在本教程中,我们将向您展示如何在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”页面中,您可以定义项目的名称和主程序包。 将“ Group Id”变量设置为"com.javacodegeeks.snippets.enterprise"
,将“ Artifact 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:
<project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javacodegeeks.snippets.enterprise.cdi</groupId>
<artifactId>cdibeans</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>cdibeans Maven Webapp</name>
<url>http://maven.apache</url>
<dependencies>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>1.1.10.Final</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.1.7</version>
</dependency>
</dependencies>
<build>
<finalName>cdibeans</finalName>
</build>
</project>
如您所见,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;
@Inject
private 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;
}
@PostConstruct
public 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/1999/xhtml"
xmlns:h="http://java.sun/jsf/html"
xmlns:f="http://java.sun/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/1999/xhtml"
xmlns:h="http://java.sun/jsf/html"
xmlns:f="http://java.sun/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/1999/xhtml"
xmlns:h="http://java.sun/jsf/html"
xmlns:f="http://java.sun/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应用程序的中央控制器。 在显示JSP之前,它将接收对JSF应用程序的所有请求并初始化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/2001/XMLSchema-instance"
xmlns="http://java.sun/xml/ns/javaee" xmlns:web="http://java.sun/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun/xml/ns/javaee
http://java.sun/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/2013/04/java-ee-cdi-conversationscoped-example.html
更多推荐
Java EE CDI ConversationScoped示例
发布评论