1JSF详解Word文档格式.docx
《1JSF详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《1JSF详解Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
ApplyRequestValues:
把请求当中的数据设置到控件树当中对应的控件当中去。
iii.
ProcessValidations:
如果某一控件有配置Validator,则这些Validator将对刚设置的数据的正确性和合法性进行验证。
iv.
UpdateModelValues:
控件树上的控件更新其底层所对应的模型。
v.
InvokeApplication:
对产生的事件进行分发。
vi.
RenderResponse:
构建作为响应的控件树。
3.
UI:
控件:
JSF通过标签库,提供了一些主要控件的实现。
包括标签,文本框,单选框,列表等。
由于JSF使用一种类似于UI的方式来组织组件,所以,除了基本的组件以外,还提供了一些用于布局的容器,例如面板等。
在这里有一个要注意的地方就是,一般情况下,页面的内容应该放到JSF提供的view标签里面。
代码:
<
%@pagecontentType="
text/html;
charset=gb2312"
%>
%@tagliburi="
prefix="
f"
h"
html>
head>
title>
Test<
/title>
/head>
body>
f:
view>
h:
form>
panelGridcolumns="
1"
>
outputLabel>
outputTextvalue="
UserID"
/>
/h:
panelGrid>
/f:
/body>
/html>
c)
事件处理:
与Struts不同,由于JSF使用以控件树为中心的方式来处理请求,所以,她提供了一种额外的类似Swing的,事件处理的方式来处理用户的输入事件。
JSF提供了两种事件类型,ActionEvent,用于处理命令和ValueChangeEvent,用于处理数据更改。
模型代码:
packagenick;
publicclassUserActionListenerimplementsActionListener{
publicvoidprocessAction(ActionEventarg0)
throwsAbortProcessingException{
FacesContextcontext=FacesContext.getCurrentInstance();
ValueBindingbinding=Util.getValueBinding("
#{user}"
);
Useruser=(User)binding.getValue(context);
Stringid=user.getId();
}
}
页面代码:
import="
java.util.*"
2"
outputLabelfor="
id"
commandButtonid="
regist"
value="
注册"
actionListenertype="
nick.UserActionListener"
commandButton>
注:
通过嵌套actionListener标签,我们可以为一个控件注册监视器。
4.
数据绑定:
数据绑定要解决的问题就是如何把模型中的值,绑定到页面的控件上。
在JSF当中这可以通过JSF所提供的配置文件来完成。
配置文件:
faces-config>
managed-bean>
managed-bean-name>
user<
/managed-bean-name>
managed-bean-class>
nick.User<
/managed-bean-class>
managed-bean-scope>
session<
/managed-bean-scope>
/managed-bean>
/faces-config>
publicclassUser{
privateStringid="
Nick"
;
publicvoidsetId(Stringid){
this.id=id;
publicStringgetId(){
returnthis.id;
<
inputTextid="
#{user.id}"
<
<
<
通过配置文件,我们把nick.User类绑定到名称user上,然后页面的代码就可以直接使用#{user.xxx}来引用User这个类中的各个字段。
5.
页面流:
页面到控制器:
JSF通过使用方法绑定的方式来定义从页面到控制器的跳转,和数据绑定相同,为了能够正确找到被绑定方法所在的类,我们需要首先在配置文件当中声明managed-bean,然后通过设置控件的action属性,定义页面到控制器的跳转逻辑。
publicStringregist(){
return"
publicStringlogin(){
login"
}
action="
#{user.regist}"
#{user.login}"
登陆"
上述的页面代码,把注册按钮的动作绑定到User类的regist()方法,把登陆按钮的动作绑定到User类的login()方法。
因此,当这两个按钮被点击时,对应的方法将被调用,用于实现页面流的方法,必须声明为public,而且她不接受参数,且返回值必须为String。
控制器到页面:
JSF通过名称绑定的方式,来定义从控制器到页面的跳转。
为了实现从控制器到页面的跳转,我们需要在配置文件当中定义一些<
navigation-rule>
,这些rule主要定义了怎么根据上述action标签所绑定的方法的返回值来查找下一页面。
from-view-id>
/index.jsp<
/from-view-id>
navigation-case>
from-outcome>
regist<
/from-outcome>
to-view-id>
/regist.jsp<
/to-view-id>
/navigation-case>
login<
/login.jsp<
/navigation-rule>
上述的配置文件定义了一个<
,该rule指明了如果“/index.jsp”页面通过她内部的某个控件的action属性发生了跳转,那么当该跳转方法的返回值为字符串“regist”时,则页面将跳转到对应的“/regist.jsp”中,同理,如果返回值为“login”,则页面将跳转到“/login.jsp”。
6.
数据传输:
在JSF的页面代码当中,通过数据绑定,我们把控件的value值,与某个后台的数据bean关联起来。
而在前述的生命周期部分,我们看到,当一个JSF请求到达时,他需要经历RestoreView,ApplyRequestValue等步骤,而ApplyRequestValue部分的工作,就是把请求当中的值绑定到这个后台的bean之中,因此,我们不需要考虑页面中的Form值如何传入到后台的bean当中。
进一步,如果录入控件的value属性,和命令控件的action属性都是绑定在同一个bean上的话,那么在页面跳转时,我们可以直接访问到bean的属性值。
但是为了不污染模型,和实现控制与模型的分离,一般情况下,我们需要把输入控件的value值绑定到数据bean,而把命令控件的action值绑定到控制bean,由于两个bean不是同一个,所以,控制bean需要一种方法来获取数据bean中的属性值。
action<
nick.Action<
packagenick;
privateStringid="
this.id=id;
publicStringgetId(){
returnthis.id;
publicclassAction{
Useruser=(User)
binding.getValue(FacesContext.getCurrentInstance());
…
#{action.regist}"
页面代码当中把输入控件的value绑定到了user的id上,把命令控件的action值绑
定到action的regist上。
当用户点击登陆按钮时,action的regist()方法将会被调用,
而在该方法内部,为了获取之前页面中的信息,我们可以使用ValueBinding类。
该类使用
的数据绑定表达式与页面中的类似。
通过之前的叙述,我们可以发现,当我们需要把数据从控制器传到页面时,我们同样可以使用数据绑定的方式,因为,当我们通过数据绑定表达式,获取到某个页面当中所使用的模型实例时,便可以在该实例上直接调用对应的set()方法,来设定所希望的值。
7.
插件功能:
Converter(转换):
当模型中的某个字段需要在页面上显示时,她需要先被转换为字符串类型;
而用户在页面输入的字符串值,在传到模型中时也需要根据模型对应字段的类型,进行一个转换。
另外,由于国际化的要去,模型中的值在不同的地区会有不同的表示方式。
为了解决以上这些问题,JSF提供了Converter的实现,她主要做的事情就是根据所在的地区,对页面数据和模型数据进行双向的转换。
privateDatedate=newDate();
publicDategetDate(){
returndate;
publicvoidsetDate(Datedate){
this.date=date;
3"
date"
#{user.date}"
convertDateTimepattern="
M/d/yyyy"
inputText>
messagefor="
通过嵌套的convertXXX标签,我们可以为控件配置用于转换的转换器。
我们可以使用两种方式来注册转换器,一是通过控件的convert属性,另外一种就是通过嵌套的convertXXX标签。
如果在转换的时候发生错误,那么JSF将跳过转换以后的步骤,而直接跳到RenderResponse步骤,生成响应,并在FacesContext里添加一个出错的Message,该Message的内容可以通过message标签进行显示。
Validate(验证):
在数据被交付后台处理以前,我们可以通过验证器,来验证输入的数据是否合法,这包括数值的大小,或者是