SlideShare a Scribd company logo
1 of 61
Download to read offline
。式方合整的際實及以,色角的居所             ,下架框
                                       S pring            Web
的 它 其 合 結 在 看 看 來 將,中 節 小 個 這 在,等 、   是 像,架 框
                                    J SF   Struts
Web 的 它 其 合 結 以 可 也,下 之 架 框
                          Web MVC的供提   用使不在  Spring
    。現實術技層 的己自義定以可至甚您,案方的術技層
                   View
  同不了供提還
View        ,外之層S pring 為作術技 了除,籤標
                           View              JSP
的供提    及 以 合 結 以 可,時 術 技 層 為 作 用 使 當
       Spring   JSTL                  View          JSP
       View 層方案、Web 框架整合
       8
8 2
                     作實    JSTL   供提站網方官        8.1 Java   圖
                        :                 http://java.sun.com/products/jsp/jstl/
:作實     JSTL
          得取站網方官           在可,     Java括包中之       JSTL                Java EE
                                       。碼式程 寫撰接直                     Java
       JSP
中面頁 於是不而,成生的輯邏面頁助協來 用運以可,時 為                           JSTL                 JSP
術技層    View
          的 用 使 所 當 ,起一 在 雜 混 碼 式 程 與 籤標上 面 頁 得 使 會 這 , 法
方好是 不 並 碼 式 程 寫 撰   Java          scriplet        JSP
                           用 使 上 在接直 , 面 畫 的 同 不 示 顯
來果結的理處據根須必時面頁果結現呈,後之求請的者用使完理處在
                                                               8.1.1 結合 JSTL
         JSTL
。供 提來 由則輯邏現呈的面頁於至,用使合結架框                                          Spring MVC Web
與可籤標的供提所  ,籤 標 的 供 提S pring及以)                Spring           Standard Tag Library
J avaServer Pages   JSTL
        ( 合結 以 可 , 時 術 技 層    為作                       View        JSP   用使當
                              8.1 結合 JSTL 與 Spring 標籤
                )   – http://openhome.cc           良信林(冊手術技              Spring 2.0
Chapter 8 View          、案方層   W eb   合整架框

                得取個幾供提中」
          D ownloads                   「在 JSTL    載下接直以可您,式方的                    Java
EE            載下僅者或,作實 括包有就中當,
                       JSTL                      Jakarta Taglibs Standard tag
載下前先您果如。中 至入加
library                與      的中當將,
                       jstl.jar   standard.jar            lib
在,    到找下錄目
     Spring     在以可也,本版依相是                 的 lib/j2ee                 jstl.jar
         。      到找以可則中錄目
lib/jakarta-taglibs                          standard.jar

件條有行進來能功的 與      合 結 , 例範的 整 完 個 一 範 示 下 以
                                         Spring         JSTL
            :別類            寫撰 先 首 , 現 呈 面 頁 的
                           HelloController


    JSTLSpringDemo                                          HelloController.java
package onlyfun.caterpillar;

import    javax.servlet.http.HttpServletRequest;
import    javax.servlet.http.HttpServletResponse;
import    org.springframework.web.servlet.mvc.Controller;
import    org.springframework.web.servlet.ModelAndView;

public class HelloController implements Controller {
    private String viewPage;

     public ModelAndView handleRequest(HttpServletRequest req,
                                     HttpServletResponse res)
                                        throws Exception {
         String user = req.getParameter("user");
         Integer age = new Integer(
                 Integer.parseInt(req.getParameter("age")));

          java.util.Map model = new java.util.HashMap();
          model.put("name", user);
          model.put("age", age);

          return new ModelAndView(viewPage, model);
     }

     public void setViewPage(String viewPage) {
         this.viewPage = viewPage;
     }
}



                                                                                   8 3
Spring 2.0   良信林(冊手術技         – http://openhome.cc      )

  ,中件物    至 定 設並, 數 參 求 請 集 收 的 單簡是 只 , 中 式 程 個 這 在           Model
  以可性屬         的                       ,中檔義定在著接
                   I nternalResourceViewResolver     "viewClass"
     :如例,                                        為定設
         org.springframework.web.servlet.view.JstlView


      JSTLSpringDemo                                          mvc-config.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

       <bean id="viewResolver"
             class="org.springframework.web.servlet.
                      → view.InternalResourceViewResolver">
           <property name="viewClass"
                value="org.springframework.web.servlet.view.JstlView"/>
           <property name="prefix" value="/WEB-INF/jsp/"/>
           <property name="suffix" value=".jsp"/>
       </bean>

       <bean name="/hello.do"
             class="onlyfun.caterpillar.HelloController">
           <property name="viewPage" value="hello"/>
       </bean>

  </beans>



  現呈的輯邏面頁作   用 使 中 當 個 這 在 , 面頁試 測 的 單 簡 個 一 寫 來   JSTL
     :句語迎歡示顯會才,時 於等於大   "age"    在有 只 面 頁 定 設 , 斷 判
                                       18


      JSTLSpringDemo                                               hello.jsp
  <%@ page language="java" contentType="text/html; charset=BIG5"
      pageEncoding="BIG5"%>
  <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <head>



8 4
Chapter 8 View     、案方層     W eb    合整架框

<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>JSTL And Spring</title>
</head>
<body>
    <c:choose>
        <c:when test="${age >= 18}">
            <h1> , <c:out value="${name}"/>
               嗨                              </h1>
                                               !
        </c:when>
        <c:otherwise>
            <h1>
               !喔歲八十滿未      </h1>
        </c:otherwise>
    </c:choose>
</body>
</html>



   : 面 畫 果 結 的 時 行 執個一 看 看 來 並 , 數 參 求請定 給 上 列 址 網 在 接 直



                   圖   8.2 JSTLSpringDemo   果結行執的案專

8.1.2 <spring:bind> 標籤

單表 與 面 頁 供 提 , 合 結件組 的 關 相 與 以 可 , 庫 籤 標 的 訂 自 供 提
   Spring
作實中節         以 邊 這 在 ,幅 篇 省 節 為 , 能 功 定 綁據 數 的 息 訊 誤 錯 、 件 物7.2.7
籤標        的
    SimpleFormDemo入 加,充 擴 改 修 行 進 來 案 專            Spring的過   <bind>
                   form.jsp       :        下一改修先首,能功
 SpringBindDemo                                                     form.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
    pageEncoding="BIG5"%>



                                                                           8
Spring 2.0   良信林(冊手術技            – http://openhome.cc   )

  <%@taglib prefix="spring"
             uri="http://www.springframework.org/tags"%>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=BIG5">
  <title>Login Form</title>
  </head>
  <body>
      <h1>  單表入登  </h1>
      <spring:bind path="command.*">
           <font color="red">
               <b>${status.errorMessage}</b>
           </font><br>
      </spring:bind>

      :碼密與稱名者用使入輸請         <p>
      <form name="loginform"
            action="/SpringBindDemo/login.do"
            method="post">

            <spring:bind path="command.username">
            稱名  <input type="text"
                        name="${status.expression}"
                        value="${status.value}"/><br>
            </spring:bind>

            <spring:bind path="command.password">
            碼密  <input type="password"
                        name="${status.expression}"
                        value="${status.value}"/><br>
            </spring:bind>

          <input type="submit" value="    定確   "/>
      </form>
      。中面頁個這到回再會誤錯入輸:意注
  </body>
  </html>



      <spring:bind>   的   "path" 稱名 個 這 , 稱 名 件 物 單 表 的 定 綁 要 定 設 性 屬
  在定設是      " loginController"   是稱名設預,性屬
                                      "commandName"                的中
8 6
Chapter 8 View   、案方層   W eb   合整架框

關相有 所 上 件 物 單 表 定 綁 示 表 , 時
"command"                              為定設當,
                             "command.*"
訊誤錯的定設中    " status"  示顯會
                        "errorMessage"  的         ,據數的
                                               Controller
                      。明說再會中作實的
                Controller                    在會待這,息
,性 屬                  了定綁,位欄
                       "username"        於對,中單表在
                                              "command.username"
單表示顯則
"status"       而,稱名性屬的定綁示顯會
              "expression"                      的      "value"
樣這,         到 回 會 後 敗失入 登 在 式 程 的 計 設 邊這, 值 的 存 儲 所 中 件 物   form.jsp
                。 值 的入輸 前 之 與 息 訊 誤 錯 示顯上 面 頁 個 一 同 在 以 可
中案專                  對以可,籤標定綁的上
                 form.jsp                     合配了為
                                                SimpleFormDemo
LoginController              :正修些一作別類
  SpringBindDemo                                     LoginController.java
package onlyfun.caterpillar;

import     org.springframework.validation.BindException;
import     javax.servlet.http.HttpServletRequest;
import     javax.servlet.http.HttpServletResponse;
import     org.springframework.web.servlet.mvc.SimpleFormController;
import     org.springframework.web.servlet.*;

public class LoginController extends SimpleFormController {
    public LoginController() {
        setCommandClass(LoginForm.class);
    }

     protected ModelAndView onSubmit(Object command,
                                   BindException errors)
                                        throws Exception {
        LoginForm form = (LoginForm) command;

           if("caterpillar".equals(form.getUsername()) &&
                  "123456".equals(form.getPassword())) {
              return new ModelAndView(getSuccessView(),"user",
                                       form.getUsername());
           }
           else {



                                                                       8 7
Spring 2.0   良信林(冊手術技              – http://openhome.cc      )

                 // 回返  Form   例實    的    errors
                                         個一有要,時面頁  Model
                 errors.reject("loginfail", "
                              誤錯碼密或稱名者用使                             ");
               return new ModelAndView(getFormView(),
                                       errors.getModel());
           }
       }
  }


        用使次這以所,件物
      Spring                        個一要需定綁籤標
                                      B indException                       o nSumit()
  ,法方         用使中               在 , 時 敗 失證驗 當 , 本 版 個 一 另 的
                                               BindException       reject()
  ,        是個一第,數參個兩受接                , 據數的 入 輸 次 這 絕 拒 示 表
                                   r eject()                          error code
  中檔         的定設到會這,) 考參(
               MessageSource               3.4.2  定設有果如            .properties
  定設有沒果如,息訊的應對相出找以, ) (鍵 為
      error code    "       K ey      "                   依
     。 出 輸 息 訊 誤 錯 為 作值的 定 設 所 數 參 個 二 第 用 使 則 ,
  MessageSource

  儲所       用使前之,件物 個一傳回法方
      errors     getModel()                      的 Map                reject()
  會後之,                給定設 之 將 , 中 件 物 個 這在括 包 就 息 訊 誤 錯 的 存ModelAndView
                                  。 出 輸 上籤標 在 息 訊 定 綁 為 理 處
           與都,等檔義定與別類、頁網 的現呈中書在沒下剩
                              JSP                                    SimpleForm-
  來,容內案檔關相的中案專
  Demo                               考參行自請,同相案專
                                     SpringBindDemo
                          :容內示顯的
                        form.jsp              前入登有沒還看看




                     圖   8.3 SpringBindDemo        一之果結行執的案專
8 8
Chapter 8 View   、案方層   W eb   合整架框

輸前之與息訊誤錯將籤標定綁,容內的下以示顯會則,誤錯入登果如
                  : 上 籤 標的應 對 在 示 顯 料 資 的 入




                    圖   8.4 SpringBindDemo   二之果結行執的案專

8.1.3 數據綁定的幾個方法

與性屬個一的件物單表定綁次一以可您。法方的定綁據數個幾看看來
                          :如例,值數
...
<spring:bind path="command.username">
稱名  <input type="text"
             name="${status.expression}"
             value="${status.value}"/><br>
</spring:bind>

<spring:bind path="command.password">
碼密  <input type="password"
             name="${status.expression}"
             value="${status.value}"/><br>
</spring:bind>
...


     "expression"   而,稱名性屬的定綁被示顯會                value   屬的定綁被示顯則
。值性
                                                                    8
Spring 2.0   良信林(冊手術技             – http://openhome.cc      )

       定綁麼這是者或             Command   :
  ...
  <spring:bind path="command">
  稱名  <input type="text"
               name="username"
               value="${command.username}"/><br>

  碼密  <input type="password"
               name="password"
               value="${command.password}"/><br>
  </spring:bind>
  ...


        用前之,息訊誤錯於對                 BindException   的中   reject()   法方個這,法方
  用使以可,息訊誤錯位欄定特分區會不並                               rejectValue()   誤錯入加來法方
                 :息訊
  rejectValue(String field, String errorCode,
                Object[] errorArgs, String defaultMessage)
  rejectValue(String field, String errorCode,
                String defaultMessage)


  數參         , 性 屬的件 物 單 表 定 指 您 讓 數 參 的
       rejectValue()       field                                   e rrorCode
  , 元字位 佔 的 中 案 檔 源 資 定 指 於 用 數 參
                       "   "            , 鍵 的中案檔源資定指
                               e rrorArgs
  : 下如子 例 用 使 個 一 。 息 訊的現 呈 要 所 時 案 檔 源 資到不 找 是 則 息 訊 設 預 而
  ....
  public void ModelAndView(....,
                       BindException errors) throws Exception {
       ...
       errors.rejectValue("username",
                       "error", null, "     誤錯稱名者用使");
       ...
       errors.rejectValue("password", "error", null, "       ");
                                                             誤錯碼密
       return new ModelAndView(



8 1
Chapter 8 View   、案方層    W eb   合整架框

                   this.getFormView(), errors.getModel());
}
...


      : 息 訊 現 呈 來 籤 標 定綁用 使 以 可 , 息 訊 之 入加中 段 片 式 程 的 面 上 如
...
<spring:bind path="command.username">
稱名  <input type="text"
             name="${status.expression}"
             value="${status.value}"/><br>
<font color="red">${status.errorMessage}</color>
</spring:bind>

<spring:bind path="command.password">
碼密  <input type="password"
             name="${status.expression}"
             value="${status.value}"/><br>
<font color="red">${status.errorMessage}</color>
</spring:bind>
...


錯了定綁被上性屬個一同果如,位欄的關相至定綁會息訊誤錯的應相
訊出輸來 配搭,出取             用使以可則,息訊誤
                    ${status.errorMessages}           JSTL
                           :如例,息
...
<spring:bind path="command.username">
稱名  <input type="text"
             name="${status.expression}"
             value="${status.value}"/><br>
<c:if test="${status.error}">
    <font color="red">
      :誤錯<br>
        <c:forEach items="${status.errorMessages}"
                     var="error">
            <c:out value="${error}"/><br>
        </c:forEach>
    </font>



                                                                8 11
Spring 2.0   良信林(冊手術技          – http://openhome.cc   )

 </c:if>
 </spring:bind>
 ...


                    用使以可也,息訊誤錯有否是試測於用可
       ${status.error}                                        <spring:
 hasBindErrors>          : 如例, 容 內 些 某 出 輸 否 是 定 決 來
 ...
 <spring:hasBindErrors>
       。。。正更請,誤錯的下以現發
     ......
 </spring:hasBindErrors>
 ...


       :如 例 , 息 訊 誤 錯 的 有所出 輸 次 一 , 性 屬 件 物單表 分 區 不 以 可 也 者 或
 ....
 <spring:bind path="command.*">
      <font color="red">
       :誤錯 <br>
          <c:forEach items="${status.errorMessages}"
                       var="error">
              <c:out value="${error}"/><br>
          </c:forEach>
      </font>
 </spring:bind>
 ...




 8.1.4 <spring:message> 標籤

           用使以可    <spring:message>             合結籤標
                                                ResourceBundleMessage-
 Source 示顯上頁網在,                         在如例,息訊字文的中
                         m essages.properties                m essages.
       :下如義定中
 properties




8 12
Chapter 8 View   、案方層   W eb   合整架框

  MessageTagDemo                                 messages.properties
welcome=Hello, {0} {1}. Welcome to Spring.



    得記    messages.properties     在須必案檔 Classpath   在放如例,下徑路的
         ,下
/WEB-INF/classes/       B ean   入加要中檔義定      ResourceBundleMessage-
Source    :如例,義定的
  MessageTagDemo                                      mvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="urlMapping"
          class="org.springframework.web.servlet.
                    → handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/index.do">indexController</prop>
            </props>
        </property>
    </bean>

    <bean id="viewResolver"
          class="org.springframework.web.servlet.
                    → view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="messageSource"
          class="org.springframework.context.
                    → support.ResourceBundleMessageSource">
        <property name="basename" value="messages"/>
    </bean>

    <bean id="indexController"



                                                                 8 13
Spring 2.0   良信林(冊手術技              – http://openhome.cc   )

                   class="org.springframework.web.servlet.
                         mvc.ParameterizableViewController">
                         →
           <property name="viewName" value="index"/>
       </bean>

  </beans>



          了用使接直邊這在            ParameterizableViewController   請的者用使發轉來
 :示所下如容內的頁網,頁網
       index.jsp   至求
   MessageTagDemo                                                  index.jsp
  <%@ page language="java" contentType="text/html; charset=BIG5"
      pageEncoding="BIG5"%>
  <%@taglib prefix="spring"
            uri="http://www.springframework.org/tags"%>

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=BIG5">
  <title>Message Tag Demo</title>
  </head>
  <body>
    <h1><spring:message code="welcome" arguments="Justin,Lin"/></h1>
  </body>
  </html>



       "arguments"  代 取 別 分 會, 隔 分 號 逗 以 , 數 引 的 定 指 中          messages.pro-
 perties   :示所 下 如 果 結 行 執 頁 網 的 面 上 , 元 字 位 佔 等 、 的 應 對 中
                   {0}       { 1}




                     圖   8.5 MessageTagDemo    果結行執的案專

8 14
Chapter 8 View     、案方層          W eb   合整架框

8.1.5 <spring:transform> 標籤

     Spring   的              之籤標
                  <spring:transform>          於位須必籤標      <spring:bind>
            PropertyEditor              配搭,中
                             所您 為 換 轉 值 性 屬 的     將以可,話的用使
                                                   Command
                                 。式格串字的要
一期星,示表字數的期星了存儲中          設假 , 子 例 的 際 實 個 舉
                               Command
望希您而然,示表 用使日期星…示表 用使二期星,示表 用使
      "1"                      "2"                       "0"
,樣字等   、 、      是的示顯上單表在以可,時單表寫填在            "MON"     " THU"    " WED"
                 。 換 轉 成 完 您幫動 自 式 程 用 使 望 希 您
   : 到 值數參求請集收,別類             個一計設先以可
                       WeekForm                                 "0"     "6"


    TransFormTagDemo                                              WeekForm.java
package onlyfun.caterpillar;

public class WeekForm {
    private String weekNumber;

     public void setWeekNumber(String weekNumber) {
         this.weekNumber = weekNumber;
     }

     public String getWeekNumber() {
         return weekNumber;
     }
}



     weekNumber     設以可著接,值數參求請的類之 、 、 是的存儲
                              "1"    " 2"   " 3"
 個一計                到   、
        WeekPropertyEditor   為值數參些這換轉來別類                     "MON"       " TUE"
:
"SUN"




                                                                                  8 1
Spring 2.0   良信林(冊手術技        – http://openhome.cc   )

   TransFormTagDemo                           WeekPropertyEditor.java
  package onlyfun.caterpillar;

  import java.beans.PropertyEditorSupport;

  public class WeekPropertyEditor extends PropertyEditorSupport {
      public void setAsText(String text) {
          if("MON".equals(text)) {
              setValue("1");
          }
          else if("TUE".equals(text)) {
              setValue("2");
          }
          else if("WED".equals(text)) {
              setValue("3");
          }
          else if("THU".equals(text)) {
              setValue("4");
          }
          else if("FRI".equals(text)) {
              setValue("5");
          }
          else if("SAT".equals(text)) {
              setValue("6");
          }
          else if("SUN".equals(text)) {
              setValue("0");
          }
          else {
              setValue("");
          }
      }

       public String getAsText() {
           if(this.getValue() != null
                   && !(this.getValue() instanceof String)) {
               return "";
           }

          String text = (String) this.getValue();




8 16
Chapter 8 View    、案方層    W eb   合整架框

         if("1".equals(text)) {
             return "MON";
         }
         else if("2".equals(text))   {
             return "TUE";
         }
         else if("3".equals(text))   {
             return "WED";
         }
         else if("4".equals(text))   {
             return "THU";
         }
         else if("5".equals(text))   {
             return "FRI";
         }
         else if("6".equals(text))   {
             return "SAT";
         }
         else if("0".equals(text))   {
             return "SUN";
         }
         else {
             return text;
         }
     }
}



     義定新重須必,時     計設在
            Controller                   initBinder()   的訂自冊註以法方
             :如例,
PropertyEditor


    TransFormTagDemo                         WeekFormController.java
package onlyfun.caterpillar;

import org.springframework.web.servlet.
                                mvc.SimpleFormController;
import org.springframework.web.servlet.*;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.springframework.validation.BindException;
import org.springframework.web.



                                                                  8 17
Spring 2.0   良信林(冊手術技         – http://openhome.cc   )

                                bind.ServletRequestDataBinder;

  public class WeekFormController extends SimpleFormController {
      private Map refData;

       public WeekFormController() {
           setCommandClass(WeekForm.class);

           refData = new HashMap();

           List list = new ArrayList();
           for(int i = 0; i < 7; i++) {
               list.add(String.valueOf(i));
           }

           refData.put("weekNumbers", list);
       }

       protected ModelAndView onSubmit(Object command,
                      BindException errors) throws Exception {
          WeekForm form = (WeekForm) command;

           if(form.getWeekNumber() == null) {
              return new ModelAndView(this.getFormView());
           }
           else {
              return new ModelAndView(
                      this.getSuccessView(), errors.getModel());
           }
       }

       protected Map referenceData(
              HttpServletRequest request) throws Exception {
           return refData;
       }

       protected void initBinder(HttpServletRequest request,
                 ServletRequestDataBinder binder) throws Exception {
           super.initBinder(request, binder);
           binder.registerCustomEditor(
                   String.class, new WeekPropertyEditor());
       }
  }



8 18
Chapter 8 View      、案方層     W eb   合整架框

,值串字的 到 好備準會,時
             WeekFormController              構建在  "0"   "6"
,示顯上面頁在以,件物 的值串字些這括包傳回會法方
referenceData()                             Map
    合配再,
     initBinder()        的訂自了冊註中                 於由
                                  WeekPropertyEditor              <spring:
面頁,字文等
transform>      、     示顯上面頁在以可就,籤標     "SUN"      " MON"
  :寫撰 的 輯 邏 面 頁 助 協 來 了 配 搭 中 當 , 示 所 下 如 計 設 的
form.jsp                             JSTL


  TransFormTagDemo                                                form.jsp
<%@page language="java" contentType="text/html;charset="BIG5"
<pageEncoding="BIG5"%>
<%@taglib prefix="c"
                 uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="spring"
                 uri="http://www.springframework.org/tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
    <head>
        <meta http-equiv="Content-Type"
              content="text/html; charset=BIG5">
        <title>JSP Page</title>
    </head>
    <body>
    <spring:bind path="command.*">
        <font color="red">
            <c:out value="${status.errorMessage}"/>
        </font>
    </spring:bind>

     <form name="weekForm"
           action="/TransFormTagDemo/weekForm.do"
           method="POST">
         <spring:bind path="command.weekNumber">
             <select name="weekNumber">
                 <c:forEach var="weekNumber"
                            items="${weekNumbers}" >
                     <spring:transform value="${weekNumber}"
                                           var="weekName"/>
                     <c:choose>

                    <c:when test="${status.value == weekName}">




                                                                       8 1
Spring 2.0   良信林(冊手術技         – http://openhome.cc   )

                      <option value="<c:out value="${weekName}"/>"
                                          selected>
                      </c:when>
                      <c:otherwise>
                      <option value="<c:out value="${weekName}"/>">
                      </c:otherwise>

                      </c:choose>
                          <c:out value="${weekName}"/>
                      </option>
                  </c:forEach>
              </select>
          </spring:bind>
          <input type="submit" value="Submit"/>
      </form>
      </body>
  </html>



       Bean       在以所, 了用使於由,寫撰下如檔義定     JSTL            InternalResource-
  ViewResolver:別類    用使以可上定設的
                  "viewClass"    的              JstlView


      TransFormTagDemo                                     mvc-config.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

       <bean id="viewResolver"
             class="org.springframework.web.servlet.
                     →   view.InternalResourceViewResolver">
           <property name="viewClass"
               value="org.springframework.web.servlet.view.JstlView"/>
           <property name="prefix" value="/WEB-INF/jsp/"/>
           <property name="suffix" value=".jsp"/>
       </bean>

       <bean name="/weekForm.do"
             class="onlyfun.caterpillar.WeekFormController">
           <property name="formView" value="form"/>




8 2
Chapter 8 View           、案方層    W eb   合整架框

        <property name="successView" value="success"/>
    </bean>

</beans>


    到 連,話 的 式 程 行 執 您 果 如            form.jsp   :容內的下以示顯會,時




                     圖   8.6 TransFormTagDemo    果結行執的案專

8.1.6 Spring 2.0 的 form 標籤

    、     括包,籤標 組一了增新中
    Spring 2.0                    form                < form:form> <form:input>     、
  取提以可,時頁網單表計設在您便方,籤標等
<form:password>                                                           Command
在要,籤標 的新       用使想,中頁網在示顯並值的件物           Spring 2.0        form               JSP   網
                         :上加上頁
<%@ taglib prefix="form"
           uri="http://www.springframework.org/tags/form" %>


  用使下以           Spring 2.0   的   form   寫改,籤標        8.1.2   的   SpringBindDemo    專
:    的中案
       form.jsp




                                                                                8 21
Spring 2.0   良信林(冊手術技           – http://openhome.cc      )

   FormTagDemo                                                        form.jsp
  <%@ page language="java" contentType="text/html; charset=BIG5"
      pageEncoding="BIG5"%>
  <%@ taglib prefix="form"
              uri="http://www.springframework.org/tags/form" %>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=BIG5">
  <title>Login Form</title>
  </head>
  <body>
      <h1>        </h1>
                   單表入登
           :碼密與稱名者用使入輸請        <p>
      <form:form>
                <form:input path="username" /><br>
                    :稱名
                    :稱名
                    :稱名
                    :稱名
                <form:password path="password" />
                    :碼密
                    :碼密
                    :碼密
                    :碼密
           <input type="submit" value="   "/> 定確
                                              定確
                                              定確
                                              定確
      </form:form>
  </body>
  </html>



       在,面頁的上以          < form:form>   的下以生產將,份部的籤標              HTML   :容 內
 <form id="command" method="post" action="/FormTagDemo/login.do">
       :稱名<input id="username" name="username" type="text" value=""/><br>
       :碼密<input id="password" name="password" type="password" value=""/>
     <input type="submit" value="     "/>
                                       定確
 </form>


       ,位欄入輸字文生產來用
         < form:form>    ,中           在
                           < form:input>                          < form:pass-
 件物
 word>   定指來用定設的性屬 ,位欄入輸碼密生產來用      " path"                    Command
 考參別分將         與     ,中 例 範 個 這 在 如 例,性 屬 的
                                 < form:input>     < form:password>
   LoginForm。性屬    與       的例實
                         username         至
                                       password




8 22
Chapter 8 View   、案方層      W eb   合整架框

     <form:form>    的設預   " commandName"        是稱名" command"   自您果如,
了定設行      Controller 的   "commandName"       在要則,性屬             籤標
                                                          < form:form>
   的" commandName" 如例,       " commandName"   為定設若                 :
                                                        " loginForm"
…
     <form:form commandName=”loginForm”>
        :稱名   <form:input path="username" /><br>
        :碼密   <form:password path="password" />
         <input type="submit" value="    "/>
                                        定確
     </form:form>
…


 的紹介所邊這了除                        等
                         < form:form>     、      、
                                        < form:input>   < form:password>
 於應對有還,外之籤標              HTML    、        是像,籤標的件元入輸    < form:checkbox>
  、
<form:radiobutton>               以可例範些一,單簡很都上用使在,等
                       < form:select>
件文考參   考參接直
          Spring                        。容內的
                            13.9.2 The form tag




                                                                         8 23
Spring 2.0     良信林(冊手術技             – http://openhome.cc     )

 8.2 其它 View 技術
 個這在,別類 的己自立建或,術技層 的它其用使以可還您      View                        View
 作實何如範示來面畫果結 訂自以並,術技層 為作 範示節小
               Tiles       View                       Pdf
 View                    。別類

 8.2.1 以 Tiles 為例

 )      ( 配的頁網讓以可,
          置
       Tiles         )             ( 引版模個一是
                                    擎
                                   T emplate Engine                      L ayout
  面 版 個 一 供 提 , 離 分 料資的 現 呈 要 際 實 與 ) 籤 標
                 <table>                     用使是像(            T iles
  ,置 配 面 版 的 頁 網 理 管 用 使 層      的
                           Spring        在以可您,制機理管
                                         View         Tiles
                          定設是一,定設須必作動本基個兩有這     org.springframework.web.servlet.
 view.tiles.TilesView          定設是二,     org.springframework.web.servlet.view.
 tiles.TilesConfigurer          :如例,
   TilesViewDemo                                                  mvc-config.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

        <bean id="viewResolver"
              class="org.springframework.web.servlet.
                          view.InternalResourceViewResolver">
                           →
            <property name="viewClass" value="org.springframework.
                          web.servlet.view.tiles.TilesView"/>
                           →
        </bean>

        <bean id="tilesConfigurer"
              class="org.springframework.web.servlet.view.
                          tiles.TilesConfigurer">
                           →
            <property name="definitions">
               <list>



8 24
Chapter 8 View   、案方層       W eb   合整架框

                <value>/WEB-INF/tiles-defs.xml</value>
            </list>
        </property>
    </bean>

    <bean name="/welcome.do"
          class="org.springframework.web.servlet.
                       →  mvc.ParameterizableViewController">
        <property name="viewName" value="welcome"/>
    </bean>

</beans>



的定設中       的回傳您,後之
                TilesView 定設到意注             ModelAndView
名的義定所中檔義定
"view"     在是而,置位   的源資是不並稱名
                         URL                Tiles
設      的             ,例為定設的面上以,稱
                      P arameterizableViewController      "viewName"
  ,定設     的關相找中檔定設 到會則,
    "welcome"          Tiles         為定         "welcome"          T iles
假,定設來性屬     的        由以可 置 位 取 讀 的 檔 義 定
                        TilesConfigurer   "definitions"
  Tiles           :的定設麼這是檔義定 設
  TilesViewDemo                                           tiles-defs.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
 "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
 "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

<tiles-definitions>
    <definition name=".myLayout"
                  path="/WEB-INF/jsp/tiles/myLayout.jsp">
      <put name="title" value="Sample Page Title"/>
      <put name="header" value="/WEB-INF/jsp/tiles/header.jsp"/>
      <put name="menu" value="/WEB-INF/jsp/tiles/menu.jsp"/>
      <put name="footer" value="/WEB-INF/jsp/tiles/footer.jsp"/>
      <put name="body" value="/WEB-INF/jsp/tiles/body.jsp"/>
    </definition>

    <definition name="welcome" extends=".myLayout">
      <put name="title" value="Tiles 面頁試測   "/>



                                                                       8 2
Spring 2.0   良信林(冊手術技       – http://openhome.cc   )

      </definition>
  </tiles-definitions>



 在,時點逗個有頭開稱名,              個一義定先首,中檔義定在
                                ".myLayout"
 ,義定頁網的料資現呈要正真個一是不而,義定面版個一示表上例慣名命
 項     了義定新重並,義定的
 "welcome"                    承繼以可義定
                          ".myLayout"                         "title"
 中檔義 定 是 的 取 讀 會 上 際 實 , 時
              view          為若稱名的 回傳在,目
                             "welcome"
 "welcome"                      。定設的
  : 置配的面版計 設來格表 用使中當,的 寫撰麼 這 是
          myLaout.jsp                設假
   TilesViewDemo                                         myLayout.jsp
  <%@ page language="java" contentType="text/html; charset=BIG5"
      pageEncoding="BIG5"%>
  <%@taglib prefix="tiles"
               uri="http://jakarta.apache.org/struts/tags-tiles"%>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=BIG5">
  <title><tiles:getAsString name="title"/></title>
  </head>
  <body>
      <table border="0" width="100%" cellspacing="5">
          <tr>
               <td colspan="2">
               <tiles:insert attribute="header"/>
               </td>
          </tr>
          <tr>
               <td width="140" valign="top">
               <tiles:insert attribute="menu"/>
               </td>
               <td valign="top" align="left">
               <tiles:insert attribute="body"/>
               </td>
          </tr>



8 26
Chapter 8 View      、案方層   W eb   合整架框

        <tr>
             <td colspan="2">
             <tiles:insert attribute="footer"/>
             </td>
        </tr>
    </table>
</body>
</html>



   header   、   m enu   、   b ody   、   f ooter   等   JSP   :寫撰下如的單簡面頁
 TilesViewDemo                                                           header.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
    pageEncoding="BIG5"%>
<center><h1>Tiles View    <h1> </center>
                                範示


 TilesViewDemo                                                                menu.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
     pageEncoding="BIG5"%>
<li>件文學教    </li>
<li> 區論討  </li>
<li>  的我 Blog</li>
<li>站網薦推    </li>




 TilesViewDemo                                                                body.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
    pageEncoding="BIG5"%>
     Hello World
               的寫         Brian Kernighan
                          在是現出的       個一第    "A Tutorial Introduction
to the Language B"
字文                        B
         將來用它,)身前的言語 是言語 (中籍書     C                   Hello World
第作當它將的次數無經已,上籍書或件文學教言語式程的多很,後之此自,上幕螢腦電在示顯
                                  。式程例範個一



                                                                                  8 27
Spring 2.0   良信林(冊手術技            – http://openhome.cc        )

   TilesViewDemo                                                       footer.jsp
  <%@ page language="java" contentType="text/html; charset=BIG5"
      pageEncoding="BIG5"%>
  <center> 有所權版  (c)http://www.caterpillar.onlyfun.net/</center>



               有要須必,話的 用使要
              Tiles                                   、
                                       commons-beanutils.jar commonslogging.
 jar            、
       c ommons-collections.jar      、                 、
                                      c ommons-digester.jar   s truts.jar     個四
                                                                              .jar
             在以可都案檔
                 .jar         些這,案檔         Spring   中案檔載下            lib   的錄目
          。到找下錄目 及錄目
 jakarta-commons             struts

 得 取 會 則,     到 接 連 果 如,定 設 的 上 以 照 按    /welcome.do               Tiles    中檔義定
 welcome  :容內的下以示顯是果結,義定的




                        圖   8.7 TilesViewDemo   果結行執的案專
 在如例(面頁個一每在是料資些一有果如                                  Header   您,的現出要都)處
       :寫撰麼這中     在以可
         header.jsp


 <%@ page language="java" contentType="text/html; charset=BIG5"
     pageEncoding="BIG5"%>
 <center><h1>Tiles View    <h1> </center>
                             範示
 <H1>${someData}</H1>




8 28
Chapter 8 View    、案方層   W eb   合整架框

示顯能要了為              ${someData}   個一每在須必則,料資          Controller   定設中
 :如例,值性屬
...
Map model = new HashMap();
...
model.put("someData", data);
...


 定設,時回傳       在著接
           ModelAndView                   model       個一每,件物   Controller
有個一每在會才,述描些這入加須必都中                          Tiles 示顯能都面頁的定設
${someData} 。
承繼以可您,法方的單簡更個有還過不                            org.springframework.web.
servlet.view.tiles.ComponentControllerSupport       承繼它,別類        Tiles   的
              義定新重以可您,別類
ControllerSupport                        ComponentControllerSupport       的
doPerform()         :如例,法方
...
public class HeaderControllerSupport
                    extends ComponentControllerSupport {
    protected void doPerform(
                        ComponentContext componentContext,
                        HttpServletRequest request,
                        HttpServletResponse response)
                                            throws Exception {
        ApplicationContext context = getApplicationContext();
            SomeData someData =
                   (SomeData) context.getBean("someData");

        componentContext.putAttribute("someData", someData);
    }
}




                                                                          8 2
Spring 2.0   良信林(冊手術技         – http://openhome.cc    )

   在      Tiles   得 取 都 面 頁個一 每 以 可 就 , 定 設 麼 這 以 可 中 檔 義 定     someData
  :了值的
  <?xml version="1.0" encoding="UTF-8" ?>
  <!DOCTYPE tiles-definitions PUBLIC
   "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
   "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

  <tiles-definitions>
      <definition name=".header"
                    path="/WEB-INF/jsp/tiles/header.jsp"
                    controllerClass="onlyfun.caterpillar.
                                    → HeaderControllerSupport"/>

       <definition name=".myLayout"
                     path="/WEB-INF/jsp/tiles/myLayout.jsp">
         <put name="title" value="Sample Page Title"/>
         <put name="header" value=".header"/>
         <put name="menu" value="/WEB-INF/jsp/tiles/menu.jsp"/>
         <put name="footer" value="/WEB-INF/jsp/tiles/footer.jsp"/>
         <put name="body" value="/WEB-INF/jsp/tiles/body.jsp" />
       </definition>

      <definition name="welcome" extends=".myLayout">
        <put name="title" value="Tiles   面頁試測 "/>
      </definition>
  </tiles-definitions>




  8.2.2 自訂 View Class

                                     承繼以可您                     自
                     org.springframework.web.servlet.view.AbstractView
         生 產 以 邊 這 ,術 技 層 的 需 所 生 產 以,別 類 訂
      View                      View                     Pdf   ,例為果結的
                                  承繼接直以可
                         org.springframework.web.servlet.view.document.
  :如例,法方
  AbstractPdfView       義定新重並,別類       buildPdfDocument()




8 3
Chapter 8 View   、案方層       W eb   合整架框

    PdfViewDemo                                      CustomPdfView.java
package onlyfun.caterpillar;

import   com.lowagie.text.Document;
import   com.lowagie.text.Paragraph;
import   com.lowagie.text.pdf.PdfWriter;
import   java.util.Map;
import   javax.servlet.http.HttpServletRequest;
import   javax.servlet.http.HttpServletResponse;
import   org.springframework.web.servlet.
                    view.document.AbstractPdfView;

public class CustomPdfView extends AbstractPdfView {
    protected void buildPdfDocument(Map model,
                        Document document,
                        PdfWriter writer,
                        HttpServletRequest request,
                        HttpServletResponse response)
                                      throws Exception {
        String header = (String) model.get("header");

         Paragraph headerParagraph =
                      new Paragraph(header);
         headerParagraph.font().setSize(20);
         document.add(headerParagraph);

         String content = (String) model.get("content");
         Paragraph contentParagraph =
                         new Paragraph(content);
         document.add(contentParagraph);

         String copyright = (String) model.get("copyright");
         Paragraph copyrightParagraph =
                               new Paragraph(copyright);
         copyrightParagraph.setAlignment(
                                Paragraph.ALIGN_BOTTOM);
         document.add(copyrightParagraph);
     }
}




                                                                    8 31
Spring 2.0   良信林(冊手術技         – http://openhome.cc     )

       在設假    Controller   了供提中   Model   :件物料資
      PdfViewDemo                                    PdfController.java
  package onlyfun.caterpillar;

  import   java.util.HashMap;
  import   java.util.Map;
  import   javax.servlet.http.HttpServletRequest;
  import   javax.servlet.http.HttpServletResponse;
  import   org.springframework.web.servlet.ModelAndView;
  import   org.springframework.web.servlet.mvc.Controller;

  public class PdfController implements Controller {
      public ModelAndView handleRequest(HttpServletRequest req,
                          HttpServletResponse res) throws Exception {
          Map model = new HashMap();
          model.put("header", "Pdf View Test");
          model.put("content", "This is content for pdf view test.");
          model.put("copyright", "caterpillar.onlyfun.net");

            return new ModelAndView("customPdfView", model);
       }
  }



       在而   Bean   :的計設麼這是中檔義定
      PdfViewDemo                                           mvc-config.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

       <bean id="viewResolver"
             class="org.springframework.web.servlet.
                       → view.BeanNameViewResolver"/>

       <bean id="customPdfView"



8 32
Chapter 8 View        、案方層   W eb   合整架框

           class="onlyfun.caterpillar.CustomPdfView"/>

    <bean name="/pdf.do"
          class="onlyfun.caterpillar.PdfController"/>

</beans>



括包下錄目            在得記
           / WEB-INF/lib             itext   上接連則,案檔 的
                                             . jar                 /pdf.do
   : 面 畫果結 的 下 以 示 顯 會 , 時




                    圖   8.8 PdfViewDemo   果結行執的案專




                                                                      8 33
8 34
      。載下行進                 http://struts.apache.org
                                至以可則,作實                                    Struts
的新最載下要想果如,案檔的供提所下錄目 中案檔載下                       lib
                                                用使                Spring
接直而,案檔關相           Strtus
            載 下 何 如 紹 介 再 不 ,制限 的 幅 篇 於 基 邊 這 在
                   。 份 部 個 這 過 略接直 以 可 , 式 方 寫 撰 的
Struts
   解了經已您果如,例範合整的           與          Struts
                                 習練際實以可也,中      Spring
8.3.2
  的來下接利以,式程                 Struts
                  個一第寫撰何如解了速快您讓在的目,容
內的排安所者讀的           Struts
           過觸接未對針是,門入的式程                  個一第            Struts
                                              8.3.1 第一個 Struts 程式
                          。起一在合整
Spring   Struts
   與 將何如及以,門入的 下一紹介來將,中節小個這在,點       Struts
優其為富豐件文,多員人用使但,聲之議非的良不計設多許有前目                                              Struts
使即,發開行進           Struts
          用使案專的多當相有界業在,案專的起發月 年                                             3
2000
  於      Craig McClanahan
            由,架框     的久悠史歷是            Web MVC                     Struts
                                              8.3 整合 Struts 框架
                  )   – http://openhome.cc      良信林(冊手術技           Spring 2.0
Chapter 8 View           、案方層         W eb   合整架框




                                   圖   8.9 Struts   站網方官
   在別分以可,檔 的下以要需,說來式程 Struts    個一第於對                    . jar                          Spring
,案檔 些這到找錄目 與    lib          下錄目 的案檔載下
                               jakarta-commons       struts                      .jar
     與    在以 可 也 , 本 版 依 相 是
                        Spring 的載下前先您果如                          lib/struts     lib/jakarta-
-commons              :案檔些這到找下錄目
   struts.jar

   commons-beanutils.jar

   commons-digester.jar

   commons-collections.jar

   commons-logging.jar

       (器制控端前任擔,中
         Struts     在                         F ront Controller           是的)  org.apache.
    在須必您,別類
struts.action.ActionServlet                            web.xml      定指並,義定以加中
Struts:如例,稱名與置位的案檔定設
  FirstStrutsDemo                                                                    web.xml
<?xml version="1.0" encoding="UTF-8"?>



                                                                                           8 3
Spring 2.0   良信林(冊手術技        – http://openhome.cc      )

  <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">
      <session-config>
          <session-timeout>
              30
          </session-timeout>
      </session-config>

       <!-- Standard Action Servlet Configuration -->
       <servlet>
           <servlet-name>action</servlet-name>
           <servlet-class>
               org.apache.struts.action.ActionServlet
           </servlet-class>
           <init-param>
               <param-name>config</param-name>
               <param-value>
                   /WEB-INF/struts-config.xml
               </param-value>
           </init-param>
           <load-on-startup>1</load-on-startup>
       </servlet>

      <!-- Standard Action Servlet Mapping -->
      <servlet-mapping>
          <servlet-name>action</servlet-name>
          <url-pattern>*.do</url-pattern>
      </servlet-mapping>
  </web-app>



 名與置位的案檔定設       定設來用性屬
       ActionServlet   "config" 的             Struts
 分來       由 交 會 都 , 求 請 的 對 有 所,中 定 設 的 上 以 在 , 稱
                                  *.do                  ActionServlet
                                。理處件物制控給配



8 36
Chapter 8 View     、案方層       W eb   合整架框

          Struts           承繼是作實的件物制控,中  在
                                         org.apache.struts.action.Action
得取將 , 中 作 實 的 下 以 在 如 例 , 成 完 來 法 方
                     execute()      義定新重並,別類
    :件物          的態型 給定設並,值數參求請
            "user"                      的者用使
                                         Map           Model


    FirstStrutsDemo                                      HelloAction.java
package onlyfun.caterpillar;

import    java.util.*;
import    javax.servlet.http.*;
import    org.apache.struts.action.Action;
import    org.apache.struts.action.ActionForm;
import    org.apache.struts.action.ActionForward;
import    org.apache.struts.action.ActionMapping;

public class HelloAction extends Action {
    public ActionForward execute(ActionMapping mapping,
                                   ActionForm form,
                                   HttpServletRequest request,
                                   HttpServletResponse response)
                                                  throws Exception {
        String username = request.getParameter("user");

            Map model = new HashMap();

            if(username != null) {
                model.put("username", username);
            }
            else {
                model.put("username", "nobody");
            }

            request.setAttribute("userInfo", model);

            return mapping.findForward("helloUser");
      }
}




                                                                        8 37
Spring 2.0    良信林(冊手術技           – http://openhome.cc       )

                         由須必,後之成完理處求請在
                                     org.apache.struts.action.ActionMapping
   的中檔義定            是       ,址位的面頁現呈詢查來
                              A ctionMapping        Struts              <action-
 :的 寫 撰 何 如 是 檔 義 定
 mappings>            下一看來,表代例實的義定        Struts


   FirstStrutsDemo                                           struts-config.xml
  <?xml version="1.0" encoding="UTF-8" ?>
  <!DOCTYPE struts-config PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
   "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
   <struts-config>
      <action-mappings>
          <action
              path="/hello"
              type="onlyfun.caterpillar.HelloAction">
              <forward
                   name="helloUser"
                   path="/WEB-INF/jsp/hello.jsp"/>
          </action>
      </action-mappings>
  </struts-config>



 為徑路求請定設性屬  Struts    的籤標     ,中檔義定
                              < action>在           "path"
 而,求 請 的 者 用 使 理 處 來
 hello.do                 給交將
                 A ctionServlet     ,時HelloAction
 詢查法方
 <forward>          的件物        用使定設籤標
                              ActionMapping             findForward()
 中           在如例,址位的面頁現呈個一下的知告要所,時稱名                             HelloAction
 由將,後畢完理處求請此因,
 findForward()               是稱名的定設
                                  "helloUser"
   :示所下如寫撰的
 /WEB-INF/jsp/hello.jsp,面畫果結現呈來                 h ello.jsp


   FirstStrutsDemo                                                   hello.jsp
  <%@ page language="java" contentType="text/html; charset=BIG5"
      pageEncoding="BIG5"%>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=BIG5">



8 38
Chapter 8 View     、案方層    W eb   合整架框

<title>Struts Demo</title>
</head>
<body>
    <H1>Hello, ${userInfo["username"]} !</H1>
</body>
</html>



    將是只頁網
   hello.jsp            request   中   Map   的件物   "username"   出示顯料資
: 示 所下如 面 畫 行 執 個 一 , 來



                 圖   8.10 FirstStrutsDemo   果結行執的案專




                                                                   8 3
Spring 2.0     良信林(冊手術技           – http://openhome.cc    )


           於關有    Struts    的 上 站 網 我 考 參 以 可,紹 介 的 盡 詳 更   Struts   :件 文
           http://caterpillar.onlyfun.net/Gossip/Struts/StrutsGossip.htm




  8.3.2 在 Struts 中整合 Spring

  的   道知    讓是就法方的要主,用使合結
        Struts      Spring  與要                            Struts       Spring
  關賴依的件組寫撰接直中式程在免避,件組的關相理管
                 Spring       讓以,在存
                               。立建係
    冊註籤標      用使中  Struts 的  在要先首
                              struts-config.xml      <plug-in>              org.
          :
  springframework.web.struts.ContextLoaderPlugIn

  ...
        <plug-in className="org.springframework.web.
                    → struts.ContextLoaderPlugIn">
            <set-property property="contextConfigLocation"
                         value="/WEB-INF/beans-config.xml, /WEB-INF/..."/>
        </plug-in>
  ...


  的    是一之法方, 的理管所       得取以可法方個幾有
                                 Spring           Bean                 Struts
  類個這,
  Action                      承繼改
                    org.springframework.web.struts.ActionSupport
            的它用使以可,作實的別類象抽
        Struts     Action     的    是別                    getWebApplication-
  容    得取步一進後然,例實的
  Context()                 得取來
                          ApplicationContext                           Spring
                 Bean :如例,例實 的理管所器
  ...
  public class SomeAction extends ActionSupport {
      public ActionForward execute(ActionMapping mapping,
                                  ActionForm form,
                                  HttpServletRequest req,
                                  HttpServletResponse res)



8 4
Chapter 8 View     、案方層     W eb   合整架框

                                                       throws Exception {
          ApplicationContext context =
                                           getWebApplicationContext();

          SomeBean bean = (SomeBean) context.getBean("some");
          ...
          return mapping.findForward("view");
      }
}
...


到得 可 並 ,       作 實來承 繼 過 透 , 慣 習 用 使 的
                      Struts                 合符式方種這        Action
一在合耦 的
Spring             與     是就處壞但,處好的係關件組理管      Spring   Struts   API
管       用 善 有 沒 並 這 ,輯邏 的 件 物 依 相 得 取 了 括 包 中
             Action                              且而,起                  Spring
                                           。處好的入注賴依理
,別類       象抽的己自它承繼接直    Struts     的
                                  Action   讓是式方個一另               Action
管      為成也件物
      Spring          讓,件 物
                      Struts        的
                                 Action     理管來     讓但
                                                 Action                Spring
如例,件物依相入注式方的入注賴依用使接直以可就來一麼這, 的理
      Bean
      :別類             的中案專
                      FirstStrutsDemo        下一改修新重以可
                                                 HelloAction


  StrutsSpringDemo                                         HelloAction.java
package onlyfun.caterpillar;

import    java.util.*;
import    javax.servlet.http.*;
import    org.apache.struts.action.Action;
import    org.apache.struts.action.ActionForm;
import    org.apache.struts.action.ActionForward;
import    org.apache.struts.action.ActionMapping;

public class HelloAction extends Action {
    private UserChecker userChecker;

      public ActionForward execute(
                               ActionMapping mapping,
                               ActionForm form,
                               HttpServletRequest request,


                                                                            8 41
Spring 2.0   良信林(冊手術技         – http://openhome.cc    )

                                 HttpServletResponse response)
                                      throws Exception {
            String username = request.getParameter("user");
            username = this.getUserChecker().check(username);

            Map model = new HashMap();
            model.put("username", username);
            request.setAttribute("userInfo", model);

            return mapping.findForward("helloUser");
        }

        public UserChecker getUserChecker() {
            return userChecker;
        }

        public void setUserChecker(UserChecker userChecker) {
            this.userChecker = userChecker;
        }
  }



       中其   UserChecker   :示所下如義定的別類
      StrutsSpringDemo                                 UserChecker.java
  package onlyfun.caterpillar;

  public class UserChecker {
      public String check(String username) {
          if(username != null) {
              return username;
          }
          else {
              return "guest";
          }
      }
  }




8 42
Chapter 8 View     、案方層        W eb   合整架框

中      的
    UserChecker在 要您, 件 物 查 檢 限 權 的 層 務 商 擬 模               Struts     Action
以 可, 入 注 賴 依 作 您 為 來
        UserChecker     由 交 以 可 這, 例 實 的 Spring 到用使
    在如例,理管
   HelloAction       給交都例實的
                  UserChecker               與     將
                                              Spring                      Bean
                                          :義定麼這中檔義定
  StrutsSpringDemo                                         beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="userChecker"
          class="onlyfun.caterpillar.UserChecker"/>

    <bean name="/hello"
          class="onlyfun.caterpillar.HelloAction">
        <property name="userChecker" ref="userChecker"/>
    </bean>

</beans>



,時求請配分在
    Action        麼那,理管的        入納已在現例實的
                               Spring                Struts
代至配分先,前之           的定指至配分要求請當,制機理代間中個一有要          Action
將並 , 求 請 理 處 來 例 實    的理管所 Spring    知通件 物 理 代 由 , 件 物 理
                                          Action
     在以可這,         給回返 件 物 理 代 由 再 , 件物理 代 給 回 返 果 結 理 處
                                                  Struts                struts-
config.xml                              用使中
                      org.springframework.web.struts.DelegatingAction-
Proxy                          :如例,理代作來例實的
  StrutsSpringDemo                                     struts-config.xml
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts-config PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"




                                                                           8 43
Spring 2.0   良信林(冊手術技             – http://openhome.cc      )

   "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
   <struts-config>
      <action-mappings>
          <action
              path="/hello"
              type="org.springframework.web.
                           → struts.DelegatingActionProxy">
              <forward
                   name="helloUser"
                   path="/WEB-INF/jsp/hello.jsp"/>
          </action>
      </action-mappings>

      <plug-in className="org.springframework.web.
                               → struts.ContextLoaderPlugIn">
          <set-property property="contextConfigLocation"
                        value="/WEB-INF/beans-config.xml"/>
      </plug-in>
  </struts-config>



                         入加籤標
                           <plug-in>     了用使中檔義定在ContextLoaderPlugIn   定指並,
   Spring      Bean        。稱名與置位之檔義定 的                   了
 ,     為定設性屬            的
            beans-config.xml         中
                                   HelloAction      意注
                                                  "name"                "/hello"
    <action>  ,         為定設須必也性屬
                      "path"                的中    "/hello"則  D elegatingAction-
 兩 在夫功 花 要 是 就 點 缺 的 法 方 個 這 , 例 實
 Proxy                         Action   到找來個這著藉是
 結的行 執 , 成 完 改 修 邊 這 到 案 專               。對 比 稱 名 的 檔 義 定 個
                          S trutsSpringDemo
                              。 面 畫 的 圖下 一 考 參 以 可 面 畫 果
                           8.10


                  Spring               的      用使以可您
                                org.springframework.web.struts.Delegating-
             在,
 RequestProcessor              的 Struts代取來RequestProcessor       strutsconfig.xml
                                                    :義定中



8 44
Chapter 8 View   、案方層    W eb   合整架框

...
<plug-in className="org.springframework.web.
                → struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation"
                  value="/WEB-INF/beans-config.xml"/>
</plug-in>

<controller processorClass="org.springframework.web.
                → struts.DelegatingRequestProcessor"/>
...


將接直以可,次一這                Struts   的   Action   在寫稱名別類                   ,
                                                        struts-config.xml
:如例 , 覺 直 較 比 會 來 看
...
<action path="/hello"
            type="onlyfun.caterpillar.HelloAction"/>
...


    楚 清 較 比 了 為 是 只 來出 寫 撰,定 設 的 性 屬
                         "type"            到用使會不並上實事
Action         : 了 以 可 就 樣這要 只 法 寫 的 潔 簡 , 別 類 個 一 哪 了 用 使
...
<action path="/someAction"/>
...


至 配 分求 請 將 件 物 理 代 由 會 ,時 配 分 求 請 當 , 的 樣 同                Bean   中檔義定
             。例實
               / hello   的) (稱名同相有具
                           Action




                                                                       8 4
8 46
               :載下行進                   com/j2ee/javaserverfaces/download.html
h ttp://java.sun.              J ava
            站網方官 至以可案檔考參作實的 ,案檔關相的作實                        JSF
JSF載 下 何 如 紹 介 再 不, 制 限 的 幅 篇 於 基 邊 這 在 , 了 括 包           JSF            Java EE
                                    。 份 部個這 過 略 接 直 以 可 , 式
           JSF
方寫撰的 解了經已您果如,例範合整的 與                              JSF
                                              習練際實以可也     Spring
      8.4.2                             JSF
, 中 的 來 下 接 利 以 , 式 程 個 一 第 寫 撰 何如解 了 速 快 您 讓 在 的 目
                           JSF
,容 內 的 排 安 所 者 讀 的 過 觸 接 未 對 針 是 , 門 入 的 式 程 個 一 第                 JSF
                                                   8.4.1 第一個 JSF 程式
       。      Spring     JSF
            與 合整何 如 及 以 , 式 程 用 應 個 一 第 發 開 何 如 紹         JSF
介來將,中節小個這在,發開式程 手上速快以可也,員人的發開式程           Web
窗視面桌慣習讓,型模發開的式程用應窗視面桌似類供提,面介者用使構
建速快式方的曳拖以上境環發開合整援支並,件元)                    ( 的              U ser Interface    UI
                 View      Web
用 使 複 重 可 層 的 供提,點 特 術 技 的 有 現商廠 家 各 合 綜,準 標 術
技個一的出提所)               J ava Community Process
                           ( 為                      JCP     JavaServer Faces
                                                    8.4 整合 JSF 框架
                    )   – http://openhome.cc       良信林(冊手術技               Spring 2.0
Chapter 8 View      、案方層       W eb    合整架框




                            圖   8.11 JSF   頁網載下的考參作實


       己 自 行 進 來 範 規 的 準 標 據 根 以 可 商 廠 個 各,準 標 術 技 個 一是
       JSF
           。考參作實的司公 是的供提上站網 ,本版作實的
                     S un                    Sun



     到 用使 將, 式 程 個 一第的 作實 要於 對  JSF                  jsf-impl.jar    與   jsf-api.jar   ,
   的 要需而因, 的 到用使要需 外另
     JSF              JSTL        API              JSTL   jstl.jar   與   standard.jar  ,
        、            要需還,外之此除
                     commons-digester.jar      c ommons-collections.jar       、   c om-
:示所下如 的要需所計總,案檔等
mons-beanutils.jar                            .jar

   jsf-impl.jar

   jsf-api.jar

   jstl.jar

   standard.jar

   commons-digester.jar


                                                                                   8 47
Spring 2.0   良信林(冊手術技        – http://openhome.cc      )

    commons-collections.jar

    commons-beanutils.jar

 用採是也  JSF          Web MVC    用使,構架       JSF   (器制控端前任擔時       F ront
  是的)
 controller      javax.faces.webapp.FacesServlet   在要您,別類      web.xml
  :如例,它義定
   FirstJSFDemo                                                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"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    → http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
      <session-config>
          <session-timeout>
              30
          </session-timeout>
      </session-config>

       <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>




8 48
Chapter 8 View   、案方層   W eb    合整架框

         由交求請的    的有所將,中義定的面上在        ".faces"          FaceServlet   ,理處來
     是求請如例,頁網 的址網求請於對相起喚會
FaceServlet                                   .jsp              /index.faces
使始開以可就,置配的上以成完。頁網     起喚會上際實則,話的
                              /index.jsp
    JSF       :別類 的單簡個一寫撰來先, 用      Bean


    FirstJSFDemo                                                 User.java
package onlyfun.caterpillar;

public class User {
    private String name;

      public void setName(String name) {
          this.name = name;
      }

      public String getName() {
          return name;
      }
}



數參求請的者用使存儲以用, User           的單簡個是只別類 個這   JavaBean
不 並的重 偏 所 者 兩 但 , 現 實 的 構 架
     J SF       Struts             是都然雖 與 。值
                                  Web MVC
也,計設的程流面頁於重著則 ;計設的件物制控是的重著 ,同相
          S truts                              J SF
,結連何如是間之面頁個一下與面頁個一上,下立成件條種何在義定是就
                  :如例 , 程 流 面 頁 義 定 中
           faces-config.xml              在以可
    FirstJSFDemo                                          faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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>




                                                                         8 4
Spring 2.0   良信林(冊手術技         – http://openhome.cc          )

            <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.User
                 </managed-bean-class>
            <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>
    </faces-config>



    頁個一上程流面頁當,程流面頁了義定中籤標
            <navigation-rule>                             在
    了括包中求請且並,面頁的定指中籤標
                 <from-view-id>                        自來是面
    值       的定指籤標
    <navigation-case>                 的中籤標
                                   <from-outcome>                     "login"
             。面頁的定指所中籤標    <to-view-id>     至向 導 求 請 將 會 則 , 時
    能功是只,理管的件物 助協也 ,到看以可也中義定的面上在      J SF         Bean
    物 理管以可中籤標
      Spring                            在;多許了少器容
                                  <managed-bean>             比             Bean
    器覽瀏 啟 開 者 用 使 是 就 也,
                 Bean            為 圍 範 活 存 的 件 物 定 設 可, 件
                                           "session"
      Web         。用作在存以可都 ,段階話會的動互式程 與
                                   B ean

    ,稱名       的 用 使 以可 們 他 , 是 訊 資 的 員 人計 設 頁 網 訴 告 要 來 下 接         Bean
    所面上及以,稱名           的定設中籤標
            <managed-bean-name>                          是就也
                                                       "user"
    員人計設頁網如例,值些這定設要需時件元面頁用使在,程流面頁的義定
                   JSP                    :頁網 的下以寫撰會



8
Chapter 8 View    、案方層    W eb    合整架框

  FirstJSFDemo                                                      index.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
    pageEncoding="BIG5"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<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>



      ,庫籤標    與    的 了用 使 中 頁 網 的 面 上 在
                                JSF     "core"     "html"          " core"   有是
    。籤標階進的
     UI        於關有是則   而,理處的件元 於關
                             "html"               HTML

籤標      與    在要定一件元些這,時件元 用使始開
                   JSF                              <f:view>    </f:view>
     ,籤標階進的關相籤標
         " html"   與是都乎幾中庫籤標          ;間之
                                       HTML                             < h:form>
中檔義定         示顯來        用使 , 單 表 個 一 生 產 會
                             <h:inputText>           faces-config.xml
一生產會
"user"          而,性屬
              Bean     的件物 個這"name"              <h:commandButton>
的義定中         據根將定指之中性屬
                     "action"在,鈕按交提個                 faces-config.xml
"login" :下如計設其,面頁      往前中程流面頁
                             welcome.jsp




                                                                              8     1
Spring 2.0   良信林(冊手術技          – http://openhome.cc           )

      FirstJSFDemo                                                     welcome.jsp
    <%@ page language="java" contentType="text/html; charset=BIG5"
        pageEncoding="BIG5"%>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=BIG5">
    <title>個一第   JSF   </title>
                      式程
    </head>
    <body>
        <f:view>
            <h:outputText value="#{user.name}"/>            !好您
            <h3>  用使迎歡  JavaServer Faces </h3> !
        </f:view>
    </body>
    </html>



    ,性屬   的件物 個這     得取以可籤標
        <h:outputText>                     "user"         Bean        "name"
    則中頁網個這在而,值數參求請的出送所中       前先括包將性屬個這
                           index.jsp
             :果結行執的     下 一 看來先 首 , 來 出 示 顯 之 將
                                       index.jsp




                  圖   8.12 FirstJSFDemo    的案專      index.jsp   果結行執頁網




8   2
Chapter 8 View      、案方層   W eb   合整架框

    : 面 畫 果 結 的 下 以 到看以 可 , 後 鈕 按 出 送 並畢完 寫 填 中 位 欄 稱 名 在




            圖   8.13 FirstJSFDemo   的案專   welcome.jsp   果結行執頁網
至以可,式方發開的得所即視所中 在 下一驗體想果如
                       JSF      IDE
載下
http://developers.sun.com/prodtech/javatools/jscreator/index.jsp
圖 下,載 下 費 免 具 工 發 開 該 供 提 已 現 司 公 ,
Sun Java Studio Creator      S un
        :面畫輯編件元頁網得所即視所的
  Sun Java Studio Creator           為




          圖   8.14 Sun Java Studio Creator   輯編件元頁網得所即視所的
                                                                        8    3
Spring 2.0   良信林(冊手術技           – http://openhome.cc        )

    ,上輯編的程流面頁在而                     S un Java Studio Creator   計設的化視可供提也
              :式方




                  圖   8.15 Sun Java Studio Creator   輯編程流面頁的化視可


          於關有多更到找上站網的我在以可,話的趣興有                                JSF   :紹介的
          http://caterpillar.onlyfun.net/Gossip/JSF/JavaServerFaces.htm




    8.4.2 在 JSF 中整合 Spring

    容 的 JSF 過 不,能 功 的 入 注 賴 依 有 理 管 的 於 對 身 本
                        Bean                                         Spring   IoC
    可也上理處易交在,架框 有還               面 方 一另, 能 功 的 多 更 供 提 器
                                     Spring          AOP
                                               。助協供提
8   4
Chapter 8 View   、案方層        W eb   合整架框

被以可,稱名 的
      JSF   Spring 讓是就的目要主,合結的       與       Spring     Bean
定 在 是 就 也,用 使 來 稱 名 的 上 籤 標
JSF         <managed-bean-name>      為作視                               JSF
名到不找中       的 己 自 在 若 , 時 例 實 求要 稱 名 據 根 中 檔 義
                     Bean              JSF              Context
                  。找尋去中
                 Spring      的   到試嘗以可,稱
                            Context

,作運合結何如      與 範示以,案專
                FirstJSFDemo     下一寫改來       JSF      Spring
                      :別類      的單簡個一計設先首
                     UserChanger


  JSFSpringDemo                                          UserChanger.java
package onlyfun.caterpillar;

public class UserChanger {
    public String getChangedName(String name) {
        return name.toUpperCase();
    }
}



接,件物個一的層務商擬模來用,寫大成改稱名的入傳將會別類個這
              User   :別類 下一寫改來著
  JSFSpringDemo                                                   User.java
package onlyfun.caterpillar;

public class User {
    private String name;
    private UserChanger userChanger;

      public void setName(String name) {
          this.name = getUserChanger().getChangedName(name);
      }

      public String getName() {
          return name;
      }




                                                                             8
Spring 2.0   良信林(冊手術技         – http://openhome.cc      )

           public void setUserChanger(UserChanger userChanger) {
               this.userChanger = userChanger;
           }

           public UserChanger getUserChanger() {
               return userChanger;
           }
    }



    會 稱 名 的 出 送 者 用 使,入 注 例 實 的 別 類
          User            UserChecker 受接中別類
          UserChecker  用使以可,寫大為改例實的別類         被        org.springframework.
    在以可稱名 的               讓別類
    web.jsf.DelegatingVariableResolver             Spring       Bean
    JSF              :定設中JSF        的 在以可,用使中
                                faces-config.xml


        JSFSpringDemo                                        faces-config.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!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>
        <application>
            <variable-resolver>
           org.springframework.web.jsf.DelegatingVariableResolver
            </variable-resolver>
        </application>
        <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.User



8   6
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合

More Related Content

What's hot

Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Justin Lin
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
yiditushe
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
appollo0312
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
yiditushe
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
yiditushe
 
Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
yiditushe
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
Guo Albert
 
Spring中的object xml映射详解
Spring中的object xml映射详解Spring中的object xml映射详解
Spring中的object xml映射详解
leeley2000
 
jsp基础速成精华讲解
jsp基础速成精华讲解jsp基础速成精华讲解
jsp基础速成精华讲解
wensheng wei
 

What's hot (20)

Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOP
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 Spring
 
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
 
ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 
Spring 2.0 技術手冊第三章 - IoC 容器
Spring 2.0 技術手冊第三章 - IoC 容器Spring 2.0 技術手冊第三章 - IoC 容器
Spring 2.0 技術手冊第三章 - IoC 容器
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答
 
Spring中的object xml映射详解
Spring中的object xml映射详解Spring中的object xml映射详解
Spring中的object xml映射详解
 
jsp基础速成精华讲解
jsp基础速成精华讲解jsp基础速成精华讲解
jsp基础速成精华讲解
 

Viewers also liked

Viewers also liked (17)

Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄
 
Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁
 
Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序
 
進階主題
進階主題進階主題
進階主題
 
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMailServlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
 
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
 
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
 
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletServlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
 
類別的繼承
類別的繼承類別的繼承
類別的繼承
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能
 
並行與平行
並行與平行並行與平行
並行與平行
 
Python 起步走
Python 起步走Python 起步走
Python 起步走
 

Similar to Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合

Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
yiditushe
 
Jsp面试知识
Jsp面试知识Jsp面试知识
Jsp面试知识
yiditushe
 
Java Web动态图表编程
Java Web动态图表编程Java Web动态图表编程
Java Web动态图表编程
yiditushe
 
2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0
Anthony Chen
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
yiditushe
 
旺铺前端设计和实现
旺铺前端设计和实现旺铺前端设计和实现
旺铺前端设计和实现
hua qiu
 

Similar to Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合 (20)

Jsp讲义
Jsp讲义Jsp讲义
Jsp讲义
 
前端MVC之backbone
前端MVC之backbone前端MVC之backbone
前端MVC之backbone
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
 
Structs2簡介
Structs2簡介 Structs2簡介
Structs2簡介
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Jsp面试知识
Jsp面试知识Jsp面试知识
Jsp面试知识
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services
 
Java Web动态图表编程
Java Web动态图表编程Java Web动态图表编程
Java Web动态图表编程
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训
 
2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0
 
Js培训
Js培训Js培训
Js培训
 
test
testtest
test
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
旺铺前端设计和实现
旺铺前端设计和实现旺铺前端设计和实现
旺铺前端设计和实现
 
Vue.js
Vue.jsVue.js
Vue.js
 
React vs Flux
React vs FluxReact vs Flux
React vs Flux
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
JdonFramework中文
JdonFramework中文JdonFramework中文
JdonFramework中文
 
视图模式
视图模式视图模式
视图模式
 
Ibatis技术讲座
Ibatis技术讲座Ibatis技术讲座
Ibatis技术讲座
 

More from Justin Lin

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 

Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合

  • 1. 。式方合整的際實及以,色角的居所 ,下架框 S pring Web 的 它 其 合 結 在 看 看 來 將,中 節 小 個 這 在,等 、 是 像,架 框 J SF Struts Web 的 它 其 合 結 以 可 也,下 之 架 框 Web MVC的供提 用使不在 Spring 。現實術技層 的己自義定以可至甚您,案方的術技層 View 同不了供提還 View ,外之層S pring 為作術技 了除,籤標 View JSP 的供提 及 以 合 結 以 可,時 術 技 層 為 作 用 使 當 Spring JSTL View JSP View 層方案、Web 框架整合 8
  • 2. 8 2 作實 JSTL 供提站網方官 8.1 Java 圖 : http://java.sun.com/products/jsp/jstl/ :作實 JSTL 得取站網方官 在可, Java括包中之 JSTL Java EE 。碼式程 寫撰接直 Java JSP 中面頁 於是不而,成生的輯邏面頁助協來 用運以可,時 為 JSTL JSP 術技層 View 的 用 使 所 當 ,起一 在 雜 混 碼 式 程 與 籤標上 面 頁 得 使 會 這 , 法 方好是 不 並 碼 式 程 寫 撰 Java scriplet JSP 用 使 上 在接直 , 面 畫 的 同 不 示 顯 來果結的理處據根須必時面頁果結現呈,後之求請的者用使完理處在 8.1.1 結合 JSTL JSTL 。供 提來 由則輯邏現呈的面頁於至,用使合結架框 Spring MVC Web 與可籤標的供提所 ,籤 標 的 供 提S pring及以) Spring Standard Tag Library J avaServer Pages JSTL ( 合結 以 可 , 時 術 技 層 為作 View JSP 用使當 8.1 結合 JSTL 與 Spring 標籤 ) – http://openhome.cc 良信林(冊手術技 Spring 2.0
  • 3. Chapter 8 View 、案方層 W eb 合整架框 得取個幾供提中」 D ownloads 「在 JSTL 載下接直以可您,式方的 Java EE 載下僅者或,作實 括包有就中當, JSTL Jakarta Taglibs Standard tag 載下前先您果如。中 至入加 library 與 的中當將, jstl.jar standard.jar lib 在, 到找下錄目 Spring 在以可也,本版依相是 的 lib/j2ee jstl.jar 。 到找以可則中錄目 lib/jakarta-taglibs standard.jar 件條有行進來能功的 與 合 結 , 例範的 整 完 個 一 範 示 下 以 Spring JSTL :別類 寫撰 先 首 , 現 呈 面 頁 的 HelloController JSTLSpringDemo HelloController.java package onlyfun.caterpillar; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.servlet.ModelAndView; public class HelloController implements Controller { private String viewPage; public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { String user = req.getParameter("user"); Integer age = new Integer( Integer.parseInt(req.getParameter("age"))); java.util.Map model = new java.util.HashMap(); model.put("name", user); model.put("age", age); return new ModelAndView(viewPage, model); } public void setViewPage(String viewPage) { this.viewPage = viewPage; } } 8 3
  • 4. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) ,中件物 至 定 設並, 數 參 求 請 集 收 的 單簡是 只 , 中 式 程 個 這 在 Model 以可性屬 的 ,中檔義定在著接 I nternalResourceViewResolver "viewClass" :如例, 為定設 org.springframework.web.servlet.view.JstlView JSTLSpringDemo mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean name="/hello.do" class="onlyfun.caterpillar.HelloController"> <property name="viewPage" value="hello"/> </bean> </beans> 現呈的輯邏面頁作 用 使 中 當 個 這 在 , 面頁試 測 的 單 簡 個 一 寫 來 JSTL :句語迎歡示顯會才,時 於等於大 "age" 在有 只 面 頁 定 設 , 斷 判 18 JSTLSpringDemo hello.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> 8 4
  • 5. Chapter 8 View 、案方層 W eb 合整架框 <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title>JSTL And Spring</title> </head> <body> <c:choose> <c:when test="${age >= 18}"> <h1> , <c:out value="${name}"/> 嗨 </h1> ! </c:when> <c:otherwise> <h1> !喔歲八十滿未 </h1> </c:otherwise> </c:choose> </body> </html> : 面 畫 果 結 的 時 行 執個一 看 看 來 並 , 數 參 求請定 給 上 列 址 網 在 接 直 圖 8.2 JSTLSpringDemo 果結行執的案專 8.1.2 <spring:bind> 標籤 單表 與 面 頁 供 提 , 合 結件組 的 關 相 與 以 可 , 庫 籤 標 的 訂 自 供 提 Spring 作實中節 以 邊 這 在 ,幅 篇 省 節 為 , 能 功 定 綁據 數 的 息 訊 誤 錯 、 件 物7.2.7 籤標 的 SimpleFormDemo入 加,充 擴 改 修 行 進 來 案 專 Spring的過 <bind> form.jsp : 下一改修先首,能功 SpringBindDemo form.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> 8
  • 6. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title>Login Form</title> </head> <body> <h1> 單表入登 </h1> <spring:bind path="command.*"> <font color="red"> <b>${status.errorMessage}</b> </font><br> </spring:bind> :碼密與稱名者用使入輸請 <p> <form name="loginform" action="/SpringBindDemo/login.do" method="post"> <spring:bind path="command.username"> 稱名 <input type="text" name="${status.expression}" value="${status.value}"/><br> </spring:bind> <spring:bind path="command.password"> 碼密 <input type="password" name="${status.expression}" value="${status.value}"/><br> </spring:bind> <input type="submit" value=" 定確 "/> </form> 。中面頁個這到回再會誤錯入輸:意注 </body> </html> <spring:bind> 的 "path" 稱名 個 這 , 稱 名 件 物 單 表 的 定 綁 要 定 設 性 屬 在定設是 " loginController" 是稱名設預,性屬 "commandName" 的中 8 6
  • 7. Chapter 8 View 、案方層 W eb 合整架框 關相有 所 上 件 物 單 表 定 綁 示 表 , 時 "command" 為定設當, "command.*" 訊誤錯的定設中 " status" 示顯會 "errorMessage" 的 ,據數的 Controller 。明說再會中作實的 Controller 在會待這,息 ,性 屬 了定綁,位欄 "username" 於對,中單表在 "command.username" 單表示顯則 "status" 而,稱名性屬的定綁示顯會 "expression" 的 "value" 樣這, 到 回 會 後 敗失入 登 在 式 程 的 計 設 邊這, 值 的 存 儲 所 中 件 物 form.jsp 。 值 的入輸 前 之 與 息 訊 誤 錯 示顯上 面 頁 個 一 同 在 以 可 中案專 對以可,籤標定綁的上 form.jsp 合配了為 SimpleFormDemo LoginController :正修些一作別類 SpringBindDemo LoginController.java package onlyfun.caterpillar; import org.springframework.validation.BindException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.mvc.SimpleFormController; import org.springframework.web.servlet.*; public class LoginController extends SimpleFormController { public LoginController() { setCommandClass(LoginForm.class); } protected ModelAndView onSubmit(Object command, BindException errors) throws Exception { LoginForm form = (LoginForm) command; if("caterpillar".equals(form.getUsername()) && "123456".equals(form.getPassword())) { return new ModelAndView(getSuccessView(),"user", form.getUsername()); } else { 8 7
  • 8. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) // 回返 Form 例實 的 errors 個一有要,時面頁 Model errors.reject("loginfail", " 誤錯碼密或稱名者用使 "); return new ModelAndView(getFormView(), errors.getModel()); } } } 用使次這以所,件物 Spring 個一要需定綁籤標 B indException o nSumit() ,法方 用使中 在 , 時 敗 失證驗 當 , 本 版 個 一 另 的 BindException reject() , 是個一第,數參個兩受接 , 據數的 入 輸 次 這 絕 拒 示 表 r eject() error code 中檔 的定設到會這,) 考參( MessageSource 3.4.2 定設有果如 .properties 定設有沒果如,息訊的應對相出找以, ) (鍵 為 error code " K ey " 依 。 出 輸 息 訊 誤 錯 為 作值的 定 設 所 數 參 個 二 第 用 使 則 , MessageSource 儲所 用使前之,件物 個一傳回法方 errors getModel() 的 Map reject() 會後之, 給定設 之 將 , 中 件 物 個 這在括 包 就 息 訊 誤 錯 的 存ModelAndView 。 出 輸 上籤標 在 息 訊 定 綁 為 理 處 與都,等檔義定與別類、頁網 的現呈中書在沒下剩 JSP SimpleForm- 來,容內案檔關相的中案專 Demo 考參行自請,同相案專 SpringBindDemo :容內示顯的 form.jsp 前入登有沒還看看 圖 8.3 SpringBindDemo 一之果結行執的案專 8 8
  • 9. Chapter 8 View 、案方層 W eb 合整架框 輸前之與息訊誤錯將籤標定綁,容內的下以示顯會則,誤錯入登果如 : 上 籤 標的應 對 在 示 顯 料 資 的 入 圖 8.4 SpringBindDemo 二之果結行執的案專 8.1.3 數據綁定的幾個方法 與性屬個一的件物單表定綁次一以可您。法方的定綁據數個幾看看來 :如例,值數 ... <spring:bind path="command.username"> 稱名 <input type="text" name="${status.expression}" value="${status.value}"/><br> </spring:bind> <spring:bind path="command.password"> 碼密 <input type="password" name="${status.expression}" value="${status.value}"/><br> </spring:bind> ... "expression" 而,稱名性屬的定綁被示顯會 value 屬的定綁被示顯則 。值性 8
  • 10. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 定綁麼這是者或 Command : ... <spring:bind path="command"> 稱名 <input type="text" name="username" value="${command.username}"/><br> 碼密 <input type="password" name="password" value="${command.password}"/><br> </spring:bind> ... 用前之,息訊誤錯於對 BindException 的中 reject() 法方個這,法方 用使以可,息訊誤錯位欄定特分區會不並 rejectValue() 誤錯入加來法方 :息訊 rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage) rejectValue(String field, String errorCode, String defaultMessage) 數參 , 性 屬的件 物 單 表 定 指 您 讓 數 參 的 rejectValue() field e rrorCode , 元字位 佔 的 中 案 檔 源 資 定 指 於 用 數 參 " " , 鍵 的中案檔源資定指 e rrorArgs : 下如子 例 用 使 個 一 。 息 訊的現 呈 要 所 時 案 檔 源 資到不 找 是 則 息 訊 設 預 而 .... public void ModelAndView(...., BindException errors) throws Exception { ... errors.rejectValue("username", "error", null, " 誤錯稱名者用使"); ... errors.rejectValue("password", "error", null, " "); 誤錯碼密 return new ModelAndView( 8 1
  • 11. Chapter 8 View 、案方層 W eb 合整架框 this.getFormView(), errors.getModel()); } ... : 息 訊 現 呈 來 籤 標 定綁用 使 以 可 , 息 訊 之 入加中 段 片 式 程 的 面 上 如 ... <spring:bind path="command.username"> 稱名 <input type="text" name="${status.expression}" value="${status.value}"/><br> <font color="red">${status.errorMessage}</color> </spring:bind> <spring:bind path="command.password"> 碼密 <input type="password" name="${status.expression}" value="${status.value}"/><br> <font color="red">${status.errorMessage}</color> </spring:bind> ... 錯了定綁被上性屬個一同果如,位欄的關相至定綁會息訊誤錯的應相 訊出輸來 配搭,出取 用使以可則,息訊誤 ${status.errorMessages} JSTL :如例,息 ... <spring:bind path="command.username"> 稱名 <input type="text" name="${status.expression}" value="${status.value}"/><br> <c:if test="${status.error}"> <font color="red"> :誤錯<br> <c:forEach items="${status.errorMessages}" var="error"> <c:out value="${error}"/><br> </c:forEach> </font> 8 11
  • 12. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) </c:if> </spring:bind> ... 用使以可也,息訊誤錯有否是試測於用可 ${status.error} <spring: hasBindErrors> : 如例, 容 內 些 某 出 輸 否 是 定 決 來 ... <spring:hasBindErrors> 。。。正更請,誤錯的下以現發 ...... </spring:hasBindErrors> ... :如 例 , 息 訊 誤 錯 的 有所出 輸 次 一 , 性 屬 件 物單表 分 區 不 以 可 也 者 或 .... <spring:bind path="command.*"> <font color="red"> :誤錯 <br> <c:forEach items="${status.errorMessages}" var="error"> <c:out value="${error}"/><br> </c:forEach> </font> </spring:bind> ... 8.1.4 <spring:message> 標籤 用使以可 <spring:message> 合結籤標 ResourceBundleMessage- Source 示顯上頁網在, 在如例,息訊字文的中 m essages.properties m essages. :下如義定中 properties 8 12
  • 13. Chapter 8 View 、案方層 W eb 合整架框 MessageTagDemo messages.properties welcome=Hello, {0} {1}. Welcome to Spring. 得記 messages.properties 在須必案檔 Classpath 在放如例,下徑路的 ,下 /WEB-INF/classes/ B ean 入加要中檔義定 ResourceBundleMessage- Source :如例,義定的 MessageTagDemo mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="urlMapping" class="org.springframework.web.servlet. → handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/index.do">indexController</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean id="messageSource" class="org.springframework.context. → support.ResourceBundleMessageSource"> <property name="basename" value="messages"/> </bean> <bean id="indexController" 8 13
  • 14. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) class="org.springframework.web.servlet. mvc.ParameterizableViewController"> → <property name="viewName" value="index"/> </bean> </beans> 了用使接直邊這在 ParameterizableViewController 請的者用使發轉來 :示所下如容內的頁網,頁網 index.jsp 至求 MessageTagDemo index.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title>Message Tag Demo</title> </head> <body> <h1><spring:message code="welcome" arguments="Justin,Lin"/></h1> </body> </html> "arguments" 代 取 別 分 會, 隔 分 號 逗 以 , 數 引 的 定 指 中 messages.pro- perties :示所 下 如 果 結 行 執 頁 網 的 面 上 , 元 字 位 佔 等 、 的 應 對 中 {0} { 1} 圖 8.5 MessageTagDemo 果結行執的案專 8 14
  • 15. Chapter 8 View 、案方層 W eb 合整架框 8.1.5 <spring:transform> 標籤 Spring 的 之籤標 <spring:transform> 於位須必籤標 <spring:bind> PropertyEditor 配搭,中 所您 為 換 轉 值 性 屬 的 將以可,話的用使 Command 。式格串字的要 一期星,示表字數的期星了存儲中 設假 , 子 例 的 際 實 個 舉 Command 望希您而然,示表 用使日期星…示表 用使二期星,示表 用使 "1" "2" "0" ,樣字等 、 、 是的示顯上單表在以可,時單表寫填在 "MON" " THU" " WED" 。 換 轉 成 完 您幫動 自 式 程 用 使 望 希 您 : 到 值數參求請集收,別類 個一計設先以可 WeekForm "0" "6" TransFormTagDemo WeekForm.java package onlyfun.caterpillar; public class WeekForm { private String weekNumber; public void setWeekNumber(String weekNumber) { this.weekNumber = weekNumber; } public String getWeekNumber() { return weekNumber; } } weekNumber 設以可著接,值數參求請的類之 、 、 是的存儲 "1" " 2" " 3" 個一計 到 、 WeekPropertyEditor 為值數參些這換轉來別類 "MON" " TUE" : "SUN" 8 1
  • 16. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) TransFormTagDemo WeekPropertyEditor.java package onlyfun.caterpillar; import java.beans.PropertyEditorSupport; public class WeekPropertyEditor extends PropertyEditorSupport { public void setAsText(String text) { if("MON".equals(text)) { setValue("1"); } else if("TUE".equals(text)) { setValue("2"); } else if("WED".equals(text)) { setValue("3"); } else if("THU".equals(text)) { setValue("4"); } else if("FRI".equals(text)) { setValue("5"); } else if("SAT".equals(text)) { setValue("6"); } else if("SUN".equals(text)) { setValue("0"); } else { setValue(""); } } public String getAsText() { if(this.getValue() != null && !(this.getValue() instanceof String)) { return ""; } String text = (String) this.getValue(); 8 16
  • 17. Chapter 8 View 、案方層 W eb 合整架框 if("1".equals(text)) { return "MON"; } else if("2".equals(text)) { return "TUE"; } else if("3".equals(text)) { return "WED"; } else if("4".equals(text)) { return "THU"; } else if("5".equals(text)) { return "FRI"; } else if("6".equals(text)) { return "SAT"; } else if("0".equals(text)) { return "SUN"; } else { return text; } } } 義定新重須必,時 計設在 Controller initBinder() 的訂自冊註以法方 :如例, PropertyEditor TransFormTagDemo WeekFormController.java package onlyfun.caterpillar; import org.springframework.web.servlet. mvc.SimpleFormController; import org.springframework.web.servlet.*; import java.util.*; import javax.servlet.http.HttpServletRequest; import org.springframework.validation.BindException; import org.springframework.web. 8 17
  • 18. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) bind.ServletRequestDataBinder; public class WeekFormController extends SimpleFormController { private Map refData; public WeekFormController() { setCommandClass(WeekForm.class); refData = new HashMap(); List list = new ArrayList(); for(int i = 0; i < 7; i++) { list.add(String.valueOf(i)); } refData.put("weekNumbers", list); } protected ModelAndView onSubmit(Object command, BindException errors) throws Exception { WeekForm form = (WeekForm) command; if(form.getWeekNumber() == null) { return new ModelAndView(this.getFormView()); } else { return new ModelAndView( this.getSuccessView(), errors.getModel()); } } protected Map referenceData( HttpServletRequest request) throws Exception { return refData; } protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { super.initBinder(request, binder); binder.registerCustomEditor( String.class, new WeekPropertyEditor()); } } 8 18
  • 19. Chapter 8 View 、案方層 W eb 合整架框 ,值串字的 到 好備準會,時 WeekFormController 構建在 "0" "6" ,示顯上面頁在以,件物 的值串字些這括包傳回會法方 referenceData() Map 合配再, initBinder() 的訂自了冊註中 於由 WeekPropertyEditor <spring: 面頁,字文等 transform> 、 示顯上面頁在以可就,籤標 "SUN" " MON" :寫撰 的 輯 邏 面 頁 助 協 來 了 配 搭 中 當 , 示 所 下 如 計 設 的 form.jsp JSTL TransFormTagDemo form.jsp <%@page language="java" contentType="text/html;charset="BIG5" <pageEncoding="BIG5"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title>JSP Page</title> </head> <body> <spring:bind path="command.*"> <font color="red"> <c:out value="${status.errorMessage}"/> </font> </spring:bind> <form name="weekForm" action="/TransFormTagDemo/weekForm.do" method="POST"> <spring:bind path="command.weekNumber"> <select name="weekNumber"> <c:forEach var="weekNumber" items="${weekNumbers}" > <spring:transform value="${weekNumber}" var="weekName"/> <c:choose> <c:when test="${status.value == weekName}"> 8 1
  • 20. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <option value="<c:out value="${weekName}"/>" selected> </c:when> <c:otherwise> <option value="<c:out value="${weekName}"/>"> </c:otherwise> </c:choose> <c:out value="${weekName}"/> </option> </c:forEach> </select> </spring:bind> <input type="submit" value="Submit"/> </form> </body> </html> Bean 在以所, 了用使於由,寫撰下如檔義定 JSTL InternalResource- ViewResolver:別類 用使以可上定設的 "viewClass" 的 JstlView TransFormTagDemo mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean name="/weekForm.do" class="onlyfun.caterpillar.WeekFormController"> <property name="formView" value="form"/> 8 2
  • 21. Chapter 8 View 、案方層 W eb 合整架框 <property name="successView" value="success"/> </bean> </beans> 到 連,話 的 式 程 行 執 您 果 如 form.jsp :容內的下以示顯會,時 圖 8.6 TransFormTagDemo 果結行執的案專 8.1.6 Spring 2.0 的 form 標籤 、 括包,籤標 組一了增新中 Spring 2.0 form < form:form> <form:input> 、 取提以可,時頁網單表計設在您便方,籤標等 <form:password> Command 在要,籤標 的新 用使想,中頁網在示顯並值的件物 Spring 2.0 form JSP 網 :上加上頁 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 用使下以 Spring 2.0 的 form 寫改,籤標 8.1.2 的 SpringBindDemo 專 : 的中案 form.jsp 8 21
  • 22. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) FormTagDemo form.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title>Login Form</title> </head> <body> <h1> </h1> 單表入登 :碼密與稱名者用使入輸請 <p> <form:form> <form:input path="username" /><br> :稱名 :稱名 :稱名 :稱名 <form:password path="password" /> :碼密 :碼密 :碼密 :碼密 <input type="submit" value=" "/> 定確 定確 定確 定確 </form:form> </body> </html> 在,面頁的上以 < form:form> 的下以生產將,份部的籤標 HTML :容 內 <form id="command" method="post" action="/FormTagDemo/login.do"> :稱名<input id="username" name="username" type="text" value=""/><br> :碼密<input id="password" name="password" type="password" value=""/> <input type="submit" value=" "/> 定確 </form> ,位欄入輸字文生產來用 < form:form> ,中 在 < form:input> < form:pass- 件物 word> 定指來用定設的性屬 ,位欄入輸碼密生產來用 " path" Command 考參別分將 與 ,中 例 範 個 這 在 如 例,性 屬 的 < form:input> < form:password> LoginForm。性屬 與 的例實 username 至 password 8 22
  • 23. Chapter 8 View 、案方層 W eb 合整架框 <form:form> 的設預 " commandName" 是稱名" command" 自您果如, 了定設行 Controller 的 "commandName" 在要則,性屬 籤標 < form:form> 的" commandName" 如例, " commandName" 為定設若 : " loginForm" … <form:form commandName=”loginForm”> :稱名 <form:input path="username" /><br> :碼密 <form:password path="password" /> <input type="submit" value=" "/> 定確 </form:form> … 的紹介所邊這了除 等 < form:form> 、 、 < form:input> < form:password> 於應對有還,外之籤標 HTML 、 是像,籤標的件元入輸 < form:checkbox> 、 <form:radiobutton> 以可例範些一,單簡很都上用使在,等 < form:select> 件文考參 考參接直 Spring 。容內的 13.9.2 The form tag 8 23
  • 24. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 8.2 其它 View 技術 個這在,別類 的己自立建或,術技層 的它其用使以可還您 View View 作實何如範示來面畫果結 訂自以並,術技層 為作 範示節小 Tiles View Pdf View 。別類 8.2.1 以 Tiles 為例 ) ( 配的頁網讓以可, 置 Tiles ) ( 引版模個一是 擎 T emplate Engine L ayout 面 版 個 一 供 提 , 離 分 料資的 現 呈 要 際 實 與 ) 籤 標 <table> 用使是像( T iles ,置 配 面 版 的 頁 網 理 管 用 使 層 的 Spring 在以可您,制機理管 View Tiles 定設是一,定設須必作動本基個兩有這 org.springframework.web.servlet. view.tiles.TilesView 定設是二, org.springframework.web.servlet.view. tiles.TilesConfigurer :如例, TilesViewDemo mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="viewResolver" class="org.springframework.web.servlet. view.InternalResourceViewResolver"> → <property name="viewClass" value="org.springframework. web.servlet.view.tiles.TilesView"/> → </bean> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view. tiles.TilesConfigurer"> → <property name="definitions"> <list> 8 24
  • 25. Chapter 8 View 、案方層 W eb 合整架框 <value>/WEB-INF/tiles-defs.xml</value> </list> </property> </bean> <bean name="/welcome.do" class="org.springframework.web.servlet. → mvc.ParameterizableViewController"> <property name="viewName" value="welcome"/> </bean> </beans> 的定設中 的回傳您,後之 TilesView 定設到意注 ModelAndView 名的義定所中檔義定 "view" 在是而,置位 的源資是不並稱名 URL Tiles 設 的 ,例為定設的面上以,稱 P arameterizableViewController "viewName" ,定設 的關相找中檔定設 到會則, "welcome" Tiles 為定 "welcome" T iles 假,定設來性屬 的 由以可 置 位 取 讀 的 檔 義 定 TilesConfigurer "definitions" Tiles :的定設麼這是檔義定 設 TilesViewDemo tiles-defs.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd"> <tiles-definitions> <definition name=".myLayout" path="/WEB-INF/jsp/tiles/myLayout.jsp"> <put name="title" value="Sample Page Title"/> <put name="header" value="/WEB-INF/jsp/tiles/header.jsp"/> <put name="menu" value="/WEB-INF/jsp/tiles/menu.jsp"/> <put name="footer" value="/WEB-INF/jsp/tiles/footer.jsp"/> <put name="body" value="/WEB-INF/jsp/tiles/body.jsp"/> </definition> <definition name="welcome" extends=".myLayout"> <put name="title" value="Tiles 面頁試測 "/> 8 2
  • 26. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) </definition> </tiles-definitions> 在,時點逗個有頭開稱名, 個一義定先首,中檔義定在 ".myLayout" ,義定頁網的料資現呈要正真個一是不而,義定面版個一示表上例慣名命 項 了義定新重並,義定的 "welcome" 承繼以可義定 ".myLayout" "title" 中檔義 定 是 的 取 讀 會 上 際 實 , 時 view 為若稱名的 回傳在,目 "welcome" "welcome" 。定設的 : 置配的面版計 設來格表 用使中當,的 寫撰麼 這 是 myLaout.jsp 設假 TilesViewDemo myLayout.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <%@taglib prefix="tiles" uri="http://jakarta.apache.org/struts/tags-tiles"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title><tiles:getAsString name="title"/></title> </head> <body> <table border="0" width="100%" cellspacing="5"> <tr> <td colspan="2"> <tiles:insert attribute="header"/> </td> </tr> <tr> <td width="140" valign="top"> <tiles:insert attribute="menu"/> </td> <td valign="top" align="left"> <tiles:insert attribute="body"/> </td> </tr> 8 26
  • 27. Chapter 8 View 、案方層 W eb 合整架框 <tr> <td colspan="2"> <tiles:insert attribute="footer"/> </td> </tr> </table> </body> </html> header 、 m enu 、 b ody 、 f ooter 等 JSP :寫撰下如的單簡面頁 TilesViewDemo header.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <center><h1>Tiles View <h1> </center> 範示 TilesViewDemo menu.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <li>件文學教 </li> <li> 區論討 </li> <li> 的我 Blog</li> <li>站網薦推 </li> TilesViewDemo body.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> Hello World 的寫 Brian Kernighan 在是現出的 個一第 "A Tutorial Introduction to the Language B" 字文 B 將來用它,)身前的言語 是言語 (中籍書 C Hello World 第作當它將的次數無經已,上籍書或件文學教言語式程的多很,後之此自,上幕螢腦電在示顯 。式程例範個一 8 27
  • 28. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) TilesViewDemo footer.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <center> 有所權版 (c)http://www.caterpillar.onlyfun.net/</center> 有要須必,話的 用使要 Tiles 、 commons-beanutils.jar commonslogging. jar 、 c ommons-collections.jar 、 、 c ommons-digester.jar s truts.jar 個四 .jar 在以可都案檔 .jar 些這,案檔 Spring 中案檔載下 lib 的錄目 。到找下錄目 及錄目 jakarta-commons struts 得 取 會 則, 到 接 連 果 如,定 設 的 上 以 照 按 /welcome.do Tiles 中檔義定 welcome :容內的下以示顯是果結,義定的 圖 8.7 TilesViewDemo 果結行執的案專 在如例(面頁個一每在是料資些一有果如 Header 您,的現出要都)處 :寫撰麼這中 在以可 header.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <center><h1>Tiles View <h1> </center> 範示 <H1>${someData}</H1> 8 28
  • 29. Chapter 8 View 、案方層 W eb 合整架框 示顯能要了為 ${someData} 個一每在須必則,料資 Controller 定設中 :如例,值性屬 ... Map model = new HashMap(); ... model.put("someData", data); ... 定設,時回傳 在著接 ModelAndView model 個一每,件物 Controller 有個一每在會才,述描些這入加須必都中 Tiles 示顯能都面頁的定設 ${someData} 。 承繼以可您,法方的單簡更個有還過不 org.springframework.web. servlet.view.tiles.ComponentControllerSupport 承繼它,別類 Tiles 的 義定新重以可您,別類 ControllerSupport ComponentControllerSupport 的 doPerform() :如例,法方 ... public class HeaderControllerSupport extends ComponentControllerSupport { protected void doPerform( ComponentContext componentContext, HttpServletRequest request, HttpServletResponse response) throws Exception { ApplicationContext context = getApplicationContext(); SomeData someData = (SomeData) context.getBean("someData"); componentContext.putAttribute("someData", someData); } } 8 2
  • 30. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 在 Tiles 得 取 都 面 頁個一 每 以 可 就 , 定 設 麼 這 以 可 中 檔 義 定 someData :了值的 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd"> <tiles-definitions> <definition name=".header" path="/WEB-INF/jsp/tiles/header.jsp" controllerClass="onlyfun.caterpillar. → HeaderControllerSupport"/> <definition name=".myLayout" path="/WEB-INF/jsp/tiles/myLayout.jsp"> <put name="title" value="Sample Page Title"/> <put name="header" value=".header"/> <put name="menu" value="/WEB-INF/jsp/tiles/menu.jsp"/> <put name="footer" value="/WEB-INF/jsp/tiles/footer.jsp"/> <put name="body" value="/WEB-INF/jsp/tiles/body.jsp" /> </definition> <definition name="welcome" extends=".myLayout"> <put name="title" value="Tiles 面頁試測 "/> </definition> </tiles-definitions> 8.2.2 自訂 View Class 承繼以可您 自 org.springframework.web.servlet.view.AbstractView 生 產 以 邊 這 ,術 技 層 的 需 所 生 產 以,別 類 訂 View View Pdf ,例為果結的 承繼接直以可 org.springframework.web.servlet.view.document. :如例,法方 AbstractPdfView 義定新重並,別類 buildPdfDocument() 8 3
  • 31. Chapter 8 View 、案方層 W eb 合整架框 PdfViewDemo CustomPdfView.java package onlyfun.caterpillar; import com.lowagie.text.Document; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.PdfWriter; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet. view.document.AbstractPdfView; public class CustomPdfView extends AbstractPdfView { protected void buildPdfDocument(Map model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception { String header = (String) model.get("header"); Paragraph headerParagraph = new Paragraph(header); headerParagraph.font().setSize(20); document.add(headerParagraph); String content = (String) model.get("content"); Paragraph contentParagraph = new Paragraph(content); document.add(contentParagraph); String copyright = (String) model.get("copyright"); Paragraph copyrightParagraph = new Paragraph(copyright); copyrightParagraph.setAlignment( Paragraph.ALIGN_BOTTOM); document.add(copyrightParagraph); } } 8 31
  • 32. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 在設假 Controller 了供提中 Model :件物料資 PdfViewDemo PdfController.java package onlyfun.caterpillar; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class PdfController implements Controller { public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { Map model = new HashMap(); model.put("header", "Pdf View Test"); model.put("content", "This is content for pdf view test."); model.put("copyright", "caterpillar.onlyfun.net"); return new ModelAndView("customPdfView", model); } } 在而 Bean :的計設麼這是中檔義定 PdfViewDemo mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="viewResolver" class="org.springframework.web.servlet. → view.BeanNameViewResolver"/> <bean id="customPdfView" 8 32
  • 33. Chapter 8 View 、案方層 W eb 合整架框 class="onlyfun.caterpillar.CustomPdfView"/> <bean name="/pdf.do" class="onlyfun.caterpillar.PdfController"/> </beans> 括包下錄目 在得記 / WEB-INF/lib itext 上接連則,案檔 的 . jar /pdf.do : 面 畫果結 的 下 以 示 顯 會 , 時 圖 8.8 PdfViewDemo 果結行執的案專 8 33
  • 34. 8 34 。載下行進 http://struts.apache.org 至以可則,作實 Struts 的新最載下要想果如,案檔的供提所下錄目 中案檔載下 lib 用使 Spring 接直而,案檔關相 Strtus 載 下 何 如 紹 介 再 不 ,制限 的 幅 篇 於 基 邊 這 在 。 份 部 個 這 過 略接直 以 可 , 式 方 寫 撰 的 Struts 解了經已您果如,例範合整的 與 Struts 習練際實以可也,中 Spring 8.3.2 的來下接利以,式程 Struts 個一第寫撰何如解了速快您讓在的目,容 內的排安所者讀的 Struts 過觸接未對針是,門入的式程 個一第 Struts 8.3.1 第一個 Struts 程式 。起一在合整 Spring Struts 與 將何如及以,門入的 下一紹介來將,中節小個這在,點 Struts 優其為富豐件文,多員人用使但,聲之議非的良不計設多許有前目 Struts 使即,發開行進 Struts 用使案專的多當相有界業在,案專的起發月 年 3 2000 於 Craig McClanahan 由,架框 的久悠史歷是 Web MVC Struts 8.3 整合 Struts 框架 ) – http://openhome.cc 良信林(冊手術技 Spring 2.0
  • 35. Chapter 8 View 、案方層 W eb 合整架框 圖 8.9 Struts 站網方官 在別分以可,檔 的下以要需,說來式程 Struts 個一第於對 . jar Spring ,案檔 些這到找錄目 與 lib 下錄目 的案檔載下 jakarta-commons struts .jar 與 在以 可 也 , 本 版 依 相 是 Spring 的載下前先您果如 lib/struts lib/jakarta- -commons :案檔些這到找下錄目 struts.jar commons-beanutils.jar commons-digester.jar commons-collections.jar commons-logging.jar (器制控端前任擔,中 Struts 在 F ront Controller 是的) org.apache. 在須必您,別類 struts.action.ActionServlet web.xml 定指並,義定以加中 Struts:如例,稱名與置位的案檔定設 FirstStrutsDemo web.xml <?xml version="1.0" encoding="UTF-8"?> 8 3
  • 36. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <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"> <session-config> <session-timeout> 30 </session-timeout> </session-config> <!-- Standard Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value> /WEB-INF/struts-config.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app> 名與置位的案檔定設 定設來用性屬 ActionServlet "config" 的 Struts 分來 由 交 會 都 , 求 請 的 對 有 所,中 定 設 的 上 以 在 , 稱 *.do ActionServlet 。理處件物制控給配 8 36
  • 37. Chapter 8 View 、案方層 W eb 合整架框 Struts 承繼是作實的件物制控,中 在 org.apache.struts.action.Action 得取將 , 中 作 實 的 下 以 在 如 例 , 成 完 來 法 方 execute() 義定新重並,別類 :件物 的態型 給定設並,值數參求請 "user" 的者用使 Map Model FirstStrutsDemo HelloAction.java package onlyfun.caterpillar; import java.util.*; import javax.servlet.http.*; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class HelloAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String username = request.getParameter("user"); Map model = new HashMap(); if(username != null) { model.put("username", username); } else { model.put("username", "nobody"); } request.setAttribute("userInfo", model); return mapping.findForward("helloUser"); } } 8 37
  • 38. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 由須必,後之成完理處求請在 org.apache.struts.action.ActionMapping 的中檔義定 是 ,址位的面頁現呈詢查來 A ctionMapping Struts <action- :的 寫 撰 何 如 是 檔 義 定 mappings> 下一看來,表代例實的義定 Struts FirstStrutsDemo struts-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <action-mappings> <action path="/hello" type="onlyfun.caterpillar.HelloAction"> <forward name="helloUser" path="/WEB-INF/jsp/hello.jsp"/> </action> </action-mappings> </struts-config> 為徑路求請定設性屬 Struts 的籤標 ,中檔義定 < action>在 "path" 而,求 請 的 者 用 使 理 處 來 hello.do 給交將 A ctionServlet ,時HelloAction 詢查法方 <forward> 的件物 用使定設籤標 ActionMapping findForward() 中 在如例,址位的面頁現呈個一下的知告要所,時稱名 HelloAction 由將,後畢完理處求請此因, findForward() 是稱名的定設 "helloUser" :示所下如寫撰的 /WEB-INF/jsp/hello.jsp,面畫果結現呈來 h ello.jsp FirstStrutsDemo hello.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> 8 38
  • 39. Chapter 8 View 、案方層 W eb 合整架框 <title>Struts Demo</title> </head> <body> <H1>Hello, ${userInfo["username"]} !</H1> </body> </html> 將是只頁網 hello.jsp request 中 Map 的件物 "username" 出示顯料資 : 示 所下如 面 畫 行 執 個 一 , 來 圖 8.10 FirstStrutsDemo 果結行執的案專 8 3
  • 40. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 於關有 Struts 的 上 站 網 我 考 參 以 可,紹 介 的 盡 詳 更 Struts :件 文 http://caterpillar.onlyfun.net/Gossip/Struts/StrutsGossip.htm 8.3.2 在 Struts 中整合 Spring 的 道知 讓是就法方的要主,用使合結 Struts Spring 與要 Struts Spring 關賴依的件組寫撰接直中式程在免避,件組的關相理管 Spring 讓以,在存 。立建係 冊註籤標 用使中 Struts 的 在要先首 struts-config.xml <plug-in> org. : springframework.web.struts.ContextLoaderPlugIn ... <plug-in className="org.springframework.web. → struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/beans-config.xml, /WEB-INF/..."/> </plug-in> ... 的 是一之法方, 的理管所 得取以可法方個幾有 Spring Bean Struts 類個這, Action 承繼改 org.springframework.web.struts.ActionSupport 的它用使以可,作實的別類象抽 Struts Action 的 是別 getWebApplication- 容 得取步一進後然,例實的 Context() 得取來 ApplicationContext Spring Bean :如例,例實 的理管所器 ... public class SomeAction extends ActionSupport { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) 8 4
  • 41. Chapter 8 View 、案方層 W eb 合整架框 throws Exception { ApplicationContext context = getWebApplicationContext(); SomeBean bean = (SomeBean) context.getBean("some"); ... return mapping.findForward("view"); } } ... 到得 可 並 , 作 實來承 繼 過 透 , 慣 習 用 使 的 Struts 合符式方種這 Action 一在合耦 的 Spring 與 是就處壞但,處好的係關件組理管 Spring Struts API 管 用 善 有 沒 並 這 ,輯邏 的 件 物 依 相 得 取 了 括 包 中 Action 且而,起 Spring 。處好的入注賴依理 ,別類 象抽的己自它承繼接直 Struts 的 Action 讓是式方個一另 Action 管 為成也件物 Spring 讓,件 物 Struts 的 Action 理管來 讓但 Action Spring 如例,件物依相入注式方的入注賴依用使接直以可就來一麼這, 的理 Bean :別類 的中案專 FirstStrutsDemo 下一改修新重以可 HelloAction StrutsSpringDemo HelloAction.java package onlyfun.caterpillar; import java.util.*; import javax.servlet.http.*; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class HelloAction extends Action { private UserChecker userChecker; public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, 8 41
  • 42. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) HttpServletResponse response) throws Exception { String username = request.getParameter("user"); username = this.getUserChecker().check(username); Map model = new HashMap(); model.put("username", username); request.setAttribute("userInfo", model); return mapping.findForward("helloUser"); } public UserChecker getUserChecker() { return userChecker; } public void setUserChecker(UserChecker userChecker) { this.userChecker = userChecker; } } 中其 UserChecker :示所下如義定的別類 StrutsSpringDemo UserChecker.java package onlyfun.caterpillar; public class UserChecker { public String check(String username) { if(username != null) { return username; } else { return "guest"; } } } 8 42
  • 43. Chapter 8 View 、案方層 W eb 合整架框 中 的 UserChecker在 要您, 件 物 查 檢 限 權 的 層 務 商 擬 模 Struts Action 以 可, 入 注 賴 依 作 您 為 來 UserChecker 由 交 以 可 這, 例 實 的 Spring 到用使 在如例,理管 HelloAction 給交都例實的 UserChecker 與 將 Spring Bean :義定麼這中檔義定 StrutsSpringDemo beans-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="userChecker" class="onlyfun.caterpillar.UserChecker"/> <bean name="/hello" class="onlyfun.caterpillar.HelloAction"> <property name="userChecker" ref="userChecker"/> </bean> </beans> ,時求請配分在 Action 麼那,理管的 入納已在現例實的 Spring Struts 代至配分先,前之 的定指至配分要求請當,制機理代間中個一有要 Action 將並 , 求 請 理 處 來 例 實 的理管所 Spring 知通件 物 理 代 由 , 件 物 理 Action 在以可這, 給回返 件 物 理 代 由 再 , 件物理 代 給 回 返 果 結 理 處 Struts struts- config.xml 用使中 org.springframework.web.struts.DelegatingAction- Proxy :如例,理代作來例實的 StrutsSpringDemo struts-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" 8 43
  • 44. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <action-mappings> <action path="/hello" type="org.springframework.web. → struts.DelegatingActionProxy"> <forward name="helloUser" path="/WEB-INF/jsp/hello.jsp"/> </action> </action-mappings> <plug-in className="org.springframework.web. → struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/beans-config.xml"/> </plug-in> </struts-config> 入加籤標 <plug-in> 了用使中檔義定在ContextLoaderPlugIn 定指並, Spring Bean 。稱名與置位之檔義定 的 了 , 為定設性屬 的 beans-config.xml 中 HelloAction 意注 "name" "/hello" <action> , 為定設須必也性屬 "path" 的中 "/hello"則 D elegatingAction- 兩 在夫功 花 要 是 就 點 缺 的 法 方 個 這 , 例 實 Proxy Action 到找來個這著藉是 結的行 執 , 成 完 改 修 邊 這 到 案 專 。對 比 稱 名 的 檔 義 定 個 S trutsSpringDemo 。 面 畫 的 圖下 一 考 參 以 可 面 畫 果 8.10 Spring 的 用使以可您 org.springframework.web.struts.Delegating- 在, RequestProcessor 的 Struts代取來RequestProcessor strutsconfig.xml :義定中 8 44
  • 45. Chapter 8 View 、案方層 W eb 合整架框 ... <plug-in className="org.springframework.web. → struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/beans-config.xml"/> </plug-in> <controller processorClass="org.springframework.web. → struts.DelegatingRequestProcessor"/> ... 將接直以可,次一這 Struts 的 Action 在寫稱名別類 , struts-config.xml :如例 , 覺 直 較 比 會 來 看 ... <action path="/hello" type="onlyfun.caterpillar.HelloAction"/> ... 楚 清 較 比 了 為 是 只 來出 寫 撰,定 設 的 性 屬 "type" 到用使會不並上實事 Action : 了 以 可 就 樣這要 只 法 寫 的 潔 簡 , 別 類 個 一 哪 了 用 使 ... <action path="/someAction"/> ... 至 配 分求 請 將 件 物 理 代 由 會 ,時 配 分 求 請 當 , 的 樣 同 Bean 中檔義定 。例實 / hello 的) (稱名同相有具 Action 8 4
  • 46. 8 46 :載下行進 com/j2ee/javaserverfaces/download.html h ttp://java.sun. J ava 站網方官 至以可案檔考參作實的 ,案檔關相的作實 JSF JSF載 下 何 如 紹 介 再 不, 制 限 的 幅 篇 於 基 邊 這 在 , 了 括 包 JSF Java EE 。 份 部個這 過 略 接 直 以 可 , 式 JSF 方寫撰的 解了經已您果如,例範合整的 與 JSF 習練際實以可也 Spring 8.4.2 JSF , 中 的 來 下 接 利 以 , 式 程 個 一 第 寫 撰 何如解 了 速 快 您 讓 在 的 目 JSF ,容 內 的 排 安 所 者 讀 的 過 觸 接 未 對 針 是 , 門 入 的 式 程 個 一 第 JSF 8.4.1 第一個 JSF 程式 。 Spring JSF 與 合整何 如 及 以 , 式 程 用 應 個 一 第 發 開 何 如 紹 JSF 介來將,中節小個這在,發開式程 手上速快以可也,員人的發開式程 Web 窗視面桌慣習讓,型模發開的式程用應窗視面桌似類供提,面介者用使構 建速快式方的曳拖以上境環發開合整援支並,件元) ( 的 U ser Interface UI View Web 用 使 複 重 可 層 的 供提,點 特 術 技 的 有 現商廠 家 各 合 綜,準 標 術 技個一的出提所) J ava Community Process ( 為 JCP JavaServer Faces 8.4 整合 JSF 框架 ) – http://openhome.cc 良信林(冊手術技 Spring 2.0
  • 47. Chapter 8 View 、案方層 W eb 合整架框 圖 8.11 JSF 頁網載下的考參作實 己 自 行 進 來 範 規 的 準 標 據 根 以 可 商 廠 個 各,準 標 術 技 個 一是 JSF 。考參作實的司公 是的供提上站網 ,本版作實的 S un Sun 到 用使 將, 式 程 個 一第的 作實 要於 對 JSF jsf-impl.jar 與 jsf-api.jar , 的 要需而因, 的 到用使要需 外另 JSF JSTL API JSTL jstl.jar 與 standard.jar , 、 要需還,外之此除 commons-digester.jar c ommons-collections.jar 、 c om- :示所下如 的要需所計總,案檔等 mons-beanutils.jar .jar jsf-impl.jar jsf-api.jar jstl.jar standard.jar commons-digester.jar 8 47
  • 48. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) commons-collections.jar commons-beanutils.jar 用採是也 JSF Web MVC 用使,構架 JSF (器制控端前任擔時 F ront 是的) controller javax.faces.webapp.FacesServlet 在要您,別類 web.xml :如例,它義定 FirstJSFDemo 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" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee → http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <session-config> <session-timeout> 30 </session-timeout> </session-config> <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> 8 48
  • 49. Chapter 8 View 、案方層 W eb 合整架框 由交求請的 的有所將,中義定的面上在 ".faces" FaceServlet ,理處來 是求請如例,頁網 的址網求請於對相起喚會 FaceServlet .jsp /index.faces 使始開以可就,置配的上以成完。頁網 起喚會上際實則,話的 /index.jsp JSF :別類 的單簡個一寫撰來先, 用 Bean FirstJSFDemo User.java package onlyfun.caterpillar; public class User { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } } 數參求請的者用使存儲以用, User 的單簡個是只別類 個這 JavaBean 不 並的重 偏 所 者 兩 但 , 現 實 的 構 架 J SF Struts 是都然雖 與 。值 Web MVC 也,計設的程流面頁於重著則 ;計設的件物制控是的重著 ,同相 S truts J SF ,結連何如是間之面頁個一下與面頁個一上,下立成件條種何在義定是就 :如例 , 程 流 面 頁 義 定 中 faces-config.xml 在以可 FirstJSFDemo faces-config.xml <?xml version="1.0" encoding="UTF-8"?> <!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> 8 4
  • 50. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <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.User </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config> 頁個一上程流面頁當,程流面頁了義定中籤標 <navigation-rule> 在 了括包中求請且並,面頁的定指中籤標 <from-view-id> 自來是面 值 的定指籤標 <navigation-case> 的中籤標 <from-outcome> "login" 。面頁的定指所中籤標 <to-view-id> 至向 導 求 請 將 會 則 , 時 能功是只,理管的件物 助協也 ,到看以可也中義定的面上在 J SF Bean 物 理管以可中籤標 Spring 在;多許了少器容 <managed-bean> 比 Bean 器覽瀏 啟 開 者 用 使 是 就 也, Bean 為 圍 範 活 存 的 件 物 定 設 可, 件 "session" Web 。用作在存以可都 ,段階話會的動互式程 與 B ean ,稱名 的 用 使 以可 們 他 , 是 訊 資 的 員 人計 設 頁 網 訴 告 要 來 下 接 Bean 所面上及以,稱名 的定設中籤標 <managed-bean-name> 是就也 "user" 員人計設頁網如例,值些這定設要需時件元面頁用使在,程流面頁的義定 JSP :頁網 的下以寫撰會 8
  • 51. Chapter 8 View 、案方層 W eb 合整架框 FirstJSFDemo index.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <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> ,庫籤標 與 的 了用 使 中 頁 網 的 面 上 在 JSF "core" "html" " core" 有是 。籤標階進的 UI 於關有是則 而,理處的件元 於關 "html" HTML 籤標 與 在要定一件元些這,時件元 用使始開 JSF <f:view> </f:view> ,籤標階進的關相籤標 " html" 與是都乎幾中庫籤標 ;間之 HTML < h:form> 中檔義定 示顯來 用使 , 單 表 個 一 生 產 會 <h:inputText> faces-config.xml 一生產會 "user" 而,性屬 Bean 的件物 個這"name" <h:commandButton> 的義定中 據根將定指之中性屬 "action"在,鈕按交提個 faces-config.xml "login" :下如計設其,面頁 往前中程流面頁 welcome.jsp 8 1
  • 52. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) FirstJSFDemo welcome.jsp <%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title>個一第 JSF </title> 式程 </head> <body> <f:view> <h:outputText value="#{user.name}"/> !好您 <h3> 用使迎歡 JavaServer Faces </h3> ! </f:view> </body> </html> ,性屬 的件物 個這 得取以可籤標 <h:outputText> "user" Bean "name" 則中頁網個這在而,值數參求請的出送所中 前先括包將性屬個這 index.jsp :果結行執的 下 一 看來先 首 , 來 出 示 顯 之 將 index.jsp 圖 8.12 FirstJSFDemo 的案專 index.jsp 果結行執頁網 8 2
  • 53. Chapter 8 View 、案方層 W eb 合整架框 : 面 畫 果 結 的 下 以 到看以 可 , 後 鈕 按 出 送 並畢完 寫 填 中 位 欄 稱 名 在 圖 8.13 FirstJSFDemo 的案專 welcome.jsp 果結行執頁網 至以可,式方發開的得所即視所中 在 下一驗體想果如 JSF IDE 載下 http://developers.sun.com/prodtech/javatools/jscreator/index.jsp 圖 下,載 下 費 免 具 工 發 開 該 供 提 已 現 司 公 , Sun Java Studio Creator S un :面畫輯編件元頁網得所即視所的 Sun Java Studio Creator 為 圖 8.14 Sun Java Studio Creator 輯編件元頁網得所即視所的 8 3
  • 54. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) ,上輯編的程流面頁在而 S un Java Studio Creator 計設的化視可供提也 :式方 圖 8.15 Sun Java Studio Creator 輯編程流面頁的化視可 於關有多更到找上站網的我在以可,話的趣興有 JSF :紹介的 http://caterpillar.onlyfun.net/Gossip/JSF/JavaServerFaces.htm 8.4.2 在 JSF 中整合 Spring 容 的 JSF 過 不,能 功 的 入 注 賴 依 有 理 管 的 於 對 身 本 Bean Spring IoC 可也上理處易交在,架框 有還 面 方 一另, 能 功 的 多 更 供 提 器 Spring AOP 。助協供提 8 4
  • 55. Chapter 8 View 、案方層 W eb 合整架框 被以可,稱名 的 JSF Spring 讓是就的目要主,合結的 與 Spring Bean 定 在 是 就 也,用 使 來 稱 名 的 上 籤 標 JSF <managed-bean-name> 為作視 JSF 名到不找中 的 己 自 在 若 , 時 例 實 求要 稱 名 據 根 中 檔 義 Bean JSF Context 。找尋去中 Spring 的 到試嘗以可,稱 Context ,作運合結何如 與 範示以,案專 FirstJSFDemo 下一寫改來 JSF Spring :別類 的單簡個一計設先首 UserChanger JSFSpringDemo UserChanger.java package onlyfun.caterpillar; public class UserChanger { public String getChangedName(String name) { return name.toUpperCase(); } } 接,件物個一的層務商擬模來用,寫大成改稱名的入傳將會別類個這 User :別類 下一寫改來著 JSFSpringDemo User.java package onlyfun.caterpillar; public class User { private String name; private UserChanger userChanger; public void setName(String name) { this.name = getUserChanger().getChangedName(name); } public String getName() { return name; } 8
  • 56. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) public void setUserChanger(UserChanger userChanger) { this.userChanger = userChanger; } public UserChanger getUserChanger() { return userChanger; } } 會 稱 名 的 出 送 者 用 使,入 注 例 實 的 別 類 User UserChecker 受接中別類 UserChecker 用使以可,寫大為改例實的別類 被 org.springframework. 在以可稱名 的 讓別類 web.jsf.DelegatingVariableResolver Spring Bean JSF :定設中JSF 的 在以可,用使中 faces-config.xml JSFSpringDemo faces-config.xml <?xml version="1.0" encoding="UTF-8"?> <!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> <application> <variable-resolver> org.springframework.web.jsf.DelegatingVariableResolver </variable-resolver> </application> <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.User 8 6