JSF是基于Java的Web应用程序的服务器端用户接口(UI)组件框架,它提供了一种以组件为中心来开发JavaWeb用户界面的方法,从而简化开发。更重要的是JSF将MVC模型继承到它的体系结构中,确保了程序的可维护性。
二、UI组件、JSTL以及EL表达式
刚刚已经提到JSF是以组件为中心进行开发的,所以在JSF中必定会存在与组件有关的技术。JSF定义了一组UI组件,以及一组标准的API。所以的UI组件都可以直接在页面里使用,而且组件几乎都是HTML form系列标记的翻版。
JSTL(JavaServer Pages Standard Tag Library)是包括了很多JSP公用的核心功能。取代了在JSP应用中融合种类分多的标签,JSTL使用一种单一的标准的标签集合。
JSTL包括循环标签、流程控制标签、操作XML标签、格式化标签、使用SQL的标签和函数标签。
在JSF页面中,主要使用到的标签库是
- <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
- <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
EL表达式是一种特殊的表达式,分为两种:E表达式和L表达式。E表达式是即时表达式,即时表达式意味着页面在第一次调用时,JSP引擎就会计算表达式的值并立即返回结果。L表达式是延迟表达式,意味着不管是否合适,该表达式只能在页面的生命周期以后使用自己的机制计算表达式的值。
关于表达式的计算和赋值,在JSF底层,使用的反射技术实现的。
三、JSFDemo
该例子实现的功能是通过登录页面登录系统,如果登录成功,跳转到登录成功页面,否则跳转到登录失败页面。使用的服务器是JBoss服务器。
login.jsp
- <span style="font-size: 12px;"><%@ page language="java" pageEncoding="GB2312"%>
- <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
- <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Login</title>
- </head>
- <body>
- <f:view>
- <h:form>
- 帐号:<h:inputText value="#{user.username}"></h:inputText><br/>
- 密码:<h:inputSecret value="#{user.password}"></h:inputSecret><br/>
- <h:commandButton value="提交" action="#{user.login}"></h:commandButton>
- </h:form>
- </f:view>
- </body>
- </html>
- </span>
其中
- <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
- <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
是使用JSTL标签库。
第一个是HTML的工具标签(因为组件几乎都是HTML form系列标记的翻版),第二个是核心标签库。
- 帐号:<h:inputText value="#{user.username}"></h:inputText><br/>
- 密码:<h:inputSecret value="#{user.password}"></h:inputSecret><br/>
- <h:commandButton value="提交" action="#{user.login}"></h:commandButton>
使用的是EL表达式中的延迟表达式,因为只有当输入过之后,提交的时候,在利用反射技术,为user实例赋值。并不是立即计算的。
failure.jsp
- <span style="font-size: 12px;"><%@ page language="java" pageEncoding="GB2312"%>
- <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
- <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Failure</title>
- </head>
- <body>
- <f:view>
- 登录失败!<a href="${login.jsp}">点此重新登录</a>
- </f:view>
- </body>
- </html></span>
success.jsp
- <span style="font-size: 12px;"><%@ page language="java" pageEncoding="GB2312"%>
- <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
- <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Success</title>
- </head>
- <body>
- <f:view>
- <h:outputLabel value="#{user.username}"></h:outputLabel><br/>
- 你好!恭喜你登录成功!
- </f:view>
- </body>
- </html></span>
faces-config.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
- <managed-bean>
- <managed-bean-name>user</managed-bean-name>
- <managed-bean-class>edu.cn.beans.User</managed-bean-class>
- <managed-bean-scope>session</managed-bean-scope>
- <managed-property>
- <property-name>username</property-name>
- <property-class>java.lang.String</property-class>
- <value />
- </managed-property>
- <managed-property>
- <property-name>password</property-name>
- <property-class>java.lang.String</property-class>
- <value />
- </managed-property>
- </managed-bean>
- <navigation-rule>
- <from-view-id>/login.jsp</from-view-id>
- <navigation-case>
- <from-outcome>"success"</from-outcome>
- <to-view-id>/success.jsp</to-view-id>
- </navigation-case>
- <navigation-case>
- <from-outcome>"failure"</from-outcome>
- <to-view-id>/failure.jsp</to-view-id>
- </navigation-case>
- </navigation-rule>
- </faces-config>
该配置文件中定义了托管Bean以及Bean的属性,还有就是导航规则,JSF架构会根据该配置文对整个程序件进行管理。
web.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>FacesServlet</servlet-name>
- <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>FacesServlet</servlet-name>
- <url-pattern>/faces/*</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>login.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
该配置文件主要是在客户端访问的时候,web服务器会根据该文件找到相关资源并调用。
User.java
- package edu.cn.beans;
- public class User {
- private String username;
- private String password;
- public User(){
- super();
- }
- public User(String username,String password){
- this.password = password;
- this.username = username;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String login(){
- if(username.equals(password)){
- return "success";
- }
- return "failure";
- }
- }
个人总结:JSF最重要的是faces-config.xml文件。如果该文件中的内容搞清了,那么整个流程就会很清楚,学起来也会很容易,使用起来也会得心应手。