java ee cdi_Java EE CDI ConversationScoped示例
java ee cdi
在本教程中,我們將向您展示如何在Web應用程序中創建和使用ConversationScoped Bean。 在CDI中,bean是定義應用程序狀態和/或邏輯的上下文對象的源。 如果容器可以根據CDI規范中定義的生命周期上下文模型來管理其實例的生命周期,則Java EE組件就是Bean。
ConversationScoped Bean是一個bean,其作用域在顯式的開發人員控制的邊界內描述用戶與JavaServer Faces應用程序的交互,該邊界將作用域擴展到JavaServer Faces生命周期的多次調用。 所有長時間運行的對話都限于特定的HTTP Servlet會話,并且可能不會跨越會話邊界。
使用ConversationScoped Bean,我們可以從ViewScoped JSF Bean中獲得所需的相同功能。 此外,借助ConversationScoped Bean,我們可以在不同的頁面請求之間維護相同的對話(或狀態)。 但是,當我們不進行對話時,托管Bean將保持活動狀態直到超時。
在這里,我們將創建一個使用ConversationScoped bean的JFS Web應用程序,以實現客戶機與服務器之間的對話。 客戶端將通過導航到不同的頁面來向服務器發出多個請求,以顯示Bean如何保持狀態。
我們首選的開發環境是Eclipse 。 我們正在使用Eclipse Juno(4.2)版本以及Maven Integration插件版本3.1.0。 您可以從Eclipse的這里從和Maven Eclipse插件這里 。 用于Eclipse的Maven插件的安裝不在本教程的討論范圍之內,因此不再討論。 Tomcat 7是使用的應用程序服務器。
讓我們開始,
1.創建一個新的Maven項目
轉到文件->項目-> Maven-> Maven項目。
在向導的“選擇項目名稱和位置”頁面中,確保未選中 “創建簡單項目(跳過原型選擇)”選項,單擊“下一步”以繼續使用默認值。
在這里,必須添加用于創建Web應用程序的Maven原型。 單擊“添加原型”并添加原型。 將“ Archetype組ID”變量設置為"org.apache.maven.archetypes" ,將“ Archetype構件ID”變量設置為"maven-archetype-webapp" ,將“ Archetype版本”設置為"1.0" 。 點擊“確定”繼續。
在向導的“輸入工件ID”頁面中,您可以定義項目的名稱和主程序包。 將“組ID”變量設置為"com.javacodegeeks.snippets.enterprise" ,將“工件ID”變量設置為"cdibeans" 。 上述選擇組成主體工程包作為"com.javacodegeeks.snippets.enterprise.cdibeans"和項目名稱為"cdibeans" 。 將“ Package”變量設置為"war" ,以便創建一個war文件以部署到tomcat服務器。 點擊“完成”退出向導并創建您的項目。
Maven項目結構如下所示:
- 它由以下文件夾組成:
- / src / main / java文件夾,其中包含應用程序動態內容的源文件,
- / src / test / java文件夾包含用于單元測試的所有源文件,
- / src / main / resources文件夾包含配置文件,
- / target文件夾包含已編譯和打包的可交付成果,
- / src / main / resources / webapp / WEB-INF文件夾包含Web應用程序的部署描述符,
- pom.xml是項目對象模型(POM)文件。 包含所有項目相關配置的單個文件。
2.添加所有必要的依賴項
通過在POM編輯器的“ Pom.xml”頁面上對其進行編輯,可以在Maven的pom.xml文件中添加依賴項,如下所示:
pom.xml:
如您所見,Maven以聲明方式管理庫依賴關系。 創建本地存儲庫(默認情況下,位于{user_home} /。m2文件夾下),所有必需的庫都從公共存儲庫下載并放置在該庫中。 此外,庫內的依賴關系會自動解決和處理。
3.創建ConversationScoped Bean
CDIConversationScopedBean.java類是一個ConversationScoped Bean,其注釋為@ConversationScoped 。 在容器中為它指定了cDIConversationScopedBean名稱,并帶有@Named批注。 首先,該類必須實現Serializable接口,以便成為ConversationScoped托管bean。 它還必須使用帶有@Inject批注的Conversation接口,該接口被注入到bean中。 將Conversation實例注入到Bean中,以便允許應用程序通過將當前對話標記為短暫或長期運行并指定對話標識符(對話的唯一標識符)來管理對話上下文。
該類具有String屬性,稱為message ,該屬性具有getter和setter方法。 帶有@PostConstruct批注的init()方法是在創建bean并initializes message屬性時調用的方法。
initConversation()和endConversation()是開始和結束對話的工具。 所述initConversation()方法標記瞬時conversation作為長期運行,而endConversation()方法馬克長期運行的conversation為瞬態,返回到應用程序的初始頁。 如果在JSF請求結束時會話處于過渡狀態,則將其破壞,并且會話上下文也將被破壞。 如果在JSF請求結束時會話處于長期運行狀態,則不會破壞該會話。 而是,它可以傳播到其他請求。 所有長時間運行的對話都有一個字符串值的唯一標識符。
該類還有另外兩個方法,由客戶端通過頁面調用,這將在后面顯示。
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.創建頁面
第一頁是初始頁,客戶端將調用該初始頁以開始對話。 它設置PreRenderViewEvent ,在顯示頁面之前PreRenderViewEvent 。 PreRenderViewEvent調用Bean的initConversation()方法以將對話標記為長時間運行。 該頁面顯示了bean的message屬性,并且每次單擊“獲取您的消息”按鈕時, message都會更改。 通過單擊“繼續此消息”命令鏈接,將調用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值。 通過單擊“讓我們結束對話”鏈接,客戶端現在被重定向到第三頁。
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值。 通過單擊“結束對話”命令鏈接,將調用Bean的endConversation()方法,該方法將客戶端重定向到第一頁,從而將conversation設置為瞬態。
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應用程序中, web.xml文件是定義服務器需要了解的有關應用程序的所有內容的文件。 此處設置了Servlet和其他組件,例如過濾器或偵聽器,初始化參數,容器管理的安全性約束,資源,歡迎頁面等。 在JFS應用程序中,我們需要在web.xml文件中定義javax.faces.webapp.FacesServlet ,該類是負責處理JSF應用程序的類。 FacesServlet是JSF應用程序的中央控制器。 它會收到對JSF應用程序的所有請求,并在顯示JSP之前初始化JSF組件。 因此, web.xml文件具有定義FacesServlet的條目。 它是servlet條目。 它還具有一個servlet-mapping項,以映射URL以.xhtml結束的所有請求,以供servlet處理。 在這里,我們還指定Servlet偵聽器(用于啟動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.運行應用程序
為了運行該應用程序,我們需要使用Maven構建項目。 產生的war文件必須放置在tomcat的webapps文件夾中。 然后,我們可以繼續:
本地主機:8080 / cdibeans / firstpage.xhtml
在瀏覽器上,結果如下所示:
通過單擊“獲取您的消息”按鈕,我們可以更改message ,如下所示:
通過單擊“繼續此消息”鏈接,我們將轉到下一頁,并攜帶message值。
通過單擊“讓我們結束對話”鏈接,我們轉到下一頁,并且仍然保留message值。
現在,如果我們單擊“結束對話”鏈接,對話將關閉,并再次顯示第一頁,開始新的對話。
這是Java EE CDI ConversationScoped Bean的教程。
下載本教程的源代碼: CDIConversationScopedBeansExample.zip
翻譯自: https://www.javacodegeeks.com/2013/04/java-ee-cdi-conversationscoped-example.html
java ee cdi
總結
以上是生活随笔為你收集整理的java ee cdi_Java EE CDI ConversationScoped示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小白装机最新最详细的台式电脑组装教程图解
- 下一篇: Java中的RAII