JSF 探索 (1)html
虽然JSF已经出来很久了,并且好像感受不是很潮流的框架了,而后当我看见他的时候,我以为他的思想很好,并且随着手机等client多样化的出现,我相信人们
必将从新拾起JSF的思想。java
JSF说白了是事件驱动,web之前的时代我估计大部分都是事件驱动的开发模式,而web的出现,令人们更多关注浏览器上面的渲染,以及servlet和http的操做上。
web2.0的出现,令人们感受在浏览器上的操做更像之前c/s结构的操做,而手机client的热捧更能体现将来多种客户端访问server的模式即将到来,也许你们开始
在想如何作新的框架,其实这种想法已经out了,JSF里面早就有这个思想了,你只须要去关注JSF不就ok了?web
任何《* in action》的书老是让programmer 兴奋,一样JSF in Action也是一本不错的书,让咱们一块儿去看看它把。api
1.JSF 关键词
UI component :静态对象,它保存在server端,其实自己UI Component是javabean对象,他具备javabean具有的属性,methods和events。一般多个component被组织为一个页面的视图浏览器
Renderer:渲染器,renderer被用做渲染component,以及将用户的输入转换为component的值。特别当不一样类型的client端,好比手机,那么对应的就有手机相应格式的renderer。cookie
Validator:负责验证用户输入值的可靠性,单个UI component能够对应一个或多个Validator.session
Backing beans:后台的javabean,作一些逻辑处理什么的,存储component的值,实现事件监听器,他能够引用component。app
Converter:显示转换器,好比时间格式的显示,一个component能够对应一个converter框架
Events and listeners:事件和监听器webapp
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 具体里面的配置属性能够查看配置文件,能够找可视化工具进行配置。