实时事件

 所谓的实时事件(Immediate Events),是指JSF视图组件在取得请求中该取得的值之后,即立即处理指定的事件,而不再进行后续的转换器处理、验证器处理、更新模型值等流程。
  在JSF的事件模型中会有所谓实时事件,导因于Web应用程序的先天特性不同于GUI程序,所以JSF的事件模式与GUI程序的事件模式仍有相当程度的不同,一个最基本的问题正因为HTTP无状态的特性,使得Web应用程序天生就无法直接唤起伺服端的特定对象。所有的对象唤起都是在伺服端执行的,至于该唤起什么对象,则是依一个基本的流程:

  • 回复画面(Restore View)

  对于选择的页面如果是初次浏览则建立新的组件树。如果是会话阶段,会从使用者端或服务器端的数据找寻数据以回复每个组件的状态并重建组件树,如果不包括请求参数,则直接跳过接下来的阶段直接绘制响应。

  • 套用申请值(Apply Request Values)

  每个组件尝试从到来的请求中找寻自己的参数并更新组件值,在这边会触发ActionEvent,这个事件会被排入队列中,然后在唤起应用程序阶段之后才会真正由事件处理者进行处理。
然而对于设定immeduate为true的命令(Commamnd)组件来说,会立即处理事件并跳过之后的阶段直接绘制响应,而对于设定immediate为true的输入(Input)组件,会马上进行转换验证并处理值变事件,之后跳过接下来的阶段,直接绘制响应。

  • 执行验证(Process Validations)

  进行转换与验证处理,如果验证错误,则会跳过之后的阶段,直接绘制响应,结果是重新呼叫同一页绘制结果。

  • 更新模型值(Update Model Values)

  更新每一个与组件绑定的backing 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:commandButton></h:form></body></html>
</f:view>

这是一个可以让使用者决定使用语系的示范,最后一个commandButton组件被设定了immediate属性,当按下这个按钮后,JSF套用请求值之后会立即处理指定的actionListener,而不再进行验证、更新模型值,简单的说,就这个程序来说,您在输入字段与密码字段中填入的值,不会影响您的user.name与user.password。

UserBean.java

package wsz.ncepu;import javax.faces.event.ActionEvent;public class UserBean {private String locale;private String name;private String password;private String errMessage;public void changeLocale(ActionEvent e) {if ("en".equals(locale))locale = "zh_CN";elselocale = "en";}public String getLocale() {return locale;}public void setLocale(String locale) {this.locale = 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>wsz.ncepu.UserBean</managed-bean-class><managed-bean-scope>session</managed-bean-scope></managed-bean>
</faces-config>

讯息资源文件的内容则是如下:

messages_en.properties

titleText=JSF DemohintText=Please input your name and passwordnameText=namepassText=passwordcommandText=SubmitText=\u4e2d\u6587

messages_zh_CN.properties

titleText=JSF\u793A\u8303
hintText=\u8BF7\u8F93\u5165\u7528\u6237\u540D\u5BC6\u7801
nameText=\u540D\u79F0
passText=\u5BC6\u7801
commandText=\u9001\u51FA
Text=English 

程序的画面如下:

如果加上phase事件中代码,会发现immediate="true"时,后台打印的输出

16:52:01,939 INFO  [STDOUT] Before RESTORE_VIEW 1
16:52:01,970 INFO  [STDOUT] After RESTORE_VIEW 1
16:52:01,970 INFO  [STDOUT] Before APPLY_REQUEST_VALUES 2
16:52:01,970 INFO  [STDOUT] After APPLY_REQUEST_VALUES 2
16:52:01,970 INFO  [STDOUT] Before RENDER_RESPONSE 6
16:52:02,010 INFO  [STDOUT] After RENDER_RESPONSE 6

不加immediate="true"时 后台打印的输出

16:50:52,044 INFO  [STDOUT] Before RESTORE_VIEW 1
16:50:52,065 INFO  [STDOUT] After RESTORE_VIEW 1
16:50:52,065 INFO  [STDOUT] Before APPLY_REQUEST_VALUES 2
16:50:52,075 INFO  [STDOUT] After APPLY_REQUEST_VALUES 2
16:50:52,075 INFO  [STDOUT] Before PROCESS_VALIDATIONS 3
16:50:52,075 INFO  [STDOUT] After PROCESS_VALIDATIONS 3
16:50:52,075 INFO  [STDOUT] Before UPDATE_MODEL_VALUES 4
16:50:52,075 INFO  [STDOUT] After UPDATE_MODEL_VALUES 4
16:50:52,075 INFO  [STDOUT] Before INVOKE_APPLICATION 5
16:50:52,075 INFO  [STDOUT] After INVOKE_APPLICATION 5
16:50:52,075 INFO  [STDOUT] Before RENDER_RESPONSE 6
16:50:52,105 INFO  [STDOUT] After RENDER_RESPONSE 6

JSF----事件处理----实时事件相关推荐

  1. 重新定义分析 - EventBridge实时事件分析平台发布

    作者:肯梦 对于日志分析大家可能并不陌生,在分布式计算.大数据处理和 Spark 等开源分析框架的支持下,每天可以对潜在的数百万日志进行分析. 事件分析则和日志分析是两个完全不同的领域,事件分析对实时 ...

  2. jsf按钮响应事件_如何从JSF获取JSON响应?

    jsf按钮响应事件 许多JavaScript小部件都希望使用JSON格式的数据和选项. 如今,选择一个很酷的小部件并将其包装在一个复合组件中确实很容易. 但是第一个问题是如何发送AJAX请求并以正确的 ...

  3. 深度剖析SOC高性能实时事件关联分析引擎

    [引言]安全管理平台(SOC) 的一项关键技术就是事件关联分析.借助实时的事件关联分析引擎,安全管理平台能够发掘出复杂的海量安全日志和事件背后隐藏的信息,引导安全管理人员发现外 部***和内部违规行为 ...

  4. 事件处理-注册时间 // 事件处理-修饰符 // 事件处理-键盘事件的修饰符 // 事件处理-系统修饰符 // 事件处理-鼠标修饰符

    事件处理-注册事件 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...

  5. linux input子系统分析--子系统核心.事件处理层.事件传递过程

    linux input子系统分析--子系统核心.事件处理层.事件传递过程 一.  输入子系统核心分析. 1.输入子系统核心对应与/drivers/input/input.c文件,这个也是作为一个模块注 ...

  6. 【Vue2.0】—事件处理和事件修饰符(二)

    [Vue2.0]-事件处理和事件修饰符(二) <div id="root"><h2>{{name}},加油!</h2><!-- 阻止默认事 ...

  7. Microsoft Teams安排 Teams 实时事件

    安排 Teams 实时事件 如果你是实时活动的组织者,你可以以与安排定期活动Teams相同的方式安排Teams活动.  此过程将实时事件添加到你和事件组的日历中. 之后,你需要邀请 与会者. 在Tea ...

  8. Teams Meeting 实时事件通知

    Microsoft Teams最近推出了很多新的功能和api,我们今天就来一起看一下 teams 会议的实时事件通知,我觉得有了这个功能,我们的app,我们的bot又可以有很多可以实现的场景了. 我们 ...

  9. 双十一|又快又稳!闲鱼实时事件规则计算驱动平台

    闲鱼双十一金鳞抽奖玩法 相信今年在11月7日-11月11日期间使用过闲鱼的用户,可能已经被如下图所示的幸运海星"砸"到过了.只要用户进入到指定的几个页面,或者在某些指定的页面有点击 ...

  10. 基于 WEB 的实时事件通知方式 服务器推送

    下面这些可以实现基于web的实时事件通知的方法.在他们的实验性研究中在一个利用COMET推送方式实现(Dojo的Cometd库,dwr的反向Ajax)的AJAX应用和一个纯拉取方式的应用之间,对数据一 ...

最新文章

  1. 卡尔曼滤波——车定位(GPS与车运动方程)
  2. 报名开启 | 李开复等AI大咖齐聚量子位MEET大会,邀你共探新形势下智能产业发展之路...
  3. pyqt5动态删除控件问题
  4. MySQL查询的进阶操作--排序查询
  5. C# winform DataGridView 属性说明
  6. 04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
  7. 多层感知机和神经网络的区别_学习笔记-从神经元到神经网络
  8. matlab求心率,心电图QRS波检测(计算心跳次数)
  9. 计算机信息管理试卷答案,计算机信息管理专业《计算机组成原理》试卷B和参考答案4...
  10. 自然语言处理实战-Python编程进阶
  11. 《深入浅出WPF》——命令学习
  12. 学汽车故障计算机排除怎么样,汽车故障清除后就没事了么?
  13. PC防光护眼专家Iris Pro绿色特别版 傻瓜式软件
  14. STM32智能小车------红外遥控
  15. 交直流电压电流信号ADC采集
  16. 关于阿里云ACP认证的那些事儿
  17. outlook邮箱邮件大小限制_附件大小超过了允许的限制错误 - Outlook | Microsoft Docs...
  18. 0x01.渗透思路篇
  19. 计算机网络的全局模式是,全局配置模式-计算机网络精品课程网.PPT
  20. 70行代码撸一个桌面自动翻译神器

热门文章

  1. Python Chemistry
  2. 【学习笔记】信息系统项目管理-项目採购管理-合同分类
  3. header简单用处
  4. MVC保存二进制到数据库,并显示文件的方法(图片显示)
  5. mysql 各种字段取值范围 2009-12-23
  6. MySQL复制以及调优
  7. 分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装
  8. dubbo+zookeeper项目搭建
  9. 【转载】"library not found for - "解决办法
  10. HDU4757 Tree(可持久化Trie)