http://blog.csdn.net/thystar/article/details/41786763
DAO(Data Access Object,數據訪問對象),主要的功能是用於進行數據操作的,在程序的標准開發框架中屬於數據層的操作。
數據開發結構:
資源層是數據庫的操作層,里面可以進行各種數據庫的存儲,但是這些數據存儲的時候肯定是依靠SQL語句,數據層通過一個專門的數據庫組件完成對數據庫的操作
業務層是整個項目的核心
DAO組成
DatabaseConnection:專門負責數據庫打開與關閉操作的類
VO:主要由屬性,setter, getter方法組成,VO類中的屬性與表中的字段相對應,每一個VO類的對象都表示表中的每一條記錄;
DAO:主要定義操作的接口,定義一系列數據庫的原子性操作,例如增刪改查等;
Impl: DAO接口的真實實現類,主要完成具體數據庫操作,但不負責數據庫的打開和關閉;
Proxy:代理實現類,主要完成數據庫的打開和關閉並且調用真實實現類對象的操作;
Factory: 工廠類,通過工廠類取得一個DAO的實例化對象。
對於包的命名:
在使用DAO時對包有嚴格的命名
- 數據庫連接: xxx.dbc.DatabaseConnection
- DAO接口: xxx.dao.IXxxDAO
- DAO接口真實實現類:xxx.dao.impl.XxxDAOImpl
- DAO接口代理實現類:xxx.dao.proxy.XxxDAOProxy
- VO類: xxx.vo.Xxx, VO命名要與表的命名一致
- 工廠類:xxx.factory.DAOFactory.
用DAO重新寫登陸頁面:
所需要的文件:這里直接使用MVC模式開發,使用myeclipse 10。
數據庫腳本:
- /*=============刪除數據庫=============*/
- DROP DATABASE IF EXISTS usr;
- /*=============創建數據庫=============*/
- CREATE DATABASE usr;
- /*=============使用數據庫=============*/
- USE usr;
- /*=============刪除數據庫表===========*/
- DROP TABLE IF EXISTS login;
- /*=============創建數據庫表===========*/
- CREATE TABLE login(
- userid VARCHAR(30) PRIMARY KEY,
- name VARCHAR(30) NOT NULL,
- password VARCHAR(32) NOT NULL
- );
- INSERT INTO login(userid, name, password)VALUES('admin', 'admin', 'admin');
1.定義vo類,vo類定義了數據的屬性,及相應的setter,getter方法。
定義User類 :User.java -------- package org.thystar.mvcdemo.vo.User.
- /**
- * vo層
- */
- package org.thystar.mvcdemo.vo;
- /**
- *
- * 定義用戶類
- */
- public class User {
- private String userid; //用戶ID
- private String name; //用戶名
- private String password; //密碼
- public String getUserid() {
- return userid;
- }
- public void setUserid(String userid) {
- this.userid = userid;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
2. 定義數據庫連接類,這個類只負責連接數據庫:
定義DataBaseConnection類 DatabaseConnection.java ------------package org.thystar.mvcdemo.dbc.DatabaseConnection;
- package org.thystar.mvcdemo.dbc;
- import java.sql.*;
- /**
- *
- * 連接數據庫
- *
- */
- public class DatabaseConnection {
- // 定義數據庫驅動程序
- private static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
- // 數據庫連接地址
- private static final String DBURL = "jdbc:mysql://localhost:3306/usr";
- private static final String DBUSER = "root"; // 數據庫連接用戶名
- private static final String DBPASSWORD = "mysqladmin"; // 數據庫連接密碼
- private Connection conn = null; //聲明數據庫連接對象
- public DatabaseConnection() throws Exception{ //構造函數
- try{
- Class.forName(DBDRIVER); // 加載驅動程序
- this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); // 取得數據庫連接
- }catch(Exception e){
- throw e;
- }
- }
- public Connection getConnection() { //取得數據庫連接
- return this.conn;
- }
- public void close() throws Exception { // 關閉數據庫操作
- if(this.conn != null){ // 避免NullPointerException
- try{
- this.conn.close(); // 關閉數據庫
- }catch(Exception e){
- throw e; // 拋出異常
- }
- }
- }
- }
3 . 定義數據庫操作接口,定義數據庫操作的方法:
定義IUserDAO接口,IUserDAO.java --------- package org.thystar.mvcdemo.dao.IUserDAO
- package org.thystar.mvcdemo.dao;
- // 在這個操作中要導入vo包。
- import org.thystar.mvcdemo.vo.*;
- /**
- *
- * 數據庫操作接口
- *
- */
- public interface IUserDAO {
- /**
- * 用戶登錄驗證
- * @param user 傳入vo對象
- * @return 驗證操作結果
- * @throws Exception
- */
- public boolean findLogin(User user) throws Exception;
- }
4. 定義DAO實現類,實現接口中定義的方法
定義UserDAOImpl類, UserDAOImpl.java ---------package org.thystar.mvcdemo.dao.impl.UserDAOImpl
- package org.thystar.mvcdemo.dao.impl;
- import java.sql.*;
- import org.thystar.mvcdemo.dao.IUserDAO;
- import org.thystar.mvcdemo.vo.User;
- /**
- *
- * DAO實現類,實現方法,但不負責數據庫的具體連接
- *
- */
- public class UserDAOImpl implements IUserDAO{
- private Connection conn = null; //定義數據庫的連接對象
- private PreparedStatement pstmt = null; //定義數據庫操作對象
- public UserDAOImpl(Connection conn){ // 構造方法,設置數據庫連接
- this.conn = conn;
- }
- /**
- * 具體操作方法:查詢
- */
- public boolean findLogin(User user) throws Exception{
- boolean flag = false; //定義標志位
- try{
- String sql = "SELECT name FROM login WHERE userid = ? AND password = ?";
- this.pstmt = this.conn.prepareStatement(sql); // 實例化操作
- this.pstmt.setString(1, user.getUserid()); // 設置用戶id
- this.pstmt.setString(2, user.getPassword()); // 設置password
- ResultSet rs = this.pstmt.executeQuery(); // 取得查詢結果
- if(rs.next()){
- user.setName(rs.getString(1)); //取得姓名
- flag = true;
- }
- }catch(Exception e){
- throw e;
- }
- return flag;
- }
- }
可以看出,在真實的數據庫的實現類中,沒有處理數據庫打開和關閉的操作,只是通過構造方法取得了數據庫的連接,真正的負責打開和關閉的操作由代理類實現
5.代理(proxy)類實現:負責數據庫的打開和關閉及調用真實實現類對象操作:
定義UserDAOProxy implements IUserDAO,UserDAOProxy.java ------------package org.thystar.mvcdemo.dao.proxy.UserDAOProxy
- package org.thystar.mvcdemo.dao.proxy;
- /**
- * 代理類,要找到真實主題
- */
- import org.thystar.mvcdemo.dao.IUserDAO;
- import org.thystar.mvcdemo.dbc.DatabaseConnection;
- import org.thystar.mvcdemo.dao.impl.UserDAOImpl;
- import org.thystar.mvcdemo.vo.User;
- public class UserDAOProxy implements IUserDAO {
- private DatabaseConnection dbc = null;
- private IUserDAO dao = null;
- public UserDAOProxy() { //構造方法,實例化連接,同時實例化dao對象
- try {
- this.dbc = new DatabaseConnection(); // 連接數據庫
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- this.dao = new UserDAOImpl(this.dbc.getConnection()); //實例化真實主題類
- }
- public boolean findLogin(User user) throws Exception{ // 實現接口中的方法。
- boolean flag = false; //定義標志位
- try{
- flag = this.dao.findLogin(user); // 調用真實主題
- }catch(Exception e){
- throw e; //向上拋出異常
- }finally{
- this.dbc.close();
- }
- return flag; //返回標記
- }
- }
6. 工廠類的實現: 取得DAO實例
定義DAOFactory類, DAOFactory.java --------------package org.thystar.mvcdemo.factory.DAOFactory
- package org.thystar.mvcdemo.factory;
- import org.thystar.mvcdemo.dao.IUserDAO;
- import org.thystar.mvcdemo.dao.proxy.UserDAOProxy;
- /**
- *
- * 工長類
- *
- */
- public class DAOFactory {
- public static IUserDAO getIUserDAOInstance(){ // 取得DAO實例
- return new UserDAOProxy(); // 返回代理實例
- }
- }
工廠類的功能就是直接返回DAO接口的實例化對象,以后客戶端直接通過工廠類就可以取得DAO接口的實例化對象
到這里,數據層的部分就完成了,下面開始定義Servlet/jsp部分,也就是顯示層,進行頁面的顯示
7 .定義Servlet:
LoginServlet.java
- /**
- * 定義Servlet
- */
- package org.thystar.mvcdemo.servlet;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.thystar.mvcdemo.factory.DAOFactory;
- import org.thystar.mvcdemo.vo.User;
- public class LoginServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- /**
- * The doGet method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String path = "login.jsp";
- String userid = request.getParameter("userid"); //接收userid的內容
- String userpass = request.getParameter("userpass"); //接收userpass的內容
- List<String> info = new ArrayList<String>(); // 保存返回信息
- //判斷輸入為空的情況
- if(userid == null || "".equals(userid)){
- info.add("用戶id不能為空");
- }
- if(userpass == null || "".equals(userpass)){
- info.add("密碼不能為空");
- }
- //用戶名密碼驗證通過
- if(info.size() == 0){
- User user = new User(); //實例化vo
- user.setUserid(userid); //設置userid
- user.setPassword(userpass); //設置userpass
- try {
- if(DAOFactory.getIUserDAOInstance().findLogin(user)){ //驗證通過
- info.add("通過驗證" + user.getName() + "已登錄");
- }else{
- info.add("登錄失敗");
- }
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- }
- request.setAttribute("info", info);
- request.getRequestDispatcher(path).forward(request, response); //跳轉
- }
- /**
- * The doPost method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to post.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response); // 調用doGet操作
- }
- }
8. 登陸頁
login.jsp
- <%@ page contentType = "text/html" pageEncoding="GBK" import = "java.util.*"%>
- <html>
- <head>
- <title>www.thystar.com</title>
- <script language = "JavaScript">
- function validate(f){
- if(!(/^\w{1,15}$/.test(f.userid.value))){
- alert("用戶ID必須是1~15位");
- f.userid.focus();
- return false;
- }
- if(!(/^\w{1,15}$/.test(f.userpass.value))){
- alert("密碼必須是1~15位");
- f.userpass.focus();
- return false;
- }
- return true;
- }
- </script>
- </head>
- <body>
- <h2>用戶登錄</h2>
- <%
- request.setCharacterEncoding("GBK");
- %>
- <%
- List<String> info=(List<String>)request.getAttribute("info");
- if(info != null){
- Iterator<String> iter = info.iterator();
- while(iter.hasNext()){
- %>
- <h4><%= iter.next() %></h4>
- <%
- }
- }
- %>
- <form action="LoginServlet" method="post" onSubmit = "validate(this)">
- 用戶ID: <input type = "text" name = "userid"><br>
- 密 碼:<input type = "password" name="userpass"><br>
- <input type = "submit" value = "登錄">
- <input type = "reset" value = "重置">
- </form>
- </body>
- </html>
結果: