迫於課程結束,老師逼着讓做課程設計,就簡單花了一天的時間寫了個使用dao設計模式的東西~ ~ ~順帶在這裏講解下dao設計模式
把寫個這個東西的源代碼放上來:
http://download.csdn.net/detail/u010800530/8273915
先畫一個圖,這個圖可能能夠完整表達出dao設計模式的意思,但是可以在下邊通過代碼看出來:
一、完成登陸功能(未設計AJAX,等到完成顯示列表的時候我們做AJAX):
首先,我們建立一個項目TestJSP
然後,我們寫一個login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<div style="border: 1px solid #ccc;width:350;height:450;margin:auto auto;">
<br>
<center><h3>登陸界面</h3></center>
<br><br>
<br>
<form method="post" name="Login" action="login" onSubmit="return login();">
<table>
<tr>
<td>用戶名:<input type="text" id="username" name="username"/></td>
</tr>
<tr>
<td>密 碼:<input type="password" id="password" name="password" /></td>
</tr>
<br>
<tr>
<td><input type="submit" name="Submit" value="提交" /></td>
</tr>
</table>
</form>
</div>
<script type="text/javascript" >
function login()
{
var name = document.getElementById("username").value;
var pwd = document.getElementById("password").value;
if(name.length != 0 && pwd.length != 0){
return true;
}else{
alert("請輸入姓名或者密碼!");
return false;
}
}
</script>
</body>
</html>
多餘的不用看,我們看錶單提交選項,我們通過post方式提交表單到login
接下來,我們配置一下web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>acceptLogin</servlet-name>
<servlet-class>com.cn.controller.LoginAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>acceptLogin</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>listAction</servlet-name>
<servlet-class>com.cn.controller.ListAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>listAction</servlet-name>
<url-pattern>/list</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>deleteAction</servlet-name>
<servlet-class>com.cn.controller.DeleteAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>deleteAction</servlet-name>
<url-pattern>/deleteuser</url-pattern>
</servlet-mapping>
</web-app>
我們看第一個servlet,第一個servlet的路徑是/login,剛好對應login.jsp中的路徑。這個servlet指向com.cn.controller.LoginAction.java類,我們把這個servlet類寫出來:
package com.cn.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.cn.dao.UserDao;
import com.cn.entity.User;
import com.cn.factory.DAOFactory;
public class LoginAction extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("gb2312");
User user = null;
String username = req.getParameter("username").toString();
String password = req.getParameter("password").toString();
if(username == null || username.equals("")){
resp.sendRedirect("login.jsp");
}
if(password == null || password.equals("")){
resp.sendRedirect("login.jsp");
}
try {
UserDao dao = DAOFactory.getUserDAOInstance(); //標記1
user = dao.queryByName(username); //標記2
if(user != null){
System.out.println("user不爲空");
if((user.getPassword().trim()).equals(password.trim())){
System.out.println("登陸成功");
resp.sendRedirect("main.jsp");
}else{
System.out.println("密碼錯誤");
resp.sendRedirect("login.jsp");
}
}else{
System.out.println("登陸失敗");
resp.sendRedirect("login.jsp");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我們看下doPost()方法中的try....catch代碼塊,這裏邊我寫了兩個標記。我們先看標記1。
1、標記1
我們先建立UserDao.java接口:
package com.cn.dao;
import java.util.List;
import com.cn.entity.User;
public interface UserDao {
public abstract boolean insert(User user) throws Exception;
public abstract boolean deleteById(int userid) throws Exception;
public abstract User queryByName(String name) throws Exception;
public abstract User queryById(int userid) throws Exception;
public abstract List<User> findAll() throws Exception;
}
並且對這個接口進行實現UserDaoImpl.java:
package com.cn.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.cn.dao.DataBaseConnection;
import com.cn.dao.UserDao;
import com.cn.entity.User;
public class UserDaoImpl implements UserDao {
private Connection conn = null;
private PreparedStatement pstmt = null;
public UserDaoImpl(Connection conn) {
this.conn = conn;
}
public boolean deleteById(int userid) throws Exception {
String sql = "delete from users where id="+userid;
try{
this.pstmt = this.conn.prepareStatement(sql);
int row = this.pstmt.executeUpdate();
if(row>0){
this.pstmt.close();
this.conn.close();
System.out.println("Dao刪除成功");
return true;
}else{
this.pstmt.close();
this.conn.close();
System.out.println("Dao刪除失敗");
return false;
}
}catch(Exception e){
e.printStackTrace();
this.pstmt.close();
this.conn.close();
return false;
}
}
public List<User> findAll() throws Exception {
List<User> userList = new ArrayList<User>();
User user = null;
String sql = "select * from users";
try
{
this.pstmt = this.conn.prepareStatement(sql);
ResultSet rs = this.pstmt.executeQuery();
while(rs.next()){
user = new User();
user.setId(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword());
userList.add(user);
}
this.pstmt.close();
this.conn.close();
}catch (Exception e) {
e.printStackTrace();
}
return userList;
}
public boolean insert(User user) throws Exception {
// TODO Auto-generated method stub
return false;
}
public User queryById(int userid) throws Exception {
// TODO Auto-generated method stub
return null;
}
public User queryByName(String name) throws Exception {
User user = null;
String sql = "select * from users where username=?";
try{
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setString(1,name);
ResultSet rs = this.pstmt.executeQuery();
if(rs.next()){
user = new User();
user.setId(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
}
this.pstmt.close();
this.conn.close();
}catch(Exception e){
<pre name="code" class="java"><span style="white-space:pre"> </span>e.printStackTrace();
}return user;}}
在這個類中,我們看下構造方法,這個構造方法傳入了一個Connection類型參數,通過這個參數,我們在對這個類進行實例化的時候就會打開對數據庫的鏈接。並通過這個鏈接執行sql語句。
2、標記2
user = dao.queryByName(username)
這句代碼中的queryByName(username)方法調用的是UserDaoProxy.java代理類中的方法,這個代理類是對UserDao接口。我們寫下UserDaoProxy.java:
package com.cn.daoProxy;
import java.util.ArrayList;
import java.util.List;
import com.cn.dao.DataBaseConnection;
import com.cn.dao.UserDao;
import com.cn.dao.impl.UserDaoImpl;
import com.cn.entity.User;
public class UserDaoProxy implements UserDao {
private DataBaseConnection dbc = null;
private UserDao dao = null;
public UserDaoProxy() {
super();
this.dbc = new DataBaseConnection();
this.dao = new UserDaoImpl(this.dbc.getConnection());
}
public boolean deleteById(int userid) throws Exception {
Boolean bo = this.dao.deleteById(userid);
if(bo){
return true;
}
else{
return false;
}
}
public List<User> findAll() throws Exception {
List<User> userList = new ArrayList<User>();
userList = this.dao.findAll();
return userList;
}
public boolean insert(User user) throws Exception {
return false;
}
public User queryById(int userid) throws Exception {
// TODO Auto-generated method stub
return null;
}
public User queryByName(String name) throws Exception {
User user = null;
try{
user = this.dao.queryByName(name);
}catch(Exception e){
e.printStackTrace();
}finally{
dbc.close();
}
return user;
}
}
寫到這裏,我忘了把實體類的代碼貼出來了:User.java
package com.cn.entity;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然後,我們回到上邊控制層的LoginAction.java,通過驗證是否用戶密碼正確,判斷可以登陸系統(這裏沒做攔截器)
二、完成列表顯示(涉及到了AJAX)
當我們打開login.jsp,並輸入用戶名密碼登陸之後,到了main.jsp頁面,在這個頁面我們要實現,打開這個頁面的時候能夠直接顯示User表。
我們看下main.jsp頁面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用戶管理操作界面</title>
<script type="text/javascript" src="js/jquery-2.1.1.js"></script>
<script type="text/javascript" src="js/main.js"></script>
</head>
<body>
<h2 style="margin-left:44%; margin-top:9%;">用戶管理操作界面</h2>
<form style="margin-left:42%;">
<input type="text" name="userid" style="width:60px;"><input type="submit" value="按Id查詢" οnclick="queryById()">
<input type="text" name="username" style="width:60px;"><input type="submit" value="按姓名查詢" οnclick="queryByName()">
</form>
<table cellpadding="1" border="1" style="margin-left:43%; text-align: center;">
<tr>
<td>Id</td>
<td>姓名</td>
<td>密碼</td>
<td>操作</td>
</tr>
</table>
<div id="myDiv"></div>
</body>
</html>
在這個頁面,我們定義了一個table,並寫了一個main.js,我們下邊把main.js的代碼貼上來:
//完成AJAX
$(function()
{
var xmlhttp;
if(window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else{
xmlhttp=new ActiveObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
var data =xmlhttp.responseText; //接收到響應回來的text文本
var datajson=eval("("+data+")"); //把String轉換成json對象
$.each(datajson.person,function(i,item){//對json對象進行解析
//下邊這些是把每條信息解析顯示出來並添加到table中
var $tr = $("<tr></tr>");
var $td_1 = $("<td>"+item.id+"</td>");
var $td_2 = $("<td>"+item.username+"</td>");
var $td_3 = $("<td>"+item.password+"</td>");
var $td_4 = $("<input type='button' value='刪除' οnclick='deleteUser()' />" +
"<input type='button' value='更新' οnclick='updateUser()'/>");
var $parent = $("table");
$parent.append($tr);
$tr.prepend($td_1);
$tr.append($td_2);
$tr.append($td_3);
$tr.append($td_4);
});
}
};
xmlhttp.open("POST","list",true);
xmlhttp.send();
});
//刪除方法
function deleteUser(){
if (!confirm("確認刪除?")) {
window.event.returnValue = false;
}else{
var val = 1; //val是要刪除的id,這裏因爲懶,直接把數據寫死了
window.location.href="deleteuser?userid="+val;
}
}
//更新方法,懶沒寫
function updateUser(){
alert("update");
}
//通過id查詢,懶沒寫
function queryById(){
}
//通過name查詢,懶沒寫
function queryByName(){
alert(2);
}
通過AJAX,我們在頁面刷新的時候提交一個請求,並且得到請求把相應的值用jquery添加到頁面上邊。
這是效果圖,看起來是挺簡單的: