HttpServletRequest 请求消息数据

HttpServletRequest 请求消息数据

request对象和response对象的原理

1.request和response对象是由服务器创建的。我们来使用它们

2.request对象是来获取请求消息,response对象是来设置响应消息

request对象继承体系结构

​ ServletRequest – 接口
​ | 继承
​ HttpServletRequest – 接口
​ | 实现
​ org.apache.catalina.connector.RequestFacade 类(tomcat)

request功能:
  1. 获取请求行数据

    方法:

    1. 获取请求方式 :GET
      • String getMethod()
    2. (*)获取虚拟目录:/day14
      • String getContextPath()
    3. 获取Servlet路径: /demo1
      • String getServletPath()
    4. 获取get方式请求参数:name=zhangsan
      • String getQueryString()
    5. (*)获取请求URI:/day14/demo1
      • String getRequestURI(): /day14/demo1
      • StringBuffer getRequestURL() :http://localhost/demo1
      • URL:统一资源定位符 : http://localhost/demo1 中华人民共和国
      • URI:统一资源标识符 : /day14/demo1 共和国
    6. 获取客户机的IP地址
      • String getRemoteAddr()
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1. 获取请求方式 :GET
            String method = request.getMethod();
            //2.获取虚拟目录
            String contextPath = request.getContextPath();
            //获取Servlet路径
            String servletPath = request.getServletPath();
            //获取get方式请求参数
            String queryString = request.getQueryString();
            //获取请求URI
            String requestURI = request.getRequestURI();
            StringBuffer requestURL = request.getRequestURL();
            //打印
            System.out.println(method);
            System.out.println(contextPath);
            System.out.println(servletPath);
            System.out.println(queryString);
            System.out.println(requestURI);
            System.out.println(requestURL);
        }
    
  2. 获取请求头数据

    • 方法:

      (*)String getHeader(String name):通过请求头的名称获取请求头的值

      Enumeration getHeaderNames():获取所有的请求头名称

      //演示获取请求头数据 user-agent  作用判断使用什么样子的浏览器等
              String agent = request.getHeader("user-agent");
              System.out.println(agent);
              //判断  java在contains()方法是判断字符串中是否有子字符串
              if (agent.contains("Chrome")){
                  System.out.println("谷歌来了");
              }else if (agent.contains("Firefox")){
                  System.out.println("火狐来了");
              }
      
  3. 获取请求体数据

  • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

  • 步骤:

    1. 获取流对象
      • BufferedReader getReader():获取字符输入流,只能操作字符数据
      • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据(在文件上传知识点后讲解)
    2. 再从流对象中拿数据
    //获取请求体数据
    BufferedReader reader = request.getReader();
    //读取数据
    String line = null;
    while ((line = reader.readLine()) != null){
        System.out.println(line);
    }
    

    4.获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数

    1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123

      1. String[] getParameterValues(String name):根据参数名称获取参数值的数组
      2. Enumeration getParameterNames():获取所有请求的参数名称
      3. Map<String,String[]> getParameterMap():获取所有参数的map集合
    public class RequestDemo4 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //根据参数名称获取参数名****重点
            String username = request.getParameter("username");
            System.out.println(username);
            System.out.println("post");
    
            //根据参数名称获取参数值的数组
            String[] hobbies = request.getParameterValues("hobby");
            for (String hobby:hobbies){
                System.out.println(hobby);
                //System.out.println(hobbies.);
            }
            //获取所有请求的参数名称
            Enumeration<String> parameterNames = request.getParameterNames();
            while (parameterNames.hasMoreElements()){
                String name = parameterNames.nextElement();
                System.out.println(name);
                //String[] parameterValues = request.getParameterValues(name);
                String vale = request.getParameter(name);
                System.out.println(vale);
                System.out.println("*************");
            }
    
            //获取所有参数的map集合/*****重点
            Map<String, String[]> parameterMap = request.getParameterMap();
            //遍历
            Set<String> keySet = parameterMap.keySet();
            for (String name:keySet){
                //获取建获取值
                String[] values = parameterMap.get(name);
                System.out.println(name);
                for (String value:values){
                    System.out.println(value);
                }
                System.out.println("***********");
            }
        }
    
  1. 中文乱码

    • get方式:tomcat 8 已经将get方式乱码问题解决了

    • post方式:会乱码

      ​ 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //设置流
              request.setCharacterEncoding("utf-8");
              //获取请求参数username
              String username = request.getParameter("username");
              System.out.println(username);
          
          }
      
  2. 请求转发:一种在服务器内部的资源跳转方式

    • 步骤:

      • 通过request对象获取请求转发器对象:RequestDispatcher
        getRequestDispatcher(String path)
      • 使用RequestDispatcher对象来进行转发:forward(ServletRequest request,
        ServletResponse response)
    • 特点:

      • 浏览器地址栏路径不发生变化。
      • 只能转发到当前服务器内部资源中。
      • 转发是一次请求。
    @WebServlet("/RequestDemo6")
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RequestDemo7");
            requestDispatcher.forward(request,response);
    
    @WebServlet("/RequestDemo7")
    System.out.println("demo7被转发了");
    
  3. 共享数据

  • 域对象:一个有作用范围的对象,可以在范围内共享数据

  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

  • 方法:

    1. void setAttribute(String name,Object obj):存储数据
    2. Object getAttitude(String name):通过键获取值
    3. void removeAttribute(String name):通过键移除键值对
    public class RequestDemo6 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("demo6被转发了");
            //转发到demo7
            //RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RequestDemo7");
            //requestDispatcher.forward(request,response);
            //存储数据到request域中
            request.setAttribute("msg","hello");
    
            //转发
            //request.getRequestDispatcher("/RequestDemo7").forward(request,response);
        }
    public class RequestDemo7 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("demo7被转发了");
            Object msg = request.getAttribute("msg");
            System.out.println(msg);
        }
    
  1. 获取ServletContext
  • ServletContext getServletContext()

    public class RequestDemo8 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletContext servletContext = request.getServletContext();
            System.out.println(servletContext);
            //org.apache.catalina.core.ApplicationContextFacade@4375fd2
        }
    

代码:E:\Java\wang\javaweb学习\servlet_request

案例用户登录

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值