Java Web笔记:MVC设计模式实现用户登录

MVC是一个核心设计模式,可以使整个程序的输入、处理和输出分开。MVC设计模式被分为三层,模型层、控制层和显示层。

显示层:负责接收Servlet传递的内容,调用JavaBean,将内容传递给用户。

控制层:负责所有的用户请求参数,判断请求参数是否合法,根据请求的类型调用JavaBean并且将结果输送给显示层。

模型层:完成一个独立的业务操作组件,一般以Javabean或者EJB的形式进行定义。

在整个的MVC模式中,用户提交请求时,会交给Servlet进行处理,Servlet会调用JavaBean,JavaBean进行操作后会把结果通过RequestDispatcher接口传递到JSP页面。

这些要请求的内容只在一次请求中有效,所以一般使用request属性范围传递。

下面用一个用户登录的实例展示MVC模型。

主要的业务流程如图:



首先创建VO类:User

package com.zzh.lomvc.vo;

public class User {
	private String name;
	private String id;
	private String password;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}
然后定义一个数据库操作类:DatabaseConnection

package com.zzh.lomvc.dbc;

import java.sql.Connection;
import java.sql.DriverManager;

public class DatabaseConnection {
	public static final String DBDRIVER = "com.mysql.jdbc.Driver";
	public static final String DBURL = "jdbc:mysql://localhost:3306/test";
	public static final String DBUSER = "root";
	public static final String DBPASS = "zhengzehui";
	private Connection conn = null;

	public DatabaseConnection() throws Exception {
		try {
			Class.forName(DBDRIVER);
			this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		} catch (Exception e) {
			throw e;
		}
	}

	public Connection getConnection() {
		return this.conn;
	}

	public void close() throws Exception {
		if (this.conn != null) {
			try {
				this.conn.close();
			} catch (Exception e) {
				throw e;
			}
		}
	}
}
定义DAO接口:IUserDAO

package com.zzh.lomvc.dao;

import com.zzh.lomvc.vo.User;

public interface IUserDAO {
	public boolean findLogin(User user) throws Exception;
}
定义DAO实现类:UserDAOImpl

package com.zzh.lomvc.dao.impl;

import java.sql.ResultSet;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.zzh.lomvc.dao.IUserDAO;
import com.zzh.lomvc.vo.User;

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 user WHERE id =? AND password =?";
			this.pstmt = (PreparedStatement) this.conn.prepareStatement(sql);
			this.pstmt.setString(1, user.getId());
			this.pstmt.setString(2, user.getPassword());
			ResultSet rs = this.pstmt.executeQuery();
			if (rs.next()) {
				user.setName(rs.getString(1));
				flag = true;
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			if (this.pstmt != null) {
				try {
					this.pstmt.close();
				} catch (Exception e2) {
					// TODO: handle exception
					e2.printStackTrace();
				}
			}

		}
		return flag;

	}
}
定义DAO代理操作类:UserDAProxy

package com.zzh.lomvc.dao.proxy ;

import java.sql.* ;

import com.mysql.jdbc.Connection;
import com.zzh.lomvc.dao.IUserDAO;
import com.zzh.lomvc.dao.impl.UserDAOImpl;
import com.zzh.lomvc.dbc.DatabaseConnection;
import com.zzh.lomvc.vo.User;
public class UserDAOProxy implements IUserDAO {
	private DatabaseConnection dbc = null ;
	private IUserDAO dao = null ;
	public UserDAOProxy(){
		try{
			this.dbc = new DatabaseConnection() ;
		}catch(Exception e){
			e.printStackTrace() ;
		}
		this.dao = new UserDAOImpl((Connection) 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 ;
	}
} 
定义工厂类取得DAO实例:DAOFactory

package com.zzh.lomvc.factory;

import com.zzh.lomvc.dao.IUserDAO;
import com.zzh.lomvc.dao.proxy.UserDAOProxy;

public class DAOFactory {
	public static IUserDAO getIUserDAOInstance() {
		return new UserDAOProxy();

	}
}
定义Servlet:LoginServlet

package com.zzh.lomvc.servlet ;
import java.io.IOException;
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 com.zzh.lomvc.factory.DAOFactory;
import com.zzh.lomvc.vo.User;

public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
		String path = "login.jsp" ;
		String id = req.getParameter("id") ;
		String userpass = req.getParameter("userpass") ;
		List<String> info = new ArrayList<String>() ;	// 收集错误
		if(id==null || "".equals(id)){
			info.add("用户id不能为空!") ;
		}
		if(userpass==null || "".equals(userpass)){
			info.add("密码不能为空!") ;
		}
		if(info.size()==0){	// 里面没有记录任何的错误
			User user = new User() ;
			user.setId(id) ;
			user.setPassword(userpass) ;
			try{
				if(DAOFactory.getIUserDAOInstance().findLogin(user)){
					info.add("用户登陆成功,欢迎" + user.getName() + "光临!") ;
				} else {
					info.add("用户登陆失败,错误的用户名和密码!") ;
				}
			}catch(Exception e){
				e.printStackTrace() ;
			}
		}
		req.setAttribute("info",info) ;
		req.getRequestDispatcher(path).forward(req,resp) ;
	}
	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
		this.doGet(req,resp) ;
	}


}
显示页面:login.jsp

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>test</title></head>
<body>
<script language="javascript">
	function validate(f){
		if(!(/^\w{5,15}$/.test(f.id.value))){
			alert("用户ID必须是5~15位!") ;
			f.id.focus() ;
			return false ;
		}
		if(!(/^\w{5,15}$/.test(f.userpass.value))){
			alert("密码必须是5~15位!") ;
			f.userpass.focus() ;
			return false ;
		}
	}
</script>
<%
	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="return validate(this)">
	用户ID:<input type="text" name="id"><br>
	密  码:<input type="password" name="userpass"><br>
	<input type="submit" value="登陆">
	<input type="reset" value="重置">
</form>
</body>
</html>












你可能感兴趣的:(Java Web笔记:MVC设计模式实现用户登录)