Day57 Session补充、自定义DbUtils
1.思维导图
2.代码部分
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
-
画四位随机数
-
将图片响应到浏览器
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 { //校验不通过,跳转到登录页面 }
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); } }
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);