WEB应用通常需要响应用户事件,比如选择菜单项目或者单击按钮。例如,响应用户对地址表单中的国家选择,更改场所和加载当前页面以更好的适应用户。
通常,可以与组件一起注册事件处理器;例如,可以在JSF页面中使用菜单来注册值变化监听器。如:
JSF代码
- <h:selectOneMenu id="select" valueChangeListener="#{user.myEvent}" onchange="submit();"
- value="#{user.selectedContent}">
- <f:selectItems value="#{user.countryItems}"></f:selectItems>
- </h:selectOneMenu>
在上述代码中,方法绑定#{user.myEvent}引用form bean的myEvent方法,当用户从菜单中作出选择之后,JSF实现调用该方法。
JSF支持三种类型的事件:
值变化事件
动作事件
阶段事件
当输入组件的值发生变化并且比较表单时,值变化事件由该输入组件触发,例如: h:inputText,h:selectRadio,h:selectManyMenu。
当激活按钮或连接时,命令组件(如:h:commandButton和h:commandLink)会触发动作事件。
生命周期事件
JSF应用程序中的请求由JSF实现产生――该JSF实现通常时一个控制器servlet――然后执行JSF生命周期。JSF生命周期包括下列阶段:
Restore View(恢复视图)
Apply Request Values(应用请求值)
Process Validations(处理验证)
Update Model Values(更新模型值)
Invoke Application(调用应用程序)
Render Response(呈现响应)
在用户再次访问JSF页面时,恢复视图阶段将重新创建服务器组件树,应用请求值阶段将请求参数(request parameters)复制到组件提交值(submitted value)中。处理验证阶段首先转换这些提交的值并验证转换后的值。更新模型值将转换后和验证过的值复制到模型中。这通常是由JSF页面中值引用表达式 所表示,如:
JSF代码
- <h:inputText value=”#{user.name}”/>
<h:inputtext value="”#{user.name}”/">
调用应用程序阶段调用动作监听器和动作,可以在一个组件中注册动作监听器和动作。
<h:commandbutton action="”#{bean.action}”" actionlistener="”#{bean.listener}”/">
JSF 代码
- <h:commandButton action=”#{bean.action}” actionListener=”#{bean.listener}”/>
在这里,JSF实现将调用该bean的listener方法,接着是action方法.
最后,呈现响应阶段保存状态并加载下一个视图,对于JSP应用程序,JSF导航处理器或者转发或者重定向到另一个JSF页面,转发是默认的行为,但是可以在faces配置文件中使用redirect元素指定重定向。
从应用请求值阶段开始,事件被创建和放置到每个生命周期中的一个事件序列中。完成这些阶段之后,JSF实现将这些排队的事件传播到注册的监听器上。
每个监听器都会以下列三种方法之一来影响JSF生命周期:1。生命周期正常进行;2。调用FacesContext.renderResponse()来 跳过生命周期的其他部分,而直接到呈现响应;3。调用FacesContext.responseComplete ()来跳过生命周期的其他所有部分。
</h:commandbutton></h:inputtext>
1
值变化事件
Web应用程序中的组件通常是相互依赖的。可以使得所依赖的组件与值变化事件保持同步。例如,下图显示的应用程序,当选择下拉框中的内容时,在下面显示所选中的内容。这在验证了新值和提交关闭之后由输入组件触发。
上图显示的应用程序将一个值变化监听器连接到select菜单,并使用onchange属性来在菜单值变化之后强迫执行表单提交:
JSF代码
- <h:selectOneMenu id="select" valueChangeListener="#{user.myEvent}" onchange="submit();"
- value="#{user.selectedContent}">
- <f:selectItems value="#{user.countryItems}"></f:selectItems>
- </h:selectOneMenu>
当用户从菜单中选择一个国家时,JavaScript submit函数将被调用来提交菜单的表单,然后它调用JSF生命周期。在处理验证阶段,JSF实现将调用form bean的myEvent()方法。这个方法将根据新的selectedContent值来更改视图的场所:
java 代码
-
-
-
-
-
-
-
-
-
-
-
-
-
- package jsf;
- import javax.faces.event.ActionEvent;
- import javax.faces.event.ValueChangeEvent;
- import javax.faces.context.FacesContext;
- import javax.faces.model.SelectItem;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.List;
- import java.util.Locale;
- public class UserBean ...{
- String result;
- String input;
- private ArrayList countryItems = null;
- private String selectedContent = null;
- public String getSelectedContent() ...{
- return selectedContent;
- }
- public void setSelectedContent(String selectedContent) ...{
- this.selectedContent = selectedContent;
- }
- public String getResult() ...{
- return result;
- }
- public void setResult(String result) ...{
- this.result = result;
- }
- public void listen(ActionEvent e) ...{
- FacesContext context = FacesContext.getCurrentInstance();
- String myclientId = e.getComponent().getClientId(context);
- String clientId = e.getComponent().getId();
- if (clientId.equals("btnSubmitAdd"))
- setResult(getInput());
- }
-
- public void myEvent(ValueChangeEvent e) ...{
- FacesContext context = FacesContext.getCurrentInstance();
- String clientId = e.getComponent().getId();
- if (clientId.equals("select")) ...{
- setResult(e.getNewValue().toString());
- }
- }
- public String getInput() ...{
- return input;
- }
- public void setInput(String input) ...{
- this.input = input;
- }
- public Collection getCountryItems() ...{
- SelectItem aa= new SelectItem();
- if (countryItems == null) ...{
- countryItems = new ArrayList();
- countryItems.add(new SelectItem("Sun", "Sun", null));
- countryItems.add(new SelectItem("Month", "Month", null));
- countryItems.add(new SelectItem("Earth", "Earth", null));
- }
- return countryItems;
- }
- public void setCountryItems(ArrayList<selectitem> countryItems) ...{ </selectitem>
- this.countryItems = countryItems;
- }
1
与所有值变化监听器一样,上述监听器将传递一个值变化事件,该监听器使用该事件来访问组件的新值。ValueChangeEventl类扩展了FacesEvent,两个类都位于javax.faces.event包中。下面列出了这些类中的常用方法:
javax.faces.event.ValueChangeEvent
UIConponent getComponent()
返回触发事件的输入组件
Object getNewValue()
当转换和验证新值后,返回组件的新值
Object getOldValue()
返回组件的以前值
Javax.faces.event.FacesEvent
Void queue()
将传送事件放到当前生命周期阶段的末端并排队等待
PhaseID getPhaseId()
返回对应于发送事件阶段的阶段标识符
Void setPaseId(PhaseId)
设置对应于发送事件阶段的阶段标识符
上图的页面代码为:
Myjsp.jsp
- <%@ page language="java" pageEncoding="ISO-8859-1"%>
- <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
- <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <f:view>
- <head>
- <title>This is the first JSF example!</title>
- </head>
- <body>
- <h:form>
- <h:inputText value="#{user.input}" id="input" />
- <h:selectOneMenu id="select" valueChangeListener="#{user.myEvent}"
- onchange="submit()" value="#{user.selectedContent}">
- <f:selectItems value="#{user.countryItems}"></f:selectItems>
- </h:selectOneMenu>
-
- <p>
- <h:commandButton value="Login" action="login" id="btnSubmitAdd"
- actionListener="#{user.listen}" />
- </p>
- <h:outputText value="#{user.result}" />
- </h:form>
- </body>
- </f:view>
- </html>
1
动作事件
动作事件在组件被激活时由命令按钮触发――按钮,连接等等。正如前面“生命周期事件”所讨论的,动作事件在调用应用程序阶段触发,接近生命周期的末端。
通常将动作监听器连接到JSF页面的命令组件,例如可以将一个动作监听器添加到一个按钮上。如上例中为按钮定义了一个事件:
<h:commandbutton value="Login" action="login" actionlistener="#{user.listen}">
当命令组件被激活时,它们提交请求,因此不需要使用onchange来强迫提交表单,这与值变化事件中所做的有所不同,当激活一个命令或连接时,封闭的表单将被提交,然后JSF实现将触发动作事件。
认识action listener和action之间的区别很重要,动作被设计用于业务逻辑并参与导航处理,而动作监听器通常执行用户页面逻辑,但不参与导航处理。当动作需要用户界面相关的信息时,动作监听器通常与动作一起工作。</h:commandbutton>
分享到:
相关推荐
主要讲述JSF的工作方式 JSF的工作方式 JSF架构 JSF模型 JSF事件类型
JSF事件处理,生命周期事件,动作事件,内容如下
JSF中文教程JSF中文教程JSF中文教程JSF中文教程
jsf 中文文档jsf 中文文档jsf 中文文档jsf 中文文档
这是我自己写的jsf,这个project包含了转换器与监听器的一些使用。
jsf帮助文档 中文手册 javascript js_ref
精通JSF中文教程精通JSF中文教程精通JSF中文教程精通JSF中文教程精通JSF中文教程精通JSF中文教程
commons-beanutils-1.6.jar commons-collections-3.1.jar jsf-api.jar jsf-impl.jar standard.jar
JSF中文文档
一些可能包含自定义组件、约束、转换器或者监听器的对象 为在页面中表现自定义对象的一组自定义tag 包含JSP页面的JSF应用程序也使用由为了表现UI组件和在页面上的其他对象的JSF技术而定义的标准的tag库。 ...
jsf 分页 jsf 分页 jsf 分页 jsf 分页
jsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSFjsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSF
jsf的中文教程chm版的和讲解jsf中使用到的一些参数的传递方式,学习jsf很不错的材料……
JSF框架中文教程,包括JSF入门、Backing Beans、Beans 上的 List, Map、JSF Expression Language、JSF 生命周期、Phase 事件、TableModel 类别、等有关jsf的知识。
JSF 使用 Bean 来达到逻辑层与表现层分离的目的,Bean 的管理集中在组态档案中,您只要修改组态档案,就可以修改 Bean 之间的相依关系。 o Backing Beans o Beans 的组态与设定 o Beans 上的 List, Map 数据转换与...
CSS、JavaScript 和 JSF 精心打造 Ajax 应用,需要的朋友可以去下载。
jsf中文使用教程jsf中文使用教程
JSF入门(中文pdf)
Dhtml手册、 JSF中文教程、JSF API、struts2.0中文帮助手册.chm等等
这里是jsf的tags的书籍。主要讲述jsf的用法。