- Java EE框架開(kāi)發(fā)技術(shù)與案例教程
- 張繼軍 董衛(wèi)
- 1838字
- 2020-05-28 14:20:30
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)似,這里就不給出具體源代碼了。
- UML和模式應(yīng)用(原書(shū)第3版)
- Java 9 Concurrency Cookbook(Second Edition)
- 新一代通用視頻編碼H.266/VVC:原理、標(biāo)準(zhǔn)與實(shí)現(xiàn)
- 圖解Java數(shù)據(jù)結(jié)構(gòu)與算法(微課視頻版)
- Python深度學(xué)習(xí)
- 名師講壇:Java微服務(wù)架構(gòu)實(shí)戰(zhàn)(SpringBoot+SpringCloud+Docker+RabbitMQ)
- Visual C
- 微信小程序入門(mén)指南
- 蘋(píng)果的產(chǎn)品設(shè)計(jì)之道:創(chuàng)建優(yōu)秀產(chǎn)品、服務(wù)和用戶體驗(yàn)的七個(gè)原則
- Emgu CV Essentials
- Image Processing with ImageJ
- 人人都能開(kāi)發(fā)RPA機(jī)器人:UiPath從入門(mén)到實(shí)戰(zhàn)
- Mastering PowerCLI
- C語(yǔ)言程序設(shè)計(jì)與應(yīng)用實(shí)驗(yàn)指導(dǎo)書(shū)(第2版)
- PHP從入門(mén)到精通(第7版)