接上节:
修改校验逻辑,从数据库中获取用户信息进行校验:
结合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"%>
添加success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
添加error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
测试程序: