• Servlet&HTTP&Request8_登录案例


    案例:用户登录

    1、用户登录案例需求:

      1.编写login.html登录页面

        username & password 两个输入框  

      2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表

      3.使用JdbcTemplate技术封装JDBC

      4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您

      5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

    2、分析

     

    3、开发步骤

     1. 创建项目,导入html页面,配置文件,jar包

      新建一个module,模块名为day08_test

       

       把login.html放入web目录下,druid.properties放在src下,web下创建一个WEB-INF目录,把lib目录粘到WEB-INF里,lib右键Add as Library

       

      login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="/day08_test/loginServlet" method="post">
            用户名:<input type="text" name="username"> <br>
            密码:<input type="password" name="password"><br>
    
            <input type="submit" value="登录">
    
        </form>
    </body>
    </html>

      druid.property

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///day08
    username=root
    password=root
    initialSize=5
    maxActive=10
    maxWait=3000

     2. 创建数据库环境

    CREATE DATABASE day08;
    
    USE day08;
    
    CREATE TABLE USER(
        id INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(32) UNIQUE NOT NULL,
        PASSWORD VARCHAR(32) NOT NULL
    );

      在user表中手动添加几条记录

     3. 创建包cn.itcast.domain,创建类User

    package cn.itcast.domain;
    
    /**
     * 用户的实体类
     */
    public class User {
        private int id;
        private String username;
        private String password;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }

     4. 创建包cn.itcast.util,编写工具类JDBCUtils

    package cn.itcast.util;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
    
    /**
     * JDBC工具类 使用Druid连接池
     */
    public class JDBCUtils {
    
        private static DataSource ds;
    
        static {
            try {
                //1. 加载配置文件
                Properties pro = new Properties();
                //使用ClassLoader加载配置i文件,获取字节输入流
                InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
    
                pro.load(is);
    
                //2. 初始化连接池对象
                ds = DruidDataSourceFactory.createDataSource(pro);
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
        }
        /**
         * 获取连接池对象
         */
        public static DataSource getDataSource(){
            return ds;
        }
    
    
        /**
         * 获取连接Connection对象
         */
        public static Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
    }

     5. 创建包cn.itcast.dao,创建类UserDao,提供login方法

    package cn.itcast.dao;
    
    import cn.itcast.domain.User;
    import cn.itcast.util.JDBCUtils;
    import org.springframework.dao.DataAccessException;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    /**
     * 操作数据库中User表的类
     */
    public class UserDao {
    
        //声明JDBCTemplate对象公用
        private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    
        /**
         * 登录方法
         * @param loginUser 只有用户名和密码
         * @return user包含用户全部数据,没有查询到返回null
         */
        public User login(User loginUser){
            try {
                //1. 编写sql
                String sql ="select * from user where username=? and password=?";
                //2. 调用query方法
                User user = template.queryForObject(sql,
                        new BeanPropertyRowMapper<User>(User.class),
                        loginUser.getUsername(),
                        loginUser.getPassword());
                return user;
            } catch (DataAccessException e) {
                e.printStackTrace();//记录日志
                return null;
            }
        }
    }

     6. 编写cn.itcast.web.servlet.LoginServlet类

    package cn.itcast.web.servlet;
    
    import cn.itcast.dao.UserDao;
    import cn.itcast.domain.User;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/loginServlet")
    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //1. 设置编码
            request.setCharacterEncoding("utf-8");
            //2. 获取请求参数
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //3. 封装User对象
            User loginUser = new User();
            loginUser.setUsername(username);
            loginUser.setPassword(password);
    
            //4. 调用UserDao的login方法
            UserDao dao = new UserDao();
            User user = dao.login(loginUser);
    
            //5. 判断user
            if(user == null){
                request.getRequestDispatcher("/failServlet").forward(request,response);
    
            }else {
                //存储数据
                request.setAttribute("user",user);
                //转发
                request.getRequestDispatcher("/successServlet").forward(request,response);
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request,response);
        }
    }

     7. 编写FailServlet和SuccessServlet类

    package cn.itcast.web.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/failServlet")
    public class FailServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //给页面写一句话
            //设置编码
            response.setContentType("text/html;charset=utf-8");
            //输出
            response.getWriter().write("登录失败,用户名或密码错误");
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request,response);
        }
    }
    package cn.itcast.web.servlet;
    
    import cn.itcast.domain.User;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/successServlet")
    public class SuccessServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取request域中共享的user对象
            User user = (User) request.getAttribute("user");
            if(user != null){
                //给页面写一句话
                //设置编码
                response.setContentType("text/html;charset=utf-8");
                //输出
                response.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request,response);
        }
    }

     8. login.html中form表单的action路径的写法

      虚拟目录+Servlet的资源路径

     以上完成后可以访问http://localhost:8080/day08_test/login.html,输入错误的用户名和密码,或者是输入正确的用户名密码,提交后就会在浏览器展示信息。

       

     9. BeanUtils工具类,简化数据封装

      LoginServlet类可以简化为

    package cn.itcast.web.servlet;
    
    import cn.itcast.dao.UserDao;
    import cn.itcast.domain.User;
    import org.apache.commons.beanutils.BeanUtils;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.util.Map;
    
    @WebServlet("/loginServlet")
    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //1. 设置编码
            request.setCharacterEncoding("utf-8");
       
           //2. 获取所有请求参数
            Map<String, String[]> map = request.getParameterMap();
            //3. 创建User对象
            User loginUser = new User();
            //3.2 使用BeanUtils封装
            try {
                BeanUtils.populate(loginUser,map);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
            //4. 调用UserDao的login方法
            UserDao dao = new UserDao();
            User user = dao.login(loginUser);
    
            //5. 判断user
            if(user == null){
                request.getRequestDispatcher("/failServlet").forward(request,response);
    
            }else {
                //存储数据
                request.setAttribute("user",user);
                //转发
                request.getRequestDispatcher("/successServlet").forward(request,response);
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request,response);
        }
    }

      用于封装JavaBean的

      a. JavaBean:标准的Java类

       1. 要求:

         i. 类必须被public修饰

         ii. 必须提供空参的构造器

         iii. 成功变量必须使用private修饰

         iiii. 提供公共setter和getter方法

       2. 功能:封装数据

      b. 概念

       成员变量:

       属性:setter和getter方法截取后的产物。例如:getUsername() --> Username--> username

      c. 方法:

        i. setProperty():操作的是属性,不是成员变量

        ii. getProperty():操作的是属性,不是成员变量

        iii. popute(Objcet obj,Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

      d. 演示:

    package cn.itcast.domain;
    
    /**
     * 用户的实体类
     */
    public class User {
        private int id;
        private String username;
        private String password;
    
        private String gender;
    
        public void setHehe(String gender){
            this.gender = gender;
        }
    
        public String getHehe(){
           return gender;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    ", gender='" + gender + '\'' +
                    '}';
        }
    }
    package cn.itcast.test;
    
    import cn.itcast.domain.User;
    import org.apache.commons.beanutils.BeanUtils;
    import org.junit.Test;
    
    import java.lang.reflect.InvocationTargetException;
    
    public class BeanUtilsTest {
    
        @Test
        public void test(){
            User user = new User();
            try {
                BeanUtils.setProperty(user,"username","zhangsan");
                BeanUtils.setProperty(user,"hehe","male");
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
            System.out.println(user);
    
            try {
                String gender = BeanUtils.getProperty(user, "hehe");
                System.out.println(gender);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
    
        }
    }

      执行结果为:

       

  • 相关阅读:
    MySQL源代码解读(二)
    MySQL源代码解读(一)
    C语言中如何对串口进行操作
    mysql 运行概图
    Yacc 与 Lex
    外键建索引
    提高SQL查询效率
    MySQL源代码分析:(1)Main函数
    Linux "could not open default font 'fixed'."
    转帖 浅析ARM汇编语言子例程设计方法
  • 原文地址:https://www.cnblogs.com/ajing2018/p/15917166.html
Copyright © 2020-2023  润新知