小白初学Servlet_2(request对象和response对象的原理、request继承体系、request对象常见方法、用户登入案例、JavaBean)

一、request对象和response对象的原理

在Servle接口中有一个service()方法, public   void service(ServletRequest servletRequest,ServletResponse servletResponse)其中servletRequest为请求消息数据对象,servletResponse为响应消息对象,程序员可以再Service()方法中使用这两对象, 通过servletRequest对象来获取请求数据,通过servletResponse对象来设置响应消息
  1. requestresponse对象是由服务器创建的。我们使用它们
  2. request对象是来获取请求消息,response对象是来设置响应消息(服务器响应浏览器的消息会在对象中由程序员设计)

在这里插入图片描述

二、request继承体系结构

ServletRequest – 接口

​      | 继承

HttpServletRequest – 接口

​      | 实现

org.apache.catalina.connector.RequestFacade类(Tomcat服务器的类)

三、request对象常见方法的       功能:获取请求消息

3.1 获取请求消息数据

3.1.1 获取请求行数据

  • 列:请求行Get /day13_servlet_war_exploded/demo?name=zhangsan HTTP/1.1
  • 方法:
    1. 获取请求方式:GET
                String getMethod()
    2. (*)获取虚拟目录/day13_servlet_war_exploded/
                String getContextPath()
    3. 获取Servlet实现类的对象的路径:/demo1
                String getServletPath()
    4. 获取get方式的请求参数:name=zhangsan
                String getQueryString()
    5. (重点)获取请求URI/day13_servlet_war_exploded/demo
      • getRequestURI()/day13_servlet_war_exploded/demo
                  URI:统一资源标识符。如:共和国
      • getRequestURL()http://localhost:8080/day13_servlet_war_exploded/demo
                  URL:统一资源定位符。如:中华人民共和国
    6. 获取协议及版本:HTTP/1.1
                String getProtocol()
    7. 获取客户机的IP地址
                String getRemoteAddr()

3.1.2 获取请求头数据

  • 方法:
    1. String getHeader(String name)通过请求头的名称获取请求头的值
    2. Enumeration<String> getHeaderNames():获取所有的请求头名称

3.1.3 获取请求体数据

  • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
  • 步骤:
    1. 获取流对象
      • BufferedReader getReader():获取字符输入流,只能操作字符数据
      • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据 在文件上传知识点运用
    2. 再从流对象中拿数据

3.2 其他功能

3.2.1 获取请求体中的参数及参数值(post/get请求方式都通用)(请求体中内容的格式:参数1=值1&参数2=值2...)

  1. String getParameter(String name):根据参数名称获取参数值。如:username=zhangsan&password=123
  2. String[] getParameterValues(String name):根据参数名称获取参数值的数组。如复选框,hobby=xx&hobby=xxx
  3. Enumeration<String> getParameterNames():获取所有请求的参数名称
  4. Map<String, String[]> getParameterMap():获取所有参数Map集合
  • 通过上面的方法得到的数据存在中文乱码问题:
    • get方式:tomcat8已经将get方式乱码问题解决了
    • post方式:会乱码
      • 解决:在post方法中,在获取参数前,设置request对象的编码,request.setCharacterEncoding("utf-8");

3.2.2 请求转发(资源跳转)

  • 一种在服务器内部的资源跳转的方式
    (从一个Servlet实现类跳转到另一个Servlet实现类)
  • 步骤:
    1. 通过request对象方法获取转发器对象RequestDispatcher getRequestDispatcher(String path)   里面传入一个要跳转的对象地址
    2. 使用RequestDispatcher转发器对象的方法来进行转发:forward(ServletRequest request, ServletResponse response)
  • 特点
    1. 浏览器地址栏路径没有发生变化
    2. 只能转发到当前服务器内部资源中
    3. 转发是一次请求

3.2.3 (同一次请求中)共享数据

  • 域对象:一个有作用范围的对象,可以在范围内共享数据
  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    (一个Servlet实现类对象转发到另一个Servlet对象是一次请求,在他们两个对象怎么共用一个资源???为该次请求的request域添加共享数据添加)
  • 方法:
    1. setAttribute(String name, Object obj):存储共享数据的键和值
    2. Object getAttribute(String name):通过键获取值
    3. removeAttribute(String name):通过键移除值

3.2.4 获取ServletContext对象

  • 方法:
    • ServletContext getServletContext()

案例1:用户登陆

  • 用户登录案例需求:
    1.编写login.html登录页面
    username & password 两个输入框
    2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表
    3.使用JdbcTemplate技术封装JDBC
    4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
    5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

  • 分析

在这里插入图片描述

  • 步骤

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

    2. 创建数据库环境(创建数据库day14,里面有一个表USER,表里面有两username和password)

    3. 创建实体类User

      package cn.itcast.domain;
      public class User {
         private int id;
          private String username;
          private String password;
          public User(){
      	}
      	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. 编写工具类JDBCUtils

      package cn.itcast.util;
      import com.alibaba.druid.pool.DruidDataSource;
      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加载配置文件,获取字节输入流
                  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;
          }
          /**
           * 获取连接池对象
           */
          public static Connection getConnection() throws SQLException {
              return ds.getConnection();
          }
      }
      
    5. 创建类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;
      public class UserDao {
          //声明JDBCTemplate对象共用
          private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
          /**
           * 登陆方法
           * @param loginUser
           * @return user包含用户全部数据
           */
          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;
              }
          }
      }
      
           
      • 编写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 {
                this.doGet(request, response);
            }
            protected void doGet(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);*/
                //2. 获取请求参数
                Map<String, String[]> map = request.getParameterMap();
                //3. 封装user对象
                //3.1 创建User对象
                User loginUser = new User();
                try {
                    BeanUtils.populate(loginUser, map);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
                //4. 调用UserDao的login方法
                UserDao ud = new UserDao();
                User user = ud.login(loginUser);
                //5. 判断user
                if(user == null){
                    //登陆失败
                    request.getRequestDispatcher("/FailServlet").forward(request,response);
                } else{
                    request.setAttribute("user",user);
                    request.getRequestDispatcher("/SuccessServlet").forward(request,response);
                }
            }
        }
        
             
        • 编写FailServletSuccessServlet

          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 {
              }
          }
          
               
            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 {
                    User user = (User)request.getAttribute("user");
                    if(user != null){
                        //给页面写一句话
                        response.setContentType("text/html;charset=utf-8");
                        response.getWriter().write("登陆成功");
                    }
                }
                protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                }
            }
             .
            
                 
            • login.html中form表单的action路径的写法

              <!DOCTYPE html>
              <html lang="en">
              <head>
                  <meta charset="UTF-8">
                  <title>Title</title>
              </head>
              <body>
                  <form action="/day13_Case_UserLogin_war_exploded/LoginServlet" method="post">
                      用户名:<input type="text" name="username"> <br>
                      密码:<input type="password" name="password"><br>
                      <input type="submit" value="登录">
                  </form>
              </body>
              </html>
              
                   
              • BeanUtils工具类,简化数据封装

                • 用于封装的JavaBean 工具类
                  1. JavaBean:标准的Java类
                    1. 要求
                      1. 类必须被public修饰
                      2. 必须提供空参的构造器
                      3. 成员变量必须被private修饰
                      4. 提供公共的setter和getter方法(JavaBean通过set和get方法设置查询变量值)
                    2. 功能:封装数据
                  2. 概念:
                    • 成员变量
                    • 属性:setter和getter方法截取后的产物
                      • 如:getUsername() --> Username --> username
                  3. 方法:
                    1. setProperty(对象,变量,值)给该对象的变量设置值
                    2. getProperty(对象,变量)获取该对象变量的值
                    3. populate(Object obj, Map map):将map集合的键值对信息,封装到对应的JavaBean对象中
            ©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页