天天看點

JSF架構簡介與執行個體

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

上一篇: MongoDB結合PHP
下一篇: SSH架構整合