JSF 的生命周期
Restore View(恢复视图)
Apply Request Values(应用请求值)
Process Validations(处理验证)
Update Model Values(更新模型值)
Invoke Application(调用应用程序)
Render Response(呈现响应)
在调用ValueChangeListener 方法后如何重新装载页面?
在 ValueChangeListener的最后,调用 FacesContext.getCurrentInstance().renderResponse()
jsf中action、actionlistener、valueChangeListener的区别
事件 | 校验 | 参数 | 事件产生 | 页面跳转
action | ok | 无参数,不传入当前控件,有返回值 |当铵钮被单击时产生事件.提交表单 |返回页面---根据配置文件跳转
actionListener | ok | 传入当前控件,无返回值 |当铵钮被单击时产生事件.提交表单 | 返回本页面
ValueChangeListener | ok | 传入当前控件,无返回值 |不提交表单(需指定其onchange/οnclick="submit"才自动提交表单 |返回本页面
action()处理的是业务逻辑.实际上JSF会自动产生一个"预设的ActionListener"来处理事件,并根据其返回值决定页面跳转.第五阶段:调用应用执行会影响到页面间的导航(navigation)。主要处理一些业务逻辑并返回几个业务逻辑结果(String类型),JSF的导航系统将会根据这个来选择恰当的下一个页面. 会提交表单.
actionListener(ActionEvent e)处理页面上组件的"监听事件".第五阶段:调用应用执行
不会影响到导航.主要操作当前页面内的组件,或者是进行一些业务模型上的改变,或者是修改backing bean(托管Bean)的属性等,并不会出现在页面间的跳转。会提交表单.
valueChangeListener(ValueChangeEvent event)处理页面上组件值变化的"监听事件","第三阶段:验证请求值"执行
ActionListener (事件监听器)是用于解决只影响用户界面的事件
特别地,在beans的form数据被加载和触发验证前被调用
用immediate=“true”指明这个行为不触发验证
在监听器调用后,会重新显示表单
不应用导航规则,不重定向页面
Action
隶属于按钮、超链接和图形映射控件
自动提交对应表单
ValueChangeListener
隶属于单选框、组合框、列表框、复选框、文本框等控件
需要用οnclick=“submit()”或οnchange=“submit()”的方式提交表单
注:actionListener比Action先执行
首页介绍JSF 如何配置多个文件
web.xml配置:
<context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/navigation.xml,/WEB-INF/beans.xml</param-value></context-param>
跟Struts 差不多 只不过 这里的参数是<param>javax.faces.CONFIG-FILES</param>
JSF 如何获取工程 路径
#{facesContext.externalContext.requestContextPath}
获取表单的两种方法
第一种:
1.如在你的页面中有 <input type= "hidden " name= "classid " value= "1 ">
注意要写在form中,并且要用name而不是id.
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( "classid ")可以得到。
2.
<h:form id= "f ">
<input type= "hidden " id= "classid " value= "1 ">
</h:form>
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( "f:classid ")可以得到。
3.使用JSF自带的控件,则和2是一样的访问方法
以上方法就可以了,写id的时候,jsf会把form的id加进去 变成 formId:componentId 的格式
第二种:
就是通过findComponent方法获得控件实例,然后通过getValue方法获得值
HtmlInputText text = (HtmlInputText) this.findComponent(this.FORM + ":"+ ENERGY_COMSUPTION_PREFIX + id);
String value = text.getValue().toString();
public UIComponent findComponent(String name) {
// 不能使用静态变量view保持当前的viewroot,因为每次操作之后的viewroot都是不一样的
ViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
return view.findComponent(name);
}
需要注意的是 不能使用静态变量view保持当前的viewroot,因为每次操作之后的viewroot都是不一样的。
对比以上两种方法,第一种简单方便,但只适合于取值操作。第二种可操控的范围和能力更大,不仅可以取值还可以设置和获得所有属性。
Restore View(恢复视图)
Apply Request Values(应用请求值)
Process Validations(处理验证)
Update Model Values(更新模型值)
Invoke Application(调用应用程序)
Render Response(呈现响应)
在调用ValueChangeListener 方法后如何重新装载页面?
在 ValueChangeListener的最后,调用 FacesContext.getCurrentInstance().renderResponse()
jsf中action、actionlistener、valueChangeListener的区别
事件 | 校验 | 参数 | 事件产生 | 页面跳转
action | ok | 无参数,不传入当前控件,有返回值 |当铵钮被单击时产生事件.提交表单 |返回页面---根据配置文件跳转
actionListener | ok | 传入当前控件,无返回值 |当铵钮被单击时产生事件.提交表单 | 返回本页面
ValueChangeListener | ok | 传入当前控件,无返回值 |不提交表单(需指定其onchange/οnclick="submit"才自动提交表单 |返回本页面
action()处理的是业务逻辑.实际上JSF会自动产生一个"预设的ActionListener"来处理事件,并根据其返回值决定页面跳转.第五阶段:调用应用执行会影响到页面间的导航(navigation)。主要处理一些业务逻辑并返回几个业务逻辑结果(String类型),JSF的导航系统将会根据这个来选择恰当的下一个页面. 会提交表单.
actionListener(ActionEvent e)处理页面上组件的"监听事件".第五阶段:调用应用执行
不会影响到导航.主要操作当前页面内的组件,或者是进行一些业务模型上的改变,或者是修改backing bean(托管Bean)的属性等,并不会出现在页面间的跳转。会提交表单.
valueChangeListener(ValueChangeEvent event)处理页面上组件值变化的"监听事件","第三阶段:验证请求值"执行
ActionListener (事件监听器)是用于解决只影响用户界面的事件
特别地,在beans的form数据被加载和触发验证前被调用
用immediate=“true”指明这个行为不触发验证
在监听器调用后,会重新显示表单
不应用导航规则,不重定向页面
Action
隶属于按钮、超链接和图形映射控件
自动提交对应表单
ValueChangeListener
隶属于单选框、组合框、列表框、复选框、文本框等控件
需要用οnclick=“submit()”或οnchange=“submit()”的方式提交表单
注:actionListener比Action先执行
首页介绍JSF 如何配置多个文件
web.xml配置:
<context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/navigation.xml,/WEB-INF/beans.xml</param-value></context-param>
跟Struts 差不多 只不过 这里的参数是<param>javax.faces.CONFIG-FILES</param>
JSF 如何获取工程 路径
#{facesContext.externalContext.requestContextPath}
获取表单的两种方法
第一种:
1.如在你的页面中有 <input type= "hidden " name= "classid " value= "1 ">
注意要写在form中,并且要用name而不是id.
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( "classid ")可以得到。
2.
<h:form id= "f ">
<input type= "hidden " id= "classid " value= "1 ">
</h:form>
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( "f:classid ")可以得到。
3.使用JSF自带的控件,则和2是一样的访问方法
以上方法就可以了,写id的时候,jsf会把form的id加进去 变成 formId:componentId 的格式
第二种:
就是通过findComponent方法获得控件实例,然后通过getValue方法获得值
HtmlInputText text = (HtmlInputText) this.findComponent(this.FORM + ":"+ ENERGY_COMSUPTION_PREFIX + id);
String value = text.getValue().toString();
public UIComponent findComponent(String name) {
// 不能使用静态变量view保持当前的viewroot,因为每次操作之后的viewroot都是不一样的
ViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
return view.findComponent(name);
}
需要注意的是 不能使用静态变量view保持当前的viewroot,因为每次操作之后的viewroot都是不一样的。
对比以上两种方法,第一种简单方便,但只适合于取值操作。第二种可操控的范围和能力更大,不仅可以取值还可以设置和获得所有属性。