Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

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

1.975 visualizaciones

Publicado el

Spring 2.0 技術手冊

Publicado en: Tecnología
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

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

×