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