Successfully reported this slideshow.

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

1

Share

Loading in …3
×
1 of 80
1 of 80

More Related Content

Related Books

Free with a 30 day trial from Scribd

See all

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

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

×