Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,194 views

Published on

Spring 2.0 技術手冊

Published in: Technology
  • Be the first to comment

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

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

×