SlideShare una empresa de Scribd logo
1 de 80
Descargar para leer sin conexión
。別類
    的當適用使求需的己自依以可您讓,構架承繼
Controller                                            Controller
的善完個一了供提還    ,外之架框       供提了除
                      Spring              Web MVC
             。便方為更上合整的能功多許在,能功器
容 的
  IoC    合結,題問架框
         Spring             的存現決解能望希,案
                               Web MVC
方架框       的己自供提也
        Web MVC         ,)     S pring(架框F ramework        MVC
  的 案 專)
Web           (碼 始 原 放 開 多 許 有 今 現 , 構 架 的 薦 推 所
             O penSource
員人發開數多受 ,時式程用應 發開來以久長是構架   Web                        Web MVC
                  Spring Web MVC 框架
      7
Spring 2.0   良信林(冊手術技            – http://openhome.cc     )

  7.1 Spring Web MVC 入門
        的單簡最個一從將,中節小個這在                              解了來,式程用應
                                              Spring Web                     Web
  MVC   的    及以,式方作運的構架           Spring    Web   。構架     現實何如架框Web MVC



  7.1.1 使用 Eclipse Web Tools Platform

              用使將,式程用應 的章本
               Web                         Eclipse Web Tools Platform   (   W TP   )
  「的               在以可您,發開行進來
                           http://www.eclipse.org/webtools/        d ownloads      」
  用使將章本。本版的」             「載下區
            W ebTools Platform; All-in-one                         Tomcat 5.5
         至請也以所,)
        Servlet      (器容   為作
                        C ontainer                   http://tomcat.apache.org/
        Tomcat 5.5    。    載下

             用使算打果如     Eclipse   裝安式方新更上線的          WTP   下 考 參 以 可 則,
          :學教音影的址網列
          http://eclipse.cdpa.nsysu.edu.tw/technology/phoenix/demos/i
          nstall-wtp/install-wtp.html



  寫撰了為,後之 行執在  WTP                      Web   的便方些一用使以可,時式程用應
      「行執 請 , 合 組 窗 視 具 工                     啟開擇選,」
                             W indow/Open Perspective/Other…
     :」
      J 2EE Perspective 「




7 2
Chapter 7 Spring Web MVC     架框




                       圖   7.1   啟開擇選      J2EE Perspective


   動啟接直中 在以可就此如,境環行執
              Server               定設要先首              WTP             Tomcat
選方下窗視 在請,式程用應 的寫撰所中 在試測以,器容
              WTP                     Web                     WTP
    :」   「行執 , 鍵 右 鼠 滑 按 中 窗 視 於 並 , 」
   S ervers                              「擇           N ew/Server




                           圖   7.2   增新   Server   境環行執
用使將章本為因           Tomcat 5.5         「在著接以所,          N ew Server   擇選中窗視」
 「的中」
 A pache「       T omcat v5.5 Server     :」




                                                                          7 3
7 4
                               :                                        FirstSpringMVC
為稱名案專            Spring Web MVC
                個一第設假,稱名案專入輸,後之鈕按
     N ext
」 「下按在,案專」                   W eb/Dynamic Web Project
                             「擇選,時案專增新
」   F ile/New/Project…
        「行執 在 以 可 , 式 程 用 應 寫 撰 要 中 在                      Web             WTP
                          境環行執    Server   了增新       7.4   圖
                : 示 所 圖 下 如 後成完 , 增 新 的 境 環 行 執 成完可即,鈕按        Server
」   F inish   「下按著接,夾料資裝安         Tomcat
                                      擇選請,後之鈕按」 「下按                     N ext
                            型類   Server   定設   7.3   圖
                    )   – http://openhome.cc          良信林(冊手術技              Spring 2.0
Chapter 7 Spring Web MVC      架框




                    圖   7.5   態動增新       Web   案專
理管源資了為次這。增新的案專成完可即,後之鈕按」 「下按
     F inish
,          的依相其及以,     用使接直,便方的上
                spring.jar                      commons-logging.jar
     jar    。下夾料資      到放 個兩這將請
               WEB-INF/lib




                    圖   7.6   態動   Web   構結案專




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

  式程用應   在置放須必是或,案檔碼始原
           WTP            的中
                         Java        在                           Web
  資關相 或頁網它其,下之錄目 在增新以可,案檔的下
  Classpath                            src                         Web
     為)  (出匯要後以,下之錄目         在增新以可,源
                    WebContent                                E xport       WAR
    為織組案檔關相將動自會 ,時案檔)
      W eb Application Archive           (   W TP                            Web
                     。 構結統 系 案 檔 的 式 程 用 應

  7.1.2 第一個 Spring Web MVC 程式

  先須 必 而 , 源 資 的 需 所至接 連 接 直 不 並 者 用 使 , 中 構 架
          Web MVC                                       在
  求請的 者 用 使 斷 判 器 制 控 端 前 由 , )
                         F ront controller   ( 器 制控 端前至接連
  達 此藉 ,求 請 理 處 來)
            D ispatch       (件 物 制 控 個 一 哪 給 )        (派 分 要
                                               C ontroller
                                    。 的 目 之源資 求 請 者 用 使 制 控 到
           是的色角器制控端前任擔,中架框
          Spring    Web MVC                     的       在           org.spring-
  將責負
  framework.web.servlet.DispatcherServlet
                       ,                             D ispatcherServlet
  是就,步一第的                     用 使 以 所 , 件 物制控 給 配 分 求 請 的 戶 客
                                              Spring Web MVC
      web.xml                 :
                        DispatcherServlet      義定中          在
      FirstSpringMVC                                                      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>




7 6
Chapter 7 Spring Web MVC        架框

       <servlet>
           <servlet-name>dispatcherServlet</servlet-name>
           <servlet-class>
               org.springframework.web.servlet.DispatcherServlet
           </servlet-class>
           <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>/WEB-INF/mvc-config.xml</param-value>
           </init-param>
           <load-on-startup>1</load-on-startup>
       </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>



      例實的  web.xml       個一了義定中             在
                                       DispatcherServlet       "dispatcher-
由會都求請的尾結
Servlet"      至接連有所,到看以可中定設從,                      *.do
定設來用數參始初
"dispatcherServlet"          ,理處來
                             " contextConfigLocation"
參始初
Bean                置設不果如,稱名與置位的檔義定         "contextConfigLocation"
    「取讀,置前為稱名的         用使會設預
         DispatcherServlet                  則,數
                                        Servlet                       S ervlet
取讀會則中定設的面上在,檔義定
       - servlet.xml         其為作」
                                Bean         稱名
mvc-config.xml               。義定的中
           :是 像 , 源 來 的 檔 義 定 個 多 義 定 以 可 也 您
                         Bean


...
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-config.xml,



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

              → /WEB-INF/other-service.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  ...


    (件物制控至求請配分責負
       DispatcherServlet                            C ontroller   在,)   Spring
  Web MVC 作實要件物制控,中架框                     org.springframework.web.servlet.
  的作實須必個一有面介
  mvc.Controller ,面介       C ontroller                      handleRequest()
               :示所 下 如 義 定 其 , 法 方
  package org.springframework.web.servlet.mvc;

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

  public interface Controller {
      ModelAndView handleRequest(HttpServletRequest request,
          HttpServletResponse response) throws Exception;
  }

         行執會,求請的配分
          Controller                到收
                              DispatcherServlet  當                    handle-
  Request()       個一傳回後畢完理處,求請理處來法方                  org.springframework.
  在現呈要了括包                ,例實的
  web.servlet.ModelAndView                  M odelAndView
  。 息 訊 關 相 的 層 它 其 及 以, 料 資
  View           JSP            的)頁網 如例(層
                                  Model               View

               個一由將求請的者用使,中
                S pring Web MVC            個一第在               H elloController
                             : 示 所 下如作 實 其 , 理 處 來 件 物
      FirstSpringMVC                                 HelloController.java
  package onlyfun.caterpillar;

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



7 8
Chapter 7 Spring Web MVC            架框

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");
        return new ModelAndView(viewPage, "user", user);
    }

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



在定設並,數參求請 的者用使自來了得取,中
           Controller                     個這在   " user"
個一第的
ModelAndView   構 建 ,中 子 例 個 這 在 , 中 例 實 的        ModelAndView
得取來用定設是數引個二第,徑路)源資或(頁網標目的現呈要為數引
   的 料 資 現 呈 層 給 是 數 引 個 三 第 而 , ) (鍵 的 件 物
Model        "     K ey   "                     View                 Model
                                            。件物

        進,求 請 的 者 用 使 集 收 為 用 作 的 件 物 制 控,下 構 架
         Web MVC                                  在
        也,輯邏務商行執中件物制控在應不,作動的關相層 與行
           Web
        件 物 的 層 務 商 讓 會 這,層 務 商 至 入 侵 的 關 相
             Servlet           API              讓應不
        件物
         Servlet API        讓 能 不 如 例,合 耦 生 產     與
                                         HttpServletRequest
                                   。中之件物層務商至定設接直
器容 其在              的
          Spring Web MVC   ,是處好的      S pring     用使
                                                  Controller       IoC
相 成完來 入 注 賴 依 其 用 利 並 , 理 管 以 加 來
                              Bean    的般一 同 如 以 可 , 下 理 管
       定設中案檔 在以可您,說來子例的邊這以,入注的件物關               XML               Controller
的檔義定        下 一 看 來 ,徑路 頁 網 的 料 資 現 呈 要所, 後 之 畢 完 理 處 求 請  Bean


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

  依,容內        web.xml     在請,定設的中        WEB-INF     立建下錄目         mvc-config.xml
   :案檔
      FirstSpringMVC                                               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="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>



   上際實                          個一據根須必
                 DispatcherServlet                  HandlerMapping    定決,件物
  個一哪由求請           Controller       ,理處來D ispatcherServlet   用使設預     org.spring-
  是就也,
  framework.web.servlet.handler.BeanNameUrlHandlerMapping
  一 哪用 使 定 決 , 的 求 請 者 用 使 及 性 屬
        Bean               "name"  的時義定在 據根                  URL
  ,時  Controller      求請,中子例個這在如例,例實       個        /FirstSpringMVC/hello.do
          為    用使要定決,稱名
  DispatcherServlet                據根
                           "hello.do"                        "name"     "hello.do"
     。理處來例實的
      Bean                   由交求請將是就以所,例實 的
                                          HelloController

  由交會              ,後
             Controller           回傳     當
                                ModelAndView           D ispatcherServlet
  個一置設要需您而因,析解關相的層
  ViewResolver                    作來件物
                                View
  用使以所,術技層 為作 以將中例範個這在,例實
  ViewResolver                                JSP        View


7 1
Chapter 7 Spring Web MVC              架框

org.springframework.web.servlet.view.InternalResourceViewResolver                       ,
InternalResourceViewResolver      置設要需        "viewClass"        是設預,    org.spring-
framework.web.servlet.view.InternalResourceView              援支別類個這,
Servlet        。)      、 是像(源資關相的術技
                                  JSP    S ervlet

    與會性屬       、      的
    InternalResourceViewResolver            "prefix"    " suffix"              Model-
則,串字
AndView  為 回 傳 訊資徑 路 若 如 例 , 合 結 訊 資 徑 路 的 回 傳                      "hello"
   。               是 就 徑 路 的 際 實 ,合結 定 設 子 例 的 上 以 與
                                               /WEB-INF/jsp/hello.jsp

       :       的試測個一寫中
                   /WEB-INF/jsp/         在以可後最          hello.jsp


  FirstSpringMVC                                                          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">
<title>First Spring MVC</title>
</head>
<body>
    <h1>Hello, ${user}!!</h1>
</body>
</html>



         由經,件物   的置設中
          ModelAndView             在  Model                InternalResourceView-
的取存可中術技 為定設將,析解的
Resolver                       及
             InternalResourceView                             JSP
取來        的中術技 用使以可此因,)
      A ttribute                   (性屬JSP              Expression Language
參 了帶附時     求請在您果如,式程的寫撰所上以依,料資得                        hello.do               " user"
       「的 行執以可,息訊 現出會 的後最則,數
               JSP          " user"                    WTP          R un/Run As/Run
網將請,器覽瀏 動啟並
On Server      動啟動自會 ,令指」
                     W TP                Tomcat              Web
個一,                               向指址
          http://localhost:8080/FirstSpringMVC/hello.do?user=Justin
                   : 示所下 如 面 畫 考 參 的 行 執
                                                                                   7 11
Spring 2.0   良信林(冊手術技          – http://openhome.cc     )




                       圖   7.7 FirstSpringMVC   面畫考參行執

 7.1.3 WebApplicationContext
         的義定 所 己 自 在 要 想 果 如     Servlet   用使中別類    Spring   則,能功器容的
                       用 使以可 也                               例,
              org.springframework.web.context.ContextLoaderListener
 :義定以加籤標
       web.xml用使中            在如
                      <listener>


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


 取讀會設預 ContextLoaderListener               applicationContext.xml   以可您,
      在要只,檔義定的己自定指              <context-param>    定指中       "contextConfig-
        :如例,數參
 Location"


 ...
 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/beans-config.xml,
            → /WEB-INF/demo-service.xml</param-value>
 </context-param>
 ...




7 12
Chapter 7 Spring Web MVC         架框

     的義定自在以可著接                Servlet   用使中     org.springframework.web.
context.support.WebApplicationContextUtils       從,            得取中
                                                      ServletContext
org.springframework.web.context.WebApplicationContext           :如例,
WebApplicationContext ctx =
    WebApplicationContextUtils.
        getRequiredWebApplicationContext(
                         this.getServletContext());


     WebApplicationContext        了作實   ApplicationContext      是,面介   Spring
為專     Servlet   的   Web         的計設式程用應ApplicationContext   取在,別類作實
 得WebApplicationContext    得取來它用利以可,後之                Bean   的義定中檔義定
Bean   :如例,例實
Date date = (Date) ctx.getBean("dateBean");


援支不在             Listener   如例(上器容的定設         Servlet 2.2   ,)本版的早更以
  用使以可                                                      來
            org.springframework.web.context.ContextLoaderServlet
 的面上代取       ContextLoaderListener   :如例,定設的
...
<servlet>
    <servlet-name>contextLoader</servlet-name>
    <servlet-class>
      org.springframework.web.context.ContextLoaderServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
...


設假,式方態組的整完範示來例範的單簡個一寫撰,述敘的上以合綜
     : 示 所 下 如 , 能功時 報 供 提 為 用 作 , 式 程
                 Servlet               個一了寫撰您


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

      WebApplicationContextDemo                           TimeServlet.java
  package onlyfun.caterpillar;

  import    java.io.*;
  import    javax.servlet.*;
  import    javax.servlet.http.*;
  import    org.springframework.web.context.WebApplicationContext;
  import    org.springframework.web.context.
                                     support.WebApplicationContextUtils;

  public class TimeServlet extends HttpServlet {
      public void doGet(HttpServletRequest req,
                      HttpServletResponse res)
                    throws ServletException, IOException {
          WebApplicationContext ctx =
                  WebApplicationContextUtils.
                      getRequiredWebApplicationContext(
                          this.getServletContext());

            PrintWriter out = res.getWriter();
            out.println(ctx.getBean("dateBean"));
        }
  }



   了用使中      個這Servlet                WebApplicationContext   得取試嘗來
 義定中    在以可,
 "dateBean"              web.xml         ContextLoaderListener義定 與
                                                                 Bean
         :如例,置位的檔
      WebApplicationContextDemo                                    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>



7 14
Chapter 7 Spring Web MVC       架框

    </session-config>

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

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

    <servlet>
        <servlet-name>time</servlet-name>
        <servlet-class>
            onlyfun.caterpillar.TimeServlet
        </servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>time</servlet-name>
        <url-pattern>/time.do</url-pattern>
    </servlet-mapping>
</web-app>



了 定 設,中 性 屬
      <context-param>          的             在
                        "contextConfigLocation"                  Bean
          : 示 所 下 如 容 內 的 檔 義 定 ,稱 名 與 置 位 的 檔 義 定
                    B ean


 WebApplicationContextDemo                         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="dateBean"
            class="java.util.Date" scope="singleton"/>

</beans>



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

 至接 連 器 覽 瀏 用 使 以 可             TimeServlet   執個一,間時的接連示顯會頁網,
     :示所下如面畫的行



                圖   7.8 WebApplicationContextDemo   面畫考參行執的

 7.1.4 Handler Mapping
   ,時到來求請的戶客當                                  決件物
                              D ispatcherServlet         據根
                                                      Handler mapping
 的 應 對至配 分 求 請 將 何 如 , 定          Controller   常通,說來式程用應 於對,
                                                     Web
      至應對徑路 以是就
          URL                Controller   。
 的設預   DispatcherServlet          Handler mapping    是   org.springframework.
 web.servlet.handler.BeanNameUrlHandlerMapping                  在使即以所,  Bean
 告宣確明有沒中檔義定                      BeanNameUrlHandlerMapping   用使會也,
 BeanNameUrlHandlerMapping   依       Bean     的義定   "name"   決來, 之性屬
                                                                  URL
 個一哪用使定         Controller   :如例,
 ...
       <bean id="viewResolver"
             class="org.springframework.web.servlet.
                      → view.InternalResourceViewResolver">
           <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>
 ...


7 16
Chapter 7 Spring Web MVC          架框

 對 者 用 使,中 定 設 的 面 上 在           /hello.do   ,求 請 的 徑 路   D ispatchServlet   都
。理處件物               由交會
         HelloController


      BeanNameUrlHandlerMapping                  的單簡是於用適僅,
                                               Handler mapping
得 使 它為因 , 式 程 用 應 的 型 小        URL      Controller 與 關立 建 接 直 稱 名 別 類 的
         的
         Spring   在,係
                  Handler mapping             是的用使常最中org.springframework.
                                    下如子例的用使個一,
web.servlet.handler.SimpleUrlHandlerMapping
:示所
...
      <bean id="urlHandlerMapping"
            class="org.springframework.web.servlet.
                      → handler.SimpleUrlHandlerMapping">
          <property name="mappings">
              <props>
                  <prop key="/hello.do">helloController</prop>
                  <prop key="/welcome.do">welcomeController</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="helloController"
              class="onlyfun.caterpillar.HelloController">
          <property name="viewPage" value=”hello”/>
      </bean>

      <bean id="welcomeController"
            class="onlyfun.caterpillar.WelcomeController">
          ...
      </bean>
...




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

   的求請是   的  ,中置設的性屬
           "mappings"      在              < prop>     "key"             URL   而,
 的    ,稱名 的求請理處上際實定設間
 <prop>       </prop>    與                          Bean          < prop>    "key"
              :如例,    用使以可還置設
                   Wildcard


 ...
        <bean id="urlHandlerMapping"
              class="org.springframework.web.servlet.
                        → handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <prop key="/hello*.do">helloController</prop>
                    <prop key="/welcome.do">welcomeController</prop>
                </props>
            </property>
        </bean>
 ....


 以,中置設的面上在                   hello 的尾結 及頭開 .do        URL    給交會都,求請         Bean
       的中檔義定  " helloController"       。理處來
        義定若    Controller   用 使可則 , 範 規 名 命 守 遵 時 稱 名          Spring 2.0   的增新
 org.springframework.web.servlet.mvc.support.ControllerClassName
 HandlerMapping     寫改以可如例,            FirstSpringMVC   的   mvc-config.xml   :下如
 ...
        <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=”controllerClassNameHandlerMapping”
             class="org.springframework.web.servlet.mvc.
                       → support.ControllerClassNameHandlerMapping"/>

        <bean name="helloController"
              class="onlyfun.caterpillar.HelloController">


7 18
Chapter 7 Spring Web MVC          架框

          <property name="viewPage" value="hello"/>
      </bean>
...


             與求請的    將動自會
      ControllerClassNameHandlerMapping                 hello*
Controller      尋找試嘗會將求請的    如例,對比稱名別類
                                  hello.do                           Hello-
Controller        則,求請的   是若,的樣同,理處來例實 welcome*                  Controller-
             。理處來例實
ClassNameHandlerMapping   尋找試嘗會        WelcomeController



7.1.5 Handler Interceptor
           在是者或,後前的行執
             Controller   在果如                View   記些 一 作 算 打 後 之 製 繪
                 作實以可,作動等求請截攔或錄org.springframework.web.servlet.Hand-
下如義定其,法方個三了範規中面介個這在,面介
lerInterceptor
                            :示所
package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface HandlerInterceptor {
    boolean preHandle(HttpServletRequest request,
                HttpServletResponse response,
                    Object handler) throws Exception;
    void postHandle(HttpServletRequest request,
                HttpServletResponse response,
                Object handler,
                ModelAndView modelAndView) throws Exception;
    void afterCompletion(HttpServletRequest request,
                HttpServletResponse response,
                Object handler,
                Exception ex) throws Exception;
}




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

        的回傳,行執被前之求請理處
          preHandler()         Controller在會                                  boolean
  回傳果如,求請理處來                是或
                   Handler Interceptor            讓否是定決值
                                                 Controller
  false      ,求請理處不就              或
                          Interceptor         的來下接則,
                                          Controller                p ostHandler()
  在會法方       Controller,行執被後之求請完理處                    在會則
                                                       a fterCompletion()
  View                               。行執被後之成完製繪
                                                承繼以可您
                     o rg.springframework.web.servlet.handler.HandlerInter-
  方的 要 必 對 針 要 只 您,面 介
  ceptorAdapter                        了 作 實 它,
                                  HandlerInterceptor
         作實中當在,案專                     改 修以可 如 例 , 義 定 新 重 法
                                    FirstSpringMVC                          Logging-
  Interceptor  : 錄 記 作來後 、 前 的 理 處 件 物 制 控 被 求 請 在 ,
      HandlerInterceptorDemo                             LoggingInterceptor.java
  package onlyfun.caterpillar;

  import     java.util.logging.Logger;
  import     javax.servlet.http.HttpServletRequest;
  import     javax.servlet.http.HttpServletResponse;
  import     org.springframework.web.servlet.ModelAndView;
  import     org.springframework.web.servlet.
                        handler.HandlerInterceptorAdapter;

  public class LoggingInterceptor
          extends HandlerInterceptorAdapter {
      private Logger logger =
              Logger.getLogger(this.getClass().getName());

          public boolean preHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler) throws Exception {
              logger.info(
                      handler.getClass().getName() + "        ...");
                                                              行執始開
              return true;
          }

          public void postHandle(HttpServletRequest request,
                      HttpServletResponse response, Object handler,




7 2
Chapter 7 Spring Web MVC   架框

                  ModelAndView modelAndView) throws Exception {
          logger.info(
                  handler.getClass().getName() + "    畢完行執...");
      }

      public void afterCompletion(HttpServletRequest request,
                  HttpServletResponse response, Object handler,
                  Exception ex) throws Exception {
          logger.info("畢完理處求請    ...");
      }
}



個一這用使要             HandlerInterceptor   在須必,   Bean   ,義定行進中檔義定
     :如例
    HandlerInterceptorDemo                              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="loggingInterceptor"
            class="onlyfun.caterpillar.LoggingInterceptor"/>

      <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="urlHandlerMapping"
            class="org.springframework.web.servlet.
                      → handler.SimpleUrlHandlerMapping">
          <property name="interceptors">
              <list>
                  <ref bean="loggingInterceptor"/>
              </list>



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

           </property>
           <property name="mappings">
               <props>
                   <prop key="/hello.do">helloController</prop>
               </props>
           </property>
       </bean>

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

  </beans>



 當;                     是
                       UrlHandlerMapping 的用使所意注SimpleUrlHandlerMapping
 控 在,錄 記 行 進 會 都 後 前 的理處 被 求 請 在 , 時 求 請
       DispatcherServlet                        過透
        C onsole        :示所下如訊資的到看所)          (台制




                   圖   7.9 HandlerInterceptorDemo   面畫考參行執的


 7.1.6 Controller 繼承架構

 是的求請理處上際實,後之求請出送者用使當                                             實以可您,
                                                          Controller
   ,中   在,求請理處來面介
    Controller        作               Spring        C ontroller   容     是
                                                                   Spring IoC




7 22
Chapter 7 Spring Web MVC        架框

  的富豐供提      Bean。例實 個一的理管器  S pring                 Controller   根以可,構架承繼
的需所 成 完 以 , 別 類 個 某承繼 來 求 需 的 上 際 實 據                      Controller。理處
:構架承繼的       Spring中      出列下以
                           Controller




                       圖   7.10 Spring   中   Controller   構架承繼
   介簡別分下以         Controller    :用作之別類關相
  AbstractController
  AbstractController            了承繼並,面介
                                Controller       了作實              WebContentGene-
   了供提,
  rator                直以可您。理處的)
                 Session              (化步同與取快    s ynchronized
      承繼接              處來法方
          AbstractController           義 定 新 重 並,handleRequestInternal()
  :如例,求請理
  public class SomeController extends AbstractController {
      public ModelAndView handleRequestInternal(
                 HttpServletRequest request,
                 HttpServletResponse response) throws Exception {
          ....
          return new ModelAndView("view", "modelName", model);



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

         }
         ..
    }


    MultiActionController
    的您,時大增模規式程在,別類              個一寫撰求請個一每為果如
                                Controller
    Controller用 使 接 直 或 承 繼 以 可。加 增 速 迅 會 將 別 類     MultiActionController
    寫撰求請個一每用不而,件物個一同於中集理處求請的關相個數將,別類
                                           。件物制控個一
    BaseCommandController        、
                             A bstractCommandController

    使以可則,理管以加中件物            個一至取擷值數參求請將要需果如
                                     Command
    一是     ,中     在。別 類 子 的 別 類
        BaseCommandController                    用
                                               Spring       C ommand
    至定設並取擷數參求請將責負
        JavaBean   B aseCommandController  ,     個
    流理處的續後了義定則
    Command                            ,中件物
                       A bstractCommandController
    ,         義定來                          承繼會常通,程
                   AbstractCommandController        CommandController
                                           :下如子例個一
    public class SomeCommandController
                        extends AbstractCommandController {
        public SomeCommandController() {
            setCommandClass(YourCommand.class);
        }

         public ModelAndView handle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object command,
                         BindException exception) throws Exception {
             YourCommand your = (YourCommand) command;
             ...
             return new ModelAndView(..);
         }
         ..
    }


    AbstractFormController


7 24
Chapter 7 Spring Web MVC            架框

              ,理處單表於對
                   A bstractFormController   單表及,數參求請理處了義定中
   。程流面頁的行進要所時敗失或功成交提
   SimpleFormController
        承 繼 以 可,理 處 單 表 的 單 簡 於 對    SimpleFormController   定 新 重 以 可,別 類
   理處己自要果如,法方
     doSubmitAction()           義                           新重以可則,
                                                 ModelAndView
               。法方
        onSubmit()            義定
   AbstractWizardFormController
        承繼以可,說來頁網的集收料資成完來面畫單表個數要需於對                                    Abstract-
   來能功)   (靈精的式程用應面桌像以可您,
   WizardFormController                                      W izard
                              。單表作製
個一每,紹介的單簡個作先               的上 以 於 對 邊 這 在
                        Controller                                Controller
    明 說 續繼將 下 以 , 明 說 的 細 詳有會 都 中 節 一 下 在 別 類           Spring Web MVC       的
     API                            。 要主
7.1.7 ModelAndView
所時 面 畫 現 呈 , 中 式 程
    ModelAndView               了表代別類
                                Spring Web MVC
能只次一中法方的式程 於由,件物料資 與件物料資
     Model              View                       用使
                                                 Java
同 您 便 方 ,件 物 個 兩 這 裝 封 是 用 作 的
                     ModelAndView     以 所 ,件 物 個 一 傳 回
       Model     View              。 與           回傳時
被稱名       後之,稱名的ModelAndView括包只是           的單簡最
                                          View                  View
面介
View resolver                    作 實 是 就 也,
                            org.springframework.web.servlet.View
      的單簡最,等             或
                   InternalResourceView  如例,析解例實的
                                             JstlView                   Model-
AndView                           :下如式方構建
ModelAndView(String viewName)




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

 件物 用使以可則,件物料資                的 需 所時面 畫 現 呈 回 返 要 果 如
                                           Model                              Map
 下 用 使 以 可 ,數 引 的 時 構 建 為 作         構 建 在 後 然 ,料 資 集 收 來
                              ModelAndView
                           :法方構建
                ModelAndView                 的本版個這面
 ModelAndView(String viewName, Map model)


 的現 呈 要 在 以 可 後 之 , ) ( 值 與 ) ( 鍵 定 設 中 件 物
       Map              "     K ey     "    "      V alue   "
 資      個一回傳要您果如,)中頁網 在如例(示顯以加出取中面畫  JSP                                       Model
 :本版               個這面下用使以可則,稱名的
                Model                   定指並件物料                  ModelAndView


 ModelAndView(String viewName, String modelName, Object modelObject)


  由藉                 物料資
             modelName     出取中別類作實的  在以可您, View                            Model
 據根並,件        View   現呈等 、頁網 是能可(示顯以加來術技的用使所                    JSP          P df
  。)術技
 用使可也別類ModelAndView                         View    引的時構建為作來件物的面介
 : 法 方 構 建的用 可 個 三 是 下 以 , 數
 ModelAndView(View view)
 ModelAndView(View view, Map model)
 ModelAndView(View view, String modelName, Object modelObject)


       作實個一      View   是例實的          org.springframework.web.servlet.view.
  成完來式方)
 RedirectView    (發轉用使是設預
                 M odelAndView             ,                    F orward
 )    (向導新重用使會則,話的                     用使,面畫果結的求請
                            RedirectView                                      R edirect
      : 如 例 , 果 結 的 求請現 呈 以 , 置 位 面 畫 果結的 定 指 至 導 重 求 請 將




7 26
7 27
                                           throws Exception {
                                           HttpServletResponse res)
         public ModelAndView handleRequest(HttpServletRequest req,
                                                                             ...
                   "
        :如例, 鍵 個一生產動自會法方"                 ,件物   a ddObject()
                                                       入加            Model
 僅以可您,法方         addObject()
                        了增新             ,中M odelAndView
                                                     在         Spring 2.0
                             Web
       。 址 位 式 程 用 應 的 它 其 至 定 指 以 可 ,頁網 個 一 求 要 新 重 器 覽
 瀏由是向導新重,          WEB-INF
                        是像,錄目藏隱的中式程用應 問訪能不                         Web
 以所,出發器覽瀏由是求請的後向導新重,訊資的向導新重現出會上列址
 位的器覽瀏此因,址位的定指所至接連新重會端戶客,址位求請出發新重
 器覽瀏端戶客求要會式程用應 ,話的)                W eb  (向導新重用使 R edirect
                       Web
   。 址 位 式 程 用 應 的它其 至 定 指 能 不 , 行 進 中 式 程 用 應 在 能 只                Web
 式方發 轉 , 源 資 些 這 得 取 以 可 才 , 理 處 的       與     Controller      DispatcherServlet
 過透須必而,源資些這求請接直法無就者用使此如,下                                                WEB-INF
 到放源 資 的 取 存 管 控 要 些 一 將 以 可 此 因 , 錄 目             WEB-INF
                                             是像,錄目部內
                   Web
 的定 設 所 式 程 用 應 問訪以 可 , 行 進 內 之 式 程 用 應 在 是 發 轉 且 而          Web
 ,址位的發轉被現出會不並上列址網,話的式方)                      (發轉用使    F orward
                                                   。錄目式
 程用應 是   Web     FirstSpringMVC
                           中其,址位的樣這                       MVC/pages/index.htm
 /FirstSpring-
            像須必址位的回傳                getViewPage()
                                       以所, 錄 目 根 的 式 程 用 應
 Web是不而,始開錄目根頁網器服伺從須必定設的                       ,邊這在     v iewPage
           ...
           }
                                 new RedirectView(this.getViewPage()));
               return new ModelAndView(
               ...
           public ModelAndView handleRequest(....) ... {
           ...
 架框    Chapter 7 Spring Web MVC
Spring 2.0      良信林(冊手術技             – http://openhome.cc    )

            User user = new User();
            ...
            ModelAndView modelAndView = new ModelAndView(viewPage);
            modelAndView.addObject(user);
            return modelAndView;
        }
 ...

 動自會則,例實           是的       給定設果如
                        addObject()      onlyfun.caterpillar.User
 入加果如,稱名生產來稱名面介或別類照按說是就也, 為 鍵 生產
        "   "    " user"
 null         。             生發會則,
                      IllegalArgumentException

 由,    定指不以可還
        Spring    2.0   的    ModelAndView                           View
 以可如例,稱名   供提求請據根來
 RequestToViewNameTranslator                               View
                       :寫 撰 下 如 中 檔 定 設 在
        <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=”controllerClassNameHandlerMapping”
             class="org.springframework.web.servlet.mvc.
                       → support.ControllerClassNameHandlerMapping"/>

        <bean id="viewNameTranslator"
              class="org.springframework.web.servlet.
                       → view.DefaultRequestToViewNameTranslator"/>

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

        在   HelloController   化例實中       ModelAndView    定指不若,時      View   例,
 :如
7 28
Chapter 7 Spring Web MVC       架框

...
public ModelAndView handleRequest(HttpServletRequest req,
                                      HttpServletResponse res)
                                      throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        ...
        return modelAndView;
    }
...

求請果如以所,                  了定設於由
                    ControllerClassNameHandlerMapping
     了定設於由,求請理處來
hello.do                 讓會則,
                    HelloController                              RequestTo-
並,時       生產中
ViewNameTranslator  然雖,      handleRequest()           ModelAndView
        了合結(理處來
           View      由會但,   定指有沒
                            hello.jsp                      InternalResource-
ViewResolver    。)定設置後與置前的
7.1.8 View Resolver
   的回傳據根
     DispatcherServlet                 ModelAndView  名   析解來例實       View
。件物    的面畫於現呈理處並,稱          Model            V iew   作實給託委是析解的稱名
org.springframework.web.servlet.ViewResolver            ,例實的面介        View-
Resolver   :下如義定面介
package org.springframework.web.servlet;

import java.util.Locale;

public interface ViewResolver {
    View resolveViewName(String, Locale locale)
                                 throws ServletException;
}


     ViewResolver   是例實個一的                        以可您,
                                      InternalResourceViewResolver
在   viewResolver   與    定設中
                         "prefix"      "suffix"   與置前 的 徑 路 定 設 別 分 , 性 屬

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

  樣這,字文置後            viewPage   個給接直,稱名別區要主的徑路打只以可就性屬
   :範示的定設
  ...
  <bean id="viewResolver"
        class="org.springframework.web.servlet.
                 → view.InternalResourceViewResolver">
      <property name="prefix" value=”/WEB-INF/jsp/”/>
      <property name="suffix" value=”.jsp”/>
  </bean>
  ...


  的際實,後完析解稱名在
      ViewResolve                              View   轉的件物   與製繪
                                                             Model
             作實給交是理處換                                 ,例實的面介
                       org.springframework.web.servlet.View
  View     :下如義定面介
  package org.springframework.web.servlet;

  import java.util.Map;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;

  public interface View {
      void render(Map model, HttpServletRequest request,
              HttpServletResponse response) throws Exception;
  }


      是     的設預             如例
             InternalResourceViewResolver          "viewClass"       Internal-
  關相術技層  的它其為性屬
  ResourceView      定設以可也,       "viewClass"               View
  外另,                   為定設如例,別類
                        org.springframework.web.servlet.view.JstlView
   。術技 的同不用適可,別類作實等
         TilesView       、     有還
                      V elocityView                           View

                         用使以可您
                       org.springframework.web.servlet.view.BeanNameView-
  Resolver              :如例,

7 3
Chapter 7 Spring Web MVC            架框

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

<bean id="hello"
      class="org.springframework.web.servlet.view.JstlView">
    <property name="url" value=”/WEB-INF/jsp/hello.jsp”/>
</bean>
...


                   的回返             當,中定設的上以在
                         ModelAndView            view   為稱名    "hello"   ,時
         "id"          。
                    " hello"   的     為性屬 找尋去會
                               View Bean

用使以可這,中檔性屬個一至來出立獨義定的
            ViewResolver                     將以可
來
org.springframework.web.servlet.view.ResourceBundleViewResolver
   : 如 例 , 術 技 層 示 表 的 同 不 定 設 的 際 實據根 以 可 是 處 好 , 成 達
                               URL


...
<bean id="viewResolver"
      class="org.springframework.web.servlet.
               → view.ResourceBundleViewResolver">
    <property name="basename" value=”views”/>
</bean>
...


      在                         了定設性屬
       ResourceBundleViewResolver          的
                                       "basename"                  "views"
是也    (稱名
      " views"     "basename"       用使將這,)值設預的            views.properties
的術技層示表定設來           "viewClass"      個一如例, 與
                                     "url"              views.properties   的
:示所下如例範寫撰
hello.class=org.springframework.web.servlet.
                   → view.InternalResourceView
hello.url=/WEB-INF/jsp/hello.jsp

welcome.class=org.springframework.web.servlet.view.JstlView
welcome.url=/WEB-INF/jsp/welcome.jsp


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

 other.class=org.springframework.web.servlet.view.VelocityView
 other.url=/WEB-INF/vm/other.vm



 找尋會則,      為若稱名 的中例實
                 ModelAndView         的回傳在   view           "hello"
 可您 , 的 定 指 及 例 實
 hello.class     hello.url 的應對到得來     及    ViewClass                  URL
 為置設上           在,        的同不置設區地或家國的同不為以    View       "basename"
 以可,
 "views"是定設系語果如,                取讀會設預示表,
                               views.properties                     en_US
 準它為以可,       是 定 設 系 語 果 如,
            views_en_US.properties      備準它為              zh_TW
     定設域區與置設以可中案檔的應對而,
    views_zh_TW.properties                 備                                Locale
          View                       。 的關相
                                   用使以可也
                       org.springframework.web.servlet.view.XmlViewRe-
 solver                    :示所下如例範的定設個一,
 ...
 <bean id="viewResolver"
       class="org.springframework.web.servlet.view.XmlViewResolver">
     <property name="location" value=”/WEB-INF/demo-views.xml”/>
 </bean>
 ...


  是設預性屬     ,中定設的面上在         " location"                       為定設邊這,
                                                       views.xml
 找尋中       到示表,
 demo-views.xml               demo-views.xml            View   例,義定 的
                                                                   Bean
       :義定麼這中
       demo-views.xml在如
 ...
 <bean id="hello"
       class="org.springframework.web.servlet.view.JstlView">
     <property name="url" value=”/WEB-INF/jsp/hello.jsp”/>
 </bean>
 ...




7 32
Chapter 7 Spring Web MVC           架框

     定設 與 制 機 的 作 運 其          BeanNameViewResolver 的傳回當,的似類是時
為稱名 的中例實
ModelAndView                   view       "hello"   義定 找尋去會則,時      Bean
 。定設 的
     "id"      為 的中
              "hello"    View



7.1.9 Exception Resolver
例個這捉捕想您而,外例了出丟中程過行運在
            JSP              或頁網 果如
                        Servlet
定設如例(外法方定設捉捕的外例關有中頁網 與器容用使了除,外
                         JSP
的素元令指
web.xml         頁網 定設是或,籤標
              <error-page>        的            JSP         "page"
理處 誤 錯 定 設 中 檔 義 定 的
"errorPage"              在以可也,)性屬 DispatcherServlet
用使如例,例實              的       個一定設,頁網
                         ExceptionResolver          Bean
org.springframework.web.servlet.handler.SimpleMappingException-
Resolver    :示所下如子例的定設個一,
...
<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="exceptionResolver"
      class="org.springframework.web.servlet.
             → handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.sql.SQLException">sqlexception</prop>
            <prop key="java.sql.IOException">ioexception</prop>
        </props>
    </property>
</bean>
...




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

 使時 生 發 外 例 在 並 , 用應動自會
       DispatcherServlet                   ExceptionResolver
 了生發要只,中定設的面上在如例,息訊誤錯示顯來頁網的定指用
 了生發而,
 SQLException       至接連會就,           /WEB-INF/jsp/sqlexception.jsp
 IOException 。       至接連會就,       /WEB-INF/jsp/ioexception.jsp



 7.2 Controller 實作類別
 需 所 作 製 來 求 需 依 以可 , 別 類 關 相 的 面 介
       Spring                Controller    作實供提
 , 理處求 請 的 頁 網 單 表 、 集收數 參 求 請 的 單 簡 是 論 無 , 件 物
      Controller                                      的
 以可別類的應對有都中        W izard 在,等計設的頁網 )            (靈精是至甚
                                                      Spring
                                                    。用應
 7.2.1 AbstractController
  是別類  org.springframework.web.servlet.mvc.AbstractController
  請的者用使了作實式模
 Controller              用使,作實單簡的面介       Template Method
  請對驗檢、理處的)          (頭標取快對了括包,程流的理處求         C aching header
 )      (化步同與得取的
            G ET         、援支的) 、 (法方求
                     P OST                S ession                      s ynchronized
   。別類         用使 以 可 則 , 理 處 作 題議些 這 對 要 需 果 如 , 等       AbstractController

  行執         被法方
       AbstractController      從 handleRequest()               DispatcherServlet
                              : 示所下 如 程 流 作 工 的 始 開
 1. DispatcherServlet      。法方                 行執
                                 handleRequest()

 2.   援 支 不 法 方 果 如,法 方 求 請 的 援 支 驗 檢 來 定 設 的
           "supportedMethods"                           據根
              ServletException               。         出丟則
 3.   得取試嘗,           用使要需否是求請定決定設的
           "requireSession"                             據根         Session
      Session     。               出丟則
                                 Session       得取有沒果如,
                                                     ServletException




7 34
Chapter 7 Spring Web MVC           架框

4.   據根             (頭標取快定設否是定決定設的
          "cacheSeconds"                                    C aching header。)
5.   叫呼                   據根,法方
          handleRequestInternal()                 "synchronizeOnSession"   是定決
     對否   Session       。)      (化步同行進
                                  s ynchronized


          於對 AbstractController   以可就解了的本基個有要只,程流作工的別類
   承繼 接 直 以 可 , 了     AbstractController  義定新重並,別類              handleRequest-
:如例,法方
Internal()


public class SomeController extends AbstractController {
    protected ModelAndView handleRequestInternal(
               HttpServletRequest request,
               HttpServletResponse response) throws Exception {
        ....
        return new ModelAndView("view", "modelName", model);
    }
    ..
}


方些一的好義定經已作操接直以可,話的別類
             AbstractController         用使
, 式 方 求 請 的 許 允 所 定 設, 法 方          叫呼以可如例,法
                     setSupportedMethods()
      、 、 援 支只則 , 話 的 寫 撰 下 如 若 時 作 實
      Controller                           如例             GET    P OST     H EAD
                                        :求請的
package onlyfun.caterpillar;
...
public class HelloController extends AbstractController {
    ...
    public HelloController() {
        this.setSupportedMethods(
                new String[] {"GET", "POST", "HEAD"});
    }

     protected ModelAndView handleRequestInternal(
                    HttpServletRequest req, HttpServletResponse res)
                                           throws Exception {
         ...
     }
}



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

       則,話的求請式方的許允不以果如                          Controller   出丟會候時的理處在
 org.springframework.web.servlet.support.RequestMethodNotSupported-
 Exception    。外例的

 7.2.2 MultiActionController 與 ParameterMethodName-
          Resolver
 個一寫撰理處的求請個一每為若,大越來越模規的式程用應果如
 的多越來越有中式程用應
 Controller                到現發您,的快很,別類         Web
 如例,別類個一在織組以可是責職些一的中當上實事而,別類
 Controller
 個一在織組以可就,法方等                、 、 的關相作操庫料資與
                         list()   a dd()   d elete()
                                                     。別類
              :別 類 子 個 一 的 別 類
                    AbstractController         用使以可您            o rg.springframe-
 在您讓以可它。
 work.web.servlet.mvc.multiaction.MultiActionController
 的 中當行 執 來 求 請 的 者 用 使據根 並 , 法 方 個 多 義 定 中 別 類
       Controller                                      個一
                                                 。法方個某
                   個一合配要您,
              MultiActionController              用使要     org.springframework.
         ,例實的
 web.servlet.mvc.multiaction.MethodNameResolver                      M ultiAction-
 Controller       是別類                     的用使設預
                         MethodNameResolver                  org.springframework.
 個 這,
 web.servlet.mvc.multiaction.InternalPathMethodNameResolver
        行執斷判來稱名案檔的求請後最,中址網的給所據根以可別類                                    Controller
                     行執會求請的 /test.do    如例,法方個一哪的中     test (HttpServletRequest,
 HttpServletResponse) 用使會不常通但。法方                       InternalPathMethodName-
 是像,點優些一的
 Resolver                        用使了去失就這為因,
                                       MultiActionController
                      。法 方 的 行 執 要 所 定 決來數 參 求 請 的 者 用 使 依


7 36
Chapter 7 Spring Web MVC        架框

    用使在常通      MultiActionController   配搭會時    org.springframework.
web.servlet.mvc.multiaction.ParameterMethodNameResolver       是或   o rg.
springframework.web.servlet.mvc.multiaction.PropertiesMethodName-
       行執要定決數參以,數參求請個一據根是都別類個兩,
Resolver                                                     Controller
可, 例 為               以 先 邊 這, 法 方 個 一 哪 的 中 別 類
                              ParameterMethodNameResolver
    Bean             :寫撰麼這中檔義定 在以
  MultiActionDemo                                    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="/book.do">bookController</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="paraMethodResolver"
          class="org.springframework.web.servlet.mvc.
                    → multiaction.ParameterMethodNameResolver">
        <property name="paramName" value="action"/>
        <property name="defaultMethodName" value="list"/>
    </bean>




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

       <bean id="bookController"
             class="onlyfun.caterpillar.BookController">
           <property name="methodNameResolver"
                     ref="paraMethodResolver"/>
           <property name="testPage" value="test"/>
       </bean>

  </beans>



 設性屬              用 使 ,中 義 定 的
         " paraMethodResolver"      Bean              在
                                                     "paramName"
 沒中求 請 是 若 , 法 方 的 行執 要 所 定 指 數 參
       HTTP              "action"        用使中求請          在定
 方的定設所性屬 "action"                用使會則,數參              定指有
                                     "defaultMethodName"
                    list()        。法方 是的定設邊這,法
      在義定中當,別類
       BookController                   承繼
                             MultiActionController               "action"
                              : 如 例 , 法 方的行 執 要 所 下 定 指 數 參
   MultiActionDemo                                   BookController.java
  package onlyfun.caterpillar;

  import javax.servlet.http.*;
  import org.springframework.web.servlet.ModelAndView;
  import org.springframework.web.servlet.mvc.
                   multiaction.MultiActionController;



  public class BookController extends MultiActionController {
      private String testPage;

       public ModelAndView list(HttpServletRequest req,
                             HttpServletResponse res) {
           return new ModelAndView(
                           this.getTestPage(),"executed", "list");
       }

       public ModelAndView add(HttpServletRequest req,
                              HttpServletResponse res) {




7 38
Chapter 7 Spring Web MVC       架框

           return new ModelAndView(
                           this.getTestPage(),"executed", "add");
      }

      public ModelAndView delete(HttpServletRequest req,
                               HttpServletResponse res) {
          return new ModelAndView(
                         this.getTestPage(),"executed", "delete");
      }

      public String getTestPage() {
          return testPage;
      }

      public void setTestPage(String testPage) {
          this.testPage = testPage;
      }
}


           與               括包須必,中法方的義定到意注
                                      HttpServletRequest    HttpServlet-
    。本版的
Response            數參 個 三 第 有 帶 用 使 以 可 也 , 數 參 的
                                              HttpSession

試測於用,例範的單簡個一是只別類    BookController         的義定所上以
目示表,串字個一定設是只理處的作所它,作運的
MultiActionController
者 用 使 示 顯 以 用 , 頁 網 的 用 試 測 個 一 計 設 以 可,稱 名 法 方 的 行 執 所 前
                                              JSP
                                       :如 例 , 法 方 的 求 請 所
    MultiActionDemo                                            test.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">
<title>MultiAction Test Page</title>
</head>
<body>
    <H1> "${executed}" method is executed.</H1>




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

  </body>
  </html>



  行執個一,數參求請上附中址網在以可,子例的求請出發個看際實來
                        :示 所 下 如 面 畫 考 參 的




                     圖   7.11 MultiActionDemo   果結行執的案專

  7.2.3 MultiActionController 與
            PropertiesMethodNameResolver
  寫撰是不而,中件物)            (託委個一在織組法方有所將以可也您       d elegate
  , 法方的 定 指 行 執 件 物 個 這給託 委 , 時 到 來 求 請 當 , 中 別 類
      Controller                                          在
  例,件 物 託 委 至 考 參 性 屬         的
               MultiActionController    "delegate"定設要只您
                                      : 下如計 設 以 可 件 物 託 委 如
      MultiActionDemo2                                      BookDelegate.java
  package onlyfun.caterpillar;

  import javax.servlet.http.*;
  import org.springframework.web.servlet.ModelAndView;

  public class BookDelegate {
      private String testPage;

        public ModelAndView list(HttpServletRequest req,
                              HttpServletResponse res) {



7 4
Chapter 7 Spring Web MVC     架框

          return new ModelAndView(
                  this.getTestPage(),"executed", "list");
      }

      public ModelAndView add(HttpServletRequest req,
                             HttpServletResponse res) {
          return new ModelAndView(
                  this.getTestPage(),"executed", "add");
      }

      public ModelAndView delete(HttpServletRequest req,
                               HttpServletResponse res) {
          return new ModelAndView(
                  this.getTestPage(),"executed", "delete");
      }

      public String getTestPage() {
          return testPage;
      }

      public void setTestPage(String testPage) {
          this.testPage = testPage;
      }
}



   承繼用不在現          MultiActionController    義定來別類   Controller   而,別類
義定 接 直 中 檔 義 定 在 是                         :例實的
                       MultiActionController


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




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

               <props>
                   <prop key="/book.do">bookController</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="paraMethodResolver"
             class="org.springframework.web.servlet.mvc.
                      → multiaction.ParameterMethodNameResolver">
           <property name="paramName" value="action"/>
           <property name="defaultMethodName" value="list"/>
       </bean>

       <bean id="bookDelegate"
             class="onlyfun.caterpillar.BookDelegate">
            <property name="testPage" value="test"/>
        </bean>

       <bean id="bookController"
             class="org.springframework.web.servlet.mvc.
                      → multiaction.MultiActionController">
           <property name="methodNameResolver"
                     ref="paraMethodResolver"/>
           <property name="delegate" ref="bookDelegate"/>
       </bean>

  </beans>



   用使以可您           MultiActionDemo   這,果結現呈來頁網   的中案專
                                              test.jsp
 與果結行執的式程個             MultiActionDemo 圖考參以可,的同相是案專                 7.11
      。面畫的


7 42
Chapter 7 Spring Web MVC       架框

     用使以可也,式程的面上              PropertiesMethodNameResolver   將如例,
Bean:容內的下以為寫改檔義定
<?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="/*book.do">bookController</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="propMethodResolver"
       class="org.springframework.web.servlet.mvc.
                   → multiaction.PropertiesMethodNameResolver">
       <property name="mappings">
           <props>
               <prop key="/listbook.do">list</prop>
               <prop key="/addbook.do">add</prop>
               <prop key="/deletebook.do">delete</prop>
           </props>
       </property>
   </bean>

   <bean id="bookDelegate"
         class="onlyfun.caterpillar.BookDelegate">
       <property name="testPage" value=”test”/>



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

       </bean>

     <bean id="bookController"
            class="org.springframework.web.servlet.mvc.
                     → multiaction.MultiActionController">
          <property name="methodNameResolver" ref="propMethodResolver"/>
          <property name="delegate" ref="bookDelegate"/>
     </bean>
 </beans>


          給交會都求請的尾結為         有所,定設的上以據根
                                   book.do                            bookController
 同 依 ,法 方 的       行 執 會 ,時
                      /listbook.do  求 請 而 ,理 處 來bookDelegate        list()
    或 行執來         或           用使別分以可,理道的樣
                                 /addbook.do   /deletebook.do            a dd()   l ist()
                  : 示 所 下 如 面 畫考參 的 行 執 個 一 , 法 方



                 圖   7.12   用使   PropertiesMethodNameResolver   果結行執的

 7.2.4 ParameterizableViewController
 類子的別類                   是別類
       ParameterizableViewController                 AbstractController
 這當,性屬               的它 定 設 , 義 定 中 檔 義 定 在接 直 以 可 , 別
                      Bean                               "viewName"
 , 頁網的 定 指 向 導 接 直 定 設 的
    Controller                     據根會,時行執
                                      "viewName"     個
 個一計設以可如例,求請 頁網 對接直免避來用以可是處好的它用使               JSP
 將以可,制控
 index.jsp                 過透都求請的有所讓了為,         DispatcherServlet
     :義定麼這中檔義定 在接直並,下
 index.jsp            WEB-INF             在置放    Bean




7 44
Chapter 7 Spring Web MVC   架框

...
<beans>
    <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="indexController"
          class="org.springframework.web.servlet.
                   → mvc.ParameterizableViewController">
        <property name="viewName" value=”index”/>
    </bean>
<beans>


是求請址網的接連當,定設的上以依                       /index.do   定指所至接連會則,時
   。頁網           的
  /WEB-INF/jsp/index.jsp



7.2.5 AbstractCommandController
數參 求 請 供 提 者 用 使 到 遇 當 ,
         Controller           是或    用使
                        AbstractController
這 將算打 果 如 , 數 參 求 請 得 取 中 件 物    從行自須必,時
                HttpServletRequest
等換轉態型行進或輯邏關相寫撰行自須必,件物個某至定設數參求請些
                                     。作動

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

        承繼以可        org.springframework.web.servlet.mvc.AbstractCom-
 當,件物
 mandController 個一供提並,別類             作實來
                             Controller                   Command
 稱名數 參 求 請 對 比 著 試 會                   ,時到來求請者用使
                     A bstractCommandController
 對叫呼並,)稱名法方
      Command          是就也(稱名法方
                    Setter              的上     setXXX 與
 會 也,態 型 本 基 是 數 參 的 上
        Setter          果如,值數參求請定設法方        Setter  的應
                          。 態 型 的 應 對為值 數 參 求 請 換 轉 動 自
  :別類           為 作 別 類 個 一 了 計 設您設 假 , 說 來 子 例 個 舉
                                            User          Command


      AbstractCommandDemo                                            User.java
  package onlyfun.caterpillar;

  public class User {
      private String name;
      private String password;

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

        public void setPassword(String password) {
            this.password = password;
        }

        public String getName() {
            return name;
        }

        public String getPassword() {
            return password;
        }
  }



        了括包中求請 果如        "name"   與   "password"   為 裝封要想數參 些這而,數 參
 User     承 繼則, 例 實  AbstractCommandController     使以可 , 時     作實
                                                        Controller




7 46
Chapter 7 Spring Web MVC      架框

     用
 setCommandClass()   定指 來   Command    的它義定新重並,別類          handle()   方
:如例 ,法
 AbstractCommandDemo                             UserController.java
package onlyfun.caterpillar;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.
                      mvc.AbstractCommandController;
import org.springframework.validation.BindException;

public class UserController extends AbstractCommandController {
    private String userPage;

    public UserController() {
        setCommandClass(User.class);
    }

    protected ModelAndView handle(HttpServletRequest request,
                        HttpServletResponse response,
                        Object command,
                        BindException exception) throws Exception {
        User user = (User) command;

         Map model = new HashMap();
         model.put("name", user.getName());
         model.put("password", user.getPassword());

         return new ModelAndView(getUserPage(), "userInfo", model);
    }

    public void setUserPage(String userPage) {
        this.userPage = userPage;
    }

    public String getUserPage() {




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

           return userPage;
       }
  }



 並,例實的     了得取接直,中法方
       UserController       的
                         handle()                    Command
 法方      與       作操接直,後之 為面介作操換轉在
                    User                 getName()      getPassword()
 頁網 在以,訊資集收來件物 個一了用使上以在,數參求請得取來        Map                        JSP
              : 下 如 計 設 頁 網 設假 , 訊 資 些 這 現 呈 中
                           JSP


      AbstractCommandDemo                                     userInfo.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">
  <title>AbstractCommandController Demo</title>
  </head>
  <body>
      <h1> :稱名 ${userInfo['name']}</h1>
      <h1> :碼密 ${userInfo['password']}</h1>
  </body>
  </html>



       在以可著接      Bean   的關相定設中檔義定           Bean   :示所下如,訊資
      AbstractCommandDemo                                   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">



7 48
Chapter 7 Spring Web MVC     架框

        <property name="mappings">
            <props>
                <prop key="/user.do">userController</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="userController"
          class="onlyfun.caterpillar.UserController">
        <property name="userPage" value="userInfo"/>
    </bean>

</beans>



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




              圖    7.13 AbstractCommandDemo   果結行執的案專

7.2.6 AbstractFormController
                             承繼過透常通,求需單表的單簡於對
                                      org.springframework.web.servlet.
    或          義定新重並,
mvc.SimpleFormController          義定來
                                 Controller             onSubmit()
    定 程流理 處 單 表 的 正 真 上 際實而 , 能 功 單 表 成 完 來 法 方
doSubmitAction()



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

    ,                              在義
           org.springframework.web.servlet.mvc.AbstractFormController
    :明說的中當下一理整邊這,用作之法方的串連一其明說有,中件文 在
         API

    1.     。例實的             個一傳回要,法方
               formBackingObject()            行執            commandClass

    2.   ,作 動 等 化 式 格 作 的 定 特
               initBinder()       對 您 許 允,法 方 行執
                                            Command              Field
                。定設的      或態型本基非供提,等式格錢金、式格期日如例                String

    3.          。現展的單表於用,件物 個一回返,法方
               showForm()                     行執
                                              View

    4.                 用應則, 為定設被性屬
                "bindOnNewForm"               果如       true              ServletRequest-
         行執且並,件物單表的新個一入填來數參求請始初據根
         DataBinder
         onBindOnNewForm()           。法方
    5. showForm()
         程過的單表現展在果如,法方                  行執會法方
                                     referenceData()
                      :如例,件物 個一傳回以可,料資關相些一要需,中       Map

         protected Map referenceData(
                 HttpServletRequest request) throws Exception {
             Map ref = new HashMap();
             ref.put("defalutUser", "guest");
             return ref;
         }

                 用使中頁網 在以可就,來一樣這
                               JSP                 ${defaultUser}   ,料資現呈來法寫的
                    。   是會值的得取所如例
                               "guest"

    6. Model
         。寫填行進並單表到看以可者用使,現展被件物
          : 行 進 程 流 的下以 依 會 將 , 單 表 出 送後之 單 表 完 寫 填 者 用 使
    1.   式方的樣這   用想不果如,       用使常通,出送單表的者用使受接  POST                     POST
          。法方          義定新重以可,單表出送否是者用使斷判來                 isFormSubmission()

    2.   以法方          行 執 會 則,定 設 有 沒 性 屬
               "sessionForm"                 果如             formBackingObject()
         執則到找有沒果如,件物單表得取中          從試嘗則否,件物單表得取
                                         session




7
Chapter 7 Spring Web MVC         架框

          行
       handleInvalidSubmit()     重並件物單表的新立建 試嘗是作動的設預,法方
     。單表寫填新
3. ServletRequestDataBinder
             。件物單表入填數參求請的前目據根
4.   行 進 件 物 單 表 對 以 可 前 之 料 資 證 驗,後 之 料 資 定 綁 在,法 方
         onBind()                                      行執
                                               。作動改修的訂自些一
5.                  。器證驗用使則,定設被性屬
         "validateOnBinding"                           果如
6.   些 一 作 件 物 單 表 對 後 之 料 資 證 驗 在 您 許 允,法 方
         onBindAndValidate()                           行執
                                                      。理處
7.   要別類子,法方                              行執後最,畢完理處件物單表
                                    processFormSubmission()
                               。求請的者用使成完以,法方個這義定新重

7.2.7 SimpleFormController
                            是
      org.springframework.web.servlet.mvc.SimpleFormController
AbstractFormController      類個這承繼接直以可單表的單簡於對,別類子的
義定新重並,別                     請的者用使理處以法方
                    onSubmit()     doSubmitAction()   或
     ,求
      S impleFormController            :的 樣 這 是 程 流 理 處 的
1.       processFormSubmission()       行執
                                     驗檢以       Errors   時證驗或定綁在看看,件物
                                。誤錯的何任無有
2.            。面頁的定設所        傳回,生發誤錯有果如
                             "formView"

3.   也則, 傳回並義定新重被     據根
         isFormChangeRequest()         果如   request                  true
     讓,       行執會前之
              "formView" 到 回 在,       到回會
                                  "formView"                 onFormChange()
                           。件物單表正修會機有您
4.         、         有帶行執會則,生發誤錯有沒果如          HttpServletRequest    H ttpServlet-
     帶僅行執是設預,
     Response     的數參
                 O bject      、    、
                           B indException             onSubmit()
        有只行執是設預者後而,
     Object              的
                 BindException      及
                                   onSubmit()                               Object



                                                                               7     1
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架

Más contenido relacionado

La actualidad más candente

Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootJosué Neis
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Justin Lin
 
Introduction to Spring Framework
Introduction to Spring FrameworkIntroduction to Spring Framework
Introduction to Spring FrameworkHùng Nguyễn Huy
 
Spring framework in depth
Spring framework in depthSpring framework in depth
Spring framework in depthVinay Kumar
 
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletJustin Lin
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOPDzmitry Naskou
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
jpa-hibernate-presentation
jpa-hibernate-presentationjpa-hibernate-presentation
jpa-hibernate-presentationJohn Slick
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 

La actualidad más candente (20)

Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Java Spring Framework
Java Spring FrameworkJava Spring Framework
Java Spring Framework
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBoot
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
 
Introduction to Spring Framework
Introduction to Spring FrameworkIntroduction to Spring Framework
Introduction to Spring Framework
 
Spring jdbc dao
Spring jdbc daoSpring jdbc dao
Spring jdbc dao
 
Spring framework in depth
Spring framework in depthSpring framework in depth
Spring framework in depth
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
 
Spring framework core
Spring framework coreSpring framework core
Spring framework core
 
Spring Batch 2.0
Spring Batch 2.0Spring Batch 2.0
Spring Batch 2.0
 
Spring boot
Spring bootSpring boot
Spring boot
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
jpa-hibernate-presentation
jpa-hibernate-presentationjpa-hibernate-presentation
jpa-hibernate-presentation
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Spring jdbc
Spring jdbcSpring jdbc
Spring jdbc
 

Destacado

Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Justin Lin
 
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Justin Lin
 
Spring 2.0 技術手冊第十章 - 專案:線上書籤
Spring 2.0 技術手冊第十章 - 專案:線上書籤Spring 2.0 技術手冊第十章 - 專案:線上書籤
Spring 2.0 技術手冊第十章 - 專案:線上書籤Justin Lin
 
Spring 2.0 技術手冊導讀
Spring 2.0 技術手冊導讀Spring 2.0 技術手冊導讀
Spring 2.0 技術手冊導讀Justin Lin
 
Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄Justin Lin
 
Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序Justin Lin
 
Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPJustin Lin
 
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletServlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletJustin Lin
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Justin Lin
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能Justin Lin
 
讓程式展現樂趣 玩出實驗精神與創造力
讓程式展現樂趣 玩出實驗精神與創造力讓程式展現樂趣 玩出實驗精神與創造力
讓程式展現樂趣 玩出實驗精神與創造力Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLJustin Lin
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Java SE 8 技術手冊第 7 章 - 介面與多型
Java SE 8 技術手冊第 7 章 - 介面與多型Java SE 8 技術手冊第 7 章 - 介面與多型
Java SE 8 技術手冊第 7 章 - 介面與多型Justin Lin
 

Destacado (20)

Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝
 
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
 
Spring 2.0 技術手冊第十章 - 專案:線上書籤
Spring 2.0 技術手冊第十章 - 專案:線上書籤Spring 2.0 技術手冊第十章 - 專案:線上書籤
Spring 2.0 技術手冊第十章 - 專案:線上書籤
 
Spring 2.0 技術手冊導讀
Spring 2.0 技術手冊導讀Spring 2.0 技術手冊導讀
Spring 2.0 技術手冊導讀
 
Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄
 
Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序
 
Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁
 
進階主題
進階主題進階主題
進階主題
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
 
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
 
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
 
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletServlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能
 
讓程式展現樂趣 玩出實驗精神與創造力
讓程式展現樂趣 玩出實驗精神與創造力讓程式展現樂趣 玩出實驗精神與創造力
讓程式展現樂趣 玩出實驗精神與創造力
 
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
 
Java SE 8 技術手冊第 7 章 - 介面與多型
Java SE 8 技術手冊第 7 章 - 介面與多型Java SE 8 技術手冊第 7 章 - 介面與多型
Java SE 8 技術手冊第 7 章 - 介面與多型
 

Similar a Spring 2.0 技術手冊第七章 - Spring Web MVC 框架

test
testtest
testxieyq
 
用Maven管理專案的依賴關係
用Maven管理專案的依賴關係用Maven管理專案的依賴關係
用Maven管理專案的依賴關係Huang Bruce
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2twMVC
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC
 
Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Gelis Wu
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web FrameworkFred Chien
 
Java Web动态图表编程
Java Web动态图表编程Java Web动态图表编程
Java Web动态图表编程yiditushe
 
Struts快速学习指南
Struts快速学习指南Struts快速学习指南
Struts快速学习指南yiditushe
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介GO LL
 
Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹My own sweet home!
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile ServicesKuo-Chun Su
 
Maven初级培训
Maven初级培训Maven初级培训
Maven初级培训Cody Zhang
 
IKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 JavaIKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 Java建興 王
 
P6 服务器安装与配置
P6 服务器安装与配置P6 服务器安装与配置
P6 服务器安装与配置epst
 
Asp.net+mvc4框架揭秘
Asp.net+mvc4框架揭秘Asp.net+mvc4框架揭秘
Asp.net+mvc4框架揭秘Zhenhua Tang
 
Eclipse開發平台快速入門
Eclipse開發平台快速入門Eclipse開發平台快速入門
Eclipse開發平台快速入門Luo Korth
 
利用Xfire创建Web Service
利用Xfire创建Web Service利用Xfire创建Web Service
利用Xfire创建Web Serviceicy leaf
 

Similar a Spring 2.0 技術手冊第七章 - Spring Web MVC 框架 (20)

test
testtest
test
 
Jsp
JspJsp
Jsp
 
用Maven管理專案的依賴關係
用Maven管理專案的依賴關係用Maven管理專案的依賴關係
用Maven管理專案的依賴關係
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 
Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Asp.net 5 新功能與變革
Asp.net 5 新功能與變革
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web Framework
 
Java Web动态图表编程
Java Web动态图表编程Java Web动态图表编程
Java Web动态图表编程
 
Struts快速学习指南
Struts快速学习指南Struts快速学习指南
Struts快速学习指南
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
 
Maven初级培训
Maven初级培训Maven初级培训
Maven初级培训
 
IKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 JavaIKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 Java
 
P6 服务器安装与配置
P6 服务器安装与配置P6 服务器安装与配置
P6 服务器安装与配置
 
Asp.net+mvc4框架揭秘
Asp.net+mvc4框架揭秘Asp.net+mvc4框架揭秘
Asp.net+mvc4框架揭秘
 
Eclipse開發平台快速入門
Eclipse開發平台快速入門Eclipse開發平台快速入門
Eclipse開發平台快速入門
 
利用Xfire创建Web Service
利用Xfire创建Web Service利用Xfire创建Web Service
利用Xfire创建Web Service
 

Más de Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組Justin Lin
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理Justin Lin
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承Justin Lin
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別Justin Lin
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式Justin Lin
 

Más de Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式
 

Spring 2.0 技術手冊第七章 - Spring Web MVC 框架

  • 1. 。別類 的當適用使求需的己自依以可您讓,構架承繼 Controller Controller 的善完個一了供提還 ,外之架框 供提了除 Spring Web MVC 。便方為更上合整的能功多許在,能功器 容 的 IoC 合結,題問架框 Spring 的存現決解能望希,案 Web MVC 方架框 的己自供提也 Web MVC ,) S pring(架框F ramework MVC 的 案 專) Web (碼 始 原 放 開 多 許 有 今 現 , 構 架 的 薦 推 所 O penSource 員人發開數多受 ,時式程用應 發開來以久長是構架 Web Web MVC Spring Web MVC 框架 7
  • 2. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 7.1 Spring Web MVC 入門 的單簡最個一從將,中節小個這在 解了來,式程用應 Spring Web Web MVC 的 及以,式方作運的構架 Spring Web 。構架 現實何如架框Web MVC 7.1.1 使用 Eclipse Web Tools Platform 用使將,式程用應 的章本 Web Eclipse Web Tools Platform ( W TP ) 「的 在以可您,發開行進來 http://www.eclipse.org/webtools/ d ownloads 」 用使將章本。本版的」 「載下區 W ebTools Platform; All-in-one Tomcat 5.5 至請也以所,) Servlet (器容 為作 C ontainer http://tomcat.apache.org/ Tomcat 5.5 。 載下 用使算打果如 Eclipse 裝安式方新更上線的 WTP 下 考 參 以 可 則, :學教音影的址網列 http://eclipse.cdpa.nsysu.edu.tw/technology/phoenix/demos/i nstall-wtp/install-wtp.html 寫撰了為,後之 行執在 WTP Web 的便方些一用使以可,時式程用應 「行執 請 , 合 組 窗 視 具 工 啟開擇選,」 W indow/Open Perspective/Other… :」 J 2EE Perspective 「 7 2
  • 3. Chapter 7 Spring Web MVC 架框 圖 7.1 啟開擇選 J2EE Perspective 動啟接直中 在以可就此如,境環行執 Server 定設要先首 WTP Tomcat 選方下窗視 在請,式程用應 的寫撰所中 在試測以,器容 WTP Web WTP :」 「行執 , 鍵 右 鼠 滑 按 中 窗 視 於 並 , 」 S ervers 「擇 N ew/Server 圖 7.2 增新 Server 境環行執 用使將章本為因 Tomcat 5.5 「在著接以所, N ew Server 擇選中窗視」 「的中」 A pache「 T omcat v5.5 Server :」 7 3
  • 4. 7 4 : FirstSpringMVC 為稱名案專 Spring Web MVC 個一第設假,稱名案專入輸,後之鈕按 N ext 」 「下按在,案專」 W eb/Dynamic Web Project 「擇選,時案專增新 」 F ile/New/Project… 「行執 在 以 可 , 式 程 用 應 寫 撰 要 中 在 Web WTP 境環行執 Server 了增新 7.4 圖 : 示 所 圖 下 如 後成完 , 增 新 的 境 環 行 執 成完可即,鈕按 Server 」 F inish 「下按著接,夾料資裝安 Tomcat 擇選請,後之鈕按」 「下按 N ext 型類 Server 定設 7.3 圖 ) – http://openhome.cc 良信林(冊手術技 Spring 2.0
  • 5. Chapter 7 Spring Web MVC 架框 圖 7.5 態動增新 Web 案專 理管源資了為次這。增新的案專成完可即,後之鈕按」 「下按 F inish , 的依相其及以, 用使接直,便方的上 spring.jar commons-logging.jar jar 。下夾料資 到放 個兩這將請 WEB-INF/lib 圖 7.6 態動 Web 構結案專 7
  • 6. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 式程用應 在置放須必是或,案檔碼始原 WTP 的中 Java 在 Web 資關相 或頁網它其,下之錄目 在增新以可,案檔的下 Classpath src Web 為) (出匯要後以,下之錄目 在增新以可,源 WebContent E xport WAR 為織組案檔關相將動自會 ,時案檔) W eb Application Archive ( W TP Web 。 構結統 系 案 檔 的 式 程 用 應 7.1.2 第一個 Spring Web MVC 程式 先須 必 而 , 源 資 的 需 所至接 連 接 直 不 並 者 用 使 , 中 構 架 Web MVC 在 求請的 者 用 使 斷 判 器 制 控 端 前 由 , ) F ront controller ( 器 制控 端前至接連 達 此藉 ,求 請 理 處 來) D ispatch (件 物 制 控 個 一 哪 給 ) (派 分 要 C ontroller 。 的 目 之源資 求 請 者 用 使 制 控 到 是的色角器制控端前任擔,中架框 Spring Web MVC 的 在 org.spring- 將責負 framework.web.servlet.DispatcherServlet , D ispatcherServlet 是就,步一第的 用 使 以 所 , 件 物制控 給 配 分 求 請 的 戶 客 Spring Web MVC web.xml : DispatcherServlet 義定中 在 FirstSpringMVC 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> 7 6
  • 7. Chapter 7 Spring Web MVC 架框 <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app> 例實的 web.xml 個一了義定中 在 DispatcherServlet "dispatcher- 由會都求請的尾結 Servlet" 至接連有所,到看以可中定設從, *.do 定設來用數參始初 "dispatcherServlet" ,理處來 " contextConfigLocation" 參始初 Bean 置設不果如,稱名與置位的檔義定 "contextConfigLocation" 「取讀,置前為稱名的 用使會設預 DispatcherServlet 則,數 Servlet S ervlet 取讀會則中定設的面上在,檔義定 - servlet.xml 其為作」 Bean 稱名 mvc-config.xml 。義定的中 :是 像 , 源 來 的 檔 義 定 個 多 義 定 以 可 也 您 Bean ... <servlet> <servlet-name>hello</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-config.xml, 7 7
  • 8. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) → /WEB-INF/other-service.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ... (件物制控至求請配分責負 DispatcherServlet C ontroller 在,) Spring Web MVC 作實要件物制控,中架框 org.springframework.web.servlet. 的作實須必個一有面介 mvc.Controller ,面介 C ontroller handleRequest() :示所 下 如 義 定 其 , 法 方 package org.springframework.web.servlet.mvc; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; public interface Controller { ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; } 行執會,求請的配分 Controller 到收 DispatcherServlet 當 handle- Request() 個一傳回後畢完理處,求請理處來法方 org.springframework. 在現呈要了括包 ,例實的 web.servlet.ModelAndView M odelAndView 。 息 訊 關 相 的 層 它 其 及 以, 料 資 View JSP 的)頁網 如例(層 Model View 個一由將求請的者用使,中 S pring Web MVC 個一第在 H elloController : 示 所 下如作 實 其 , 理 處 來 件 物 FirstSpringMVC HelloController.java package onlyfun.caterpillar; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.mvc.Controller; 7 8
  • 9. Chapter 7 Spring Web MVC 架框 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"); return new ModelAndView(viewPage, "user", user); } public void setViewPage(String viewPage) { this.viewPage = viewPage; } } 在定設並,數參求請 的者用使自來了得取,中 Controller 個這在 " user" 個一第的 ModelAndView 構 建 ,中 子 例 個 這 在 , 中 例 實 的 ModelAndView 得取來用定設是數引個二第,徑路)源資或(頁網標目的現呈要為數引 的 料 資 現 呈 層 給 是 數 引 個 三 第 而 , ) (鍵 的 件 物 Model " K ey " View Model 。件物 進,求 請 的 者 用 使 集 收 為 用 作 的 件 物 制 控,下 構 架 Web MVC 在 也,輯邏務商行執中件物制控在應不,作動的關相層 與行 Web 件 物 的 層 務 商 讓 會 這,層 務 商 至 入 侵 的 關 相 Servlet API 讓應不 件物 Servlet API 讓 能 不 如 例,合 耦 生 產 與 HttpServletRequest 。中之件物層務商至定設接直 器容 其在 的 Spring Web MVC ,是處好的 S pring 用使 Controller IoC 相 成完來 入 注 賴 依 其 用 利 並 , 理 管 以 加 來 Bean 的般一 同 如 以 可 , 下 理 管 定設中案檔 在以可您,說來子例的邊這以,入注的件物關 XML Controller 的檔義定 下 一 看 來 ,徑路 頁 網 的 料 資 現 呈 要所, 後 之 畢 完 理 處 求 請 Bean 7
  • 10. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 依,容內 web.xml 在請,定設的中 WEB-INF 立建下錄目 mvc-config.xml :案檔 FirstSpringMVC 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="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> 上際實 個一據根須必 DispatcherServlet HandlerMapping 定決,件物 個一哪由求請 Controller ,理處來D ispatcherServlet 用使設預 org.spring- 是就也, framework.web.servlet.handler.BeanNameUrlHandlerMapping 一 哪用 使 定 決 , 的 求 請 者 用 使 及 性 屬 Bean "name" 的時義定在 據根 URL ,時 Controller 求請,中子例個這在如例,例實 個 /FirstSpringMVC/hello.do 為 用使要定決,稱名 DispatcherServlet 據根 "hello.do" "name" "hello.do" 。理處來例實的 Bean 由交求請將是就以所,例實 的 HelloController 由交會 ,後 Controller 回傳 當 ModelAndView D ispatcherServlet 個一置設要需您而因,析解關相的層 ViewResolver 作來件物 View 用使以所,術技層 為作 以將中例範個這在,例實 ViewResolver JSP View 7 1
  • 11. Chapter 7 Spring Web MVC 架框 org.springframework.web.servlet.view.InternalResourceViewResolver , InternalResourceViewResolver 置設要需 "viewClass" 是設預, org.spring- framework.web.servlet.view.InternalResourceView 援支別類個這, Servlet 。) 、 是像(源資關相的術技 JSP S ervlet 與會性屬 、 的 InternalResourceViewResolver "prefix" " suffix" Model- 則,串字 AndView 為 回 傳 訊資徑 路 若 如 例 , 合 結 訊 資 徑 路 的 回 傳 "hello" 。 是 就 徑 路 的 際 實 ,合結 定 設 子 例 的 上 以 與 /WEB-INF/jsp/hello.jsp : 的試測個一寫中 /WEB-INF/jsp/ 在以可後最 hello.jsp FirstSpringMVC 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"> <title>First Spring MVC</title> </head> <body> <h1>Hello, ${user}!!</h1> </body> </html> 由經,件物 的置設中 ModelAndView 在 Model InternalResourceView- 的取存可中術技 為定設將,析解的 Resolver 及 InternalResourceView JSP 取來 的中術技 用使以可此因,) A ttribute (性屬JSP Expression Language 參 了帶附時 求請在您果如,式程的寫撰所上以依,料資得 hello.do " user" 「的 行執以可,息訊 現出會 的後最則,數 JSP " user" WTP R un/Run As/Run 網將請,器覽瀏 動啟並 On Server 動啟動自會 ,令指」 W TP Tomcat Web 個一, 向指址 http://localhost:8080/FirstSpringMVC/hello.do?user=Justin : 示所下 如 面 畫 考 參 的 行 執 7 11
  • 12. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 圖 7.7 FirstSpringMVC 面畫考參行執 7.1.3 WebApplicationContext 的義定 所 己 自 在 要 想 果 如 Servlet 用使中別類 Spring 則,能功器容的 用 使以可 也 例, org.springframework.web.context.ContextLoaderListener :義定以加籤標 web.xml用使中 在如 <listener> ... <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> ... 取讀會設預 ContextLoaderListener applicationContext.xml 以可您, 在要只,檔義定的己自定指 <context-param> 定指中 "contextConfig- :如例,數參 Location" ... <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/beans-config.xml, → /WEB-INF/demo-service.xml</param-value> </context-param> ... 7 12
  • 13. Chapter 7 Spring Web MVC 架框 的義定自在以可著接 Servlet 用使中 org.springframework.web. context.support.WebApplicationContextUtils 從, 得取中 ServletContext org.springframework.web.context.WebApplicationContext :如例, WebApplicationContext ctx = WebApplicationContextUtils. getRequiredWebApplicationContext( this.getServletContext()); WebApplicationContext 了作實 ApplicationContext 是,面介 Spring 為專 Servlet 的 Web 的計設式程用應ApplicationContext 取在,別類作實 得WebApplicationContext 得取來它用利以可,後之 Bean 的義定中檔義定 Bean :如例,例實 Date date = (Date) ctx.getBean("dateBean"); 援支不在 Listener 如例(上器容的定設 Servlet 2.2 ,)本版的早更以 用使以可 來 org.springframework.web.context.ContextLoaderServlet 的面上代取 ContextLoaderListener :如例,定設的 ... <servlet> <servlet-name>contextLoader</servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> ... 設假,式方態組的整完範示來例範的單簡個一寫撰,述敘的上以合綜 : 示 所 下 如 , 能功時 報 供 提 為 用 作 , 式 程 Servlet 個一了寫撰您 7 13
  • 14. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) WebApplicationContextDemo TimeServlet.java package onlyfun.caterpillar; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context. support.WebApplicationContextUtils; public class TimeServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { WebApplicationContext ctx = WebApplicationContextUtils. getRequiredWebApplicationContext( this.getServletContext()); PrintWriter out = res.getWriter(); out.println(ctx.getBean("dateBean")); } } 了用使中 個這Servlet WebApplicationContext 得取試嘗來 義定中 在以可, "dateBean" web.xml ContextLoaderListener義定 與 Bean :如例,置位的檔 WebApplicationContextDemo 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> 7 14
  • 15. Chapter 7 Spring Web MVC 架框 </session-config> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/beans-config.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>time</servlet-name> <servlet-class> onlyfun.caterpillar.TimeServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>time</servlet-name> <url-pattern>/time.do</url-pattern> </servlet-mapping> </web-app> 了 定 設,中 性 屬 <context-param> 的 在 "contextConfigLocation" Bean : 示 所 下 如 容 內 的 檔 義 定 ,稱 名 與 置 位 的 檔 義 定 B ean WebApplicationContextDemo 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="dateBean" class="java.util.Date" scope="singleton"/> </beans> 7 1
  • 16. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 至接 連 器 覽 瀏 用 使 以 可 TimeServlet 執個一,間時的接連示顯會頁網, :示所下如面畫的行 圖 7.8 WebApplicationContextDemo 面畫考參行執的 7.1.4 Handler Mapping ,時到來求請的戶客當 決件物 D ispatcherServlet 據根 Handler mapping 的 應 對至配 分 求 請 將 何 如 , 定 Controller 常通,說來式程用應 於對, Web 至應對徑路 以是就 URL Controller 。 的設預 DispatcherServlet Handler mapping 是 org.springframework. web.servlet.handler.BeanNameUrlHandlerMapping 在使即以所, Bean 告宣確明有沒中檔義定 BeanNameUrlHandlerMapping 用使會也, BeanNameUrlHandlerMapping 依 Bean 的義定 "name" 決來, 之性屬 URL 個一哪用使定 Controller :如例, ... <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <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> ... 7 16
  • 17. Chapter 7 Spring Web MVC 架框 對 者 用 使,中 定 設 的 面 上 在 /hello.do ,求 請 的 徑 路 D ispatchServlet 都 。理處件物 由交會 HelloController BeanNameUrlHandlerMapping 的單簡是於用適僅, Handler mapping 得 使 它為因 , 式 程 用 應 的 型 小 URL Controller 與 關立 建 接 直 稱 名 別 類 的 的 Spring 在,係 Handler mapping 是的用使常最中org.springframework. 下如子例的用使個一, web.servlet.handler.SimpleUrlHandlerMapping :示所 ... <bean id="urlHandlerMapping" class="org.springframework.web.servlet. → handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello.do">helloController</prop> <prop key="/welcome.do">welcomeController</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="helloController" class="onlyfun.caterpillar.HelloController"> <property name="viewPage" value=”hello”/> </bean> <bean id="welcomeController" class="onlyfun.caterpillar.WelcomeController"> ... </bean> ... 7 17
  • 18. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 的求請是 的 ,中置設的性屬 "mappings" 在 < prop> "key" URL 而, 的 ,稱名 的求請理處上際實定設間 <prop> </prop> 與 Bean < prop> "key" :如例, 用使以可還置設 Wildcard ... <bean id="urlHandlerMapping" class="org.springframework.web.servlet. → handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello*.do">helloController</prop> <prop key="/welcome.do">welcomeController</prop> </props> </property> </bean> .... 以,中置設的面上在 hello 的尾結 及頭開 .do URL 給交會都,求請 Bean 的中檔義定 " helloController" 。理處來 義定若 Controller 用 使可則 , 範 規 名 命 守 遵 時 稱 名 Spring 2.0 的增新 org.springframework.web.servlet.mvc.support.ControllerClassName HandlerMapping 寫改以可如例, FirstSpringMVC 的 mvc-config.xml :下如 ... <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=”controllerClassNameHandlerMapping” class="org.springframework.web.servlet.mvc. → support.ControllerClassNameHandlerMapping"/> <bean name="helloController" class="onlyfun.caterpillar.HelloController"> 7 18
  • 19. Chapter 7 Spring Web MVC 架框 <property name="viewPage" value="hello"/> </bean> ... 與求請的 將動自會 ControllerClassNameHandlerMapping hello* Controller 尋找試嘗會將求請的 如例,對比稱名別類 hello.do Hello- Controller 則,求請的 是若,的樣同,理處來例實 welcome* Controller- 。理處來例實 ClassNameHandlerMapping 尋找試嘗會 WelcomeController 7.1.5 Handler Interceptor 在是者或,後前的行執 Controller 在果如 View 記些 一 作 算 打 後 之 製 繪 作實以可,作動等求請截攔或錄org.springframework.web.servlet.Hand- 下如義定其,法方個三了範規中面介個這在,面介 lerInterceptor :示所 package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface HandlerInterceptor { boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; } 7 1
  • 20. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 的回傳,行執被前之求請理處 preHandler() Controller在會 boolean 回傳果如,求請理處來 是或 Handler Interceptor 讓否是定決值 Controller false ,求請理處不就 或 Interceptor 的來下接則, Controller p ostHandler() 在會法方 Controller,行執被後之求請完理處 在會則 a fterCompletion() View 。行執被後之成完製繪 承繼以可您 o rg.springframework.web.servlet.handler.HandlerInter- 方的 要 必 對 針 要 只 您,面 介 ceptorAdapter 了 作 實 它, HandlerInterceptor 作實中當在,案專 改 修以可 如 例 , 義 定 新 重 法 FirstSpringMVC Logging- Interceptor : 錄 記 作來後 、 前 的 理 處 件 物 制 控 被 求 請 在 , HandlerInterceptorDemo LoggingInterceptor.java package onlyfun.caterpillar; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet. handler.HandlerInterceptorAdapter; public class LoggingInterceptor extends HandlerInterceptorAdapter { private Logger logger = Logger.getLogger(this.getClass().getName()); public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info( handler.getClass().getName() + " ..."); 行執始開 return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 7 2
  • 21. Chapter 7 Spring Web MVC 架框 ModelAndView modelAndView) throws Exception { logger.info( handler.getClass().getName() + " 畢完行執..."); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("畢完理處求請 ..."); } } 個一這用使要 HandlerInterceptor 在須必, Bean ,義定行進中檔義定 :如例 HandlerInterceptorDemo 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="loggingInterceptor" class="onlyfun.caterpillar.LoggingInterceptor"/> <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="urlHandlerMapping" class="org.springframework.web.servlet. → handler.SimpleUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="loggingInterceptor"/> </list> 7 21
  • 22. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) </property> <property name="mappings"> <props> <prop key="/hello.do">helloController</prop> </props> </property> </bean> <bean id="helloController" class="onlyfun.caterpillar.HelloController"> <property name="viewPage" value="hello"/> </bean> </beans> 當; 是 UrlHandlerMapping 的用使所意注SimpleUrlHandlerMapping 控 在,錄 記 行 進 會 都 後 前 的理處 被 求 請 在 , 時 求 請 DispatcherServlet 過透 C onsole :示所下如訊資的到看所) (台制 圖 7.9 HandlerInterceptorDemo 面畫考參行執的 7.1.6 Controller 繼承架構 是的求請理處上際實,後之求請出送者用使當 實以可您, Controller ,中 在,求請理處來面介 Controller 作 Spring C ontroller 容 是 Spring IoC 7 22
  • 23. Chapter 7 Spring Web MVC 架框 的富豐供提 Bean。例實 個一的理管器 S pring Controller 根以可,構架承繼 的需所 成 完 以 , 別 類 個 某承繼 來 求 需 的 上 際 實 據 Controller。理處 :構架承繼的 Spring中 出列下以 Controller 圖 7.10 Spring 中 Controller 構架承繼 介簡別分下以 Controller :用作之別類關相 AbstractController AbstractController 了承繼並,面介 Controller 了作實 WebContentGene- 了供提, rator 直以可您。理處的) Session (化步同與取快 s ynchronized 承繼接 處來法方 AbstractController 義 定 新 重 並,handleRequestInternal() :如例,求請理 public class SomeController extends AbstractController { public ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) throws Exception { .... return new ModelAndView("view", "modelName", model); 7 23
  • 24. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) } .. } MultiActionController 的您,時大增模規式程在,別類 個一寫撰求請個一每為果如 Controller Controller用 使 接 直 或 承 繼 以 可。加 增 速 迅 會 將 別 類 MultiActionController 寫撰求請個一每用不而,件物個一同於中集理處求請的關相個數將,別類 。件物制控個一 BaseCommandController 、 A bstractCommandController 使以可則,理管以加中件物 個一至取擷值數參求請將要需果如 Command 一是 ,中 在。別 類 子 的 別 類 BaseCommandController 用 Spring C ommand 至定設並取擷數參求請將責負 JavaBean B aseCommandController , 個 流理處的續後了義定則 Command ,中件物 A bstractCommandController , 義定來 承繼會常通,程 AbstractCommandController CommandController :下如子例個一 public class SomeCommandController extends AbstractCommandController { public SomeCommandController() { setCommandClass(YourCommand.class); } public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException exception) throws Exception { YourCommand your = (YourCommand) command; ... return new ModelAndView(..); } .. } AbstractFormController 7 24
  • 25. Chapter 7 Spring Web MVC 架框 ,理處單表於對 A bstractFormController 單表及,數參求請理處了義定中 。程流面頁的行進要所時敗失或功成交提 SimpleFormController 承 繼 以 可,理 處 單 表 的 單 簡 於 對 SimpleFormController 定 新 重 以 可,別 類 理處己自要果如,法方 doSubmitAction() 義 新重以可則, ModelAndView 。法方 onSubmit() 義定 AbstractWizardFormController 承繼以可,說來頁網的集收料資成完來面畫單表個數要需於對 Abstract- 來能功) (靈精的式程用應面桌像以可您, WizardFormController W izard 。單表作製 個一每,紹介的單簡個作先 的上 以 於 對 邊 這 在 Controller Controller 明 說 續繼將 下 以 , 明 說 的 細 詳有會 都 中 節 一 下 在 別 類 Spring Web MVC 的 API 。 要主 7.1.7 ModelAndView 所時 面 畫 現 呈 , 中 式 程 ModelAndView 了表代別類 Spring Web MVC 能只次一中法方的式程 於由,件物料資 與件物料資 Model View 用使 Java 同 您 便 方 ,件 物 個 兩 這 裝 封 是 用 作 的 ModelAndView 以 所 ,件 物 個 一 傳 回 Model View 。 與 回傳時 被稱名 後之,稱名的ModelAndView括包只是 的單簡最 View View 面介 View resolver 作 實 是 就 也, org.springframework.web.servlet.View 的單簡最,等 或 InternalResourceView 如例,析解例實的 JstlView Model- AndView :下如式方構建 ModelAndView(String viewName) 7 2
  • 26. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 件物 用使以可則,件物料資 的 需 所時面 畫 現 呈 回 返 要 果 如 Model Map 下 用 使 以 可 ,數 引 的 時 構 建 為 作 構 建 在 後 然 ,料 資 集 收 來 ModelAndView :法方構建 ModelAndView 的本版個這面 ModelAndView(String viewName, Map model) 的現 呈 要 在 以 可 後 之 , ) ( 值 與 ) ( 鍵 定 設 中 件 物 Map " K ey " " V alue " 資 個一回傳要您果如,)中頁網 在如例(示顯以加出取中面畫 JSP Model :本版 個這面下用使以可則,稱名的 Model 定指並件物料 ModelAndView ModelAndView(String viewName, String modelName, Object modelObject) 由藉 物料資 modelName 出取中別類作實的 在以可您, View Model 據根並,件 View 現呈等 、頁網 是能可(示顯以加來術技的用使所 JSP P df 。)術技 用使可也別類ModelAndView View 引的時構建為作來件物的面介 : 法 方 構 建的用 可 個 三 是 下 以 , 數 ModelAndView(View view) ModelAndView(View view, Map model) ModelAndView(View view, String modelName, Object modelObject) 作實個一 View 是例實的 org.springframework.web.servlet.view. 成完來式方) RedirectView (發轉用使是設預 M odelAndView , F orward ) (向導新重用使會則,話的 用使,面畫果結的求請 RedirectView R edirect : 如 例 , 果 結 的 求請現 呈 以 , 置 位 面 畫 果結的 定 指 至 導 重 求 請 將 7 26
  • 27. 7 27 throws Exception { HttpServletResponse res) public ModelAndView handleRequest(HttpServletRequest req, ... " :如例, 鍵 個一生產動自會法方" ,件物 a ddObject() 入加 Model 僅以可您,法方 addObject() 了增新 ,中M odelAndView 在 Spring 2.0 Web 。 址 位 式 程 用 應 的 它 其 至 定 指 以 可 ,頁網 個 一 求 要 新 重 器 覽 瀏由是向導新重, WEB-INF 是像,錄目藏隱的中式程用應 問訪能不 Web 以所,出發器覽瀏由是求請的後向導新重,訊資的向導新重現出會上列址 位的器覽瀏此因,址位的定指所至接連新重會端戶客,址位求請出發新重 器覽瀏端戶客求要會式程用應 ,話的) W eb (向導新重用使 R edirect Web 。 址 位 式 程 用 應 的它其 至 定 指 能 不 , 行 進 中 式 程 用 應 在 能 只 Web 式方發 轉 , 源 資 些 這 得 取 以 可 才 , 理 處 的 與 Controller DispatcherServlet 過透須必而,源資些這求請接直法無就者用使此如,下 WEB-INF 到放源 資 的 取 存 管 控 要 些 一 將 以 可 此 因 , 錄 目 WEB-INF 是像,錄目部內 Web 的定 設 所 式 程 用 應 問訪以 可 , 行 進 內 之 式 程 用 應 在 是 發 轉 且 而 Web ,址位的發轉被現出會不並上列址網,話的式方) (發轉用使 F orward 。錄目式 程用應 是 Web FirstSpringMVC 中其,址位的樣這 MVC/pages/index.htm /FirstSpring- 像須必址位的回傳 getViewPage() 以所, 錄 目 根 的 式 程 用 應 Web是不而,始開錄目根頁網器服伺從須必定設的 ,邊這在 v iewPage ... } new RedirectView(this.getViewPage())); return new ModelAndView( ... public ModelAndView handleRequest(....) ... { ... 架框 Chapter 7 Spring Web MVC
  • 28. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) User user = new User(); ... ModelAndView modelAndView = new ModelAndView(viewPage); modelAndView.addObject(user); return modelAndView; } ... 動自會則,例實 是的 給定設果如 addObject() onlyfun.caterpillar.User 入加果如,稱名生產來稱名面介或別類照按說是就也, 為 鍵 生產 " " " user" null 。 生發會則, IllegalArgumentException 由, 定指不以可還 Spring 2.0 的 ModelAndView View 以可如例,稱名 供提求請據根來 RequestToViewNameTranslator View :寫 撰 下 如 中 檔 定 設 在 <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=”controllerClassNameHandlerMapping” class="org.springframework.web.servlet.mvc. → support.ControllerClassNameHandlerMapping"/> <bean id="viewNameTranslator" class="org.springframework.web.servlet. → view.DefaultRequestToViewNameTranslator"/> <bean name="helloController" class="onlyfun.caterpillar.HelloController"> <property name="viewPage" value="hello"/> </bean> ... 在 HelloController 化例實中 ModelAndView 定指不若,時 View 例, :如 7 28
  • 29. Chapter 7 Spring Web MVC 架框 ... public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { ModelAndView modelAndView = new ModelAndView(); ... return modelAndView; } ... 求請果如以所, 了定設於由 ControllerClassNameHandlerMapping 了定設於由,求請理處來 hello.do 讓會則, HelloController RequestTo- 並,時 生產中 ViewNameTranslator 然雖, handleRequest() ModelAndView 了合結(理處來 View 由會但, 定指有沒 hello.jsp InternalResource- ViewResolver 。)定設置後與置前的 7.1.8 View Resolver 的回傳據根 DispatcherServlet ModelAndView 名 析解來例實 View 。件物 的面畫於現呈理處並,稱 Model V iew 作實給託委是析解的稱名 org.springframework.web.servlet.ViewResolver ,例實的面介 View- Resolver :下如義定面介 package org.springframework.web.servlet; import java.util.Locale; public interface ViewResolver { View resolveViewName(String, Locale locale) throws ServletException; } ViewResolver 是例實個一的 以可您, InternalResourceViewResolver 在 viewResolver 與 定設中 "prefix" "suffix" 與置前 的 徑 路 定 設 別 分 , 性 屬 7 2
  • 30. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 樣這,字文置後 viewPage 個給接直,稱名別區要主的徑路打只以可就性屬 :範示的定設 ... <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <property name="prefix" value=”/WEB-INF/jsp/”/> <property name="suffix" value=”.jsp”/> </bean> ... 的際實,後完析解稱名在 ViewResolve View 轉的件物 與製繪 Model 作實給交是理處換 ,例實的面介 org.springframework.web.servlet.View View :下如義定面介 package org.springframework.web.servlet; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface View { void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; } 是 的設預 如例 InternalResourceViewResolver "viewClass" Internal- 關相術技層 的它其為性屬 ResourceView 定設以可也, "viewClass" View 外另, 為定設如例,別類 org.springframework.web.servlet.view.JstlView 。術技 的同不用適可,別類作實等 TilesView 、 有還 V elocityView View 用使以可您 org.springframework.web.servlet.view.BeanNameView- Resolver :如例, 7 3
  • 31. Chapter 7 Spring Web MVC 架框 ... <bean id="viewResolver" class="org.springframework.web.servlet. → view.BeanNameViewResolver"/> <bean id="hello" class="org.springframework.web.servlet.view.JstlView"> <property name="url" value=”/WEB-INF/jsp/hello.jsp”/> </bean> ... 的回返 當,中定設的上以在 ModelAndView view 為稱名 "hello" ,時 "id" 。 " hello" 的 為性屬 找尋去會 View Bean 用使以可這,中檔性屬個一至來出立獨義定的 ViewResolver 將以可 來 org.springframework.web.servlet.view.ResourceBundleViewResolver : 如 例 , 術 技 層 示 表 的 同 不 定 設 的 際 實據根 以 可 是 處 好 , 成 達 URL ... <bean id="viewResolver" class="org.springframework.web.servlet. → view.ResourceBundleViewResolver"> <property name="basename" value=”views”/> </bean> ... 在 了定設性屬 ResourceBundleViewResolver 的 "basename" "views" 是也 (稱名 " views" "basename" 用使將這,)值設預的 views.properties 的術技層示表定設來 "viewClass" 個一如例, 與 "url" views.properties 的 :示所下如例範寫撰 hello.class=org.springframework.web.servlet. → view.InternalResourceView hello.url=/WEB-INF/jsp/hello.jsp welcome.class=org.springframework.web.servlet.view.JstlView welcome.url=/WEB-INF/jsp/welcome.jsp 7 31
  • 32. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) other.class=org.springframework.web.servlet.view.VelocityView other.url=/WEB-INF/vm/other.vm 找尋會則, 為若稱名 的中例實 ModelAndView 的回傳在 view "hello" 可您 , 的 定 指 及 例 實 hello.class hello.url 的應對到得來 及 ViewClass URL 為置設上 在, 的同不置設區地或家國的同不為以 View "basename" 以可, "views"是定設系語果如, 取讀會設預示表, views.properties en_US 準它為以可, 是 定 設 系 語 果 如, views_en_US.properties 備準它為 zh_TW 定設域區與置設以可中案檔的應對而, views_zh_TW.properties 備 Locale View 。 的關相 用使以可也 org.springframework.web.servlet.view.XmlViewRe- solver :示所下如例範的定設個一, ... <bean id="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver"> <property name="location" value=”/WEB-INF/demo-views.xml”/> </bean> ... 是設預性屬 ,中定設的面上在 " location" 為定設邊這, views.xml 找尋中 到示表, demo-views.xml demo-views.xml View 例,義定 的 Bean :義定麼這中 demo-views.xml在如 ... <bean id="hello" class="org.springframework.web.servlet.view.JstlView"> <property name="url" value=”/WEB-INF/jsp/hello.jsp”/> </bean> ... 7 32
  • 33. Chapter 7 Spring Web MVC 架框 定設 與 制 機 的 作 運 其 BeanNameViewResolver 的傳回當,的似類是時 為稱名 的中例實 ModelAndView view "hello" 義定 找尋去會則,時 Bean 。定設 的 "id" 為 的中 "hello" View 7.1.9 Exception Resolver 例個這捉捕想您而,外例了出丟中程過行運在 JSP 或頁網 果如 Servlet 定設如例(外法方定設捉捕的外例關有中頁網 與器容用使了除,外 JSP 的素元令指 web.xml 頁網 定設是或,籤標 <error-page> 的 JSP "page" 理處 誤 錯 定 設 中 檔 義 定 的 "errorPage" 在以可也,)性屬 DispatcherServlet 用使如例,例實 的 個一定設,頁網 ExceptionResolver Bean org.springframework.web.servlet.handler.SimpleMappingException- Resolver :示所下如子例的定設個一, ... <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="exceptionResolver" class="org.springframework.web.servlet. → handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.sql.SQLException">sqlexception</prop> <prop key="java.sql.IOException">ioexception</prop> </props> </property> </bean> ... 7 33
  • 34. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 使時 生 發 外 例 在 並 , 用應動自會 DispatcherServlet ExceptionResolver 了生發要只,中定設的面上在如例,息訊誤錯示顯來頁網的定指用 了生發而, SQLException 至接連會就, /WEB-INF/jsp/sqlexception.jsp IOException 。 至接連會就, /WEB-INF/jsp/ioexception.jsp 7.2 Controller 實作類別 需 所 作 製 來 求 需 依 以可 , 別 類 關 相 的 面 介 Spring Controller 作實供提 , 理處求 請 的 頁 網 單 表 、 集收數 參 求 請 的 單 簡 是 論 無 , 件 物 Controller 的 以可別類的應對有都中 W izard 在,等計設的頁網 ) (靈精是至甚 Spring 。用應 7.2.1 AbstractController 是別類 org.springframework.web.servlet.mvc.AbstractController 請的者用使了作實式模 Controller 用使,作實單簡的面介 Template Method 請對驗檢、理處的) (頭標取快對了括包,程流的理處求 C aching header ) (化步同與得取的 G ET 、援支的) 、 (法方求 P OST S ession s ynchronized 。別類 用使 以 可 則 , 理 處 作 題議些 這 對 要 需 果 如 , 等 AbstractController 行執 被法方 AbstractController 從 handleRequest() DispatcherServlet : 示所下 如 程 流 作 工 的 始 開 1. DispatcherServlet 。法方 行執 handleRequest() 2. 援 支 不 法 方 果 如,法 方 求 請 的 援 支 驗 檢 來 定 設 的 "supportedMethods" 據根 ServletException 。 出丟則 3. 得取試嘗, 用使要需否是求請定決定設的 "requireSession" 據根 Session Session 。 出丟則 Session 得取有沒果如, ServletException 7 34
  • 35. Chapter 7 Spring Web MVC 架框 4. 據根 (頭標取快定設否是定決定設的 "cacheSeconds" C aching header。) 5. 叫呼 據根,法方 handleRequestInternal() "synchronizeOnSession" 是定決 對否 Session 。) (化步同行進 s ynchronized 於對 AbstractController 以可就解了的本基個有要只,程流作工的別類 承繼 接 直 以 可 , 了 AbstractController 義定新重並,別類 handleRequest- :如例,法方 Internal() public class SomeController extends AbstractController { protected ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) throws Exception { .... return new ModelAndView("view", "modelName", model); } .. } 方些一的好義定經已作操接直以可,話的別類 AbstractController 用使 , 式 方 求 請 的 許 允 所 定 設, 法 方 叫呼以可如例,法 setSupportedMethods() 、 、 援 支只則 , 話 的 寫 撰 下 如 若 時 作 實 Controller 如例 GET P OST H EAD :求請的 package onlyfun.caterpillar; ... public class HelloController extends AbstractController { ... public HelloController() { this.setSupportedMethods( new String[] {"GET", "POST", "HEAD"}); } protected ModelAndView handleRequestInternal( HttpServletRequest req, HttpServletResponse res) throws Exception { ... } } 7 3
  • 36. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 則,話的求請式方的許允不以果如 Controller 出丟會候時的理處在 org.springframework.web.servlet.support.RequestMethodNotSupported- Exception 。外例的 7.2.2 MultiActionController 與 ParameterMethodName- Resolver 個一寫撰理處的求請個一每為若,大越來越模規的式程用應果如 的多越來越有中式程用應 Controller 到現發您,的快很,別類 Web 如例,別類個一在織組以可是責職些一的中當上實事而,別類 Controller 個一在織組以可就,法方等 、 、 的關相作操庫料資與 list() a dd() d elete() 。別類 :別 類 子 個 一 的 別 類 AbstractController 用使以可您 o rg.springframe- 在您讓以可它。 work.web.servlet.mvc.multiaction.MultiActionController 的 中當行 執 來 求 請 的 者 用 使據根 並 , 法 方 個 多 義 定 中 別 類 Controller 個一 。法方個某 個一合配要您, MultiActionController 用使要 org.springframework. ,例實的 web.servlet.mvc.multiaction.MethodNameResolver M ultiAction- Controller 是別類 的用使設預 MethodNameResolver org.springframework. 個 這, web.servlet.mvc.multiaction.InternalPathMethodNameResolver 行執斷判來稱名案檔的求請後最,中址網的給所據根以可別類 Controller 行執會求請的 /test.do 如例,法方個一哪的中 test (HttpServletRequest, HttpServletResponse) 用使會不常通但。法方 InternalPathMethodName- 是像,點優些一的 Resolver 用使了去失就這為因, MultiActionController 。法 方 的 行 執 要 所 定 決來數 參 求 請 的 者 用 使 依 7 36
  • 37. Chapter 7 Spring Web MVC 架框 用使在常通 MultiActionController 配搭會時 org.springframework. web.servlet.mvc.multiaction.ParameterMethodNameResolver 是或 o rg. springframework.web.servlet.mvc.multiaction.PropertiesMethodName- 行執要定決數參以,數參求請個一據根是都別類個兩, Resolver Controller 可, 例 為 以 先 邊 這, 法 方 個 一 哪 的 中 別 類 ParameterMethodNameResolver Bean :寫撰麼這中檔義定 在以 MultiActionDemo 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="/book.do">bookController</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="paraMethodResolver" class="org.springframework.web.servlet.mvc. → multiaction.ParameterMethodNameResolver"> <property name="paramName" value="action"/> <property name="defaultMethodName" value="list"/> </bean> 7 37
  • 38. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <bean id="bookController" class="onlyfun.caterpillar.BookController"> <property name="methodNameResolver" ref="paraMethodResolver"/> <property name="testPage" value="test"/> </bean> </beans> 設性屬 用 使 ,中 義 定 的 " paraMethodResolver" Bean 在 "paramName" 沒中求 請 是 若 , 法 方 的 行執 要 所 定 指 數 參 HTTP "action" 用使中求請 在定 方的定設所性屬 "action" 用使會則,數參 定指有 "defaultMethodName" list() 。法方 是的定設邊這,法 在義定中當,別類 BookController 承繼 MultiActionController "action" : 如 例 , 法 方的行 執 要 所 下 定 指 數 參 MultiActionDemo BookController.java package onlyfun.caterpillar; import javax.servlet.http.*; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc. multiaction.MultiActionController; public class BookController extends MultiActionController { private String testPage; public ModelAndView list(HttpServletRequest req, HttpServletResponse res) { return new ModelAndView( this.getTestPage(),"executed", "list"); } public ModelAndView add(HttpServletRequest req, HttpServletResponse res) { 7 38
  • 39. Chapter 7 Spring Web MVC 架框 return new ModelAndView( this.getTestPage(),"executed", "add"); } public ModelAndView delete(HttpServletRequest req, HttpServletResponse res) { return new ModelAndView( this.getTestPage(),"executed", "delete"); } public String getTestPage() { return testPage; } public void setTestPage(String testPage) { this.testPage = testPage; } } 與 括包須必,中法方的義定到意注 HttpServletRequest HttpServlet- 。本版的 Response 數參 個 三 第 有 帶 用 使 以 可 也 , 數 參 的 HttpSession 試測於用,例範的單簡個一是只別類 BookController 的義定所上以 目示表,串字個一定設是只理處的作所它,作運的 MultiActionController 者 用 使 示 顯 以 用 , 頁 網 的 用 試 測 個 一 計 設 以 可,稱 名 法 方 的 行 執 所 前 JSP :如 例 , 法 方 的 求 請 所 MultiActionDemo test.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"> <title>MultiAction Test Page</title> </head> <body> <H1> "${executed}" method is executed.</H1> 7 3
  • 40. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) </body> </html> 行執個一,數參求請上附中址網在以可,子例的求請出發個看際實來 :示 所 下 如 面 畫 考 參 的 圖 7.11 MultiActionDemo 果結行執的案專 7.2.3 MultiActionController 與 PropertiesMethodNameResolver 寫撰是不而,中件物) (託委個一在織組法方有所將以可也您 d elegate , 法方的 定 指 行 執 件 物 個 這給託 委 , 時 到 來 求 請 當 , 中 別 類 Controller 在 例,件 物 託 委 至 考 參 性 屬 的 MultiActionController "delegate"定設要只您 : 下如計 設 以 可 件 物 託 委 如 MultiActionDemo2 BookDelegate.java package onlyfun.caterpillar; import javax.servlet.http.*; import org.springframework.web.servlet.ModelAndView; public class BookDelegate { private String testPage; public ModelAndView list(HttpServletRequest req, HttpServletResponse res) { 7 4
  • 41. Chapter 7 Spring Web MVC 架框 return new ModelAndView( this.getTestPage(),"executed", "list"); } public ModelAndView add(HttpServletRequest req, HttpServletResponse res) { return new ModelAndView( this.getTestPage(),"executed", "add"); } public ModelAndView delete(HttpServletRequest req, HttpServletResponse res) { return new ModelAndView( this.getTestPage(),"executed", "delete"); } public String getTestPage() { return testPage; } public void setTestPage(String testPage) { this.testPage = testPage; } } 承繼用不在現 MultiActionController 義定來別類 Controller 而,別類 義定 接 直 中 檔 義 定 在 是 :例實的 MultiActionController MultiActionDemo2 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"> 7 41
  • 42. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) <props> <prop key="/book.do">bookController</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="paraMethodResolver" class="org.springframework.web.servlet.mvc. → multiaction.ParameterMethodNameResolver"> <property name="paramName" value="action"/> <property name="defaultMethodName" value="list"/> </bean> <bean id="bookDelegate" class="onlyfun.caterpillar.BookDelegate"> <property name="testPage" value="test"/> </bean> <bean id="bookController" class="org.springframework.web.servlet.mvc. → multiaction.MultiActionController"> <property name="methodNameResolver" ref="paraMethodResolver"/> <property name="delegate" ref="bookDelegate"/> </bean> </beans> 用使以可您 MultiActionDemo 這,果結現呈來頁網 的中案專 test.jsp 與果結行執的式程個 MultiActionDemo 圖考參以可,的同相是案專 7.11 。面畫的 7 42
  • 43. Chapter 7 Spring Web MVC 架框 用使以可也,式程的面上 PropertiesMethodNameResolver 將如例, Bean:容內的下以為寫改檔義定 <?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="/*book.do">bookController</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="propMethodResolver" class="org.springframework.web.servlet.mvc. → multiaction.PropertiesMethodNameResolver"> <property name="mappings"> <props> <prop key="/listbook.do">list</prop> <prop key="/addbook.do">add</prop> <prop key="/deletebook.do">delete</prop> </props> </property> </bean> <bean id="bookDelegate" class="onlyfun.caterpillar.BookDelegate"> <property name="testPage" value=”test”/> 7 43
  • 44. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) </bean> <bean id="bookController" class="org.springframework.web.servlet.mvc. → multiaction.MultiActionController"> <property name="methodNameResolver" ref="propMethodResolver"/> <property name="delegate" ref="bookDelegate"/> </bean> </beans> 給交會都求請的尾結為 有所,定設的上以據根 book.do bookController 同 依 ,法 方 的 行 執 會 ,時 /listbook.do 求 請 而 ,理 處 來bookDelegate list() 或 行執來 或 用使別分以可,理道的樣 /addbook.do /deletebook.do a dd() l ist() : 示 所 下 如 面 畫考參 的 行 執 個 一 , 法 方 圖 7.12 用使 PropertiesMethodNameResolver 果結行執的 7.2.4 ParameterizableViewController 類子的別類 是別類 ParameterizableViewController AbstractController 這當,性屬 的它 定 設 , 義 定 中 檔 義 定 在接 直 以 可 , 別 Bean "viewName" , 頁網的 定 指 向 導 接 直 定 設 的 Controller 據根會,時行執 "viewName" 個 個一計設以可如例,求請 頁網 對接直免避來用以可是處好的它用使 JSP 將以可,制控 index.jsp 過透都求請的有所讓了為, DispatcherServlet :義定麼這中檔義定 在接直並,下 index.jsp WEB-INF 在置放 Bean 7 44
  • 45. Chapter 7 Spring Web MVC 架框 ... <beans> <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="indexController" class="org.springframework.web.servlet. → mvc.ParameterizableViewController"> <property name="viewName" value=”index”/> </bean> <beans> 是求請址網的接連當,定設的上以依 /index.do 定指所至接連會則,時 。頁網 的 /WEB-INF/jsp/index.jsp 7.2.5 AbstractCommandController 數參 求 請 供 提 者 用 使 到 遇 當 , Controller 是或 用使 AbstractController 這 將算打 果 如 , 數 參 求 請 得 取 中 件 物 從行自須必,時 HttpServletRequest 等換轉態型行進或輯邏關相寫撰行自須必,件物個某至定設數參求請些 。作動 7 4
  • 46. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) 承繼以可 org.springframework.web.servlet.mvc.AbstractCom- 當,件物 mandController 個一供提並,別類 作實來 Controller Command 稱名數 參 求 請 對 比 著 試 會 ,時到來求請者用使 A bstractCommandController 對叫呼並,)稱名法方 Command 是就也(稱名法方 Setter 的上 setXXX 與 會 也,態 型 本 基 是 數 參 的 上 Setter 果如,值數參求請定設法方 Setter 的應 。 態 型 的 應 對為值 數 參 求 請 換 轉 動 自 :別類 為 作 別 類 個 一 了 計 設您設 假 , 說 來 子 例 個 舉 User Command AbstractCommandDemo User.java package onlyfun.caterpillar; public class User { private String name; private String password; public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public String getPassword() { return password; } } 了括包中求請 果如 "name" 與 "password" 為 裝封要想數參 些這而,數 參 User 承 繼則, 例 實 AbstractCommandController 使以可 , 時 作實 Controller 7 46
  • 47. Chapter 7 Spring Web MVC 架框 用 setCommandClass() 定指 來 Command 的它義定新重並,別類 handle() 方 :如例 ,法 AbstractCommandDemo UserController.java package onlyfun.caterpillar; import java.util.HashMap; import java.util.Map; import javax.servlet.http.*; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet. mvc.AbstractCommandController; import org.springframework.validation.BindException; public class UserController extends AbstractCommandController { private String userPage; public UserController() { setCommandClass(User.class); } protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException exception) throws Exception { User user = (User) command; Map model = new HashMap(); model.put("name", user.getName()); model.put("password", user.getPassword()); return new ModelAndView(getUserPage(), "userInfo", model); } public void setUserPage(String userPage) { this.userPage = userPage; } public String getUserPage() { 7 47
  • 48. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) return userPage; } } 並,例實的 了得取接直,中法方 UserController 的 handle() Command 法方 與 作操接直,後之 為面介作操換轉在 User getName() getPassword() 頁網 在以,訊資集收來件物 個一了用使上以在,數參求請得取來 Map JSP : 下 如 計 設 頁 網 設假 , 訊 資 些 這 現 呈 中 JSP AbstractCommandDemo userInfo.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"> <title>AbstractCommandController Demo</title> </head> <body> <h1> :稱名 ${userInfo['name']}</h1> <h1> :碼密 ${userInfo['password']}</h1> </body> </html> 在以可著接 Bean 的關相定設中檔義定 Bean :示所下如,訊資 AbstractCommandDemo 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"> 7 48
  • 49. Chapter 7 Spring Web MVC 架框 <property name="mappings"> <props> <prop key="/user.do">userController</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="userController" class="onlyfun.caterpillar.UserController"> <property name="userPage" value="userInfo"/> </bean> </beans> :數 參 求 請 上 附 列 址 網在接 直 時 求 請 在 , 面 畫果結 的 行 執 個 一 看 看 來 圖 7.13 AbstractCommandDemo 果結行執的案專 7.2.6 AbstractFormController 承繼過透常通,求需單表的單簡於對 org.springframework.web.servlet. 或 義定新重並, mvc.SimpleFormController 義定來 Controller onSubmit() 定 程流理 處 單 表 的 正 真 上 際實而 , 能 功 單 表 成 完 來 法 方 doSubmitAction() 7 4
  • 50. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) , 在義 org.springframework.web.servlet.mvc.AbstractFormController :明說的中當下一理整邊這,用作之法方的串連一其明說有,中件文 在 API 1. 。例實的 個一傳回要,法方 formBackingObject() 行執 commandClass 2. ,作 動 等 化 式 格 作 的 定 特 initBinder() 對 您 許 允,法 方 行執 Command Field 。定設的 或態型本基非供提,等式格錢金、式格期日如例 String 3. 。現展的單表於用,件物 個一回返,法方 showForm() 行執 View 4. 用應則, 為定設被性屬 "bindOnNewForm" 果如 true ServletRequest- 行執且並,件物單表的新個一入填來數參求請始初據根 DataBinder onBindOnNewForm() 。法方 5. showForm() 程過的單表現展在果如,法方 行執會法方 referenceData() :如例,件物 個一傳回以可,料資關相些一要需,中 Map protected Map referenceData( HttpServletRequest request) throws Exception { Map ref = new HashMap(); ref.put("defalutUser", "guest"); return ref; } 用使中頁網 在以可就,來一樣這 JSP ${defaultUser} ,料資現呈來法寫的 。 是會值的得取所如例 "guest" 6. Model 。寫填行進並單表到看以可者用使,現展被件物 : 行 進 程 流 的下以 依 會 將 , 單 表 出 送後之 單 表 完 寫 填 者 用 使 1. 式方的樣這 用想不果如, 用使常通,出送單表的者用使受接 POST POST 。法方 義定新重以可,單表出送否是者用使斷判來 isFormSubmission() 2. 以法方 行 執 會 則,定 設 有 沒 性 屬 "sessionForm" 果如 formBackingObject() 執則到找有沒果如,件物單表得取中 從試嘗則否,件物單表得取 session 7
  • 51. Chapter 7 Spring Web MVC 架框 行 handleInvalidSubmit() 重並件物單表的新立建 試嘗是作動的設預,法方 。單表寫填新 3. ServletRequestDataBinder 。件物單表入填數參求請的前目據根 4. 行 進 件 物 單 表 對 以 可 前 之 料 資 證 驗,後 之 料 資 定 綁 在,法 方 onBind() 行執 。作動改修的訂自些一 5. 。器證驗用使則,定設被性屬 "validateOnBinding" 果如 6. 些 一 作 件 物 單 表 對 後 之 料 資 證 驗 在 您 許 允,法 方 onBindAndValidate() 行執 。理處 7. 要別類子,法方 行執後最,畢完理處件物單表 processFormSubmission() 。求請的者用使成完以,法方個這義定新重 7.2.7 SimpleFormController 是 org.springframework.web.servlet.mvc.SimpleFormController AbstractFormController 類個這承繼接直以可單表的單簡於對,別類子的 義定新重並,別 請的者用使理處以法方 onSubmit() doSubmitAction() 或 ,求 S impleFormController :的 樣 這 是 程 流 理 處 的 1. processFormSubmission() 行執 驗檢以 Errors 時證驗或定綁在看看,件物 。誤錯的何任無有 2. 。面頁的定設所 傳回,生發誤錯有果如 "formView" 3. 也則, 傳回並義定新重被 據根 isFormChangeRequest() 果如 request true 讓, 行執會前之 "formView" 到 回 在, 到回會 "formView" onFormChange() 。件物單表正修會機有您 4. 、 有帶行執會則,生發誤錯有沒果如 HttpServletRequest H ttpServlet- 帶僅行執是設預, Response 的數參 O bject 、 、 B indException onSubmit() 有只行執是設預者後而, Object 的 BindException 及 onSubmit() Object 7 1