技术开发 频道

JavaServer Faces入门开发实例


IT168技术文档】 
    为什么要使用JavaServer Faces 

    Web应用程序的开发与传统的单机程序开发在本质上存在着太多的差异,Web应用程序开发人员至今不可避免的必须处理HTTP的细节,而HTTP无状态的(stateless)本质,与传统应用程序必须维持程序运行过程中的信息有明显的违背,再则Web应用程序面对网站上不同的使用者同时的存取,其执行线程安全问题以及数据验证、转换处理等问题,又是复杂且难以解决的。 
    
    另一方面,本质上是静态的HTML与本质上是动态的应用程序又是一项违背,这造成不可避免的,处理网页设计的美术人员与程序设计人员,必须被彼此加入至视图组件中的逻辑互相干扰,即便一些视图呈现逻辑以标签的方式呈现,试图展现对网页设计美术人员的亲切,但它终究必须牵涉到相关的流程逻辑。 

    有很多方案试着解决种种的困境,而各自的着眼点各不相同,有的从程序设计人员的角度来解决,有的从网页设计人员的角度来解决,各种的框架被提出,所造成的是各种不统一的标签与框架,为了促进产能的集成开发环境(IDE)难以整合这些标签与框架,另一方面,开发人员的学习负担也不断的加重,他们必须一人了解多个角色的工作。 

    当前用于开发Web应用程序的两种流行的技术是: 
    “快速开发”风格,使用可视化开发环境,如Microsoft ASP.NET。 
    “硬核编码”风格,编写大量支持高性能后端的代码,例如J2EE(即Java 2企业版本)。 

    J2EE是一种很吸引人的平台,它高度可扩展性,可移植到多个平台上,而起获得了很多厂商的支持。另一方面,ASP.NET无需乏味的编程就可以很容易的创建漂亮的用户界面。对程序于来说,当然希望两者都兼有:高性能的后端核容易编程的用户界面。 

    JavaServer Faces的目的就是将快速用户界面开发引入到服务器端Java。 

    如果用户熟悉客户端Java开发,可以将JSF认为是“适用于服务器端应用程序的Swing”。如果以前使用国JavaServer Pages(JSP),则可发现JSF提供了很多JSP开发人员必须自己实现的应用。如果熟悉服务器端框架,例如Struts,则可发现JSP使用的是类似的结构。 

    JSF具有下列部件: 
    -一套预制的UI组件 
    -事件驱动的编程模型 
   - 使得第三方开发者能够支持其他组件的组件模型 
   - JSF提供了事件处理和组件构成所需要的所有代码。很幸运的是,应用程序员可以忽略这些细节,而专注于应用程序的逻辑。

IT168技术文档】 
    JSF优势 

    1.事件驱动模式 

    事件是面向对象方法的重要组成部分,对象之间通过事件进行沟通和交流,使得一个或多个对象能够对另一个对象的行为作出响应,共同合作去完成一项业务逻辑。通常,编写Web程序时,程序员要为对象之间的沟通设计机制,编写代码。虽然沟通的内容属于业务逻辑,但沟通的机制显然与业务没有太大关系,程序员因此为业务逻辑之外的功能浪费了时间。JSF改变了这种状况。JSF的事件和侦听模式与大家熟悉的Javabean的事件模式类似,有Java基础的程序员并不需要学习任何新的东西。JSF的UI组件可以产生事件,例如,当页面上一个文本输入框的内容被修改时,会发出一个“值改变事件”。另一个对象如果对“值改变事件”感兴趣,只需注册为该对象的侦听者,并编写处理例程,即可命令JSF在事件发生时自动调用处理例程。JSF做了所有该做的事,留给程序员的只有业务逻辑代码的编写。 

    2.用户界面到业务逻辑的直接映射 

    3.程序员和网页设计人员的分工 

    4.请求处理生命周期的多阶段划分 

    5.伴随工具而生存 

    6.全面的用户自定义支持 

    7.Web开发的官方标准之一 

    JSF的1.0版本发布于2004年2月份,当时是作为一项独立的Web技术推出的。经过1.1版到现在最新的1.2版,短短的两年多时间,JSF终于在2006年年中成为Java EE 5的组成部分,上升为Web开发的官方标准之一。Java EE 5最重要的使命就是简化Java的开发,而JSF无疑为这一使命立下了汗马功劳。在Web框架层出不穷甚至有些泛滥成灾的今天,Sun以JSF来树立标准,对Java的发展是有益的。Sun在Java领域的领袖地位不容动摇,对于Java程序员来说,始终追随业界领袖的步伐,也许是避免技术落伍的最好方法。

IT168技术文档】 
    实战开发 

    下面来介绍一个简单的JavaServer Faces应用程序示例。 
    该实例的组成部分 
    1. 定义登录和欢迎屏幕的页面,这里是index.jsp和welcome.jsp 
    2. 管理用户数据的bean,这里是UserBean.java,该bean就是一个保露属性的Java类,该类中包括许多setter和getter方法。 
    3. 一个列出bean资源和导航规则的应用程序配置文件。默认时,这个文件为faces-config.xml 
    4. 使得servle容器保持正确的其他必要文件:web.xml 
    5. 开发JSF所用到的jar文件。如:jsf-api.jar,jsf-impl.jar,jstl.jar等。 
    如果我们使用集成开发环境如Eclipse,可以通过建立一个Web项目,并且右击所建的项目,选择Myeclipse->Add JSF Capabilities来导入开发JSF所需要的jar包和建立配置文件faces-config.xml,web.xml等。 

    登录和欢迎界面 
    实例是从登录屏幕开始。如图所示:


   
     在实际的Web应用程序中,这个登录屏幕应该由有经验的Web设计师来美化。 
    
    描述登录屏幕的文件实际上是一个带有一些其他标签的HTML文件,参见程序代码index.jsp。其外观可以很容易的由任何无编程技能的图形师来改善。 
   
     index.jsp
<html> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <f:view> <head> <title>This is the first JSF example!</title> </head> <body> <h:form> <h3> Please enter your name and password </h3> <table> <tr> <td> Name: </td> <td> <h:inputText value="#{user.name}" /> </td> </tr> <tr> <td> Password: </td> <td> <h:inputText value="#{user.password}" /> </td> </tr> </table> <p> <h:commandButton value="Login" action="login" /> </p> </h:form> </body> </f:view> </html>


IT168技术文档】 
    该页面起始于下列标签库声明:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
    JSF实现定义了两套标签,核心标签独立于呈现技术。HTML标签将产生HTML特定的标签。如果希望Web应用程序来呈现页面,以作为一种客户端技术,则必须使用不同的标签库。 

    大量标签是标准的HTML标签:body,table等等。 
    有些标签具有前缀,例如h:inputText和f:view,这些是JSF标签,两个taglib声明说明了JSF标签库。 
    h:inputText,h:inputSecret和h:commandButton标签对应于文本字段,密码字段和提交按钮。 
    输入字段连接到对象属性,如属性value=”#{user.name}”告诉JSF实现将该文本字段于user对象的name属性相连接。user是下面给出UserBean类的一个实例,name是该类的一个属性。 

    标签可以选择任意前缀,例如:h:inputText和f:view。我们使用f作为核心标签,使用h作为HTML标签。 

    多数页面都类似于HTML表单,注意区别: 
    所有JSF标签都包含在f:view标签中。 
    不使用HTML form标签,而是在h:form标签中包含所有JSF组件。 
    不使用熟悉的input HTML标签,而是使用h:inputText,h:inputSecret,h:commandButton。 
    输入字段值绑定到一个bean属性<h:inputText value="#{user.name}"/>,当显示该页面时调用getName()方法来获取当前属性值,当提交该页面时,调用setName()方法来设置用户输入的值。h:commandButton标签具有一个action属性,它的值用来指导导航规则 
    <h:commandButton value="Login" action="login" /> 

    当用户输入name和password并且单击登录按钮时,将显示欢迎界面:


    欢迎信息包括用户名称,该例子中忽略密码。 
    welcome.jsp页面的代码:
<html> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <f:view> <head> <title>This is the first JSF example!</title> </head> <body> <h3> Welcome to JSF : <h:outputText value="#{user.name}"/> </h3> </body> </f:view> </html>
    该页面通过<h:outputText value="#{user.name}"/>中的value="#{user.name}"属性来从UserBean类中的getName()方法得到index.jsp页面所输入的用户名并显示。


IT168技术文档】 
    管理Bean 
    在JSF应用程序中,可以使用bean来访问页面中的所有数据,这些bean是用户界面和应用程序后端之间的导管。 
    UserBean.java:
package jsf; public class UserBean { String name; String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
    导航 
    要完成此JSF应用程序,需要指定当航规则,导航规则告诉JSF实现在提交表单之后,那个页面被发送回浏览器。 

    这里的导航很简单,当用户点击:“Login”登录按钮时,将从index.jsp页面导航到welcome.jsp。可以在faces-config.xml文件中指定这种导航规则:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD
JavaServer Faces Config 1.1//EN
" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <navigation-rule> <from-view-id>/index.jsp</from-view-id> <navigation-case><from-outcome>login</from-outcome> <to-view-id>/welcome.jsp</to-view-id> <redirect /></navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class>jsf.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>
    from-outcome值与index.jsp页面上命令按钮的action属性相匹配: 
    <h:commandButton value="Login" action="login" /> 

    除了导航规则以外,faces-config.xml文件还包括bean的定义,上面代码中的这段是对UserBean的定义:
<managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class>jsf.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>

 

    其中user就是在index.jsp和welcome.jsp页面中使用的用来设置和显示name值的对象bean。即用户界面中的组件的属性中可以使用bean的名称-user,例如index.jsp页面中包含下列标签: 
    <h:inputText value="#{user.name}" /> 

    Value属性指的是user bean(这里是jsf.UserBean)的那么属性。最后范围被指定为session,这意味着bean对象可以用于访问多个页面。使用该Web应用程序的不同用户都会具有该bean对象的不同实例。


IT168技术文档】 
    Web.xml文件的配置 

    当在应用程序上部署JSF应用程序时,需要提供一个配置文件,其名称为web.xml。 
    web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
"> <context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> </web-app>
    这个文件中唯一值得注意的地方就是servlet-mapping,所用JSF页面都是由特定的servlet处理,该servlet是JSF实现代码的一部分。要确保在请求JSF页面时激活正确的servlet,JSF URL使用特殊的格式。在该文件中都有一个扩展名为.faces。例如,不能将浏览器指向http://localhost:8080/JSF/index.jsp,URL应该是http://localhost:8080/JSF/index.faces. servlet使用映射规则来激活JSF servlet,它去除了faces的后缀并加载index.jsp页面。 

    也可以定义前缀映射来代替.faces扩展名映射。在web.xml文件中可是使用下列指令:
<servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
    然后使用http://localhost:8080/JSF/index.jsp。该URL激活此JSF servlet,去除faces前缀并加载/JSF/index.jsp文件。

0
相关文章