#{…} 表达式的三种含义
n 指定输出值
Ø #{ varName.propertyName }
含义为输出特定范围域变量或托管bean的指定属性
Ø < h:outputText value=“#{ employee.address }” />
任何时候访问都是一个输出的文本
Ø < h:inputText value=“#{ employee.address }” />
当表单初始显示时,代表一个预装配的值
n 指定提交值
Ø h: inputText value="#{ employee.address }“ />
指定当表单提交时指定将值存放在何处
n 指定提交后的方法调用
Ø < h: commandButton value="Button Label" action="#{ employee.processEmployee }“ />
指定表单提交时的action处理器
n ActionController
Ø 即便已经有ActionListener,但在某些情况下还需要ActionController
• 如前所说,它们调用业务逻辑和参与导航
• Setter方法与验证会在ActionController执行处理前调用
n C)ActionListener
Ø ActionListener表现服务器端效果,并在表单上重新显示
• 通常,它们不调用业务逻辑、setter方法,且从不参与页面导航
• 正常情况下,你应该用”immediate”来显式指明setter方法不被调用
n <h:form>
n ...
n <h:commandButton
n value="#{resumeBean.colorSupportLabel}"
n actionListener="#{resumeBean.toggleColorSupport}"
n immediate="true"/>
n </h:form>
ActionListener能访问GUI对象底层详细信息:
如:Renderer、client ID等,当我们覆盖用户自定义控件时尤其需要。
最通用的例子:针对图形的客户端与服务器端映射
public void selectGrayLevel(ActionEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
String clientId = event.getComponent().getClientId(context);
HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
takeActionBasedOn(flag);
}
public void someMethod(ValueChangeEvent event) {
boolean flag = ((Boolean)event.getNewValue()).booleanValue();
Ø Firefox和IE对事件的响应不一样
• 当组合框的选项改变、单选框被选中或复选框被check/uncheck时,Firefox、Netscape和Opera fire触发onchange事件
• IE需在选项发生变化且其他GUI控件获得聚焦时触发事件
n ActionListener隶属于按钮控件
Ø 当点击按钮时会自动提交表单
n ValueChangeListener隶属于组合框、列表框、单选框、复选框、文本框等
Ø 不会自动提交表单
Ø 需要添加οnclick=”submit()”或οnchange=”submit()”JavaScript代码才能提交表单
n 一些按钮提交表单并在后端进行业务处理,用的是 Action Controller而并非 ActionListener
Ø 用<h:commandButton action="..." .../>
n 倘若另一些按钮只影响UI,此时,应该用ActionListener
Ø 用<h:commandButton actionListener="..." .../>
Ø 你通常希望这个处理发生在beans的form数据被加载之前,特别是在验证控件进行验证前
• 因为通常情况下,当UI被调整时,表单的信息并不完整
Ø 用”immediate”可明确指定这个listener在bean的form数据被加载前或触发验证前调用
Ø ActionController主要用于处理表单
• ActionController被调用之前,form的数据会被填充在ManagedBean中
• ActionController调用之前,还会完成验证逻辑的调用(请看后面章节)
• 返回字符串(导航条件),直接影响页面导航
Ø 事件监听器处理UI事件
• 通常在form数据被填充给ManagedBean之前调用
• 通常会绕过验证逻辑
• 从不直接影响页面导航
n ActionListener
Ø 在点击按钮、图形映射和附带JavaScript的超链接时调用
Ø 自动提交对应的表单
n ValueChangeListener
Ø 在点击组合框、复选框、单选框、文本框等控件时调用
Ø 不会自动提交对应的表单
Ø Action Controller:在后端程序处理的事件(通常这类事件会涉及业务逻辑)
Ø ActionListener与ValueChangeListener:会对用户界面(UI)产生影响的事件
Ø JSF将上述事件的处理方法划分为ActionController(行为控制器)和事件监听器(ActionListener和ValueChangeListener )
消息
n 简单消息
n 参数化消息
n 国际化消息
n 在WEB-INF/classes下创建一个.properties文件
n 值包含{0}, {1}, {2},等
n 例如,someName=blah {0} blah {1}
n 注意:在Myfaces中赋值不能使用单引号
n 使用f:loadBundle标签装载属性文件
n basename 指定了该文件名
n 使用var指定引用该文件的变量名
n 输出消息使用h:outputFormat标签
n value指定了base message名称
n 其中的f:param标签指定了子属性名称
n 例如:
n h:outputFormat value="#{msgs.someName}">
n <f:param value="value for 0th entry"/>
n <f:param value="value for 1st entry"/>
n </h:outputFormat>
同一路径命令行中使用转换编码命令:
n native2ascii –encoding utf8 messages2_zh_CN.properties messages2_zh_CN.properties