接上节:

修改校验逻辑,从数据库中获取用户信息进行校验:

结合jsp, jdbc, servlet;

首先,修改UserDao接口

添加方法声明,用来根据用户名和密码获取用户信息。

代码:

package com.jike.dao;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import com.jike.entity.User;//定义实现类的行为public interface UserDao {	//定义对数据库的操作	public void save(Connection conn, User user) throws SQLException;	public void update(Connection conn, Long id, User user) throws SQLException;	public void delete(Connection conn, User user) throws SQLException;		// 登陆页面	public ResultSet get(Connection conn, User user) throws SQLException;	}

添加具体实现,添加方法:

代码:

package com.jike.dao.impl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.jike.dao.UserDao;import com.jike.entity.User;public class UserDaoImpl implements UserDao {		/*	 * 保存用户信息	 */	@Override	public void save(Connection conn, User user) throws SQLException {		// TODO Auto-generated method stub		//PreparedStatement是jdbc用于执行sql查询语句的api之一,用来执行参数化的查询		//?是占位符		PreparedStatement ps = conn.prepareStatement				("insert into tbl_user(name, password, email) values (?,?,?)");		//参数设置		ps.setString(1, user.getName());//索引从1开始		ps.setString(2, user.getPassword());		ps.setString(3, user.getEmail());		ps.execute();		//将参数传入的user对象中的相关信息保存到数据库表中	}	/*	 * 根据用户id更新用户信息	 */	@Override	public void update(Connection conn, Long id, User user) throws SQLException {		// TODO Auto-generated method stub		String updateSql = "update tbl_user set name=?, password=?, email=? where id=?";		PreparedStatement ps = conn.prepareStatement(updateSql);				ps.setString(1, user.getName());		ps.setString(2, user.getPassword());		ps.setString(3, user.getEmail());		ps.setLong(4, id);		ps.execute();	}	/*	 * 删除指定的用户信息	 */	@Override	public void delete(Connection conn, User user) throws SQLException {		// TODO Auto-generated method stub		PreparedStatement ps = conn.prepareStatement("delete from tbl_user where id=?");		ps.setLong(1, user.getId());		ps.execute();	}	@Override	public ResultSet get(Connection conn, User user) throws SQLException {		// TODO Auto-generated method stub		PreparedStatement ps = conn.prepareStatement				("select * from tbl_user where name = ? and password = ?");		ps.setString(1, user.getName());		ps.setString(2, user.getPassword());		return ps.executeQuery();	}}

创建service类, 在service类中执行登陆校验的逻辑。它调用Dao层的数据库访问逻辑判断数据是否获取成功,如果成功获取,则返回布尔值true,否则返回false。

package com.jike.service;import java.sql.Connection;import com.jike.dao.UserDao;import com.jike.dao.impl.UserDaoImpl;import com.jike.entity.User;import com.jike.jdbc.util.ConnectionFactory;import com.mysql.jdbc.ResultSet;//校验用户信息public class CheckUserService {	private UserDao userDao = new UserDaoImpl();	public boolean check(User user){//执行登陆校验逻辑		Connection conn = null;		try {			conn = ConnectionFactory.getInstance().makeConnection();			conn.setAutoCommit(false);						ResultSet resultSet = (ResultSet)userDao.get(conn, user);//执行查询						while(resultSet.next()){//如果查询到,返回true				return true;			}		} catch (Exception e) {			// TODO: handle exception			e.printStackTrace();			try {				conn.rollback();			} catch (Exception e2) {				// TODO: handle exception				e2.printStackTrace();			}		}finally{			try {				conn.close();			} catch (Exception e3) {				// TODO: handle exception				e3.printStackTrace();			}		}		return false;	}}

控制层:

新建Servlet:

package com.jike.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.jike.entity.User;import com.jike.service.CheckUserService;//CheckServlet作为控制器,根据CheckUserServlet的校验结果,将用户导航到不同的页面public class CheckServlet extends HttpServlet {	/**	 * 	 */	private static final long serialVersionUID = -2941368629779903572L;	private CheckUserService cku = new CheckUserService();	public CheckServlet() {		super();	}	public void destroy() {		super.destroy(); // Just puts "destroy" string in log		// Put your code here	}	public void doGet(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		doPost(request, response);			}	public void doPost(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		//获取用户提交的信息		String uname = request.getParameter("uname");		String passwd = request.getParameter("upwd");				RequestDispatcher rd = null;		String forward = null;		// 非空判断		if(uname == null || passwd == null){			request.setAttribute("msg", "用户名或密码为空");			rd = request.getRequestDispatcher("/09/error.jsp");			rd.forward(request, response);		}else{			//若合法,则登陆校验			User user = new User();			user.setName(uname);			user.setPassword(passwd);			//进行校验			boolean bool = cku.check(user);			//根据校验结果进入不同页面			if(bool){				forward = "/09/success.jsp";			}else{				request.setAttribute("msg", "用户名或密码错误,请重新输入!");				forward = "/09/error.jsp";			}			rd = request.getRequestDispatcher(forward);			rd.forward(request, response);		}	}	public void init() throws ServletException {		// Put your code here	}}

在web.xml中添加配置信息

  
    
This is the description of my J2EE component
    
This is the display name of my J2EE component
    
CheckServlet
    
com.jike.servlet.CheckServlet
  
    
    
CheckServlet
    
/CheckServlet
  

表示层登陆页面设置:

在WebRoot下创建09文件夹,创建login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
body{ color: #000; font-size: 14px; margin: 20px auto;}
function check(form){ if(document.forms.loginForm.uname.value==""){ alert("请输入用户名"); document.forms.loginForm.uname.focus(); return false; } if(document.forms.loginForm.upwd.value==""){ alert("请输入密码"); document.forms.loginForm.upwd.focus(); return false; } }
Insert title here
<%= request.getContextPath() %>/CheckServlet" name="loginForm">
用户登陆 用户名:
密码:

添加success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
body{ color: #000; font-size: 14px; margin: 20px auto;}#message{ text-align: center;}
Insert title here
登陆成功
用户名: <%= request.getParameter("uname") %>
密码:<%= request.getParameter("upwd") %>
<%=request.getContextPath()%>/09/login.jsp">返回登陆页面

添加error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
body{ color: #000; font-size: 14px; margin: 20px auto;}#message{ text-align: center;}
Insert title here
登陆失败
错误提示 <% Object obj = request.getAttribute("msg"); if(obj !=null){ out.println(obj.toString()); }else{ out.println("无"); } %>
用户名: <%= request.getParameter("uname") %>
密码:<%= request.getParameter("upwd") %>
<%=request.getContextPath() %>/09/login.jsp">返回登陆页面

测试程序: