JSF 體系結構:
JSF 的主要優勢之一就是它既是 Java Web 應用程式的使用者界面标準又是嚴格遵循模型-視圖-控制器 (MVC) 設計模式的架構。使用者界面代碼(視圖)與應用程式資料和邏輯(模型)的清晰分離使 JSF 應用程式更易于管理。為了準備提供頁面對應用程式資料通路的 JSF 上下文和防止對頁面未授權或不正确的通路,所有與應用程式的使用者互動均由一個前端FacesServlet(控制器)來處理。
JSF 生命周期:
FacesServlet 充當使用者和 JSF 應用程式之間的紐帶。它在明确限定的 JSF 生命周期(規定了使用者請求之間的整個事件流)的範圍内工作。
1. 當JSF頁面上的一個事件發生時(比如:使用者單擊了一個按鈕),事件通知通過HTTP發往伺服器。伺服器端使用FacesServet這個特殊的Servlet處理該通知。
2. FacesServlet一接收到使用者的請求就建立一個FacesContext對象(JSF上下文,它存放了應用程式的所有資料)。在處理過程中,主要修改的就是這個FaceContext對象。
3. 接着就是處理過程,處理器是一個叫作Lifecycle的對象。FacesServet把控制權轉交給Lifecycle對象。該對象分6個階段來處理FacesContext對象以生成響應,最後将響應發回用戶端。
Lifecycle對象處理JSP請求所需要的一系列動作稱為請求處理生命周期。過程狀态圖如下:
由于請求處理生命周期裡的應用請求值、處理驗證、更新模型值和調用應用程式等階段都可以在目前的請求對應的FacesContext執行個體中添加事件,是以,JSF實作必須在這些階段後處理這些事件。
階段
說明
恢複視圖
為標明的視圖找到或建立元件樹。
一旦使用者單擊JSP頁面上的連結或按鈕,就會啟動此階段。JSF應用裡的JSP頁面被表示成一個元件樹。JSF實作會進一步将這些元件連結到事件處理程式和驗證程式,并将視圖儲存在FacesContext對象中,以備後面的處理過程所用。FacesContext對象包含了JSF用來管理目前會話中目前請求的GUI元件狀态所需要的所有狀态資訊。
應用請求值
使用請求中發送來的值來更新元件樹的元件值。因為請求中發送來的值都是String類型的,是以在更新元件樹的元件值之前,必須将這些值轉換為相應類型。這個過程也是解碼。若轉換有錯誤,這些錯誤将添加到FacesContext對象。
處理驗證
當每個元件的本地值被更新後,Lifecycle對象都會根據這些注冊元件的驗證規則來驗證這些值的合法性。
如果輸入的值不符合驗證規則,就會将驗證錯誤添加至FacesContext對象,并将元件标記為無效。JSF将轉至呈現響應階段,并顯示帶有驗證錯誤消息的視圖。
如果沒有遇到驗證錯誤,JSF将進入下一階段。
更新模型值
更新與元件相關的背景bean(也叫管理bean)或者模型對象的值。隻有那些與元件值綁定在一起的Bean屬性才會被更新。
調用應用程式
JSF控制器調用應用程式來處理應用程式級的事件,如送出一個表單。(此階段可執行業務邏輯)
呈現響應
使用目前的顯示技術(如JSP)顯示標明的視圖。
一個jsf的執行個體
配置檔案
/JSFLoginDemo/WebRoot/WEB-INF/faces-config.xml
代碼
<?xml version='1.0' encoding='UTF-8'?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
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"
version="1.2">
<managed-bean>
<managed-bean-name>loginBean</managed-bean-name>
<managed-bean-class>
com.qdu.sun.jsf.LoginBean
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>username</property-name>
<property-class>java.lang.String</property-class>
<value></value>
</managed-property>
<property-name>password</property-name>
</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>
<from-outcome>fail</from-outcome>
<to-view-id>/fail.jsp</to-view-id>
</navigation-case></navigation-rule>
<from-view-id>/success.jsp</from-view-id>
</navigation-rule>
<from-view-id>/fail.jsp</from-view-id>
</navigation-rule></faces-config>
前端頁面
/JSFLoginDemo/WebRoot/login.jsp
<%@ page language="java" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSF 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<f:view>
<br>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="username" value="User Name:" />
<h:inputText id="username" value="#{loginBean.username}" required="true" />
<h:message for="username" />
<h:outputLabel for="password" value="Password:" />
<h:inputSecret id="password" value="#{loginBean.password}" required="true" />
<h:message for="password" />
</h:panelGrid>
<h:panelGrid>
<h:panelGroup>
<h:commandButton value="Login" action="#{loginBean.login}" />
</h:panelGroup>
</h:form>
</f:view>
</body>
</html>
背景代碼
/JSFLoginDemo/src/com/qdu/sun/jsf/LoginBean.java
/**
*
*/
package com.qdu.sun.jsf;
* @author sun1
*
public final class LoginBean extends Object {
/**
*
*/
private String password;
private String username;
* @return the password
public String getPassword() {
return password;
}
* @param password the password to set
public void setPassword(String password) {
this.password = password;
* @return the username
public String getUsername() {
return username;
* @param username the username to set
public void setUsername(String username) {
this.username = username;
public String login() {
if ((username == null) || (username.length() < 1))
return "fail";
if ((password == null) || (password.length() < 1))
if ((username.equals("孫更新")) && (password.equals("123")))
return "success";
else
}
}
本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1080797