JSF 探索 (1)

虽然JSF已经出来好久了,而且好像感觉不是很潮流的框架了,然后当我看见他的时候,我觉得他的思想很好,而且随着手机等client多样化的出现,我相信人们
必将重新拾起JSF的思想。

JSF说白了是事件驱动,web以前的时代我估计大部分都是事件驱动的开发模式,而web的出现,使人们更多关注浏览器上面的渲染,以及servlet和http的操作上。
web2.0的出现,使人们感觉在浏览器上的操作更像以前c/s结构的操作,而手机client的热捧更能体现未来多种客户端访问server的模式即将到来,也许大家开始
在想如何做新的框架,其实这种想法已经out了,JSF里面早就有这个思想了,你只需要去关注JSF不就ok了?

任何《* in action》的书总是让programmer 兴奋,同样JSF in Action也是一本不错的书,让我们一起去看看它把。

1.JSF 关键词
UI component :静态对象,它保存在server端,其实本身UI Component是javabean对象,他具有javabean具备的属性,methods和events。通常多个component被组织为一个页面的视图

Renderer:渲染器,renderer被用作渲染component,以及将用户的输入转换为component的值。特别当不同类型的client端,比如手机,那么对应的就有手机相应格式的renderer。

Validator:负责验证用户输入值的可靠性,单个UI component可以对应一个或多个Validator.

Backing beans:后台的javabean,做一些逻辑处理什么的,存储component的值,实现事件监听器,他可以引用component。

Converter:显示转换器,比如时间格式的显示,一个component可以对应一个converter

Events and listeners:事件和监听器

Messages:显示给用户的信息

Navigation:一个页面到另外一个页面的向导。


2.JSF请求的六个阶段
Phase 1: Restore View
构建视图页面供用户输入或查看

Phase 2: Apply Request Values
获取请求值

Phase 3: Process Validations
可以对请求值进行验证

Phase 4: Update Model Values
更新back bean 的值

Phase 5: Invoke Application
调用应用,执行相应的监听器

Phase 6: Render Response
将response根据要求进行包装后返回给用户,这里的包装是指知道的页面技术,比如html,比如手机展现技术

3.client and server component id
server component id可以在component 的id属性中显性填写id,以便在服务端能唯一标识该组件
client id 是继承server component id,他最后体现的也是html 中的标签,而id也为对应标签的id,与server component id不同的是,他有继承关系,比如

<form id="myForm" method="post"
action="/jia-standard-components/client_ids.jsf"
enctype="application/x-www-form-urlencoded">
<p>
<input type="text" name="myForm:_id1" />
</p>
<p>
<input id="myForm:inputText" type="text" name="myForm:inputText" />
</p>
...
</form>
而对应的服务端
<p>
<h:outputText id="outputText" value="What are you looking at?"/>
</p>
<h:form id="myForm">
<p>
<h:inputText/>
</p>
<p>
<h:inputText id="inputText"/>
</p>
...
</h:form>

4.JSF EL 表达语言: 他是基于JSTL的描述
此外Jsp中application,session,page 四个scoped变量,只有page jsf中不支持

除了上面三个scoped变量,jsf还有下面一些隐性的变量
applicationScope:从application中获取对象,比如#{applicationScope.myVariable} myVariable对象存放在application中
cookie:从cookie中获取数据
facesContext:这个jsp2.0中没有,当前请求的faceContext实例
header:http head头信息,比如#{header['User-Agent']}
headerValues:多个head头信息的载体 比如#{headerValues['Accept-Encoding'][3]}
initParam:初始化的一些参数比如servlet context initialization parameters 可以这样使用#{initParam.adminEmail}
param:等同jsp中的request.getParameter() 用法#{param.address}
paramValues:等同jsp中的request.getParameterValues 用法#{param.address[2]}
requestScope等同于jsp中reqeust 用法#{requestScope.user-Preferences}
sessionScope等同于jsp中session  用法#{sessionScope['user']}
view 这个变量jsp2.0中没有,它表示当前视图,它有三个属性viewId,renderKitId, and locale 用法#{view.locale}

5.需要的jar包和文件
构建jsf环境需要jsf-api.jar,jsf-impl.jar,jstl.jar,standard.jar 以及配置文件faces-config.xml
需要在web.xml 中配置faceservlet
<web-app>
...
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
...
</web-app>

web.xml 中jsf定义的上下文的参数有
javax.faces.CONFIG_FILES
javax.faces.DEFAULT_SUFFIX
javax.faces.LIFECYCLE_ID
javax.faces.STATE_SAVING_METHOD

RI-specific configuration parameters:
com.sun.faces.NUMBER_OF_VIEWS_IN_SESSION
com.sun.faces.validateXml
com.sun.faces.verifyObjects

比如
<web-app>
...
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/navigation.xml,/WEB-INF/RegistrationWizard.xml</
param-value>
</context-param>
...
<web-app>
除了web.xml jsf相关的参数,本身jsf具有faces-config.xml 具体里面的配置属性可以查看配置文件,可以找可视化工具进行配置。