Java EE CDI ConversationScoped示例

在本教程中,我们将向您展示如何在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" 。 点击“确定”继续。

Maven的原型Web应用程序

在向导的“输入工件ID”页面中,您可以定义项目的名称和主程序包。 将“ Group Id”变量设置为"com.javacodegeeks.snippets.enterprise" ,将“ Artifact Id”变量设置为"cdibeans" 。 上述选择组成主体工程包作为"com.javacodegeeks.snippets.enterprise.cdibeans"和项目名称为"cdibeans" 。 将“ Package”变量设置为"war" ,以便创建一个war文件以部署到tomcat服务器。 点击“完成”退出向导并创建您的项目。

newcdiproject1

Maven项目结构如下所示:

newcdiproject2

  • 它包含以下文件夹:
  • / 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.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/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.org</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 ,该属性具有gettersetter方法。 带有@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 ,在显示页面之前PreRenderViewEventPreRenderViewEvent调用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应用程序的中央控制器。 在显示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.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

在浏览器上,结果如下所示:

转换1

通过单击“获取您的消息”按钮,我们可以更改message ,如下所示:

转换2

通过单击“继续此消息”链接,我们将转到下一页,并携带message值。

转换3

通过单击“让我们结束对话”链接,我们进入下一页,并且仍然保留message值。

转换4

现在,如果我们单击“结束对话”链接,对话将关闭,并再次显示第一页,开始新的对话。


这是Java EE CDI ConversationScoped Bean的教程。
下载本教程的源代码: CDIConversationScopedBeansExample.zip

翻译自: https://www.javacodegeeks.com/2013/04/java-ee-cdi-conversationscoped-example.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

block与inline,inline和inline-block,块级和行内元素,行内替换和行内非替换元素

block:块级元素默认display属性为block&#xff1b;无论块内内容有多少&#xff0c;总是占满一行&#xff1b; inline:行内元素默认display属性为inline&#xff1b;只占据块内的内容的大小&#xff0c;不会占满一整行&#xff1b; inline-block:将行内元素的display属性改为…

mybatis深入理解之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时&#xff0c;经常需要动态传递参数&#xff0c;例如我们需要根据用户的姓名来筛选用户时&#xff0c;sql 如下&#xff1a; select * from user where name "ruhua"; 上述 sql 中&#xff0c;我们希望 name 后的参数 "ru…

Git 中文教程

以下内容转载自&#xff1a;http://www.open-open.com/lib/view/open1328928294702.html Git是一个分布式的版本控制工具&#xff0c;本篇文章从介绍Git开始&#xff0c;重点 在于介绍Git的基本命令和使用技巧&#xff0c;让你尝试使用Git的同时&#xff0c;体验到原来一个版本…

php markdown的转化函数,markdown公式转为知乎格式

在知乎中写技术类文章&#xff0c;经常会用到markdown知乎文章可以导入markdown格式&#xff0c;但是不支持Latex公式。知乎大神提供了替代方案&#xff1a; https://zhuanlan.zhihu.com/p/69142198为实现自动化&#xff0c;用python将其简易实现&#xff0c;代码如下&#xff…

Java EE CDI Producer方法教程

这是CDI Producer方法的教程。 在CDI中&#xff0c;生产者方法生成一个可以注入的对象。 当我们要注入本身不是bean的对象&#xff0c;要注入的对象的具体类型在运行时可能有所不同&#xff0c;或者当对象需要一些bean构造函数不执行的自定义初始化时&#xff0c;可以使用生产者…

CSS的常用属性(二)

盒子模型之边框 border-(top/bottom/left/right)-style: solid 边框的风格 如(solid 实线&#xff0c;dotted 点线&#xff0c;dashed 虚线) border-top-color: #aaa 边框颜色 border-top-width: 20px 边框粗细 边框四个方向连写&#xff1a; 如 border-color: #000 边框属…

牛客网Java刷题知识点之方法覆盖(方法重写)和方法重载的区别

不多说&#xff0c;直接上干货&#xff01; https://www.nowcoder.com/ta/review-java/review?query&asctrue&order&page6 方法重写的原则&#xff1a; 重写方法的方法名称、参数列表必须与原方法的相同&#xff0c;返回类型可以相同也可以是原类型的子类型(从Jav…

7-26 Windows消息队列

7-26 Windows消息队列&#xff08;25 分&#xff09; 消息队列是Windows系统的基础。对于每个进程&#xff0c;系统维护一个消息队列。如果在进程中有特定事件发生&#xff0c;如点击鼠标、文字改变等&#xff0c;系统将把这个消息加到队列当中。同时&#xff0c;如果队列不是空…

java for循环遍历解释,三种for循环遍历

import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class For{public static void main(String[]args) {//new一个集合对象List alListnew ArrayList();alList.add(1);//自动转成IntegeralList.add("abc");alList.add(a);//一般f…

AngularJS的ng-repeat显示属性名和属性值

代码下载&#xff1a;https://files.cnblogs.com/files/xiandedanteng/AngularJSAuthorRepeat.rar 代码&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html ng-app&qu…

最小的JavaFX演示文稿(在JavaFX中)

如果您想进行有关JavaFX的演示&#xff0c;那么使用JavaFX本身进行演示非常方便。 这样&#xff0c;您无需离开演示文稿就可以轻松显示示例。 这是一个非常简单的示例。 在NetBeans中&#xff0c;设置一个新的JavaFX项目“ New Project”->“ JavaFX”->“ JavaFX Applic…

2018.2.28(延迟加载和缓存)

1.延迟加载 编写配置 测试类 2.侵入式延迟 3.深度延迟 4.一级缓存 5.二级缓存 配置 测试类 转载于:https://www.cnblogs.com/xu06123/p/8483245.html

java 加密解密编程,java 加密解密容易实现

当前位置:我的异常网 编程 java 加密解密容易实现java 加密解密容易实现www.myexceptions.net 网友分享于&#xff1a;2013-10-27 浏览&#xff1a;3次java 加密解密简单实现加密算法有很多种&#xff1a;这里只大约列举几例&#xff1a;1:消息摘要&#xff1a;(数字指纹)&a…

小爬麦子学院教师

任务描述&#xff1a;将麦子学院指定网页下教师信息&#xff08;姓名&#xff0c;职称&#xff0c;介绍信息&#xff09;爬取下来并保存到数据库。 1.页面分析&#xff1a; 2.代码&#xff1a; mydb.py: #!/usr/bin/env/python #coding:utf-8 操作数据库import MySQLdb as dbcl…

MongoDB:使用Spring数据添加计数器

在我的博客应用程序中&#xff0c;您可以查看任何用户的个人资料&#xff0c;例如&#xff0c;我的个人资料页面将为http://www.jiwhiz.com/profile/user1&#xff0c;“user1”是我在系统中的用户ID。 在MongoDB中&#xff0c;每个文档对象都会有一个唯一的标识符&#xff0c;…

vue2+node+mysql demo总结

1.App.vue中&#xff1a; 2.在main.js中的new vueRouter里设置mode:history或者hash &#xff1b;设置{path:/,redirect:home}默认进入的路径&#xff1b;设置linkActiveClass改变路由激活时的class名&#xff1b;也定义全局基本样式和全局过滤器等&#xff0c;例如&#xff1a…

常见文本样式及标签

本文设计到常见对文档的处理样式&#xff0c;和块&#xff0c;行标签的特点。 没用什么重要内容&#xff0c;只是自己的一些知识点的回忆&#xff0c;对以前知识的一个梳理过程&#xff0c;望某懒虫加油&#xff01;&#xff01;&#xff01; <!DOCTYPE html> <html l…

寻找内存泄漏:一个案例研究

一周前&#xff0c;我被要求修复一个有内存泄漏问题的webapp。 考虑到过去两年左右的时间里我已经看到并修复了数百个泄漏&#xff0c;我想这有多难。 但是事实证明这是一个挑战。 12小时后&#xff0c;我发现该应用程序中不少于5个漏洞&#xff0c;并设法修复了其中4个漏洞。…

matlab中求积函数,MATLAB软件及高斯勒让德求积公式MATLAB软件及高斯勒让德求积公式.doc...

MATLAB软件及高斯勒让德求积公式MATLAB软件及高斯勒让德求积公式数 值 分 析 课 程 实 验 报 告2012—2013学年度 第二学期系别&#xff1a;数学与计算机科学学院实验课程数值分析班 级10级数学与应用数学2班学 号05姓 名杜宁峰指导教师陈耀庚实验题目学习编写高斯-勒让德计算程…

[HNOI2015] 落忆枫音

题目描述 「恒逸&#xff0c;你相信灵魂的存在吗&#xff1f;」 郭恒逸和姚枫茜漫步在枫音乡的街道上。望着漫天飞舞的红枫&#xff0c;枫茜突然问出这样一个问题。 「相信吧。不然我们是什么&#xff0c;一团肉吗&#xff1f;要不是有灵魂......我们也不可能再见到你姐姐吧。」…