Java EE CDI ConversationScoped示例
在本教程中,我們將向您展示如何在Web應(yīng)用程序中創(chuàng)建和使用ConversationScoped Bean。 在CDI中,bean是定義應(yīng)用程序狀態(tài)和/或邏輯的上下文對象的源。 如果容器可以根據(jù)CDI規(guī)范中定義的生命周期上下文模型來管理其實(shí)例的生命周期,則Java EE組件就是Bean。
ConversationScoped Bean是一個(gè)bean,其作用域描述了用戶與JavaServer Faces應(yīng)用程序的交互作用,該作用域位于顯式的開發(fā)人員控制的邊界內(nèi),該邊界將作用域擴(kuò)展到JavaServer Faces生命周期的多次調(diào)用中。 所有長時(shí)間運(yùn)行的對話都限于特定的HTTP Servlet會(huì)話,并且可能不會(huì)跨越會(huì)話邊界。
使用ConversationScoped Bean,我們可以從ViewScoped JSF Bean中獲得所需的相同功能。 此外,借助ConversationScoped Bean,我們可以在不同的頁面請求之間維護(hù)相同的對話(或狀態(tài))。 但是,當(dāng)我們不進(jìn)行對話時(shí),托管Bean將保持活動(dòng)狀態(tài)直到超時(shí)。
在這里,我們將創(chuàng)建一個(gè)使用ConversationScoped bean的JFS Web應(yīng)用程序,以實(shí)現(xiàn)客戶機(jī)與服務(wù)器之間的對話。 客戶端將通過導(dǎo)航到不同的頁面來向服務(wù)器發(fā)出多個(gè)請求,以顯示Bean如何保持狀態(tài)。
我們首選的開發(fā)環(huán)境是Eclipse 。 我們正在使用Eclipse Juno(4.2)版本以及Maven Integration插件版本3.1.0。 您可以從Eclipse的這里從和Maven Eclipse插件這里 。 用于Eclipse的Maven插件的安裝不在本教程的討論范圍內(nèi),因此將不予討論。 Tomcat 7是使用的應(yīng)用程序服務(wù)器。
讓我們開始,
1.創(chuàng)建一個(gè)新的Maven項(xiàng)目
轉(zhuǎn)到文件->項(xiàng)目-> Maven-> Maven項(xiàng)目。
在向?qū)У摹斑x擇項(xiàng)目名稱和位置”頁面中,確保未選中 “創(chuàng)建簡單項(xiàng)目(跳過原型選擇)”選項(xiàng),單擊“下一步”以繼續(xù)使用默認(rèn)值。
在這里,必須添加用于創(chuàng)建Web應(yīng)用程序的Maven原型。 單擊“添加原型”并添加原型。 將“ Archetype組ID”變量設(shè)置為"org.apache.maven.archetypes" ,將“ Archetype構(gòu)件ID”變量設(shè)置為"maven-archetype-webapp" ,將“ Archetype版本”設(shè)置為"1.0" 。 點(diǎn)擊“確定”繼續(xù)。
在向?qū)У摹拜斎牍ぜ蘒D”頁面中,您可以定義項(xiàng)目的名稱和主程序包。 將“ Group Id”變量設(shè)置為"com.javacodegeeks.snippets.enterprise" ,將“ Artifact Id”變量設(shè)置為"cdibeans" 。 上述選擇組成主體工程包作為"com.javacodegeeks.snippets.enterprise.cdibeans"和項(xiàng)目名稱為"cdibeans" 。 將“ Package”變量設(shè)置為"war" ,以便創(chuàng)建一個(gè)war文件以部署到tomcat服務(wù)器。 點(diǎn)擊“完成”退出向?qū)Р?chuàng)建您的項(xiàng)目。
Maven項(xiàng)目結(jié)構(gòu)如下所示:
- 它包含以下文件夾:
- / src / main / java文件夾,其中包含應(yīng)用程序動(dòng)態(tài)內(nèi)容的源文件,
- / src / test / java文件夾包含用于單元測試的所有源文件,
- / src / main / resources文件夾包含配置文件,
- / target文件夾包含已編譯和打包的可交付成果,
- / src / main / resources / webapp / WEB-INF文件夾包含Web應(yīng)用程序的部署描述符,
- pom.xml是項(xiàng)目對象模型(POM)文件。 包含所有項(xiàng)目相關(guān)配置的單個(gè)文件。
2.添加所有必要的依賴項(xiàng)
您可以通過在POM編輯器的“ Pom.xml”頁面上對其進(jìn)行編輯,來在Maven的pom.xml文件中添加依賴項(xiàng),如下所示:
pom.xml:
如您所見,Maven以聲明方式管理庫依賴關(guān)系。 創(chuàng)建本地存儲(chǔ)庫(默認(rèn)情況下,位于{user_home} /。m2文件夾下),所有必需的庫都從公共存儲(chǔ)庫下載并放置在該庫中。 此外,庫內(nèi)的依賴關(guān)系會(huì)自動(dòng)解決和處理。
3.創(chuàng)建ConversationScoped Bean
CDIConversationScopedBean.java類是一個(gè)ConversationScoped Bean,其注釋為@ConversationScoped 。 在容器中為它指定了cDIConversationScopedBean名稱,并帶有@Named批注。 首先,該類必須實(shí)現(xiàn)Serializable接口,以便成為ConversationScoped托管bean。 它還必須使用帶有@Inject批注的Conversation接口,該接口被注入到bean中。 甲Conversation實(shí)例在bean注入,以便允許通過標(biāo)記當(dāng)前對話作為瞬時(shí)或長期運(yùn)行,并指定一個(gè)會(huì)話標(biāo)識(shí)符(會(huì)話的唯一標(biāo)識(shí)符)來管理對話上下文中的應(yīng)用。
該類具有String屬性,稱為message ,該屬性具有g(shù)etter和setter方法。 帶有@PostConstruct注釋的init()方法是在創(chuàng)建bean并initializes message屬性時(shí)調(diào)用的方法。
initConversation()和endConversation()是開始和結(jié)束對話的工具。 所述initConversation()方法標(biāo)記瞬時(shí)conversation作為長期運(yùn)行,而endConversation()方法馬克長期運(yùn)行的conversation為瞬態(tài),返回到應(yīng)用程序的初始頁。 如果在JSF請求結(jié)束時(shí)會(huì)話處于過渡狀態(tài),則它將被銷毀,并且會(huì)話上下文也將被銷毀。 如果在JSF請求結(jié)束時(shí)會(huì)話處于長期運(yùn)行狀態(tài),則不會(huì)破壞該會(huì)話。 而是,它可以傳播到其他請求。 所有長時(shí)間運(yùn)行的對話都有一個(gè)字符串值的唯一標(biāo)識(shí)符。
該類還有另外兩個(gè)方法,由客戶端通過頁面調(diào)用,這將在后面顯示。
CDIConversationScopedBean.java
package com.javacodegeeks.snippets.enterprise.cdibeans;import java.io.Serializable; import java.util.Random;import javax.annotation.PostConstruct; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.inject.Named;@Named(value="cDIConversationScopedBean") @ConversationScoped public class CDIConversationScopedBean implements Serializable {private static final long serialVersionUID = -6541718762358561835L;@Injectprivate Conversation conversation;private String message;private String[] words = {"Hello!!","Have a nice day!!","Goodbye..","Hi!","Goodmorning!","Bye..","Good evening.."}; public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Conversation getConversation() {return conversation;}@PostConstructpublic void init(){message = "Hello from the JavaCodeGeeks..";}public void initConversation(){if (!FacesContext.getCurrentInstance().isPostback() && conversation.isTransient()) {conversation.begin();}}public void sendMessage(){message = words[new Random().nextInt(7)];}public String next(){return "secondpage?faces-redirect=true";}public String endConversation(){if(!conversation.isTransient()){conversation.end();}return "firstpage?faces-redirect=true";}}4.創(chuàng)建頁面
第一頁是初始頁面,客戶端將調(diào)用該初始頁面以開始對話。 它設(shè)置PreRenderViewEvent ,在顯示頁面之前PreRenderViewEvent 。 PreRenderViewEvent調(diào)用Bean的initConversation()方法以將對話標(biāo)記為長時(shí)間運(yùn)行。 該頁面顯示了bean的message屬性,每次單擊“獲取您的消息”按鈕時(shí), message都會(huì)更改。 通過單擊“繼續(xù)此消息”命令鏈接,將調(diào)用bean的next()方法,并將客戶端重定向到第二頁。
firstPage.xhtml
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"> <f:event listener="#{cDIConversationScopedBean.initConversation}"type="preRenderView"></f:event> <h:head><title>JCG conversation 1</title> </h:head> <h:body><h:outputText value="Starting conversation"></h:outputText><br /><br /><h:form><h:outputText value="#{cDIConversationScopedBean.message}"></h:outputText><br /><h:commandButton value="Get your message" type="submit"><f:ajax execute="@form"listener="#{cDIConversationScopedBean.sendMessage}" render="@form" /></h:commandButton><br /><br /><h:commandLink action="#{cDIConversationScopedBean.next}"value="Continue with this message" /></h:form> </h:body> </html>第二頁再次顯示message值,它是客戶端在上一頁中選擇的message值。 通過單擊“讓我們結(jié)束對話”鏈接,客戶端現(xiàn)在被重定向到第三頁。
secondPage.xhtml
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"> <h:head><title>JCG conversation 2</title> </h:head> <h:body><h:outputText value="Continuing.."></h:outputText><br /><br /><h:outputText value="#{cDIConversationScopedBean.message}"></h:outputText><br /><br /><h:link outcome="/thirdpage.xhtml" value="Let's end the converation"><f:param name="cid" value="#{cDIConversationScopedBean.conversation.id}" /></h:link> </h:body> </html>第三頁再次顯示message值。 通過單擊“結(jié)束對話”命令鏈接,將調(diào)用Bean的endConversation()方法,該方法將客戶端重定向到第一頁,從而將conversation設(shè)置為瞬態(tài)。
thirdPage.xhtml
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"> <h:head><title>JCG conversation 3</title> </h:head> <h:body><h:outputText value="Ending conversation"></h:outputText><br /><br /><h:outputText value="#{cDIConversationScopedBean.message}"></h:outputText><br /><br /><h:form><h:commandLink action="#{cDIConversationScopedBean.endConversation}"value="End conversation" /></h:form> </h:body> </html>5.配置web.xml
在Web應(yīng)用程序中, web.xml文件是定義服務(wù)器需要了解的有關(guān)應(yīng)用程序的所有內(nèi)容的文件。 此處設(shè)置了Servlet和其他組件,如過濾器或偵聽器,初始化參數(shù),容器管理的安全性約束,資源,歡迎頁面等。 在JFS應(yīng)用程序中,我們需要在web.xml文件中定義javax.faces.webapp.FacesServlet ,該類是負(fù)責(zé)處理JSF應(yīng)用程序的類。 FacesServlet是JSF應(yīng)用程序的中央控制器。 在顯示JSP之前,它將接收對JSF應(yīng)用程序的所有請求并初始化JSF組件。 因此, web.xml文件具有定義FacesServlet的條目。 它是servlet條目。 它還具有一個(gè)servlet-mapping項(xiàng),以映射URL以.xhtml結(jié)束的所有請求,以供servlet處理。 在這里,我們還指定servlet偵聽器(用于啟動(dòng)Weld,并控制其與請求的交互)。
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>CDI Web Application</display-name><listener><listener-class>org.jboss.weld.environment.servlet.Listener</listener-class></listener><servlet><servlet-name>faces</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>faces</servlet-name><url-pattern>*.xhtml</url-pattern></servlet-mapping></web-app>6.運(yùn)行應(yīng)用程序
為了運(yùn)行該應(yīng)用程序,我們需要使用Maven構(gòu)建項(xiàng)目。 產(chǎn)生的war文件必須放置在tomcat的webapps文件夾中。 然后,我們可以繼續(xù):
本地主機(jī):8080 / cdibeans / firstpage.xhtml
在瀏覽器上,結(jié)果如下所示:
通過單擊“獲取您的消息”按鈕,我們可以更改message ,如下所示:
通過單擊“繼續(xù)此消息”鏈接,我們將轉(zhuǎn)到下一頁,并攜帶message值。
通過單擊“讓我們結(jié)束對話”鏈接,我們進(jìn)入下一頁,并且仍然保留message值。
現(xiàn)在,如果我們單擊“結(jié)束對話”鏈接,對話將關(guān)閉,并再次顯示第一頁,開始新的對話。
這是Java EE CDI ConversationScoped Bean的教程。
下載本教程的源代碼: CDIConversationScopedBeansExample.zip
翻譯自: https://www.javacodegeeks.com/2013/04/java-ee-cdi-conversationscoped-example.html
總結(jié)
以上是生活随笔為你收集整理的Java EE CDI ConversationScoped示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿帕奇骆驼遇见Redis
- 下一篇: Java EE CDI Producer