1. 简介
- JSF技术是Sun公司在2004年发布的用于开发Web应用的框架。当前版本是2.2,由JSR344规范定义。它是Java EE 7推荐的Web标准框架。Mojarra(https://javaserverfaces.java.net/)是Oracle官方采用的JSF的参考实现,其他的参考实现还有Apache基金的MyFaces(http://http://myfaces.apache.org/)。
- 受到Sturts、Tapestry等开源框架的影响,JSF是采用了MVC架构。
- 受到Swing组件模型的启发,JSF使得开发人员从组件、事件、模型的角度开发web应用,而不用再管http请求和响应等背后的事情。
2. Hello JSF
- 环境:JDK7 or JDK8 + Netbeans 8 + Glassfish 4
- 开发过程:
- 新建Java Web项目,选择Web应用程序
- 输入项目名称hello-jsf
- 修改上下文路径为hellojsf
- 选择JavaServer Faces框架,然后点击下面的配置标签,确认使用的页面语言为Facelets
- 点击完成
- 右击hello-jsf项目,选择运行,Netbeans会自动启动Glassfish服务器并部署项目,启动完毕后会自动打开浏览器,并显示Hello from Facelets,该页面的地址为localhost:8080/hellojsf
- 添加功能
- 将index.xhtml中的Hello from Facelets修改为Hello #{user.name}
- 创建User类,代码如下:
-
package teaching.jsf; import javax.annotation.PreDestroy; import javax.enterprise.context.RequestScoped; import javax.inject.Named; @Named //等价于@Named("user") @RequestScoped public class User { private String name = "JSF"; public String getName() { return name; } }
- 保存代码后,Glassfish会对项目进行增量部署,或者你也可以再次运行项目。
- 打开浏览器,输入localhost:8080/hellojsf,你将可以看到:Hello JSF
- 代码解释
- #{user.name}是一个EL表达式,用于或取user bean的name属性。
- User类是一个CDI bean,它具备了CDI bean的一些特征:
- Name为user,用来匹配页面中出现的EL表达式,如#{user.name}。默认情况下,Name为bean类的首字母小写后对应的名字,也可以通过@Named("myUser")来指定,这样页面中的EL表达式就要写成#{myUser.name}。
- Scope为RequestScoped,表示服务器端的Web容器会在接收到http请求后,根据#{user.name}创建一个User实例,获取其name属性的值,生成html页面并发出http响应,然后销毁该user实例。
- 项目配置文件
- web.xml: 此项目的部署文件。为了使用JSF,必须声明一个类型为javax.faces.webapp.FacesServlet的Servlet,具体代码请参见web.xml。
- 注意Faces Servlet的url-pattern为/faces/*,这样FacesServlet只接收来自匹配/faces/*的页面请求,也可以替换为*.xhtml、*.jsf或其他模式,但不能为/*或*。另外,faces只是个前缀,并不是物理文件夹。例如,在访问根据目录下的index.xhtml页面时,其对应的url为http://.../hellojsf/faces/index.xhtml,而不是http://.../hellojsf/index.xhtml。
- 在web.xml中,还可以指定一个PROJECT_STAGE参数,表示你当前项目的状态。如果为Development,当出现错误时,JSF为显示更加详细的调试信息。当项目真正部署时,可以将此参数改为Production。
- glassfish-web.xml: 定义与应用服务器相关的一些参数。在本例中,我们通过<context-root>指定项目根目录的名称。此文件由Netbeans自动生成,一般情况下不用修改。
- web.xml: 此项目的部署文件。为了使用JSF,必须声明一个类型为javax.faces.webapp.FacesServlet的Servlet,具体代码请参见web.xml。
3. 总结
- 通过例1,我们可以知道JSF的工作原理:
- 在服务器启动时,会启动一个Faces Servlet用来拦截用户请求。
- 当我们请求index.xhtml页面时,相应的Http请求就会被FacesServlet所拦截,它会对此请求进行若干处理,其中一步就是创建一个User实例,并获取其name属性的值。处理结束后,生成对应的html页面,返回给客户端。然后销毁此User实例,因为其Scope为RequestScoped。当收到Http请求时被创建,当发送Http响应后被销毁,这就是User对象的生命周期。
- 客户端(浏览器)接受由服务器端返回的Http响应并显示。
- JSF是一个采用MVC架构的框架。在例1中,index.xhtml充当V的角色,FacesServlet充当C的角色,而User则充当M的角色。这三种角色划分得非常清楚,没有一点耦合。
时间: 2024-12-22 04:18:05