SlideShare a Scribd company logo
1 of 50
Download to read offline
。案專發開來       用使何如到解了以可
                                Spring
您,籤 書 上 線   成 完 際 實 由 藉, 與 籤 標
        Spring                JSTL  、 用使     S pring    JSP
則 上 術 技 層 在,等
       View            及以
                 Java Mail     、器 容
                                H ibernate             Spring IoC
、架框             用使將中式程,式程
    Spring Web MVC               的籤書理管上  Web
線以可個一成完,能功          的過紹介前先合組將,中節章個這在
                 Spring
 。式方定設態組與用使的         API   種各中   顯突,中式程用應的
                                Spring
單簡些一在並,能功個各的         Spring 紹介於重著,中節章各的前先在
              專案:Spring 線上書籤
10
2   1
                   構架程流籤書上線      10.1 Spring   圖
                     : 構 架 程 流 的 下以出 劃 規 , 程 流 的 構 架
Web MVC   於基,式程計設來構架的           Web MVC
                               用採將籤書上線                  Spring
                                                   10.1.1 架構規劃
                           。改修的要
必不或亂混式程的成造而楚清不構架因,中程過發開式程免避以可,業作
                          Web
上紙的單簡些一前事但,式程 的單簡個一是只這然雖,術技的用採要
所慮考與構架的式程計設來間時些一花先,前之式程計設始開式正在
                                                   10.1 程式概觀
              )   – http://openhome.cc   良信林(冊手術技       Spring 2.0
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
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
1
           。式程個這備完、改修行自須必,式程個這用使合
    場些某在際實算打您果如,用之學教是的目要主式程個這,到
    俱面面的計設有沒並能功些一的中式程,式程個一成完來                   API
    或架框的關 相 合 組 何 如 是 僅,的 範 示 式 程 個 這,制 限 的 幅 篇 於 基
                                  。到看 時 面 頁 關 相 計 設 中
節小的後稍在以可面畫的行執式程,面畫的行執式程出列不先邊這在
      。 碼 密 者 用 使的您 知 告 件 信 封 一 發 統系讓 , 址 位 件 郵 的 時 冊
註入輸以可還,話的碼密記忘果如,碼密的您更變是者或,作動除刪與增
新的籤書行進中面頁理管在以可,面頁理管籤書的己自有擁並,者用使的
新個一冊註以可您,理管籤書上線行進您讓以可,籤書上線                   Spring
                                                在
                                       10.1.3 功能概述
籤書上線   S pring   :案專   Chapter 10
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
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
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
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
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
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
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
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
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
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
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
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>



,擇選能功行進者用使供單選能功現出須必,後之頁網入登者用使在
  的用 使 複 重 可 為 計 設 單選能 功 將 以 可 也 此 因 ,現出 要 都 中 面 畫 個 一 每          Tag
File                                         :如例,
  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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
1
                      吧式程個寫    Spring   用著試   10.10   圖
                                        。例範的好當相
Spring
     用使何如摩觀個一是也這,式程例範的下錄目                 下一看以可           jpetstore
您 議 建, 考 參 以 可 式 程 例 範 的      Spring
                         些 一 有 中 當, 錄 目    個一有中              samples
案檔載下     Spring
             在,是的點一充補要後最,了落段一告要邊這到書本
                                              10.6 接下來的主題
                  )   – http://openhome.cc     良信林(冊手術技               Spring 2.0

More Related Content

What's hot

Spring 2.0 技術手冊導讀
Spring 2.0 技術手冊導讀Spring 2.0 技術手冊導讀
Spring 2.0 技術手冊導讀Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPJustin Lin
 
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Justin Lin
 
Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPJustin Lin
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletServlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLJustin Lin
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Justin Lin
 
ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展江華 奚
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记yiditushe
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
整合資料庫
整合資料庫整合資料庫
整合資料庫Justin Lin
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解zany_hui
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料yiditushe
 

What's hot (20)

Spring 2.0 技術手冊導讀
Spring 2.0 技術手冊導讀Spring 2.0 技術手冊導讀
Spring 2.0 技術手冊導讀
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
 
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答
 
Jsp
JspJsp
Jsp
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
 
Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOP
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 Spring
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletServlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
 
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
 
ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
整合資料庫
整合資料庫整合資料庫
整合資料庫
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 

Viewers also liked

Spring 2.0 技術手冊第三章 - IoC 容器
Spring 2.0 技術手冊第三章 - IoC 容器Spring 2.0 技術手冊第三章 - IoC 容器
Spring 2.0 技術手冊第三章 - IoC 容器Justin Lin
 
Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁Justin Lin
 
Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄Justin Lin
 
Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMailServlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMailJustin Lin
 
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Justin Lin
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能Justin Lin
 
類別的繼承
類別的繼承類別的繼承
類別的繼承Justin Lin
 
並行與平行
並行與平行並行與平行
並行與平行Justin Lin
 
Python 起步走
Python 起步走Python 起步走
Python 起步走Justin Lin
 

Viewers also liked (14)

Spring 2.0 技術手冊第三章 - IoC 容器
Spring 2.0 技術手冊第三章 - IoC 容器Spring 2.0 技術手冊第三章 - IoC 容器
Spring 2.0 技術手冊第三章 - IoC 容器
 
Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁Spring 2.0 技術手冊書名頁
Spring 2.0 技術手冊書名頁
 
Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄Spring 2.0 技術手冊目錄
Spring 2.0 技術手冊目錄
 
Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序Spring 2.0 技術手冊再版序
Spring 2.0 技術手冊再版序
 
進階主題
進階主題進階主題
進階主題
 
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMailServlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
 
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
Servlet & JSP 教學手冊第二版 - 第 10 章:Web 容器安全管理
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能
 
類別的繼承
類別的繼承類別的繼承
類別的繼承
 
並行與平行
並行與平行並行與平行
並行與平行
 
Python 起步走
Python 起步走Python 起步走
Python 起步走
 

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

Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程appollo0312
 
Struts快速学习指南
Struts快速学习指南Struts快速学习指南
Struts快速学习指南yiditushe
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
Struts Mitac(1)
Struts Mitac(1)Struts Mitac(1)
Struts Mitac(1)wangjiaz
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing江華 奚
 
Ajax设计技术
Ajax设计技术Ajax设计技术
Ajax设计技术yiditushe
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
基于J2 Ee 的通用Web 信息系统框架设计与实现
基于J2 Ee 的通用Web 信息系统框架设计与实现基于J2 Ee 的通用Web 信息系统框架设计与实现
基于J2 Ee 的通用Web 信息系统框架设计与实现yiditushe
 
網站設計100步
網站設計100步網站設計100步
網站設計100步evercislide
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2twMVC
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料yiditushe
 
Thinking in React by Deot
Thinking in React by Deot Thinking in React by Deot
Thinking in React by Deot 荣德 周
 
Java Web动态图表编程
Java Web动态图表编程Java Web动态图表编程
Java Web动态图表编程yiditushe
 
物件導向程式設計課程講義(98 ges hi版)
物件導向程式設計課程講義(98 ges hi版)物件導向程式設計課程講義(98 ges hi版)
物件導向程式設計課程講義(98 ges hi版)Hui-Shih Leng
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVCjeffz
 
2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0Anthony Chen
 

Similar to Spring 2.0 技術手冊第十章 - 專案:線上書籤 (20)

Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts快速学习指南
Struts快速学习指南Struts快速学习指南
Struts快速学习指南
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
Struts Mitac(1)
Struts Mitac(1)Struts Mitac(1)
Struts Mitac(1)
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
 
Ajax设计技术
Ajax设计技术Ajax设计技术
Ajax设计技术
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
基于J2 Ee 的通用Web 信息系统框架设计与实现
基于J2 Ee 的通用Web 信息系统框架设计与实现基于J2 Ee 的通用Web 信息系统框架设计与实现
基于J2 Ee 的通用Web 信息系统框架设计与实现
 
網站設計100步
網站設計100步網站設計100步
網站設計100步
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
Thinking in React by Deot
Thinking in React by Deot Thinking in React by Deot
Thinking in React by Deot
 
Java Web动态图表编程
Java Web动态图表编程Java Web动态图表编程
Java Web动态图表编程
 
物件導向程式設計課程講義(98 ges hi版)
物件導向程式設計課程講義(98 ges hi版)物件導向程式設計課程講義(98 ges hi版)
物件導向程式設計課程講義(98 ges hi版)
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVC
 
2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0
 

More from Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組Justin Lin
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理Justin Lin
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承Justin Lin
 

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
 

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>&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> ,擇選能功行進者用使供單選能功現出須必,後之頁網入登者用使在 的用 使 複 重 可 為 計 設 單選能 功 將 以 可 也 此 因 ,現出 要 都 中 面 畫 個 一 每 Tag File :如例, 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. 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