Day57 Session补充、自定义DbUtils

1.思维导图

2.代码部分

session案例:登录

  • 登录功能(UserDao)
public class UserDaoImpl implements UserDao {
    @Override
    public User login(User inputUser) throws SQLException {
//        ComboPooledDataSource就是连接池,连接池包含很多连接对象
//        连接池作用就是减少连接的创建次数!
//        第一个用户,登录,创建一个连接池,创建3个连接
//        第二个用户,登录,创建一个连接池,创建3个连接
//        应该只让连接池创建一次!!后面复用就OK了!!
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        User existUser = queryRunner.query(
                "select * from tb_user where username = ? and password = ?",
                new BeanHandler<User>(User.class),
                inputUser.getUsername(),
                inputUser.getPassword());

        return existUser;
    }
}
  • LoginServlet
@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

    private UserDao userDao = new UserDaoImpl();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User inputUser = new User();
        inputUser.setUsername(username);
        inputUser.setPassword(password);
        try {
            User existUser = userDao.login(inputUser);
            System.out.println(existUser);
            //判断登录成功
            if (null == existUser) {
                //登录失败,请求转发,跳转到登录页面
                request.getRequestDispatcher("/login.html").forward(request,response);
            } else {
                //登录成功,重定向,跳转到显示用户信息
                //存储existUser
                //request : 跳转到首页,使用了重定向,会有一个新的请求
                //servletContext : 如果存储到ServletContext,就意味着所有人都可以拿到你的用户信息!
                //cookie : 如果存储到cookie中,就是存储到浏览器 , 不安全! cookie中是无法存储中文及一些特殊符号!!
                //session : 数据存储到服务器!!
                request.getSession().setAttribute("existUser",existUser);
                response.sendRedirect("/day57/showIndex");

            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
  • 显示用户信息(ShowIndexServlet)
@WebServlet(name = "ShowIndexServlet" ,urlPatterns = "/showIndex")
public class ShowIndexServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        User existUser = (User) request.getSession().getAttribute("existUser");
        if (null != existUser) {
            //在登录状态
            response.getWriter().write("欢迎回来,"+existUser.getUsername());
        } else {
            //不在登录状态
            //方式一:提示下,未登录
//            response.getWriter().write("您还没有登录,<a href='/day57/login.html'>请登录</a>");
            //方式二:跳转到登录页面
            response.sendRedirect("/day57/login.html");
            //看需求,选择方式一还是方式二
            //登录状态权限管理!!
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

session案例:随机验证码

  • 显示验证码
    • 创建图片对象

    • 画背景

    • 画边框

    • 画干扰线

    • 产生四位随机数,存储到session

    • 画四位随机数

    • 将图片响应到浏览器

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int width = 60;//定义图片宽度
        int height = 32;//定义图片高度
        //创建图片对象
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //创建画笔对象
        Graphics g = image.getGraphics();
        //设置背景颜色
        g.setColor(new Color(0xDCDCDC));
        g.fillRect(0, 0, width, height);//实心矩形
        //设置边框
        g.setColor(Color.black);
        g.drawRect(0, 0, width - 1, height - 1);//空心矩形

        Random rdm = new Random();
        //画干扰线
        for (int i = 0; i < 50; i++) {
            int x = rdm.nextInt(width);
            int y = rdm.nextInt(height);
            g.drawOval(x, y, 0, 0);
        }
        //产生随机字符串
        String hash1 = Integer.toHexString(rdm.nextInt());
        //生成四位随机验证码
        String capstr = hash1.substring(0, 4);
        //将产生的验证码存储到session域中,方便以后进行验证码校验!
        request.getSession().setAttribute("existCode", capstr);
        System.out.println(capstr);
        g.setColor(new Color(0, 100, 0));
        g.setFont(new Font("Candara", Font.BOLD, 24));
        g.drawString(capstr, 8, 24);
        g.dispose();
        //将图片响应到浏览器
        response.setContentType("image/jpeg");
        OutputStream strm = response.getOutputStream();
        ImageIO.write(image, "jpeg", strm);
        strm.close();
    }
  • 校验验证码
//获取输入的验证码
String validateCode = request.getParameter("validateCode");
//将输入的验证码和产生的随机验证码进行校验
String existCode = (String) request.getSession().getAttribute("existCode");
if (validateCode.equals(existCode)) {
    //校验通过,完成登录功能
} else {
    //校验不通过,跳转到登录页面

}

自定义DbUtils:增、删、改

public static void update(String sql , Object... parameters){
    Connection connection = null;
    PreparedStatement statement = null;
    try {
        connection = JDBCUtils.getConnection();
        statement = connection.prepareStatement(sql);
        //设置参数值的时候,参照的是parameters的个数! 应该参照有多少个问号?
        ParameterMetaData parameterMetaData = statement.getParameterMetaData();
        for (int i = 0; i < parameterMetaData.getParameterCount(); i++) {
            statement.setObject(i + 1,parameters[i]);
        }
        statement.executeUpdate();
    } catch (Exception throwables) {
        throwables.printStackTrace();
    } finally {
        JDBCUtils.release(connection, statement);
    }
}

自定义DbUtils:查询

  • MyResultSetHandler接口
    • 处理结果集,并得到想要的类型的数据
public interface MyResultSetHandler<T> {

    /**
     * 处理结果集,并返回想要的类型的数据
     * @param resultSet 结果集
     * @return 要的类型的数据
     * @throws Exception
     */
    T handle(ResultSet resultSet) throws Exception;

}
  • 通用query方法
public static<T> T query(String sql ,MyResultSetHandler<T> handler,Object... parameters ){
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    try {
        connection = JDBCUtils.getConnection();
        statement = connection.prepareStatement(sql);
        for (int i = 0; i < statement.getParameterMetaData().getParameterCount(); i++) {
            statement.setObject(i+1 , parameters[i]);
        }
        resultSet = statement.executeQuery();
        //处理结果集 , 返回结果
        T t = handler.handle(resultSet);
        return t;
    } catch (Exception throwables) {
        throwables.printStackTrace();
    } finally {
        JDBCUtils.release(connection,statement,resultSet);
    }
    return null;
}
  • 测试
User existUser = MyDbUtils.query("select * from tb_user where id = ?",
    new MyResultSetHandler<User>() {
    @Override
    public User handle(ResultSet resultSet) throws Exception {
        User user = null;
        while (resultSet.next()) {
            Integer id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            user = new User(id, username, password);
        }
        return user;
    }
}, 2);
System.out.println(existUser);

猜你喜欢

转载自www.cnblogs.com/Her4c/p/12747531.html