Java学习笔记(六十九)—— Request

request对象和response对象原理
  • request对象和response对象是由服务器创建的
  • request对象是获取请求的消息,response对象是设置响应的消息
  • request对象继承体系结构:
    ServletRequest -- 接口
    |  继承
    HttpServletRequest -- 接口
    | 实现
    org.apache.catalina.connector.RequestFacade -- 类(tomcat)
request功能:
  1. 获取数据:
    • 获取请求行消息:
      • 获取请求方式:String getMethod()
      • 获取虚拟目录:String getContextPath()
      • 获取Servlet路径:String getServletPath()
      • 获取get方式的参数:String getQueryString()
      • 获取请求的URI:String getRequestURI()String getRequestURL()
      • 获取协议及版本:String getProtocol()
      • 获取客户机的IP地址:String getRemoteAddr()
    	// http://localhost:8087/day22_2_war_exploded/RequestDemo1?name=zhangsan
        String method = request.getMethod();
        System.out.println(method); // GET
        String contextPath = request.getContextPath();
        System.out.println(contextPath); // /day22_2_war_exploded
        String servletPath = request.getServletPath();
        System.out.println(servletPath); // /RequestDemo1
        String queryString = request.getQueryString();
        System.out.println(queryString); // name=zhangsan
        // URI:统一资源标识符
        String requestURI = request.getRequestURI();
        System.out.println(requestURI); // /day22_2_war_exploded/RequestDemo1
        // URL:统一资源定位符
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL); // http://localhost:8087/day22_2_war_exploded/RequestDemo1
        String protocol = request.getProtocol();
        System.out.println(protocol); // HTTP/1.1
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr); // 0:0:0:0:0:0:0:1
    1. 获取请求头数据:
      String getHeader(String name):通过请求头的名称获取请求头的值
      Enumeration<String> getHeaderNames():获取所有的请求头名称
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()){
                String s = headerNames.nextElement();
                String header = request.getHeader(s);
                System.out.println(header);
            }
    1. 获取请求体数据:
      • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
      • 步骤:
        • 获取流对象
          BufferedReader getReader():获取字符输入流,只能操作字符数据
          ServletInputStream getInputStream():获取字节输入流,可以操作所有数据
        • 从流对象中获取数据
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            BufferedReader reader = request.getReader();
            String line=null;
            while ((line=reader.readLine())!=null){
                System.out.println(line); // username=milesmatheson&password=123
            }
        }
        <form action="/day22_2_war_exploded/requestdemo3" method="post">
            <input type="text" placeholder="请输入用户名" name="username"><br>
            <input type="text" placeholder="请输入密码" name="password"><br>
            <input type="submit" value="注册">
        </form>
  2. 其他功能:
    2.1 获取请求参数,通用的方式
    2.1.1 String getParameter(String name):根据参数名称获取参数值
            String username = request.getParameter("password");
            System.out.println(username);
    2.1.2 String[] getParameterValues(String name):根据参数名称获取参数值的数组
    String[] parameterValues = request.getParameterValues("username");
    System.out.println(Arrays.toString(parameterValues));
    2.1.3 Enumeration<String> getParameterNames():获取所有请求的参数名称
    Enumeration<String> parameterNames = request.getParameterNames();
            while (parameterNames.hasMoreElements()){
                System.out.println(request.getParameter(parameterNames.nextElement()));
            }
    2.1.4 Map<String,String[]> getParameterMap():获取所有参数的map集合
            Map<String, String[]> parameterMap = request.getParameterMap();
            Set<String> strings = parameterMap.keySet();
            for (String string : strings) {
                System.out.println(string);
            }
    中文乱码问题
    * get方式:tomcat8已经将get方式乱码问题解决了
    * post方式:
    * 	再获取参数前,设置request的编码 request.setCharacterEncoding("utf-8"),解决乱码问题
    2.2 请求转发:一种在服务器内部的资源跳转方式
    2.2.1 步骤:
    2.2.1.1 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
    2.2.1.2 使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestdemo5");
    requestDispatcher.forward(request,response);
    // 触发了demo5
    2.2.2 特点:
    浏览器地址栏路径不发生变化
    只能转发到当前服务器内部资源中
    转发只是一次请求
    2.3 共享数据
    2.3.1 域对象:一个有作用范围的对象,可以在范围内共享数据
    2.3.2 request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    2.3.3 方法:
    setAttribute(String name,Object obj):存储数据
    Object getAttribute(String name):通过键获取值
    removeAttribute(String name):通过键来移除键值对
    // demo4 
    request.setAttribute("msg","hello");
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestdemo5");
    requestDispatcher.forward(request,response);
    // demo5
    Object msg = request.getAttribute("msg");
    System.out.println(msg); // hello
    2.4 获取ServletContext
    ServletContext getServletContext()
扩展
  • BeanUtils工具类,简化数据封装
    用于封装JavaBean
  1. JavaBean:标准的Java类
    1.1 类必须被public修饰
    1.2 必须提供空参的构造器
    1.3 成员变量必须使用private修饰
    1.4 提供公共的setter和getter方法
  2. 概念:
    2.1 成员变量:
    2.2 属性:setter和getter方法截取后的产物
  3. 方法:
    setProperty()
    getProperty()
    populate(Object obj,Map map):将Map集合的键值对信息,封装到对应的JavaBean对象中
练习
  1. 登录案例

    需求:
    1.编写login.html登录页,password和username两个输入框
    2.使用Druid数据库连接池技术操作mysql,user数据表
    3.使用JdbcTemplate技术封装JDBC
    4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
    5.登录失败跳转到FailServlet展示:登录失败!用户名或密码错误
    <!-- login.html-->
    <form action="/day23_war_exploded/loginservlet" method="post">
        用户名:<input type="text" placeholder="请输入用户名" name="username"><br>
        密码:<input type="text" placeholder="请输入密码" name="password"><br>
        <input type="submit" value="登录">
    </form>
    // druid.properties
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///day23
    username=root
    password=root
    initialSize=5
    maxActive=10
    maxWait=3000
    // jar包,放在web-info文件夹里面
    commons-logging-1.2.jar
    druid-1.0.9.jar
    jsoup-1.12.1.jar
    JsoupXpath-0.3.2.jar
    mchange-commons-java-0.2.12.jar
    mysql-connector-java-5.1.9.jar
    spring-beans-5.1.10.RELEASE.jar
    spring-core-5.1.10.RELEASE.jar
    spring-jdbc-5.1.10.RELEASE.jar
    spring-tx-5.1.10.RELEASE.jar
    // 创建数据库day23和表user
    CREATE DATABASE day23;
    USE day23
    CREATE TABLE USER(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	username VARCHAR(32) UNIQUE NOT NULL,
    	PASSWORD VARCHAR(32) NOT NULL
    )
    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 + '\'' +
                    '}';
        }
    }
    
    public class JDBCUtils {
        // JDBC的工具类,使用Druid的连接池
        private static DataSource ds;
        static {
            try {
                // 加载配置文件
                Properties properties = new Properties();
                // 使用Classloader加载配置文件,获取字节输入流
                InputStream resourceAsStream = JDBCUtils.class.
                        getClassLoader().getResourceAsStream("druid.properties");
                properties.load(resourceAsStream);
                // 初始化连接池
                ds = DruidDataSourceFactory.createDataSource(properties);
            } catch (Exception e) {
                e.printStackTrace();
            }
    ds
        }
        // 获取连接池方法
        public static DataSource getDataSource(){
            return ds;
        }
        // 获取连接Connection方法
        public static Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
    }
    public class UserDao {
        // 声明JDBCTemplate对象共用
        private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
        // 操作数据库中user表的类
        public User login(User loginUser){
            try {
                // 编写sql
                String sql = "select * from user where username=? and password=?";
                // 调用query方法
                User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class),
                        loginUser.getUsername(), loginUser.getPassword());
                return user;
            }catch (Exception e){
                return null;
            }
        }
    }
    @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 {
            // 设置编码
            request.setCharacterEncoding("utf-8");
            /*
            // 获取请求参数
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            // 封装user对象
            User loginUser = new User();
            loginUser.setUsername(username);
            loginUser.setPassword(password);
             */
            // 获取所有请求参数
            Map<String, String[]> parameterMap = request.getParameterMap();
            // 创建User对象
            User loginUser = new User();
            // 使用BeanUtils 封装,需要导入commons-beanutils-1.9.4.jar包
            try {
                BeanUtils.populate(loginUser,parameterMap);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            // 调用UserDao的login方法
            UserDao dao=new UserDao();
            User user = dao.login(loginUser);
            // 判断
            if(user==null){
                // 登录失败
                // 转发
                request.getRequestDispatcher("/failservlet").forward(request,response);
            }else{
                // 登录成功
                request.setAttribute("user",user);
                request.getRequestDispatcher("/successservlet").forward(request,response);
            }
        }
    }
    @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);
        }
    }
    @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");
            // 给页面写已经话
            // 设置编码
            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);
        }
    }
    
发布了113 篇原创文章 · 获赞 1 · 访问量 879

猜你喜欢

转载自blog.csdn.net/weixin_44876003/article/details/103577768
今日推荐