JSF入门十六(即时事件)
2013-04-14 22:11
148 查看
本文参考
http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630
所谓的即时事件(Immediate Events),是指JSF视图组件在取得请求中该取得的值之后,即立即处理指定的事件,而不再进行后续的转换器处理、验证器处理、更新模型值等流程。
所有的对象唤起都是在服务器端执行的,至于该唤起什么对象,则是依一个基本的流程:
重建视图(Restore View)
依客户端传来的session数据或服务器端上的session数据,重建JSF视图组件。
套用请求值(Apply Request Values)
JSF视图组件各自获得请求中的属于自己的值,包括旧的值与新的值。
执行验证(Process Validations)
转换为对象并进行验证。
更新模型值(Update Model Values)
更新Bean或相关的模型值。
唤起应用程序(Invoke Application)
执行应用程序相关逻辑。
绘制响应页面(Render Response)
对先前的请求处理完之后,产生页面以反应客户端执行结果。
对于动作事件(Action Event)来说,组件的动作事件是在套用请求值阶段就生成ActionEvent对象了,但相关的事件处理并不是马上进行,ActionEvent会先被排入队列,然后必须再通过验证、更新方式值阶段,之后才处理队列中的事件。
这样的流程对于按下按钮然后执行后端的应用程序来说不成问题,但有些事件并不需要这样的流程,例如只影响页面的事件。
举个例子来说,在表单中可能有使用者名称、密码等栏目,并提供有一个地区选项按钮,使用者可以在不填写名称、密码的情况下,就按下地区选项按钮,如果依照正常的流程,则会进行验证、更新模型值、唤起应用程序等流程,但显然的,使用者名称与密码是空白的,这会引起不必要的错误。
您可以设定组件的事件在套用请求值之后立即被处理,并跳过后续的阶段,直接进行页面绘制以响应请求,对于JSF的input与command组件,都有一个immediate属性可以设定
,只要将其设定为true,则指定的事件就成为即时事件。
一个例子如下:index.jsp
这是一个可以让使用者决定使用语系的示范,最后一个commandButton组件被设定了immediate属性,当按下这个按钮后,JSF套用请求值之后会立即处理指定的actionListener,而不再进行验证、更新模型值,简单的说,就这个程序来说,您在输入栏目与密码栏目中填入的值,不会影响您的user.name与user.password。
基于范例的完整起见,我们列出这个程序Bean对象及faces-config.xml:UserBean.java
faces-config.xml
信息资源文件的内容则是如下:
Text中设定的是「中文」转换为Java Unicode Escape格式的结果,另一个信息资源文件的内容则是英文信息的翻译而已,其转换为Java Unicode Escape格式结果如下:messages_zh_CN.properties
http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630
所谓的即时事件(Immediate Events),是指JSF视图组件在取得请求中该取得的值之后,即立即处理指定的事件,而不再进行后续的转换器处理、验证器处理、更新模型值等流程。
所有的对象唤起都是在服务器端执行的,至于该唤起什么对象,则是依一个基本的流程:
重建视图(Restore View)
依客户端传来的session数据或服务器端上的session数据,重建JSF视图组件。
套用请求值(Apply Request Values)
JSF视图组件各自获得请求中的属于自己的值,包括旧的值与新的值。
执行验证(Process Validations)
转换为对象并进行验证。
更新模型值(Update Model Values)
更新Bean或相关的模型值。
唤起应用程序(Invoke Application)
执行应用程序相关逻辑。
绘制响应页面(Render Response)
对先前的请求处理完之后,产生页面以反应客户端执行结果。
对于动作事件(Action Event)来说,组件的动作事件是在套用请求值阶段就生成ActionEvent对象了,但相关的事件处理并不是马上进行,ActionEvent会先被排入队列,然后必须再通过验证、更新方式值阶段,之后才处理队列中的事件。
这样的流程对于按下按钮然后执行后端的应用程序来说不成问题,但有些事件并不需要这样的流程,例如只影响页面的事件。
举个例子来说,在表单中可能有使用者名称、密码等栏目,并提供有一个地区选项按钮,使用者可以在不填写名称、密码的情况下,就按下地区选项按钮,如果依照正常的流程,则会进行验证、更新模型值、唤起应用程序等流程,但显然的,使用者名称与密码是空白的,这会引起不必要的错误。
您可以设定组件的事件在套用请求值之后立即被处理,并跳过后续的阶段,直接进行页面绘制以响应请求,对于JSF的input与command组件,都有一个immediate属性可以设定
,只要将其设定为true,则指定的事件就成为即时事件。
一个例子如下:index.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@page contentType="text/html;charset=UTF8"%> <f:view locale="#{user.locale}"> <f:loadBundle basename="messages" var="msgs"/> <html> <head> <title><h:outputText value="#{msgs.titleText}"/></title> </head> <body> <h:form> <h3><h:outputText value="#{msgs.hintText}"/></h3> <h:outputText value="#{msgs.nameText}"/>: <h:inputText value="#{user.name}"/><p> <h:outputText value="#{msgs.passText}"/>: <h:inputSecret value="#{user.password}"/><p> <h:commandButton value="#{msgs.commandText}" action="#{user.verify}"/> <h:commandButton value="#{msgs.Text}" immediate="true" actionListener="#{user.changeLocale}"/> </h:form> </body> </html> </f:view>
这是一个可以让使用者决定使用语系的示范,最后一个commandButton组件被设定了immediate属性,当按下这个按钮后,JSF套用请求值之后会立即处理指定的actionListener,而不再进行验证、更新模型值,简单的说,就这个程序来说,您在输入栏目与密码栏目中填入的值,不会影响您的user.name与user.password。
基于范例的完整起见,我们列出这个程序Bean对象及faces-config.xml:UserBean.java
package bruce.zhao; import javax.faces.event.ActionEvent; public class UserBean { private String locale = "en"; private String name; private String password; private String errMessage; public void changeLocale(ActionEvent e) { if(locale.equals("en")) locale = "zh_CN"; else locale = "en"; } public String getLocale() { if (locale == null) { locale = "en"; } return locale; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } public void setErrMessage(String errMessage) { this.errMessage = errMessage; } public String getErrMessage() { return errMessage; } public String verify() { if(!name.equals("justin") || !password.equals("123456")) { errMessage = "名称或密码错误"; return "failure"; } else { return "success"; } } }
faces-config.xml
<?xml version="1.0"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"> <faces-config> <navigation-rule> <from-view-id>/pages/index.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/pages/welcome.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>failure</from-outcome> <to-view-id>/pages/index.jsp</to-view-id> </navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class> bruce.zhao.UserBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>
信息资源文件的内容则是如下:
titleText=JSF Demo hintText=Please input your name and password nameText=name passText=password commandText=Submit Text=\u4e2d\u6587
Text中设定的是「中文」转换为Java Unicode Escape格式的结果,另一个信息资源文件的内容则是英文信息的翻译而已,其转换为Java Unicode Escape格式结果如下:messages_zh_CN.properties
titleText=JSF\u793a\u7bc4 hintText=\u8acb\u8f38\u5165\u540d\u7a31\u8207\u5bc6\u78bc nameText=\u540d\u7a31 passText=\u5bc6\u78bc commandText=\u9001\u51fa Text=English
相关文章推荐
- jsf-即时事件
- JSF入门十五(动作事件)
- JSF入门十七(值变事件)
- JavaScript入门之事件、cookie、定时等
- Flask入门之触发器,事件,数据迁移
- Dojo入门:dojo中的事件处理
- C#委托,事件理解入门 转载
- HTML5之Canvas 2D入门5 - 事件与动画
- Node.js学习笔记【1】入门(服务器JS、函数式编程、阻塞与非阻塞、回调、事件、内部和外部模块)
- 复杂事件处理——Esper入门(示例程序)
- STM32小白入门(第13天)-------RTC实时时钟和闹钟事件
- Android Monkey测试入门-6-Monkey高级参数之触摸事件
- 【Cocos2d入门教程九】浅析Cocos2d下的加速计事件
- MVC框架入门准备(三)事件类 - 事件的监听和触发
- Fragment从入门到精通之Activity中响应Fragment中的事件③
- Android入门——电话拨号器和四种点击事件
- Quick-cocos2d-x3.3 Study (十六)--------- 碰撞检测,事件监听,设置掩码
- arcgis api for js入门开发系列十六迁徙流动图
- Visual Studio 2005入门 之 类的自定义事件[视频]
- App测试从入门到精通之交叉事件测试