1,Session的基本使用
*创建session

HttpSession session = req.getSession();
        System.out.println(session.getId());
        session.setAttribute("msg","hello");

*获取session

HttpSession session = req.getSession();
        System.out.println(session.getId());
        Object msg = session.getAttribute("msg");
        System.out.println(msg);

*移除session

HttpSession session = req.getSession();
        System.out.println("Demo03Servlet" +session.getId());
        session.removeAttribute("msg");

2,Session案例之登录
登录功能–UserDao

public class UserDaoImpl implements UserDao {
    @Override
    public User login(User inputUser) throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
//        User existUser = queryRunner.query(
//           "select * from tb_user where username = ? and password = ?",
//            new ResultSetHandler<User>() {
//            @Override
//                public User handle(ResultSet resultSet) throws SQLException {
//                    User user = null;
//                    if(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;
//                }
//            },
//           inputUser.getUsername(),
//           inputUser.getPassword());
        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();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        User inputUser = new User();
        inputUser.setUsername(username);
        inputUser.setPassword(password);
        try {
            User existUser = userDao.login(inputUser);
            if(null==existUser){
                //登录失败,请求转发,跳转到登录页面
                req.getRequestDispatcher("/lpgin,html").forward(req,resp);
            }else{
                //登录成功,重定向,跳转到显示用户信息
                req.getSession().setAttribute("existUser",existUser);
                resp.sendRedirect("/day57/showIndex");
            }

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

显示用户信息-ShowIndexServlet

@WebServlet(name = "ShowIndexServlet",urlPatterns = "/showIndex")
public class ShowIndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        User existUser = (User)req.getSession().getAttribute("existUser");
        if(null!=existUser){
            resp.getWriter().write("欢迎回来,"+existUser.getUsername());
        }else {
            //方式一,提示未登录
//            resp.getWriter().write("您还没有登录,<a href='/day57/login.html'>请登录</a>");、
            //方式二,跳转登录页面
            resp.sendRedirect("/day57/login.html");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注意事项:
1,第三方jar包必须放到WEB-INF文件夹
2,登录失败使用请求转发,成功使用重定向(以后用的大多数时请求转发)

java 获取的session java如何使用session实现登录_jdbc


3,session案例之随机验证码

显示验证码–

1,创建图片对象

2,画背景

3,画边框

4,画干扰线

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

6,画四位随机数

7,将图片相应到浏览器

public class CreateCodeServlet extends HttpServlet {
    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 = req.getParameter("validateCode");
        //将输入的和产生的随机验证码校验
        String existCode = (String)req.getSession().getAttribute("existCode");
        if(validateCode.equals(existCode)){
        	//校验成功
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            User inputUser = new User();
            inputUser.setUsername(username);
            inputUser.setPassword(password);
            try {
                User existUser = userDao.login(inputUser);
                if(null==existUser){
                    //登录失败,请求转发,跳转到登录页面
                    req.getRequestDispatcher("/lpgin,html").forward(req,resp);
                }else{
                    //登录成功,重定向,跳转到显示用户信息
                    req.getSession().setAttribute("existUser",existUser);
                    resp.sendRedirect("/day57/showIndex");
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }else {
            //验证码校验不通过,跳转到登录页面
            req.getRequestDispatcher("/login.html").forward(req,resp);

        }

4,复习–自定义DbUtils之增删改
JDBC开发步骤

  1. 准备环境
  2. 加载驱动
  3. 获取连接
  4. 编写sql语句,获取执行sql
  5. 设置参数,执行sql(查询,执行结果集)
  6. 释放资源

相同点:
1,获取连接
4,执行sql语句
5,释放资源

不同点:
2,sql语句
3,设置参数

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 (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.release(connection,statement);
        }
    }

5,复习–自定义DbUtils之查询

java 获取的session java如何使用session实现登录_java 获取的session_02


相同点:

1,获取连接

5,释放资源

不同点:
2,sql语句
3,设置参数
4,处理结果集

java 获取的session java如何使用session实现登录_java 获取的session_03


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 e) {
            e.printStackTrace();
        }
        return null;
    }

测试代码

public static void main(String[] args) {
        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;
                    }
                },1);
        System.out.println(existUser);
    }

存在问题:
结果集处理太麻烦,具体体现在处理结果集的具体实现上,还是太麻烦

解决思路:
如果结果集处理之后返回的时单条记录,封装好一个MyBeanHandler
如果结果集处理之后返回的是多条记录,封装好一个MyBeanListHandler