。式方合整的際實及以,色角的居所             ,下架框
                                       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
Chapter 8 View   、案方層      W eb   合整架框

        </managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
           <property-name>userChanger</property-name>
           <value>#{userChanger}</value>
        </managed-property>
    </managed-bean>
</faces-config>



,例實      的       義定有沒並中檔義定的 在上際實
               JSF                         " userChanger"    Bean
物 JSF             用使會,時
               " userChanger" 到不找 當       DelegatingVariableResolver
這 是 檔 義 定 設 假,例 實 的 名 同 找 尋 中
    Spring      Context       的    於件 Bean               Bean
                                :的寫撰麼
  JSFSpringDemo                                          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="userChanger"
           class="onlyfun.caterpillar.UserChanger"/>

</beans>



讓了為          DelegatingVariableResolver   道知件物    Bean   位與稱名 的 檔 義 定
在須必,置
  用使中        web.xml        org.springframework.web.context.Context-
用 使 並,別 類
LoaderListener                  <context-param>   定指籤標      Bean   的檔義定
      :如例,置位與稱名



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

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

        <listener>
            <listener-class>
                org.springframework.web.
                           → context.ContextLoaderListener
            </listener-class>
        </listener>

        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/beans-config.xml</param-value>
        </context-param>

        <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   8
Chapter 8 View     、案方層     W eb   合整架框

       援支不在  Listener   如例(上器容的定設            Servlet 2.2   ,)本版的早更及以
         用使以可                                              代取來
          org.springframework.web.context.ContextLoaderServlet
:如例,定設    的面上
       Listener


...
<servlet>
    <servlet-name>demoConfig</servlet-name>
    <servlet-class>
    org.springframework.web.
           → context.ContextLoaderServlet
    </servlet-class>
</servlet>
...


是稱名者用使的出送,中果結的行執下一看,式程下一作運以可在現
畫考參的時行執,     為稱名者用使的出送設假,寫大為改被會否             "caterpillar"
                          :示所下如面




                  圖     8.16 JSFSpringDemo   果結行執的案專




                                                                       8
8 6
           用使合整案方       Web   的它其與以可   8.17 Spring   圖
                                                  。的致一是
都式方用使的中      Spring在,作實案方麼什是層底論無,裝封的                  於基   Spring
, 型模裝 封 性 致 一 的 供 提 所等務 服 程 排 、 務 服 件 郵 、 務 服 程 遠 於    下     Spring
一紹介來將,節章個一下在,明說的案方合整層 於關有多更有還,中            Web
件文考參的    Spring在 ,邊這 到 明 說 且 暫 , 援 支 的 層 於     Web  對    Spring
                                         8.5 接下來的主題
             )    – http://openhome.cc   良信林(冊手術技           Spring 2.0
Chapter 8 View   、案方層   W eb   合整架框




                                 8 61

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
  • 57.
    Chapter 8 View 、案方層 W eb 合整架框 </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>userChanger</property-name> <value>#{userChanger}</value> </managed-property> </managed-bean> </faces-config> ,例實 的 義定有沒並中檔義定的 在上際實 JSF " userChanger" Bean 物 JSF 用使會,時 " userChanger" 到不找 當 DelegatingVariableResolver 這 是 檔 義 定 設 假,例 實 的 名 同 找 尋 中 Spring Context 的 於件 Bean Bean :的寫撰麼 JSFSpringDemo 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="userChanger" class="onlyfun.caterpillar.UserChanger"/> </beans> 讓了為 DelegatingVariableResolver 道知件物 Bean 位與稱名 的 檔 義 定 在須必,置 用使中 web.xml org.springframework.web.context.Context- 用 使 並,別 類 LoaderListener <context-param> 定指籤標 Bean 的檔義定 :如例,置位與稱名 8 7
  • 58.
    Spring 2.0 良信林(冊手術技 – http://openhome.cc ) JSFSpringDemo 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> <listener> <listener-class> org.springframework.web. → context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/beans-config.xml</param-value> </context-param> <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 8
  • 59.
    Chapter 8 View 、案方層 W eb 合整架框 援支不在 Listener 如例(上器容的定設 Servlet 2.2 ,)本版的早更及以 用使以可 代取來 org.springframework.web.context.ContextLoaderServlet :如例,定設 的面上 Listener ... <servlet> <servlet-name>demoConfig</servlet-name> <servlet-class> org.springframework.web. → context.ContextLoaderServlet </servlet-class> </servlet> ... 是稱名者用使的出送,中果結的行執下一看,式程下一作運以可在現 畫考參的時行執, 為稱名者用使的出送設假,寫大為改被會否 "caterpillar" :示所下如面 圖 8.16 JSFSpringDemo 果結行執的案專 8
  • 60.
    8 6 用使合整案方 Web 的它其與以可 8.17 Spring 圖 。的致一是 都式方用使的中 Spring在,作實案方麼什是層底論無,裝封的 於基 Spring , 型模裝 封 性 致 一 的 供 提 所等務 服 程 排 、 務 服 件 郵 、 務 服 程 遠 於 下 Spring 一紹介來將,節章個一下在,明說的案方合整層 於關有多更有還,中 Web 件文考參的 Spring在 ,邊這 到 明 說 且 暫 , 援 支 的 層 於 Web 對 Spring 8.5 接下來的主題 ) – http://openhome.cc 良信林(冊手術技 Spring 2.0
  • 61.
    Chapter 8 View 、案方層 W eb 合整架框 8 61