【设计模式】:Dao设计模式详解及一个简单的项目AJAX+JSP+Servlet

迫于课程结束,老师逼着让做课程设计,就简单花了一天的时间写了个使用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,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查询" onclick="queryById()">
	  	<input type="text" name="username" style="width:60px;"><input type="submit" value="按姓名查询" onclick="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='删除' onclick='deleteUser()' />" +
    						  "<input type='button' value='更新' onclick='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添加到页面上边。

这是效果图,看起来是挺简单的:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


$.AJAX()方法中的PROCESSDATA参数 在使用jQuery的$.ajax()方法的时候参数processData默认为true(该方法为jQuery独有的) 默认情况下会将发送的数据序列化以适应默认的内容类型application/x-www-form-urlencoded 如果想发送不
form表单提交的几种方式 表单提交方式一:直接利用form表单提交 html页面代码: &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot; /&gt; &lt;title&gt;Ins
文章浏览阅读1.3k次。AJAX的无刷新机制使得在注册系统中对于注册名称的检测能即时显示。常见的用户注册是用户输入用户名,后台程序检测数据库中用户名是否重复而做出注册的成功与失败之提示(当用户注册重名时将返回重新注册),或者稍微人性化一点就是在用户名文本框后添加一个检测按钮,让用户检测后再做注册。以上操作,对于用户体验方面来说是比较“差劲”的,一个很好的用户体验就是:当用户输入完注册用户名后,Web系统应能即时检查并即时_用户注册 实时异步检测
文章浏览阅读1.2k次。 本文将解释如何使用AJAX和JSON分析器在客户端和服务器之间创建复杂的JSON数据传输层。一、 引言毫无疑问,AJAX已经成为当今Web开发中一种强有力的用户交互技术,但是它的许多可能性应用仍然鲜为人知。在本文中,我们将来共同探讨如何 使用JavaScript对象标志(JSON)和JSON分析器在服务器和客户端AJAX引擎之间创建复杂而强有力的JSON数据传输层。我们将_ajax技术可行性
文章浏览阅读2.2k次。/************************** 创建XMLHttpRequest对象 **************************/function CreateRequest(){ var xmlObj = null; try { xmlObj = new XMLHttpRequest(); } catch(e) {
文章浏览阅读3.7k次。在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖 掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有 空闲的对象,则使用此对象,否则将创建一个新的对象。下面是我最近写的一个简单的类:* XMLHttpReques_xmlhttprequest发送多个请求
文章浏览阅读3.1k次。Ajax 同一页面如何同时执行多个 XMLHTTP 呢,比如博客页,需要同时利用 Ajax 读取作者信息、文章信息、评论信息……我们的第一反应可能是创建多个全局 XMLHTTP 对象,但这并不现实。其实实现方式非常简单,就是给 onreadystatechange 对应的回调函数加上参数,以下代码是解决方案中一个函数中的一段代码。xmlhttp.open("GET", "ajax_proc_ajax响应多个mxl文件
文章浏览阅读1.5k次。数据岛指的是存在Html网页中的xml代码段,它在Html中形成了一个数据的集合,数据岛允许我们在Html网页中集成xml,对xml编写脚本.数据岛有它特有的形式,由标记xml开始,在开始标记中要有一个ID属性,用于指定该指定数据岛的名称。 (当然要以/xml结束).元素xml包含的内容就是xml代码。数据岛也分为2种:1)内嵌的数据岛形式2)外嵌的数据岛形式说了那么多废话,还_数据中岛计算模式
文章浏览阅读2.1k次。AJAX 流行之后,总想好好学习一下。但是众多的框架实在难以选择。说明一下 ASP.NET AJAX 并不包括在 AJAX 框架之中。刚开始学了 JQuqery, 众多的 $get(),...等等符号早已把我搞晕了。暂时就放弃了。后来学习 ASP.NET AJAX ,在微软的领导下,逐渐由服务器端转向客户端编程。 激起我客户端编程的兴趣,才想起学习一下了 Jquery. 随着WEB2._jquery ajax asp.net 认证
文章浏览阅读1.7k次。前段时间在用google map api的函数库的时候,发现里面的downloadUrl函数非常好用,所以自己写了一个。用腻了那些什么框架什么池,到头来发现越简单的东西越是适合我这种懒人。downloadUrl(url, callback, data);参数说明: url不用说了; callback是回调函数,函数调用的时候会有两个参数:data, responseCode,data就_xmlhttprequest downloadurl
文章浏览阅读956次。前些时间写了几篇关于XMLHTTP运用的实例.(可以到http://dev.csdn.net/user/wanghr100看之前的几编关于XMLHTTP的介绍.)近来看论坛上经常有人提问关于如何无刷新,自动更新数据.传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来.但是,对于一些时效性很强的网站.传统的这种做法是不能满足的.我们可以让程序自动刷新.定时_后端xml怎么实现数据有救新增,没有就更新
文章浏览阅读3.3k次。 XMLHttpRequest调用XMLHttpRequest Call ●●●调用,回调,下载,抓取,实时,查询,远程通信(Remoting),远程通信脚本(RemoteScripting),同步,上传,XMLHttpRequest图6-2:XMLHttpRequest调用 目标故事Reta正在一个批发商网站上购买商品。每次她添加一个商品到购物车时,web站点发出_createxmlhttpre
文章浏览阅读1.3k次。function clearitem(){ var drp1 = document.getElementById("drp1"); while(drp1.options.length>0) { drp1.options.remove(0); } }//动态更改方法(根据城市代码取得该市商业区并添加到DropDownList中_dropdownlist根據動態變化
文章浏览阅读1.9k次。因為 Json.net 是有附原始碼的,他也附了單元測試的專案,底下是我額外增加的UnitTest,我的目標就是讓底下的測試可以pass,而且原來的Test 也要都能通過。 ValueTypeTest.csusing System;using NUnit.Framework;namespace Newtonsoft.Json.Test { [TestFixture] public cl_vb 無效的 json 基本型別
文章浏览阅读844次。利用XMLHTTP无刷新获取数据. 客户端和服务器端数据的交互有几种方法.1.提交,通过提交到服务器端.也称"有刷新"吧.2.通过XMLHTTP无刷新提交到服务器端,并返回数据.也称"无刷新"吧.利用XMLHTTP我们可以实现很多很强大的应用.这文章主要介绍它的一些简单的应用.附:因为XMLHTTP是IE5.0+支持的对象.所以你必须要有IE5.0+才能看到效果.client.htm_xmlhttp取源码没有更新
文章浏览阅读1.8k次。Json.Net 無法序列基本型別(string, int),Asp.Net Ajax 無法正確序列日期,AjaxPro序列出我不想要的_type字串 1. Json.Net 是我最常使用的序列/反序列json套件,標榜速度快,對於一對多關係的object 也都能正常運作, 己能滿足我平日的需要,但前幾天突然有個情況,我要序列的是一個泛型參數,該參數不一定是物object型別,有可能是st_token string in state start
文章浏览阅读1.3k次。转载自:http://www.cnblogs.com/JeffreyZhao/archive/2007/01/31/update_the_updatepanels_by_js.html众 所周知,UpdatePanel是通过Trigger来更新的。被设定为Trigger的控件在PostBack之后会被客户端所截获,并且使用 XMLHttpRequest对象发送内容,然后服务器端由ScriptMan_web.ui.updatepanel 和 updatepanel 的区别
文章浏览阅读1.9k次。有些时候,只是需要更新页面的一个部分甚至只是更新中间的几个数据却需要从服务器DOWN整个页面,导致各种资源的浪费。使用数据岛技术可以很好的解决这个问题:通过定时器或用户事件触发数据岛(XML对象)象服务器获取数据,在数据获取完成后,适时更新相关数据。示例HTML部分:http://localhost/WebService/LoadData/FeaturedService.asmx/GetScore_web数据岛
文章浏览阅读1k次。在页面上使用ActiveXObject的代价是很大的,如果我们的无刷新页面使用xmlhttp技术,我们或许需要频繁的建立xmlhttp对象,当然 我们也可以使用全局变量来cache一个xmlhttp对象实例。但是这样的方法适合于同步方式xmlhttp通信,而对于异步方式xmlhttp通信将 会出现问题。由于没有了进程的堵塞,用户可能再次调用同一个xmlhttp实例,如果这时前一个通信未完成,那么就
文章浏览阅读998次。 by Lokesh Dhakar 译: croc查看原文概要:Lightbox JS 是一个简单而又谦恭的用来把图片覆盖在当前页面上的脚本. 它能被快速安装并且运作于所有流行的浏览器.最新更新 Version 2.0 图片集: 分组相关的图片并且能轻松的导航它们 视觉特效: 奇特的自适应调整 向后兼容: yes! 点击这里查看实例_on lightbox 2 by lokesh dhakar