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

Spring 2.0 技術手冊第十章 - 專案:線上書籤

1,840 views

Published on

Spring 2.0 技術手冊

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Spring 2.0 技術手冊第十章 - 專案:線上書籤

  1. 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. 2 1 構架程流籤書上線 10.1 Spring 圖 : 構 架 程 流 的 下以出 劃 規 , 程 流 的 構 架Web MVC 於基,式程計設來構架的 Web MVC 用採將籤書上線 Spring 10.1.1 架構規劃 。改修的要必不或亂混式程的成造而楚清不構架因,中程過發開式程免避以可,業作 Web上紙的單簡些一前事但,式程 的單簡個一是只這然雖,術技的用採要所慮考與構架的式程計設來間時些一花先,前之式程計設始開式正在 10.1 程式概觀 ) – http://openhome.cc 良信林(冊手術技 Spring 2.0
  3. 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. 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. 5. 1 。式程個這備完、改修行自須必,式程個這用使合 場些某在際實算打您果如,用之學教是的目要主式程個這,到 俱面面的計設有沒並能功些一的中式程,式程個一成完來 API 或架框的關 相 合 組 何 如 是 僅,的 範 示 式 程 個 這,制 限 的 幅 篇 於 基 。到看 時 面 頁 關 相 計 設 中節小的後稍在以可面畫的行執式程,面畫的行執式程出列不先邊這在 。 碼 密 者 用 使的您 知 告 件 信 封 一 發 統系讓 , 址 位 件 郵 的 時 冊註入輸以可還,話的碼密記忘果如,碼密的您更變是者或,作動除刪與增新的籤書行進中面頁理管在以可,面頁理管籤書的己自有擁並,者用使的新個一冊註以可您,理管籤書上線行進您讓以可,籤書上線 Spring 在 10.1.3 功能概述籤書上線 S pring :案專 Chapter 10
  6. 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. 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 userCREATE 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. 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. 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. 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. 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 的中庫料資於應對將 SQLbookmark :格表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. 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. 13. Chapter 10 :案專 S pring 籤書上線籤 書 的 供 提 與 稱 名 者 用 使 據 根 :有 法 方 的 範 規 ,中 IBookmarkDAO 在。除刪的籤書行進,料資籤書詢查來稱名者用使據根,料資籤書加增來URL: 示所下如,上計設的 IBookmarkDAO 別類作實的 面介 在 BookmarkDAO SpringBookmark BookmarkDAO.javapackage 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. 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. 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. 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. 17. Chapter 10 :案專 S pring 籤書上線<h1>&nbsp;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>&nbsp;&nbsp;<li> 籤書的您存儲上線&nbsp;&nbsp;<li> 籤書的我您享分&nbsp;&nbsp;<li>結鏈的酷最出秀來快</ul>,擇選能功行進者用使供單選能功現出須必,後之頁網入登者用使在 的用 使 複 重 可 為 計 設 單選能 功 將 以 可 也 此 因 ,現出 要 都 中 面 畫 個 一 每 TagFile :如例, SpringBookmark usermenu.tag<%@tag description=" 單表能功者用使 " pageEncoding="BIG5"%><hr style="width: 100%; height: 2px;"><a href=member.do> </a> &nbsp;|&nbsp; 頁首員會<a href=member.do?action=addUrl>籤書入加 </a> &nbsp;|&nbsp;<a href=member.do?action=changePasswd>碼密變改 </a> &nbsp;|&nbsp;<a href=member.do?action=logout>出登 </a><hr style="width: 100%; height: 2px;"> 個一計設以可此因,的多不差是都尾結的頁網個每於由,了忘別後最footer.tag :案檔 1 17
  18. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.doindex.jsp :示所下如計設的 1 2
  30. 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. 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.javapackage 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. 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. 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.javapackage 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. 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 Web1 34
  35. 35. Chapter 10 :案專 S pring 籤書上線 API 與 個 一用使 改 而 , 中 之 層 務 商 至 入 侵 的 計 設 所 層 Web 的關無層 User 。 息 訊冊註 者 用 使 裝 封 來 件 物之成完冊註,定設能功入注賴依的 IUserDAO 用使將例實的 Spring據 根 是 即 入 登 否 是 者 用 使, Session 定設中性屬的件物 "valid_user" 在,後 。斷 判 行 進 來 性 屬 個 這10.4.2 LoginController用使集收來件物 個一用使以可,候時的入登行進者用使在 LoginForm於時敗失入登在,作合籤標定綁 與它用運以可並,值數參求請的者 Spring :示所下如計設的 ,息 訊 誤 錯 示 顯 上 頁 網 L oginForm SpringBookmark LoginForm.javapackage 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. 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. 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.javapackage onlyfun.caterpillar.web;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; 1 37
  38. 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. 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. 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. 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. 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. 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. 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. 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 iewResolverController 、 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. 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. 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. 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. 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. 50. 1 吧式程個寫 Spring 用著試 10.10 圖 。例範的好當相Spring 用使何如摩觀個一是也這,式程例範的下錄目 下一看以可 jpetstore您 議 建, 考 參 以 可 式 程 例 範 的 Spring 些 一 有 中 當, 錄 目 個一有中 samples案檔載下 Spring 在,是的點一充補要後最,了落段一告要邊這到書本 10.6 接下來的主題 ) – http://openhome.cc 良信林(冊手術技 Spring 2.0

×