Request笔记

request常用方法

request和ressponse对象的原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUWKVRlN-1638320358727)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130143623209.png)]

  1. 我们可以通过request获得请求响应数据,可以通过response对象设置相应消息,并传给浏览器

request继承体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vu0Ma5WK-1638320358731)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130144259784.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rPTah8bY-1638320358735)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130144342764.png)]

具体的实现类是tomcat的NamesEnumerator类

request获取数据

###获取请求行数据

  1. 获取请求方式:get 或post

    //获取请求方式
    String method = req.getMethod();
    System.out.println(method);
    
  2. 获取虚拟目录

    //获取虚拟目录
    String contextPath = req.getContextPath();
    System.out.println(contextPath);
    
  3. 获取Servlet路径

    //获取Servlet路径
    String servletPath = req.getServl
    System.out.println(servletPath);
    

4.获取get方式请求参数?name=zhangsan

String queryString = req.getQueryString();
System.out.println(queryString);
  1. 获取请求url

    /servlet_http_request/reqtest5
    http://localhost:8080/servlet_http_request/reqtest5

    //获取请求URI
    String requestURI = req.getRequestURI();
    StringBuffer requestURL = req.getRequestURL();
    System.out.println(requestURI);
    System.out.println(requestURL);
    
  2. 获取协议版本号HTTP/1.1

//获取协议版本
String protocol = req.getProtocol();
System.out.println(protocol);
  1. 获取客户机的ip地址127.0.0.1
//获取客户机的ip地址
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);

获取请求头

  1. getHeader(String name):通过请求头的名称获取请求头的值
  2. getHeaderNames():获取所有的请求头
//获取请求头
Enumeration<String> headerNames = req.getHeaderNames();
System.out.println(headerNames);
while (headerNames.hasMoreElements()){
    String name = headerNames.nextElement();
    //通过请求头获取请求值
    String value = req.getHeader(name);
    System.out.println(name + ":" +value);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OO34DIZ-1638320358737)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130151424156.png)]

  1. 常查看的请求头信息

    //user-agent:浏览器的一些信息(是谷歌还是火狐)
    //referer:判断这个链接是从哪里跳转过来的(防盗链)
    
    

获取请求体

  1. 只有post请求方式才会有请求体

  2. 在req中的请求体将数据封装为流,字符流或字节流

    //1,获取字符流
    BufferedReader reader = req.getReader();
    //2.读取数据
    String line = null;
    while((line = reader.readLine()) != null){
        System.out.println(line);
    }
    
    //获取字节流
    

其他重要的方法

获取请求参数通用的方法

不论get还是post方法中都可以使用

  1. String getParameter(String name) 根据参数名称获取参数值

    @WebServlet("/reqtest6")
    public class RequestTest6 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //根据名称获取请求参数值
            String parameter = req.getParameter("username");
            System.out.println("post");
            System.out.println(parameter);
    
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //根据名称获取请求参数值
            String parameter = req.getParameter("username");
            System.out.println("get");
            System.out.println(parameter);
    
        }
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FabUBHQY-1638320358739)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130153913693.png)]

  2. String[] getParamenterValues(String name) 根据参数值获取参数值的数组一般在使用复选框的时候使用

    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PdXxfxU2-1638320358741)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130155030883.png)]

  3. Enumeration getParamenterNames() 获取所用的请求参数名称

    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRj7Zm97-1638320358742)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130160040314.png)]

  4. Map<String,String[]> getParameterMap() 获取所用参数的Map集合

    //Map<String,String[]> getParameterMap()方法,以map形式存储,防止有些参数有多个值,所以是<Map,String[]>
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLksqVol-1638320358743)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130161148235.png)]

请求转发

请求转发:在服务器内部进行资源跳转

  1. 通过req对象获取请求转发的对象 RequestDispatcher getRequestDispatcher(String path)

  2. 使用RequestDispatcher 对象进行转发forword(req,reso);

    @WebServlet("/reqtest8")
    public class RequestTest8 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            System.out.println("test8到此一游");
            RequestDispatcher requestDispatcher = req.getRequestDispatcher("/reqtest9");
            requestDispatcher.forward(req,resp);
    
    
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           doPost(req,resp);
    
        }
    }
    
    @WebServlet("/reqtest9")
    public class RequestTest9 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("test9到此一游");
    
    
    
    
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           doPost(req,resp);
    
        }
    
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BvURtzSg-1638320358744)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130164045542.png)]

特点:

1. 浏览器地址栏不会发生变化,
2. 只能转发到当前服务器内部资源,不能转发到其他网址
3. 转发是一次请求

共享数据

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

request域:代表一次请求的范围,一般用于转发的多个资源*享对象

request共享域对象的方法

  1. void setAttribute(String name,Object obj):存储数据
  2. Object getAttribute(String name):通过键值获取
  3. void removAttribute(String name) :通过键值移除对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D7FRWcj5-1638320358745)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130194656144.png)]

获取ServletContext

请求参数乱码问题

  1. get方式没有出现乱码,因为tomcat已经帮我们解决了,但是post方式还是会存在乱码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A1ARGLw5-1638320358745)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130162104246.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PZdykHEC-1638320358746)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211130162357235.png)]

需要在获取参数前解决乱码问题

@WebServlet("/reqtest7")
public class RequestTest7 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("utf-8");
        //获取请求参数
        String username = req.getParameter("username");
        System.out.println(username);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doPost(req,resp);

    }

上一篇:java – 由HttpServlet抛出的ServletExceptions被Tomcat记录为’SEVERE’,尽管以推荐的方式处理


下一篇:Cookie和Session