【JavaEE】The Introduce of 'JSF'

一、是什么?

       1、定义

       JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化了开发。JavaServer Faces 还引起了广大 Java/Web 开发人员的兴趣。“企业开发人员”和 Web 设计人员将发现 JSF 开发可以简单到只需将用户界面 (UI) 组件拖放到页面上,而“系统开发人员”将发现丰富而强健的 JSF API 为他们提供了无与伦比的功能和编程灵活性。JSF 还通过将良好构建的模型-视图-控制器 (MVC) 设计模式集成到它的体系结构中,确保了应用程序具有更高的可维护性。最后,由于 JSF 是通过 Java Community Process (JCP) 开发的一种 Java 标准,因此开发工具供应商完全能够为 JavaServer Faces 提供易于使用的、高效的可视化开发环境。

       

       2、官网:

       http://jsfcentral.com/     https://javaserverfaces.java.net/


       3、版本:
       JSF 2.2 (2013-04-16) — JSF 2.2 introduced new concepts like stateless views, page flow and the ability to create portable resource contracts.
       JSF 2.1 (2010-10-22) — Maintenance release of 2.0. Only very minor amount of spec changes.
       JSF 2.0 (2009-06-28) — Major release for ease of use, enhanced functionality, and performance. Coincides with Java EE 6.
       JSF 1.2 (2006-05-11) — 核心系统和API改进. Coincides with Java EE 5. Initial adoption into Java EE.
       JSF 1.1 (2004-05-27) — 错误修复,没有更改规范.
       JSF 1.0 (2004-03-11) — 初始规范发布。


       4、组成

        一组JSP页面
        一组后台bean(为在一个页面上的UI组件定义的属性和函数的JavaBean组件)
        应用程序配置资源文件(定义页面导航规则、配置bean和其它的自定对象,如自定义组件)
        部署描述文件(web.xml)
        一组由应用程序开发者创建的自定义对象(有可能)
        一些可能包含自定义组件、约束、转换器或者监听器的对象
        为在页面中表现自定义对象的一组自定义tag

       

        5、主要组件(参考《JSF入门》中文版,下面有链接)

        为了展现UI组件和管理它们的状态,操作事件、服务器端的确认和数据变换;定义页面导航;支持国际化和可访问性;提供对所有特性的可扩展性的API为了在JSP中表示UI组件和拍发组件给服务器端对象的两个JSP自定义tag库。

二、优缺点?

     1、优点

    (1)引入了基于组件和事件驱动的开发模式,使开发人员可以使用类似于处理传统界面的方式来开发Web应用程序(有之前我们敲VB的感觉)。提供了行为与表达的清晰分离。 不用特别的脚本语言或者标记语言来连接UI组件和Web层。JSF技术API被直接分层在Servlet API的顶端。 技术为管理组件状态提供一个丰富的体系机构、处理组件数据、确认用户输入和操作事件。

    (2)JSF确实与后台紧耦合,通过页面的表达式(EL)来访问后台bean的属性与方法。但可以使用Spring bean,可以使用CDI bean,可以使用JSF Managed bean。

    (3)PrimeFaces是一个提高JSF Web应用程序开发效率的开源类库,shoucase  https://www.primefaces.org/showcase/  https://www.primefaces.org/showcase/  https://www.primefaces.org/showcase/ 

          

      2、缺点

    (1)JSF是一套完整的框架,不仅仅是UI,它没有实现前后端分离,恰恰相反,是耦合在一起、
    (2)在JavaEE7中 JSF版本是2.2,它忆放弃使用JSP做为表现层,而是使用了Facelets做为表现层,也是一种基于模板技术的表现层解决方案。
    (3)http://www.aiyiweb.com/javasript/15240 (吐槽,做了JSF很久的人的吐槽)


三、对比JSP和Struts2?

     1、对比JSF和JSP
     (1) JSP是一种构建动态Web应用的组件技术;
     (2)JSF是一种构建动态Web应用的框架技术。

        2、对比Struts2和JSF

        Struts 2和JSF都属于表现层框架,但是它们的框架性质不同,Struts 2框架只是一个单纯的MVC设计模式实现框架,而JSF本质上是一种事件驱动型的组件模型。JSF同微软的ASP.NET更加相似。JSF的应用,使开发Web应用程序同传统的C/S设计(例如Visual Basic模式)更加相似,可以处理Web页面中的单击按钮事件或者是选择下拉框事件等,因为JSF的核心是以事件驱动的。使用JSF开发应用,开发者甚至可以不用去关心传统的Web开发细节(如HTTP),页面的内容或者是操作可以直接对应到服务器端的JavaBean实现类,JSF框架自动将该交互封装在一起。而Struts 2框架则是一个非常传统的MVC设计模式,但是该框架被广大的程序员所熟悉和使用,Struts 2整合JSF,可以使Web开发模式为开发者所接受,同时又可以利用JSF完整的封装性能。


四、一个Demo

      1、在eclipse中新建web项目

      2、在Web应用程序的/WEB-INF/lib目录下,添加以下jar文件:

* jsf-impl.jar
* jsf-api.jar
* commons-digester.jar
* commons-collections.jar
* commons-beanutils.jar
* jstl.jar
* standard.jar
       3、配置web应用程序的web.xml文件,使用JSF时,所有请求通过FacesServlet来处理,web.xml定义如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
	<description>
		JSF Demo
	</description>
	<display-name>JSF Demo</display-name>
	<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>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>
       在上面的定义中,我们将所有.faces 的请求交由 FaceServlet 来处理,FaceServlet 会唤起相对的.jsp 网页,例如请求是/index.faces 的话,则实际上会唤起/index.jsp 网页,完成以上的配置,就可以开始使用 JSF 了。
       此时,完成了项目的创建,web.xml的配置,接下来就是开发程序了,设计一个简单的登录程序,使用者提交名称,之后由程序显示使用者名称以及欢迎信息。

       1、编写一个JavaBean 

package onlyfun.caterpillar;
public class UserBean {
	private String name;
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}
       这个Bean将存贮使用者的名称,编译好之后放置在/WEB-INF/classes下

       2、设计页面流程

      登入网页/pages/index.jsp ,用于使用者填入名称并提交表单之后在/pages/welcome.jsp中显示Bean中的使用者名称与欢迎信息。同时为了让JSF知道Bean以及页面流程,定义一个/WEB-INF/faces-config.xml:

      (1)faces-config.xml

<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
	<navigation-rule>
	<from-view-id>/pages/index.jsp</from-view-id>
		<navigation-case>
			<from-outcome>login</from-outcome>
			<to-view-id>/pages/welcome.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	<managed-bean>
		<managed-bean-name>user</managed-bean-name>
		<managed-bean-class>
			onlyfun.caterpillar.UserBean
		</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
</faces-config>
        在<navigation-rule>中,我们定义了页面流程,当请求来自<from-viewid>中指定的页面,并且指定了<navigation-case>中的<from-outcome>为login时,则会将请求导向至<to-view-id>所指定的页面。在<managed-bean>中我们可以统一管理我们的Bean, 我们设定Bean对象的存活范围是session,也就是使用者开启浏览器与程序互动过程中都存活。接下来要告诉网页设计人员的信息是,他们可以使用的Bean名称,即<managed-bean-name>中设定的名称,以及上面所定义的页面流程。
       (2)index.jsp

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@page contentType="text/html;charset=GB2312"%>
<html>
	<head>
		<title>第一个 JSF 程序</title>
	</head>
	<body>
		<f:view>
			<h:form>
				<h3>请输入您的名称</h3>
				名称: <h:inputText value="#{user.name}"/><p>
				<h:commandButton value="送出" action="login"/>
			</h:form>
		</f:view>
	</body>
</html>
        在<html>之前使用了JSF的core与html标签库,core是有关于UI组件的处理,而html则是有关于HTML的进阶标签。
        <f:view>与<html>有类似的作用,当您要开始使用JSF组件时,这些组件一定要在<f: view>与</f:view>之间,就如同使用HTML时,所有的标签一定要在<html>与< /html>之间。
        html标签库中几乎都是与HTML标签相关的进阶标签, <h:form>会产生一个表单,我们使用<h: inputText>来显示user这个Bean对象的name属性,而<h:commandButton>会产生一个提交按钮,我们在action属性中指定将根据之前定义的login页面流程中前往welcome.jsp页面。

       (3)welcome.jsp

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@page contentType="text/html;charset=GB2312"%>
<html>
	<head>
		<title>第一个 JSF 程序</title>
	</head>
	<body>
		<f:view>
			<h:outputText value="#{user.name}"/> 您好!
			<h3>欢迎使用 JavaServer Faces!</h3>
		</f:view>
	</body>
</html>
        之后,通过配置你的tomcat,就可以进行访问了,注意,url的末尾,不是index.jsp,而是index.faces。

         Addition:在html页面中,使用了JSF的EL表达式(Expression Language),这里需要区别JSF的EL表达式以及JSP的EL表达式:

#{expression} //JSF的EL
${expression} //JSP的EL


四、附注

       1、入门教程: 《JSF入门》简体中文版.pdf

       2、最新版本的javadoc API (JavaServer Faces API 2.2):https://javaserverfaces.java.net/nonav/docs/2.2/javadocs/index.html   

     3、博客学习: http://blog.csdn.net/martinchong/article/details/53844185 

       这门技术,在官网上的资料比较晦涩,想要学习的网友,可以多去论坛,ITeye就不错。

 



评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值