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" 。 点击“确定”继续。

Maven的原型Web应用程序

在向导的“输入工件ID”页面中,您可以定义项目的名称和主程序包。 将“组ID”变量设置为"com.javacodegeeks.snippets.enterprise" ,将“工件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应用程序的中央控制器。 它会收到对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

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

转换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

java ee cdi

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

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

相关文章

js input 自动换行_深入Slate.js - 拯救 ContentEditble

我们是钉钉的文档协同团队&#xff0c;我们在做一些很有意义的事情&#xff0c;其中之一就是自研的文字编辑器。为了把自研文字编辑器做好&#xff0c;我们调研了开源社区各种优秀编辑器&#xff0c;Slate.js 是其中之一&#xff08;实际上&#xff0c;自研文字编辑器前&#x…

printf 地址_C程序显示主机名和IP地址

查找本地计算机的主机名和IP地址的方法有很多。这是使用C程序查找主机名和IP地址的简单方法。我们将使用以下功能&#xff1a;gethostname() &#xff1a;gethostname函数检索本地计算机的标准主机名。gethostbyname() &#xff1a;gethostbyname函数从主机数据库中检索与主机名…

java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值当基本数据类型作为普通变量(八大基本类型&#xff1a; byte,char,boolean,short,int,long,float,double)只有开发人员对其进行初始化&#xff0c;java不会对其进行初始化&#xff0c;如果不初始…

java 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法

在本文中&#xff0c;我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法。StringBuilder(str).reverse()char[]循环与值交换byte循环与值交换apache-commons-lang3如果是为了进行开发&#xff0c;请选择StringBuilder(str).reverse()API。出于学习的目的&…

xstream xml模板_XStream – XStreamely使用Java中的XML数据的简便方法

xstream xml模板有时候&#xff0c;我们不得不处理XML数据。 而且大多数时候&#xff0c;这不是我们一生中最快乐的一天。 甚至有一个术语“ XML地狱”描述了程序员必须处理许多难以理解的XML配置文件时的情况。 但是&#xff0c;不管喜欢与否&#xff0c;有时我们别无选择&…

python知识点智能问答_基于知识图谱的智能问答机器人

研究背景及意义 智能问答是计算机与人类以自然语言的形式进行交流的一种方式&#xff0c;是人工智能研究的一个分支。 知识图谱本质上是一种语义网络&#xff0c;其结点代表实体&#xff08;entity&#xff09;或者概念&#xff08;concept&#xff09;&#xff0c;边代表实体/…

java会了还学什么_java都学哪些内容?学完之后可以做哪些工作?

展开全部阶段一&#xff1a;揭开企业开发神秘面纱 (4周32313133353236313431303231363533e78988e69d8331333431336163)1) Web开发基础&#xff1a;HTML语言、JavaScript、CSS、DOM等2) Oracle数据库基础&#xff1a;安装、配置Oracle数据库&#xff0c;熟练掌握SQL语句3) 操作系…

Java中的RAII

资源获取即初始化&#xff08; RAII &#xff09;是Bjarne Stroustrup用C 引入的一种用于异常安全资源管理的设计思想。 感谢垃圾回收&#xff0c;Java 没有此功能&#xff0c;但是我们可以使用try-with-resources实现类似的功能。 约翰哈德斯&#xff08;John Huddles&#x…

eclipse juno_Eclipse Juno上带有GlassFish的JavaEE 7

eclipse junoJava EE 7很热。 前四个JSR最近通过了最终批准选票&#xff0c;与此同时GlassFish 4达到了升级版83。 如果您关注我的博客&#xff0c;那么您将了解NetBeans的大部分工作。 但是我确实认识到&#xff0c;那里还有其他IDE用户&#xff0c;他们也有权试用最新和最出色…

java 生成校验验证码_java 验证码生成与校验

java绘图相关类验证码工具类package dt2008.util;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.awt.*;import java.awt.image.BufferedImage;import java.io.IOException;import ja…

红黑树中nil结点_什么是红黑树?程序员面试必问!

点击上方java小组&#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达当在10亿数据中只需要进行10几次比较就能查找到目标时&#xff0c;不禁感叹编程之魅力&#xff01;人类之伟大呀&#xff01; —— 学红黑树有感。终于&#xff0c;在学习了几天的红黑树相关的…

杰克逊JSON解析错误-UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...

在解析从我们的一个RESTful Web服务接收到的JSON字符串时&#xff0c;我收到此错误“线程“ main”中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException&#xff1a;无法识别的字段“人”&#xff08;类Hello $ Person&#xff09;&#xff0c;不是标记…

mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程

这篇文章主要介绍了SQL Server 2008 R2 超详细安装图文教程,需要的朋友可以参考下一、下载SQL Server 2008 R2安装文件二、将安装文件刻录成光盘或者用虚拟光驱加载&#xff0c;或者直接解压&#xff0c;打开安装文件&#xff0c;出现下面的界面安装SQL Server 2008 R2需要.NET…

hdfs读写流程_深度探索Hadoop分布式文件系统(HDFS)数据读取流程

一、开篇Hadoop分布式文件系统(HDFS)是Hadoop大数据生态最底层的数据存储设施。因其具备了海量数据分布式存储能力&#xff0c;针对不同批处理业务的大吞吐数据计算承载力&#xff0c;使其综合复杂度要远远高于其他数据存储系统。因此对Hadoop分布式文件系统(HDFS)的深入研究&a…

mysql隔离级别验证_MySQL事务隔离级别以及验证

查询初始数据开启A事务  并做更新操作再另一端 B开始另一个事务查询 事务级别设置为读未提查询到事务未提交的数据 a的count修改为3 但是没有提交2 第二个级别 读已提交 避免脏读问题 但是有不可重复读问题回滚数据 修改隔离级别 确保都是 读已提交级别客户端A客户端B验证 脏…

注意力机制可视化_目标跟踪中的(STAM)时空注意力机制

目标跟踪分为单目标跟踪和多目标跟踪&#xff0c;单目标跟踪较为简单&#xff0c;这里我们只讨论多目标跟踪。多目标跟踪的遮挡问题多目标跟踪时特别容易发生目标间的相互遮挡&#xff0c;从而导致严重的预测偏移问题&#xff0c;如下图所示&#xff1a;红色框的行人在和蓝色框…

js给标签添加属性和值_jquery节点属性

一.节点操作1.DOM内容节点操作&#xff1a;​ ①innerHTML属性&#xff1a;设置或获取文本的内容&#xff08;普通文本和标签&#xff09;。​ ②innerText属性&#xff1a;设置或获取文本的内容&#xff08;普通文本&#xff09;&#xff0c;存在兼容性问题。2.jQuery内容节点…

sci translate好用吗_228个学科分类对应12000+本SCI和SSCI期刊,总有你要的那款!

最近有很多小伙伴询问选刊的问题&#xff0c;而且都是非常具体的学科方向&#xff0c;我们的小编虽然非常热心且礼貌的回答“近期安排”&#xff0c;但其实我们也感觉到鸭梨山大:根据WOS最新一期&#xff08;2020/9/21&#xff09;名单公布&#xff0c;WOS目前总共收录了12266本…

arrays.sort(._Arrays.sort与Arrays.parallelSort

arrays.sort(.我们都使用Arrays.sort对对象和原始数组进行排序。 此API在下面使用合并排序或Tim排序对内容进行排序&#xff0c;如下所示&#xff1a; public static void sort(Object[] a) {if (LegacyMergeSort.userRequested)legacyMergeSort(a);elseComparableTimSort.sor…

适用于Idea的面向现代TDD的Java 8 JUnit测试模板(带有Mockito和AssertJ)

使用类似BDD的语法&#xff0c;Java 8和Mockito-AssertJ二重奏为Idea调整JUnit测试类模板。 本文涵盖的主题似乎很简单。 但是&#xff0c;根据我的培训师经验&#xff0c;我知道&#xff08;不幸的是&#xff09;这不是常见的做法。 因此&#xff0c;我决定写这篇简短的博客文…