O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

2.263 visualizações

Publicada em

Spring 2.0 技術手冊

Publicada em: Tecnologia
  • Seja o primeiro a comentar

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

×