More Related Content Similar to Spring 2.0 技術手冊第十章 - 專案:線上書籤 Similar to Spring 2.0 技術手冊第十章 - 專案:線上書籤 (20) More from Justin Lin (20) Spring 2.0 技術手冊第十章 - 專案:線上書籤1. 。案專發開來 用使何如到解了以可
Spring
您,籤 書 上 線 成 完 際 實 由 藉, 與 籤 標
Spring JSTL 、 用使 S pring JSP
則 上 術 技 層 在,等
View 及以
Java Mail 、器 容
H ibernate Spring IoC
、架框 用使將中式程,式程
Spring Web MVC 的籤書理管上 Web
線以可個一成完,能功 的過紹介前先合組將,中節章個這在
Spring
。式方定設態組與用使的 API 種各中 顯突,中式程用應的
Spring
單簡些一在並,能功個各的 Spring 紹介於重著,中節章各的前先在
專案:Spring 線上書籤
10
2. 2 1
構架程流籤書上線 10.1 Spring 圖
: 構 架 程 流 的 下以出 劃 規 , 程 流 的 構 架
Web MVC 於基,式程計設來構架的 Web MVC
用採將籤書上線 Spring
10.1.1 架構規劃
。改修的要
必不或亂混式程的成造而楚清不構架因,中程過發開式程免避以可,業作
Web
上紙的單簡些一前事但,式程 的單簡個一是只這然雖,術技的用採要
所慮考與構架的式程計設來間時些一花先,前之式程計設始開式正在
10.1 程式概觀
) – http://openhome.cc 良信林(冊手術技 Spring 2.0
3. 3 1
。者用
6
使給回傳果結將中” 程流“在,面畫示顯並件物料資的要必取擷會頁網
,頁網的面畫果結現呈給發轉中” 程流“在著接,件物料資的取存以可 5
所頁網為定設並息訊的要必集收器制控,後之器制控至回返程流理處在
頁網
。作動等新更、詢查、存儲行進庫料資與責負將件物取存料資中
4
” 程流“在,庫料資用採將介媒的籤書存儲來用中式程籤書上線 Spring
庫料資
D ata
。件物) (料資為裝封息訊些一將以可還,話的要需果如,求
M ail
請些這理處來等件物務商 、) (件物取存料資用調中” 程流“ D AO 3
在器制控,理處來件物 Model
的中層務業用調須必務業些一有中求請在
件物 Model
等 、 、 D AO M ail Data
。求請成完
來件物的層務商叫呼並,證驗料資行進、數參求請的者用使取擷將器制控
,理處來器制控由交求請將中” 程流“在,後器制控好定決器制控端前2
器制控
。求請理
處來器制控個一哪由定決將器制控端前,求請送發器制控端前向中” 程 1
流 “ 在 者 用 使,求 請 的 者 用 使 受 接 來 器 制 控 端 前 用 採,中 籤 書 上 線 在 Spring
) F ront Controller
(器制控端前
: 明說個 作 微 稍 , 用 作 的 示圖與 程 流 個 每 中 圖 於 對
籤書上線 S pring :案專 Chapter 10
4. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
10.1.2 採用技術
。術 技 的 用 採 際 實 將 節環個 一 每 慮 考 來 , 後 之構架 式 程 的 致 大 解 了 在
)
F ront Controller (器制控端前
Spring 現實來架框 的 用使將,中籤書上線
Spring 在
Web MVC Web MVC
。別類 的 為器制控端前的用採所中其,構架
Spring DispatcherServlet
器制控
,別類 的
Spring Web MVC合 配,架 框 用採於由
Spring DispatcherServlet
如例,別類的 上構架承繼
Spring Web MVC 中
Controller 用使將 Abstract-
類等
CommandController 、 、
S impleFormController M ultiActionController
。別
Data M ail D AO Model件物 等 、 、
現實的件物 在,別類 與別類 的訂自為面方件物料資
User Bookmark DAO
(射映係關 件物行進動自來
Hibernate 用採將,上 / O bject/Relational
作別類
Mapping 、 到用使會將,中程過的取存料資在,) User B ookmark
到用使份部個這,求需的件郵送發有會中式程而,件物料資為 Java Mail
。裝封層象抽
Spring 的
Java Mail用使會,能功的
庫料資
聯關
Spring 用採將,介媒的籤書與料資者用使存儲來用籤書上線 MySQL
。庫料資式
頁網
,籤 標 定 綁 些 一 的 用 運,礎 基 為 術 技 用 使,上 用 採 的 術 技 頁 網 在
JSP Spring
JSTL 。現呈的輯邏面頁理處來 用使並
1 4
5. 1
。式程個這備完、改修行自須必,式程個這用使合
場些某在際實算打您果如,用之學教是的目要主式程個這,到
俱面面的計設有沒並能功些一的中式程,式程個一成完來 API
或架框的關 相 合 組 何 如 是 僅,的 範 示 式 程 個 這,制 限 的 幅 篇 於 基
。到看 時 面 頁 關 相 計 設 中
節小的後稍在以可面畫的行執式程,面畫的行執式程出列不先邊這在
。 碼 密 者 用 使的您 知 告 件 信 封 一 發 統系讓 , 址 位 件 郵 的 時 冊
註入輸以可還,話的碼密記忘果如,碼密的您更變是者或,作動除刪與增
新的籤書行進中面頁理管在以可,面頁理管籤書的己自有擁並,者用使的
新個一冊註以可您,理管籤書上線行進您讓以可,籤書上線 Spring
在
10.1.3 功能概述
籤書上線 S pring :案專 Chapter 10
6. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
10.2 Model 設計
進庫 料 資 與 責 負 有 件 物
Spring 的層務商,中計設的籤書上線 在
Model
資籤書 與 料 資 者 用 使 取 存 責 負 別 分 ,
UserDAO B ookmarkDAO 、 的取存行
這,碼密的者用使送寄能功件郵到用使須必,時碼密記忘者用使在而,料
。能 功 個 這 成 完 來 別 類
SimpleMail 個一計設將
10.2.1 UserDAO
個一有計設中式程,存儲的料資者用使於對 User 料資應對以用,別類
:寫撰的別類 下一看來,格表 的中格表庫
user User
SpringBookmark User.java
package onlyfun.caterpillar.model;
public class User {
private Integer id;
private String email;
private String username;
private String passwd;
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setEmail(String email) {
this.email = email;
}
public void setUsername(String username) {
this.username = username;
}
1 6
7. Chapter 10 :案專 S pring 籤書上線
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getEmail() {
return email;
}
public String getUsername() {
return username;
}
public String getPasswd() {
return passwd;
}
}
中其,址位件郵與碼密、稱名的者用使括包將中件物
User 到看以可
於 應 對 將 別 類 個 這 ,別 識 一 唯 的 需 所 時
"id" Hibernate 用運在是性屬 User
:格表 立建來 的下以用使以可,格表 的中庫料資
user SQL user
CREATE TABLE user (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
username VARCHAR(16),
passwd CHAR(16) NOT NULL,
email VARCHAR(100) NOT NULL
);
用 使 將,上 作 實 的 在
UserDAO Hibernate 映了為,射映係關件物行進
個一寫撰要需,格表 與別類 射
User user :示所下如,
User.hbm.xml
SpringBookmark User.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
1 7
8. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
<hibernate-mapping>
<class name="onlyfun.caterpillar.model.User"
table="user">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="username" column="username"/>
<property name="passwd" column="passwd"/>
<property name="email" column="email"/>
</class>
</hibernate-mapping>
個一 計 設 過 透 以 可 , 別 類 作 實 的 際 實 於賴依 式 程 用 應 讓 不 了 為
DAO
IUserDAO : 下 如 計 設 面介, 面 介 於 賴 依 式 程 用 應 讓 , 面 介
SpringBookmark IUserDAO.java
package onlyfun.caterpillar.model;
public interface IUserDAO {
public void insert(User user);
public User findByName(String username);
public User findByEmail(String email);
public void update(User user);
}
也並,新更與存儲的料資行進來件物 據根以可,中
IUserDAO 在User
在,料資 詢查來址位件郵的者用使是或,稱名的者用使據根別分以可 User
:示所下如,上計設的
IUserDAO 別類作實的面介
UserDAO
SpringBookmark UserDAO.java
package onlyfun.caterpillar.model;
import java.util.List;
import org.springframework.orm.hibernate3.HibernateTemplate;
1 8
9. Chapter 10 :案專 S pring 籤書上線
public class UserDAO implements IUserDAO {
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(
HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public void insert(User user) {
hibernateTemplate.saveOrUpdate(user);
}
public User findByName(String username) {
if(username.equals("")) {
return null;
}
List users = hibernateTemplate.find(
"from User user where user.username='"
+ username + "'");
return (User) users.get(0);
}
public User findByEmail(String email) {
List users = hibernateTemplate.find(
"from User user where user.email='"
+ email + "'");
return (User) users.get(0);
}
public void update(User user) {
hibernateTemplate.update(user);
}
}
1
10. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
是的到看中法方 的
HibernateTemplate 在 find() Hibernate
詢查的用使勵鼓所 為, 稱簡,
Query Language HQL Hibernate
以可,性特的言語向導件物有具且單簡 比上用使在,言語
SQL
:紹介的 關有中站網的我考參
HQL
http://caterpillar.onlyfun.net/Gossip/HibernateGossip/
HibernateGossip.html
用運來裝封的 對
Spring 用使,中籤書上線 在 Spring Hibernate
進來件物
Hibernate 用使邊這,)容內的章 第考參(
6 HibernateTemplate
用使將件物 ,作操新更、詢查、取存資種各行 H ibernateTemplate Spring
。定設的關相行進會中案檔態組到看以可後稍,例實入注來能功入注賴依的
10.2.2 BookmarkDAO
個 一 有 計 設 中 式 程,存 儲 的 料 資 籤 書 於 對 Bookmark 應對以用,別類
下一看來,格表 的中格表庫料資
bookmark Bookmark :寫撰的別類
SpringBookmark Bookmark.java
package onlyfun.caterpillar.model;
public class Bookmark {
private Integer id;
private String username;
private String url;
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
1 1
11. Chapter 10 :案專 S pring 籤書上線
public void setUsername(String username) {
this.username = username;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
}
其, 址 網 籤 書 與 稱 名 者有擁 的 籤 書 括 包 將 中 件 物
Bookmark 到看以可
別類 "id" 個這,別識一唯的需所時
Hibernate 用運在是性屬 中 Bookmark
立建來 的下以用使以可,格表 bookmark 的中庫料資於應對將 SQL
bookmark :格表
CREATE TABLE bookmark (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
username VARCHAR(16) NOT NULL,
bm_URL VARCHAR(255) NOT NULL
);
,係關多對一為立建以可格表
u ser 與格表 ,上際實
bookmark
多對一射映何如中 到紹介有沒並中書本這於由過不 Hibernate
。格表的立獨個兩為計設仍例範而因,係關
1 11
12. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
,射映係關件物行進 用使將,上作實的
BookmarkDAO 在 Hibernate
個一寫撰要需,格表
Bookmark 與別類 射映了為
bookmark Bookmark.
hbm.xml :示所下如,
SpringBookmark Bookmark.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.model.Bookmark"
table="bookmark">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="username" column="username"/>
<property name="url" column="bm_URL"/>
</class>
</hibernate-mapping>
個一計設以可,別類作實 的際實於賴依式程用應讓不了為 D AO I Book-
markDAO: 下 如 計 設面介 , 面 介 於 賴 依 式 程 用 應 讓 , 面 介
SpringBookmark IBookmarkDAO.java
package onlyfun.caterpillar.model;
import java.util.List;
public interface IBookmarkDAO {
public List findUserUrl(String username);
public void addUserUrl(String username, String url);
public void deleteUserUrls(String username, String[] urls);
}
1 12
13. Chapter 10 :案專 S pring 籤書上線
籤 書 的 供 提 與 稱 名 者 用 使 據 根 :有 法 方 的 範 規 ,中
IBookmarkDAO 在
。除刪的籤書行進,料資籤書詢查來稱名者用使據根,料資籤書加增來
URL
: 示所下如,上計設的
IBookmarkDAO 別類作實的 面介 在
BookmarkDAO
SpringBookmark BookmarkDAO.java
package onlyfun.caterpillar.model;
import java.util.List;
import org.springframework.orm.hibernate3.HibernateTemplate;
public class BookmarkDAO implements IBookmarkDAO {
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(
HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public List findUserUrl(String username) {
List list= hibernateTemplate.find(
"select bm.url from Bookmark as bm where bm.username='"
+ username + "'");
return list;
}
public void addUserUrl(String username, String url) {
Bookmark bm = new Bookmark();
bm.setUsername(username);
bm.setUrl(url);
hibernateTemplate.saveOrUpdate(bm);
}
public void deleteUserUrls(
String username, String[] urls) {
for(int i = 0; i < urls.length; i++) {
List list = hibernateTemplate.find(
"from Bookmark bm where (bm.username='"
+ username +
"') and (bm.url='" + urls[i]+ "')");
hibernateTemplate.delete(list.get(0));
1 13
14. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
}
}
}
裝封的 對 用使,中作實的
BookmarkDAO 在的樣同
Spring Hibernate
功入 注 賴 依 的 用使將也件物
Hibernate H ibernateTemplate , 用運來
Spring
。 定 設 的 關 相 行進會 中 案 檔 態 組 到 看 以可後 稍 , 例 實 入 注 來 能
10.2.3 SimpleMail
用使所時冊註入輸他求要以可,時碼密的用使所時入登記忘者用使當
的 件郵, 碼 密 知 告 件 郵 送 寄會式 程 , 碼 密 的 者 用 使 詢 查 以 , 址 位
Email 的
,裝封的 對 用運並,成完來
Java Mail 用使中式程在送寄
Spring Java Mail
下一看來,單簡較比份部個這, 考參(寫撰的式程化簡以
9.2.1) SimpleMail
:計設的別類
SpringBookmark SimpleMail.java
package onlyfun.caterpillar.model;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
public class SimpleMail {
private String smtpHost;
private String from;
public void sendPasswdMail(String email,
String username, String passwd) {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost(getSmtpHost());
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(email);
mailMessage.setFrom(getFrom());
1 14
15. Chapter 10 :案專 S pring 籤書上線
mailMessage.setSubject("碼密的您 ");
mailMessage.setText(username + " 是碼密的您,好您 " + passwd);
senderImpl.send(mailMessage);
}
public void setSmtpHost(String smtpHost) {
this.smtpHost = smtpHost;
}
public String getSmtpHost() {
return smtpHost;
}
public void setFrom(String from) {
this.from = from;
}
public String getFrom() {
return from;
}
}
行進來 用使以可,址位件郵人件寄與器服伺
SMTP 於關有中其 Spring
。便方很就時定設些這換更在此如,中之式程在寫撰接直用不而,入注賴依
1 1
16. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
10.3 View 設計
來 用使,礎基頁網為作 用使將,中籤書上線
Spring JSP 在 Tag Files
面頁行進來 與籤標定綁 用 運 並 , 件 元頁網 的 用 使 複 重 可 計 設
Spring JSTL
。現呈的輯邏
10.3.1 Tag Files
(尾結、) (頭 開 頁 網 是 像 , 份 部 的 同 共 多 許 有 中 頁 網
H eader F ooter )
的中術技 用 使以可 些 這 , 等 單 選 能 功者用 使 、 訊 資 站 網 是 或
JSP 2.0 Tag
頁 網寫撰 此 如 , 中 之 頁 網 在括包 候 時 的 要 必 在 並 , 案 檔 為 計 設
Files .tag
。 容 內 的同相 寫 撰 複 重 用 不 就 時
與稱名站網、式樣的本基了括包,寫撰下如
Tag File 的頭開頁網 Logo
:置設的
SpringBookmark header.tag
<%@tag description=" 的頁網個每 Header" pageEncoding="BIG5"%>
<html>
<head>
<title>Spring 籤書上線 </title>
<style>
body {font-family: Arial, Helvetica, sans-serif;
font-size: 13px}
li, td {Arial, Helvetica, sans-serif;
font-size: 13px}
hr {color: #3333cc; width: 300;
text-align: left}
a {color: #000000}
</style>
</head>
<body>
<img src='images/caterpillar.jpg'
alt='Spring 籤書上線 Logo' border='0' align='left'
valign='bottom'/>
1 16
17. Chapter 10 :案專 S pring 籤書上線
<h1> Spring 籤書上線 </h1>
<hr style="width: 100%; height: 2px;">
<hr style="width: 100%; height: 2px;">
個一寫 撰以可這 ,息訊關相的 址網現出 要份部些有中 站網 site_info.tag
: 案檔
SpringBookmark site_info.tag
<%@tag description="
息訊站網 " pageEncoding="BIG5"%>
<ul>
<li> 籤書的您存儲上線
<li> 籤書的我您享分
<li>結鏈的酷最出秀來快
</ul>
,擇選能功行進者用使供單選能功現出須必,後之頁網入登者用使在
的用 使 複 重 可 為 計 設 單選能 功 將 以 可 也 此 因 ,現出 要 都 中 面 畫 個 一 每 Tag
File :如例,
SpringBookmark usermenu.tag
<%@tag description=" 單表能功者用使 " pageEncoding="BIG5"%>
<hr style="width: 100%; height: 2px;">
<a href='member.do'> </a> |
頁首員會
<a href='member.do?action=addUrl'>籤書入加 </a> |
<a href='member.do?action=changePasswd'>
碼密變改 </a> |
<a href='member.do?action=logout'>出登 </a>
<hr style="width: 100%; height: 2px;">
個一計設以可此因,的多不差是都尾結的頁網個每於由,了忘別後最
footer.tag :案檔
1 17
18. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
SpringBookmark footer.tag
<%@tag description=" 的頁網個每 Footer" pageEncoding="BIG5"%>
</body>
</html>
開在果如,時頁網寫撰在後以,後 的用使 複 重 可 上 以 完 計 設
Tag Files
這 到 用 使 則, 改 更 接 直 可,時 改 更 要 需 等 息 訊 址 網 是 或 尾 結 、頭
Tag Files
。 容 內 新 更 動自會 就 也 時 求 請 次 一 下 在 , 頁 網 的
Tag Files 些
10.3.2 註冊網頁
用使的法合為成以號帳個一冊註先須必,時站網到來次一第者用使當
籤標定綁的 用使以可邊這,頁網冊註個一者用使供提須必以所,者 Spring
,位欄的上頁網至定綁件物
8.1.2 的入輸者用使受接將, 考參( )
Command
: 示 所 下 如計設 的 頁 網 冊 註 , 息 訊的位 欄 於 應 對 相 供 提 以
SpringBookmark register.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %>
<%@taglib prefix="spring"
uri="http://www.springframework.org/tags"%>
<caterpillar:header/>
<spring:bind path="command.*">
<font color="red">
<b>${status.errorMessage}</b>
</font><br>
</spring:bind>
<form method='post' action='register.do'>
<table bgcolor=#cccccc>
<tr>
<td>:址位件郵 </td>
<td>
1 18
19. Chapter 10 :案專 S pring 籤書上線
<spring:bind path='command.email'>
<input type='text' name='${status.expression}'
value='${status.value}' size='30'
maxlength='100'>
</spring:bind>
</td>
</tr>
<tr>
<td>:)元字 大最(稱名16 </td>
<td valign='top'>
<spring:bind path='command.username'>
<input type='text' name='${status.expression}'
value='${status.value}'
size='16' maxlength='16'>
</spring:bind>
</td>
</tr>
<tr>
<td> 6
:)元字 到 (碼密16 </td>
<td valign='top'>
<spring:bind path='command.passwd'>
<input type='password' name='${status.expression}'
size='16' maxlength='16'>
</spring:bind>
</td>
</tr>
<tr>
<td>:碼密認確 </td>
<td>
<spring:bind path='command.passwd2'>
<input type='password' name='${status.expression}'
size='16' maxlength='16'>
</spring:bind>
</td>
</tr>
<tr>
<td colspan='2' align='center'>
<input type='submit' value='冊註 '></td></tr>
</table></form>
<caterpillar:footer/>
1 1
20. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
: 示 所 下 如 面 畫的現 呈 所 , 後 頁 網 行 執
圖 10.2 頁網冊註
,入登者用使將接直並,頁網的功成冊註個一現出會,話的功成冊註
如頁網的功成冊註,結鏈的頁網員會到接連個一到現發接直以可將者用使
:示所下
SpringBookmark register_success.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %>
<caterpillar:header/>
!頁網員會往前,功成經已冊註的您
<br><a href='member.do'>
頁網員會 </a><br>
<caterpillar:footer/>
1 2
21. Chapter 10 :案專 S pring 籤書上線
個這行執 JSP :示所下如面畫的後頁網
圖 10.3 頁網功成冊註
10.3.3 登入網頁
登個一示顯以可,時頁首式程用應到接連當,了冊註經已者用使果如
: 下 如 寫 撰 的 頁 網 ,入登 行 進 碼 密 與 稱 名 入輸者 用 使 供 提 , 頁 網 入
SpringBookmark login.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %>
<%@taglib prefix="spring"
uri="http://www.springframework.org/tags"%>
<caterpillar:header/>
<caterpillar:site_info/>
<a href='register.do'>?員會是不還 </a><p>
<form method='POST' action='login.do'>
<spring:bind path="command.*">
<font color="red">
<b>${status.errorMessage}</b>
</font><br>
</spring:bind>
1 21
22. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
<table bgcolor='#cccccc'>
<tr>
<td colspan='2'>入登員會 </td>
<tr>
<td>:稱名 </td>
<td>
<spring:bind path='command.username'>
<input type='text' name='${status.expression}'
value='${status.value}'>
</spring:bind>
</td>
</tr>
<tr>
<td>:碼密 </td>
<td>
<spring:bind path='command.passwd'>
<input type='password'
name='${status.expression}'>
</spring:bind>
</td>
</tr>
<tr>
<td colspan='2' align='center'>
<input type='submit' value='入登 '></td></tr>
<tr>
<td colspan='2'><a href='forgot.do'>?碼密記忘 </a></td>
</tr>
</table></form>
<caterpillar:footer/>
: 示 所 下如面 畫 的 後 之 行 執 頁 網
1 22
23. Chapter 10 :案專 S pring 籤書上線
圖 10.4 頁網入登
到接連接直以可者用使,頁網的功成入登個一現出會,話的功成入登
: 示 所 下 如 頁 網的功 成 入 登 , 頁 網 員 會
SpringBookmark login_success.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %>
<caterpillar:header/>
!頁網員會往前,功成入登
<br><a href='member.do'> 頁網員會 </a><br>
<caterpillar:footer/>
1 23
24. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
: 示 所 下如面 畫 的 功 成 入 登 個 一
圖 10.5 頁網功成入登
10.3.4 會員網頁
有擁所前目者用使示顯會設預,後之頁網員會至結連並入登者用使當
其有供提並,籤書些某除刪否是擇選者用使讓以可上頁網籤書在,籤書的
:示所下如計設的頁網員會,作操能功的同不行進者用使讓,單選的能功它
SpringBookmark member.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<caterpillar:header/>
<br> ${valid_user} :好您<br><br>
<form name='bm_table' action='member.do' method='post'>
<table width='300' cellpadding='2' cellspacing='0'>
<tr bgcolor='#cccccc'><td><strong> 籤書</strong></td>
<td><strong>?除刪 </strong></td></tr>
<c:forEach var="url" items="${urls}" >
<tr bgcolor='#ffffff'>
<td><a href=<c:out value="${url}"/>>
<c:out value="${url}"/>
</a></td>
1 24
25. Chapter 10 :案專 S pring 籤書上線
<td><input type='checkbox' name='del_me'
value=<c:out value="${url}"/>></td>
</tr>
</c:forEach>
<tr bgcolor='#ffffff'>
<td></td>
<td>
<input type='hidden' name='action'
value='deleteUrl'>
<input type='submit' value=' '>
除刪
</td>
</tr>
</table>
</form>
<caterpillar:usermenu/>
<caterpillar:footer/>
頁,輯邏面頁排安了為,量數籤書的有擁所者用使定決法無先事於由
結鏈籤 書 出 輸 複 重 來 籤 標
JSTL 及以籤標
<forEach> 的 了用使中面 <out>
考 參的時 籤 書 有 個 一 看 來 ,
HTML 寫撰用不就中頁網在此如, 的
Scriplet
:面畫
圖 10.6 頁網員會
1 2
26. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
10.3.5 加入書籤網頁
入加至結連以可,時」籤書入加「之中表能功的方下頁網員會下按當
, 增 新 的 籤 書 行 進 以 , 的站 網 入 輸 中 頁 網 個 這在者 用 使 , 頁 網 的 籤 書
URL
: 下如寫 撰 頁 網 的 籤 書 入 加
SpringBookmark addbm.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %>
<caterpillar:header/>
<form name='bm_table' action='member.do' method='post'>
<table width='300' cellpadding='2'
cellspacing='0' bgcolor='#cccccc'>
<tr><td>:籤書新 </td>
<td><input type='text'
name='new_url' value='http://'
size='30' maxlength='255'>
</td>
</tr>
<tr><td colspan='2' align='center'>
<input type='hidden' name='action' value='addUrl'>
<input type='submit' value='
籤書增新 '></td></tr>
</table>
</form>
<caterpillar:usermenu/>
<caterpillar:footer/>
:示 所 下 如 面 畫 的 行 執
1 26
27. Chapter 10 :案專 S pring 籤書上線
圖 10.7 頁網籤書入加
10.3.6 改變、取回密碼網頁
密行進接直,後之結鏈」碼密變改「下按於以可,後之入登在者用使
: 下如寫 撰 頁 網 , 改 更 的 碼
SpringBookmark change_passwd.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %>
<caterpillar:header/>
<br>
<form action='member.do' method='post'>
<table width='250' cellpadding='2'
cellspacing='0' bgcolor='#cccccc'>
<tr><td>
:碼密新 </td>
<td>
<input type='password' name='new_passwd'
size='16' maxlength='16'>
<input type='hidden' name='action'
value='changePasswd'>
</td>
</tr>
<tr><td colspan='2' align='center'>
<input type='submit' value='
碼密變改 '>
</td></tr>
1 27
28. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
</table>
<br>
</form>
<caterpillar:usermenu/>
<caterpillar:footer/>
: 示 所 下如現 呈 頁 網 的 碼 密 變 改
圖 10.8 頁網碼密變改
忘「 選方下的頁網入登在以可則,入登法無碼密記忘為因者用使果如
擇
郵 封一發 以 可 就 統 系 , 址 位 的 用 使 所 時 冊 註入輸 , 結 鏈 」 ? 碼 密 記
Email
:示所 下 如 計 設 的 頁 網 該,碼 密 知 告 者 用 使 給 件
SpringBookmark forgot.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %>
<caterpillar:header/>
<br>
<form action='forgot.do' method='post'>
<table width='250' cellpadding='2'
cellspacing='0' bgcolor='#cccccc'>
1 28
29. Chapter 10 :案專 S pring 籤書上線
<tr><td> :址地件郵入輸 </td>
<td><input type='text' name='email'
size='16' maxlength='100'></td>
</tr>
<tr><td colspan='2' align='center'>
<input type='submit' value=" 碼密出寄 ">
</td></tr>
</table>
<br>
<caterpillar:footer/>
: 示 所下如 面 畫 的 時 行 執 頁 網
圖 10.9 頁網碼密回取
10.3.7 首頁重新導向
如,器制控端前過經先要都求請者用使的有所,中籤書上線
Spring 在
,時址網的樣這 用使 接 直 者 用 使 果
http://localhost:8080/SpringBookmark/
為作 個一供提該應您,頁網 的設預器服伺至接連會
Welcome index.jsp
至向導新重之將,時頁網個這至接連者用使當,頁網
Welcome
,入登者用使行進以,
http://localhost:8080/SpringBookmark/login.do
index.jsp :示所下如計設的
1 2
30. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
SpringBookmark index.jsp
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5"%>
<jsp:forward page="login.do"/>
的何任有沒中頁網,到看以可,成完計設頁網的有所,止為邊這到 Java
式程,處好的構架 用 使 是 這 , 籤 標 頁 網是只 的 有 , 現 出 碼 式 程
Web MVC
。 起 一 在 雜 混 會不輯 邏 現 呈 面 畫 與 輯 邏
1 3
31. Chapter 10 :案專 S pring 籤書上線
10.4 Controller 設計
、 的關相配搭須必頁網 的計設所中節小個一前 JSP Controller
是也件物
Command , 料 資的需 所 出 現 呈 以 可 才, 件 物 料 資 是 或 C ontroller
上線 , 看 看 來 節 小 個這, 鍵 關 要 主 的 起 一 在 合 結 與
Model View 將 S pring
Controller 。計設關相的 中籤書
10.4.1 RegisterController
用使集收件物 個一用使以可,候時的冊註行進者用使在 RegisterForm
失證驗的關相在,作合籤標定綁 與它用運以可並,值數參求請的者 Spring
:示所下如計設的 , 息 訊誤錯 示 顯 上 頁 網 於 時 敗
R egisterForm
SpringBookmark RegisterForm.java
package onlyfun.caterpillar.web;
public class RegisterForm {
private String email;
private String username;
private String passwd;
private String passwd2;
public void setEmail(String email) {
this.email = email;
}
public void setUsername(String username) {
this.username = username;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public void setPasswd2(String passwd2) {
this.passwd2 = passwd2;
1 31
32. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
}
public String getEmail() {
return email;
}
public String getUsername() {
return username;
}
public String getPasswd() {
return passwd;
}
public String getPasswd2() {
return passwd2;
}
}
檢如例,作動查檢證驗些一作要需,後之出送並單表冊註寫填者用使
之 元 字 個 至 元 字 個 在否是 度 長 碼 密 , 確 正 否是式 格 件 郵 的 者 用 使 查
6 16
件物 個 一用使 以 可 這 , 等 同 相 否是碼 密 的 入 輸 次 兩 , 間
RegisterValidator
參(面介 的 了作實件物個這,作動查檢證驗的關相成完來 Spring Validator
7.3.1 :示所下如式方寫撰,) 考
SpringBookmark RegisterValidator.java
package onlyfun.caterpillar.web;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class RegisterValidator implements Validator {
public boolean supports(Class clazz) {
return clazz.equals(RegisterForm.class);
}
public void validate(Object obj, Errors errors) {
RegisterForm form = (RegisterForm) obj;
1 32
33. Chapter 10 :案專 S pring 籤書上線
if(!validateEmail(form.getEmail())) {
errors.rejectValue("email",
"invalid_email", null, " 確正不式格件郵 ");
}
if(form.getPasswd().length() < 6 ||
form.getPasswd().length() > 16) {
errors.rejectValue("passwd",
"less-or-over", null, "元字 到 是須必度長碼密 6 16 ");
}
if(!form.getPasswd().equals(form.getPasswd2())) {
errors.rejectValue(
"passwd", "not-equal", null, " 符不碼密的入輸次兩 ");
}
}
private boolean validateEmail(String email) {
return email.matches("^[_a-z0-9-]+([.]" +
"[_a-z0-9-]+)*@[a-z0-9-]+([.][a-z0-9-]+)*$");
}
}
別類
RegisterController 的 承繼將別類
Spring SimpleFormController
考參( 7.2.7 設來入注賴依的 用使接直以可件物
Validator 個 這 ,) Spring
至定 Controller :寫撰的別類 下一看來,
RegisterController
SpringBookmark RegisterController.java
package onlyfun.caterpillar.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import onlyfun.caterpillar.model.IUserDAO;
import onlyfun.caterpillar.model.User;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.
mvc.SimpleFormController;
1 33
34. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
public class RegisterController extends SimpleFormController {
private IUserDAO userDAO;
public RegisterController() {
setCommandClass(RegisterForm.class);
}
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response,
Object command,
BindException exception) throws Exception {
RegisterForm form = (RegisterForm) command;
User user = new User();
user.setEmail(form.getEmail());
user.setUsername(form.getUsername());
user.setPasswd(form.getPasswd());
this.getUserDAO().insert(user);
request.getSession().setAttribute(
"valid_user", form.getUsername());
return new ModelAndView(this.getSuccessView());
}
public void setUserDAO(IUserDAO userDAO) {
this.userDAO = userDAO;
}
public IUserDAO getUserDAO() {
return userDAO;
}
}
設並,訊資關相取擷中
RegisterController 從將,中 RegisterForm 在
中件物 將以,件物 User 得取來下接,中例實的 個一至定
IUserDAO User
所層 於屬是 到意注,格表 的庫料資至存儲息訊的
user RegisterForm Web
將 接 直 議 建 不 但 ,息 訊 冊 註 的 者 用 使 有 帶 就 中 當 它 然 雖 , 的 計 設
API Web
1 34
35. Chapter 10 :案專 S pring 籤書上線
API 與 個 一用使 改 而 , 中 之 層 務 商 至 入 侵 的 計 設 所 層 Web 的關無層 User
。 息 訊冊註 者 用 使 裝 封 來 件 物
之成完冊註,定設能功入注賴依的
IUserDAO 用使將例實的
Spring
據 根 是 即 入 登 否 是 者 用 使,
Session 定設中性屬的件物
"valid_user" 在,後
。斷 判 行 進 來 性 屬 個 這
10.4.2 LoginController
用使集收來件物 個一用使以可,候時的入登行進者用使在 LoginForm
於時敗失入登在,作合籤標定綁 與它用運以可並,值數參求請的者 Spring
:示所下如計設的 ,息 訊 誤 錯 示 顯 上 頁 網
L oginForm
SpringBookmark LoginForm.java
package onlyfun.caterpillar.web;
public class LoginForm {
private String username;
private String passwd;
public void setUsername(String username) {
this.username = username;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getUsername() {
return username;
}
public String getPasswd() {
return passwd;
}
}
1 3
36. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
與稱名者用使查檢會,時入登理處在,別類
LoginController 計設著接
定設中性屬的件物 在,話的合符果如,合符否是碼密
Session "valid_
定 設 則 合 符 不 果 如,斷 判 行 進 來 性 屬 個 這 據 根 是 即 入 登 否 是 者 用 使,
user"
:示所下如寫撰的別類 , 面 頁 入 登至回 送 並 息 訊 誤 錯 關 相
L oginController
SpringBookmark LoginController.java
package onlyfun.caterpillar.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import onlyfun.caterpillar.model.IUserDAO;
import onlyfun.caterpillar.model.User;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.
mvc.SimpleFormController;
public class LoginController extends SimpleFormController {
private IUserDAO userDAO;
public LoginController() {
this.setCommandClass(LoginForm.class);
}
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response,
Object command,
BindException exception)
throws Exception {
LoginForm form = (LoginForm) command;
User user = userDAO.findByName(form.getUsername());
if(user == null) {
exception.rejectValue("username",
"no_such_user", "人此無查 ");
return new ModelAndView(
this.getFormView(), exception.getModel());
}
1 36
37. Chapter 10 :案專 S pring 籤書上線
else if(user != null &&
!user.getPasswd().equals(form.getPasswd())) {
exception.rejectValue("passwd",
"wrong_passwd", " 誤錯碼密");
return new ModelAndView(
this.getFormView(), exception.getModel());
}
else {
request.getSession().setAttribute(
"valid_user", user.getUsername());
return new ModelAndView(this.getSuccessView());
}
}
public void setUserDAO(IUserDAO userDAO) {
this.userDAO = userDAO;
}
public IUserDAO getUserDAO() {
return userDAO;
}
}
10.4.3 MemberController
、籤書除刪或入加、示顯的籤書人個行進以可來下接,後之入登員會
為此因,能功的有擁會才員會於屬是都作動些這,作動等出登、碼密改更
撰來別類 的 承繼以可,作操些這理管合集了
Spring MultiActionController
個 一 寫 撰 作 操 個 每 為 用 不 而 , ) 考參( 理 處 的 作 操 些 這 寫
7.2.2 Controller
:寫撰的
MemberController 下一看來,別類
SpringBookmark MemberController.java
package onlyfun.caterpillar.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
1 37
38. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
import onlyfun.caterpillar.model.IBookmarkDAO;
import onlyfun.caterpillar.model.IUserDAO;
import onlyfun.caterpillar.model.User;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.
multiaction.MultiActionController;
import org.springframework.web.servlet.view.RedirectView;
public class MemberController extends MultiActionController {
private IBookmarkDAO bookmarkDAO;
private IUserDAO userDAO;
private String memberPage;
private String addBmPage;
private String passwdPage;
private String redirectPage;
// 籤書人個示顯
public ModelAndView displayUrl(HttpServletRequest req,
HttpServletResponse res) {
String username =
(String) req.getSession().getAttribute("valid_user");
if(username != null) {
// 籤書找查稱名者用使據根
List urls =
getBookmarkDAO().findUserUrl(username);
return new ModelAndView(
this.getMemberPage(), "urls", urls);
}
else {
return new ModelAndView(
new RedirectView(getRedirectPage()));
}
}
// 籤書的新入加
public ModelAndView addUrl(HttpServletRequest req,
HttpServletResponse res) {
String username =
(String) req.getSession().getAttribute("valid_user");
if(username != null) {
if(req.getParameter("new_url") != null) {
1 38
39. Chapter 10 :案專 S pring 籤書上線
String url = (String) req.getParameter("new_url");
// 址網籤書的新入加
getBookmarkDAO().addUserUrl(username, url);
return displayUrl(req, res);
}
else {
return new ModelAndView(this.getAddBmPage());
}
}
else {
return new ModelAndView(
new RedirectView(getRedirectPage()));
}
}
// 籤書的擇選所除刪
public ModelAndView deleteUrl(HttpServletRequest req,
HttpServletResponse res) {
String username =
(String) req.getSession().getAttribute("valid_user");
if(username != null) {
if(req.getParameterValues("del_me") != null) {
String[] deleted_urls =
(String[]) req.getParameterValues("del_me");
// 籤書的定指所除刪
getBookmarkDAO().deleteUserUrls(
username, deleted_urls);
return displayUrl(req, res);
}
else {
return new ModelAndView(this.getAddBmPage());
}
}
else {
return new ModelAndView(
new RedirectView(getRedirectPage()));
}
}
// 碼密變改
public ModelAndView changePasswd(HttpServletRequest req,
HttpServletResponse res) {
1 3
40. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
String username =
(String) req.getSession().getAttribute("valid_user");
if(username != null) {
if(req.getParameter("new_passwd") != null) {
String passwd = req.getParameter("new_passwd");
User user = getUserDAO().findByName(username);
user.setPasswd(passwd);
getUserDAO().update(user);
return displayUrl(req, res);
}
else {
return new ModelAndView(this.getPasswdPage());
}
}
else {
return new ModelAndView(
new RedirectView(getRedirectPage()));
}
}
// 出登
public ModelAndView logout(HttpServletRequest req,
HttpServletResponse res) {
req.getSession().invalidate();
return new ModelAndView(
new RedirectView(getRedirectPage()));
}
public void setBookmarkDAO(IBookmarkDAO bookmarkDAO) {
this.bookmarkDAO = bookmarkDAO;
}
public IBookmarkDAO getBookmarkDAO() {
return bookmarkDAO;
}
public void setUserDAO(IUserDAO userDAO) {
this.userDAO = userDAO;
}
1 4
41. Chapter 10 :案專 S pring 籤書上線
public IUserDAO getUserDAO() {
return userDAO;
}
public String getMemberPage() {
return memberPage;
}
public void setMemberPage(String memberPage) {
this.memberPage = memberPage;
}
public String getAddBmPage() {
return addBmPage;
}
public void setAddBmPage(String addBmPage) {
this.addBmPage = addBmPage;
}
public String getPasswdPage() {
return passwdPage;
}
public void setPasswdPage(String passwdPage) {
this.passwdPage = passwdPage;
}
public String getRedirectPage() {
return redirectPage;
}
public void setRedirectPage(String redirectPage) {
this.redirectPage = redirectPage;
}
}
要需,時作操關相行進 IUserDAO 及 IBookmarkDAO 以可這,例實的
。定設行進來入注賴依的
Spring 用使
1 41
42. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
10.4.4 ForgotController
位件郵的用使所時冊註入輸以可,時入登法無而碼密記忘者用使當
在是作動些這上以,箱信的定指至信封一發會統系,址 ForgotController
: 的 寫 撰 何 如 是 它 下一看 來 , 的 義 定 中 別 類
SpringBookmark ForgotController.java
package onlyfun.caterpillar.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import onlyfun.caterpillar.model.IUserDAO;
import onlyfun.caterpillar.model.SimpleMail;
import onlyfun.caterpillar.model.User;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.
mvc.AbstractController;
public class ForgotController extends AbstractController {
private IUserDAO userDAO;
private SimpleMail simpleMail;
private String loginPage;
private String forgotPage;
public ModelAndView handleRequestInternal(
HttpServletRequest request,
HttpServletResponse response) throws Exception {
String email = request.getParameter("email");
if(email != null && !"".equals(email)) {
// 料資的者用使詢查址位件郵據根
User user = getUserDAO().findByEmail(email);
// SimpleMail
件郵送發以料資關相定設並例實 得取
getSimpleMail().sendPasswdMail(
user.getEmail(),
user.getUsername(),
user.getPasswd());
return new ModelAndView(this.getLoginPage());
}
else {
1 42
43. Chapter 10 :案專 S pring 籤書上線
return new ModelAndView(this.getForgotPage());
}
}
public void setUserDAO(IUserDAO userDAO) {
this.userDAO = userDAO;
}
public IUserDAO getUserDAO() {
return userDAO;
}
public void setSimpleMail(SimpleMail simpleMail) {
this.simpleMail = simpleMail;
}
public SimpleMail getSimpleMail() {
return simpleMail;
}
public void setLoginPage(String loginPage) {
this.loginPage = loginPage;
}
public String getLoginPage() {
return loginPage;
}
public void setForgotPage(String forgotPage) {
this.forgotPage = forgotPage;
}
public String getForgotPage() {
return forgotPage;
}
}
用 使 是 也 件物賴 依 的 關 相 , 的 樣 同 Spring 。定設行進來入注賴依的
1 43
44. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
10.5 組態設定
這將 要 在 現 , 成 完 寫 撰已件 元 等 別 類 與 面 頁 的 要 需 所 籤 書 上 線
Spring
一寫撰是就法方,作合以可此彼件元個各的中式程讓以,起一在接串切一
器容與架框
XML 其用使以可 讓,定設態組行進案檔 些
Spring Web MVC
。 來 起行運 式 程 個 整 將 , 能 功
10.5.1 設定 web.xml
考參( web.xml 的 定設要中
Spring 在
DispatcherServlet 7.1.2 告並,)
下 一 看 來, 置 位 在 所 與 稱 名 之 檔 定 設 的
Spring XML 知 web.xml 何如是中
:的寫撰
SpringBookmark 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>dispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/web-config.xml,
1 44
45. Chapter 10 :案專 S pring 籤書上線
→ /WEB-INF/model-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
免避了為 Spring 的層 將此因,長過容內案檔定設關相的 Web
、定 設
Controller V iew 的 關 相 將 而,定 設 行 進 中
web-config.xml 在等定設
於定設件物
Model model-config.xml 。中之
10.5.2 設定 web-config.xml
在 web-config.xml 、 、 定設是要主中
HandlerMapping V iewResolver
Controller 、 V iew 何 如看看 來 接 直 , ) 容 內 的 關 相 節 考 參 請 ( 容 內 等
7.1
:寫撰
SpringBookmark web-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="/login.do">loginController</prop>
<prop key="/register.do">registerController</prop>
<prop key="/member.do">memberController</prop>
1 4
46. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
<prop key="/forgot.do">forgotController</prop>
</props>
</property>
</bean>
<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 id="loginController"
class="onlyfun.caterpillar.web.LoginController">
<property name="userDAO" ref="userDAO"/>
<property name="successView" value="login_success"/>
<property name="formView" value="login"/>
</bean>
<bean id="registerValidator"
class="onlyfun.caterpillar.web.RegisterValidator"/>
<bean id="registerController"
class="onlyfun.caterpillar.web.RegisterController">
<property name="validator" ref="registerValidator"/>
<property name="userDAO" ref="userDAO"/>
<property name="successView" value="register_success"/>
<property name="formView" value="register"/>
</bean>
<bean id="paraMethodResolver"
class="org.springframework.web.servlet.mvc.
→ multiaction.ParameterMethodNameResolver">
<property name="paramName" value="action"/>
<property name="defaultMethodName" value="displayUrl"/>
</bean>
<bean id="memberController"
class="onlyfun.caterpillar.web.MemberController">
<property name="methodNameResolver"
ref="paraMethodResolver"/>
1 46
47. Chapter 10 :案專 S pring 籤書上線
<property name="bookmarkDAO" ref="bookmarkDAO"/>
<property name="userDAO" ref="userDAO"/>
<property name="memberPage" value="member"/>
<property name="addBmPage" value="addbm"/>
<property name="passwdPage" value="change_passwd"/>
<property name="redirectPage"
value="/SpringBookmark/login.do"/>
</bean>
<bean id="forgotController"
class="onlyfun.caterpillar.web.ForgotController">
<property name="userDAO" ref="userDAO"/>
<property name="simpleMail" ref="simpleMail"/>
<property name="loginPage" value="login"/>
<property name="forgotPage" value="forgot"/>
</bean>
</beans>
10.5.3 設定 model-config.xml
在 關相
model-config.xml 、息訊本基的庫料資寫撰是則,中 H ibernate
及以、置配的 UserDAO,) 容 內 的 節 考 參 ( 義 定 的
B ookmarkDAO 、
6.2
關有外另 SimpleMail : 寫 撰中案 檔 個 這 在 也 , 義 定 的
SpringBookmark model-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="dataSource"
class="org.springframework.jdbc.
→ datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/bookmarks"/>
1 47
48. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
<property name="username" value="your_db_username"/>
<property name="password" value="your_db_password"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.
→ hibernate3.LocalSessionFactoryBean"
destroy-method="destroy">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>onlyfun/caterpillar/model/User.hbm.xml</value>
<value>onlyfun/caterpillar/model/Bookmark.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.
→ hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="userDAO"
class="onlyfun.caterpillar.model.UserDAO">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<bean id="bookmarkDAO"
class="onlyfun.caterpillar.model.BookmarkDAO">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<!-- 的您定設要 Smtp Server 人件寄與 -->
<bean id="simpleMail"
class="onlyfun.caterpillar.model.SimpleMail">
1 48
49. 4 1
。能功的時行運籤書上線 看看以可就 Spring
WTP
,式程行運 用使後然,定設關相的 及以,等碼密、稱名者用使庫 Mail
料 資如例 , 置 配 化 人 個 些 一 的 中 當 改 修 並 , 案 專 SpringBookmark
到找中
.jar
碟 光在以 可 , 了 式 程 的 您 行運始 開 以 可 就 後 然 , 案 檔 的 關 相 定 設 要 了
忘別 後 最 , 成 完 寫 撰 已都案 檔 的 須 必 所 籤 書 上 線 ,止為邊這到 S pring
</beans>
</bean>
<property name="from" value="your_admin_address"/>
<property name="smtpHost" value="your_smtp_server"/>
籤書上線 S pring :案專 Chapter 10
50. 1
吧式程個寫 Spring 用著試 10.10 圖
。例範的好當相
Spring
用使何如摩觀個一是也這,式程例範的下錄目 下一看以可 jpetstore
您 議 建, 考 參 以 可 式 程 例 範 的 Spring
些 一 有 中 當, 錄 目 個一有中 samples
案檔載下 Spring
在,是的點一充補要後最,了落段一告要邊這到書本
10.6 接下來的主題
) – http://openhome.cc 良信林(冊手術技 Spring 2.0