官术网_书友最值得收藏!

2.5 MVC+DAO設(shè)計(jì)模式與應(yīng)用案例

一個(gè)Java Web應(yīng)用程序是由很多不同的“組件”構(gòu)成的,那么各組件之間是如何進(jìn)行“通信”的?又是如何實(shí)現(xiàn)控制的?信息是如何提交和顯示的?這些構(gòu)成了Java Web應(yīng)用程序的開(kāi)發(fā)模式。

1.MVC設(shè)計(jì)模式

用JSP技術(shù)設(shè)計(jì)頁(yè)面,用Servlet技術(shù)實(shí)現(xiàn)控制邏輯,用JavaBean技術(shù)實(shí)現(xiàn)業(yè)務(wù)邏輯處理。將一個(gè)系統(tǒng)的功能分為3種不同類(lèi)型的組件,這種模式通常稱為MVC模式。

2.DAO設(shè)計(jì)模式

DAO模式是進(jìn)行Java數(shù)據(jù)庫(kù)開(kāi)發(fā)的最基本的設(shè)計(jì)模式,就是把對(duì)數(shù)據(jù)庫(kù)表的操作轉(zhuǎn)化為對(duì)Java類(lèi)的操作。DAO模式要與JDBC、SQL等數(shù)據(jù)庫(kù)應(yīng)用技術(shù)結(jié)合使用。

JSP+Servlet+JavaBean+DAO實(shí)現(xiàn)了不同組件的分工協(xié)作,體系結(jié)構(gòu)如圖2-8所示。

圖2-8 JSP+Servlet+JavaBean+DAO編程模式

2.5.1 基于MVC模式算術(shù)運(yùn)算的Web程序設(shè)計(jì)

例2-11】利用JSP+Servlet+JavaBean求任意兩個(gè)整數(shù)之間累加和值,并顯示結(jié)果。

【分析】該題目采用JSP+Servlet+JavaBean模式,由JavaBean計(jì)算累加值;由JSP實(shí)現(xiàn)信息的提交和運(yùn)算結(jié)果的顯示;由Servlet實(shí)現(xiàn)由提交頁(yè)面獲取數(shù)據(jù),實(shí)施計(jì)算,并保存計(jì)算結(jié)果,然后實(shí)現(xiàn)跳轉(zhuǎn),將計(jì)算結(jié)果通過(guò)顯示頁(yè)面顯示結(jié)果。

【設(shè)計(jì)】該程序需要由4個(gè)不同的構(gòu)件組成。

1)一個(gè)封裝兩個(gè)數(shù)之間累加求和操作的JavaBean:Add.java。

2)一個(gè)Servlet(QiuHe.java)實(shí)現(xiàn)數(shù)據(jù)的獲取、求值并跳轉(zhuǎn)到輸出頁(yè)面(采用注釋配置Servlet)。

3)提交兩個(gè)數(shù)的JSP(input.jsp)頁(yè)面,假設(shè)提交頁(yè)面參數(shù)是shuju1和shuju2。

4)輸出結(jié)果JSP頁(yè)面(show.jsp)。

其關(guān)鍵是各組件之間是如何實(shí)現(xiàn)數(shù)據(jù)共享,以及如何實(shí)現(xiàn)各組件之間的跳轉(zhuǎn)的。它們之間的關(guān)系如圖2-9所示,圖中的虛線是數(shù)據(jù)的傳遞。

圖2-9 【例2-11】的處理流程

【實(shí)現(xiàn)】

1)建立一個(gè)JavaBean(Add.java),該JavaBean中包含兩個(gè)屬性a和b,以及實(shí)現(xiàn)計(jì)算累加值的操作方法sum()。其代碼如下。

    package con.edu.bean;
    public class Add{
        private int a;
        private int b;
        public Add(int a, int b){this.a=a; yhis.b=b; }
        public Add(){}
        public int sum(){
          int c, s=0;
          if(a>b){c=a; a=b; b=c; }
          for(int x=a; x<=b; ++x){ s += x; }
          return s;
        }
      //省略了各屬性的setter/getter方法
    }

2)設(shè)計(jì)Servlet實(shí)現(xiàn)數(shù)據(jù)的獲取、求值并跳轉(zhuǎn)到輸出頁(yè)面,代碼如下。

3)設(shè)計(jì)提交任意兩個(gè)整數(shù)的JSP頁(yè)面(input.jsp),其頁(yè)面代碼如下。

4)設(shè)計(jì)輸出結(jié)果JSP頁(yè)面(show.jsp),其代碼如下。

    <body> <%
          Integer d1=(Integer)request.getAttribute("out1");
          Integer d2=(Integer)request.getAttribute("out2");
          Integer sum=(Integer)request.getAttribute("out_sum"); %>
          <p><%=d1%>加到<%= d2%>的和值是: <%= sum%> </p>
    </body>

【運(yùn)行測(cè)試】啟動(dòng)頁(yè)面input.jsp,按提示輸入數(shù)據(jù)并提交,顯示結(jié)果。

2.5.2 基于MVC模式用戶注冊(cè)與登錄系統(tǒng)的開(kāi)發(fā)

例2-12】利用JSP+Servlet+JavaBean+JDBC+DAO技術(shù),基于MVC模式開(kāi)發(fā)用戶注冊(cè),登錄應(yīng)用系統(tǒng)。

【分析與設(shè)計(jì)】開(kāi)發(fā)該系統(tǒng),其各組件如下。

1)由JavaBean定義用戶實(shí)體類(lèi):User.java。

2)Servlet類(lèi)的設(shè)計(jì):兩個(gè)Servlet類(lèi)(注冊(cè)用Servlet,登錄用Servlet)。

3)利用JDBC定義DAO類(lèi),實(shí)現(xiàn)數(shù)據(jù)庫(kù)的連接及讀寫(xiě)數(shù)據(jù)庫(kù)的操作。

4)利用JSP技術(shù)設(shè)計(jì)登錄頁(yè)面和注冊(cè)頁(yè)面。

【設(shè)計(jì)關(guān)鍵】該問(wèn)題的處理流程如圖2-10所示。

圖2-10 例2-12的工作流程

【實(shí)現(xiàn)】

1)創(chuàng)建數(shù)據(jù)庫(kù)與數(shù)據(jù)表。

建立MySQL數(shù)據(jù)庫(kù)user及數(shù)據(jù)庫(kù)表user_b,該表中包含3個(gè)字段:用戶序號(hào)id, int類(lèi)型且為主鍵,自動(dòng)增長(zhǎng);用戶名稱username, char(10);用戶密碼userpassword, char(10)。

2)建立對(duì)應(yīng)數(shù)據(jù)庫(kù)表結(jié)構(gòu)的JavaBean——用戶類(lèi)User。

注意,該類(lèi)的建立是根據(jù)數(shù)據(jù)庫(kù)表user_b的數(shù)據(jù)表結(jié)構(gòu)建立的。

    package edu.com.model;
    public class Student {
      private int id;
      private String username;
      private String userpassword;
      //省略了各屬性的getter/setter方法
    }

3)數(shù)據(jù)庫(kù)連接與關(guān)閉釋放資源工具JavaBean類(lèi)的設(shè)計(jì)——DbConnect類(lèi)。

    package com.db;
    import java.sql.*;
    public class DbConnect {
      private static String driverName="com.mysql.jdbc.Driver";  //驅(qū)動(dòng)程序名
      private static String userName="root";                //數(shù)據(jù)庫(kù)用戶名
      private static String userPwd="123456";               //密碼
      private static String dbName="user";                  //數(shù)據(jù)庫(kù)名
      public static Connection getDBconnection(){
        String  url1="jdbc:mysql://localhost/"+dbName;
        String  url2="? user="+userName+"&password="+userPwd;
        String  url3="&useUnicode=true&characterEncoding=UTF-8";
        String  url=url1+url2+url3;
        Connection con=null;
        try{
            Class.forName(driverName);
            con=DriverManager.getConnection(url);
          }catch (Exception e) {e.printStackTrace(); }
        return con;
        }
        public static void closeDB(Connection con, PreparedStatement pstm, ResultSet rs){
        try{
          if(rs! =null) rs.close();
          if(pstm! =null) pstm.close();
          if(con! =null) con.close();
        }catch (SQLException e) {e.printStackTrace(); }
      }
    }

4)建立訪問(wèn)數(shù)據(jù)庫(kù)的DAO類(lèi)。

    package edu.com.dao;
    //省略了import;
    public class UserDAO{
        //實(shí)現(xiàn)向數(shù)據(jù)庫(kù)中添加記錄的方法
      public int insert(User user) throws Exception{
        Connection con=null;
        PreparedStatement prepStmt=null;
        ResultSet rs=null;
        con=DbConnect.getDBconnection();
        String sql="insert into user_b(username, userpassword) values (? , ? )";
        prepStmt =con.prepareStatement(sql);
        prepStmt.setString(1, user.getUsername());
        prepStmt.setString(2, user.getUserpassword());
        int n=prepStmt.executeUpdate();
        close(prepStmt); close(con);
        return n;
      }
    //實(shí)現(xiàn)查詢數(shù)據(jù)庫(kù)中對(duì)指定的記錄是否存在的方法
      public User find(User user) throws Exception {
          Connection con=null;
          PreparedStatement prepStmt=null;
          ResultSet rs=null;
          User user2 = null;
          con=getDBconnection();
          String sql="select * from user_b where username=? and userpassword=? ";
          prepStmt = con.prepareStatement(sql);
          prepStmt.setInt(1, user.getUsername());
          prepStmt.setInt(2, user.getUserpassword());
          rs = prepStmt.executeQuery();
          if (rs.next()){
              user2 = new User();
              user2.setId(rs.getInt("id"));
              stu2.setUsername(rs.getString("username"));
              stu.setUserpassword(rs.getString("userpassword"));
          }
          close(rs); close(prepStmt); close(con);
          return user2;
      }
      //實(shí)現(xiàn)列出數(shù)據(jù)庫(kù)全部記錄的方法
      public List<Student> findAll() throws Exception {//給出實(shí)現(xiàn)方法}
      //實(shí)現(xiàn)刪除數(shù)據(jù)庫(kù)中指定的記錄的方法
      public void remove(Student stu)throws Exception{//給出實(shí)現(xiàn)方法 }
      //實(shí)現(xiàn)用指定的對(duì)象修改數(shù)據(jù)庫(kù)中記錄的方法
      public void update(Student stu) throws Exception {//給出實(shí)現(xiàn)方法}
    }

5)用戶登錄的Servlet:UserChecked.java,實(shí)現(xiàn)登錄驗(yàn)證處理,其代碼如下。

6)編寫(xiě)登錄表單頁(yè)面(input.jsp)提交登錄信息,其代碼如下。

    <body>
        <form  action="userChecked"method="post">
            用 戶 名:<input type="text"name="xm"><br><br>
            用戶密碼:<input type="password" name="mm"><br><br>
            <input type="submit" value="登錄">
        </form>
    </body>

7)登錄成功后的頁(yè)面(success.jsp),其主要代碼如下。

    <html>
      <head> <title>登錄驗(yàn)證成功頁(yè)面</title> </head>
      <body><%=request.getParameter("xm")%>:登錄成功?。糱r>  </body>
    </html>

8)登錄失敗后的展示頁(yè)面(error.jsp),其主要代碼如下。

    <html>
      <head> <title>登錄驗(yàn)證出錯(cuò)頁(yè)面</title> </head>
      <body> <%=request.getParameter("xm") %>:登錄失?。。糱r> </body>
    </html>

【運(yùn)行測(cè)試】啟動(dòng)頁(yè)面input.jsp,按提示進(jìn)行操作,會(huì)給出相應(yīng)的結(jié)果顯示。

對(duì)于“注冊(cè)”過(guò)程的設(shè)計(jì)與“登錄”過(guò)程設(shè)計(jì)類(lèi)似,這里就不給出具體源代碼了。

主站蜘蛛池模板: 宁南县| 神农架林区| 沙雅县| 巩留县| 肥城市| 岢岚县| 连城县| 威宁| 资溪县| 武安市| 南城县| 夏津县| 珠海市| 江川县| 新竹县| 黄浦区| 巴彦县| 咸丰县| 许昌市| 灵山县| 桂林市| 诸暨市| 密云县| 沁源县| 海城市| 昌吉市| 镇宁| 安塞县| 长顺县| 大冶市| 蓬莱市| 鄱阳县| 拜城县| 漳浦县| 凤阳县| 漳州市| 呼伦贝尔市| 曲阜市| 偃师市| 滦平县| 津市市|