Servlet之Request深刻剖析

Request原理
  • Servlet中哪个对象代表请求消息数据?
    • Request对象.
  • Servlet中哪个对象代表响应消息数据?
    • Response对象.
  • Tomcat接收到请求之后都做了什么事情?
    • 根据请求的路劲先去找资源(Servlet) 如果有对应的Servlet的话(默认情况下)创建Serlvet对象.
    • Tomcat会创建Request对象以及Response对象 -> 将请求的参数内容封装到Request对象中.
    • 将Request对象和Response对象传入到service方法中并且调用service方法.
    • 开发者根据逻辑使用Request对象并且将响应信息封装到Response对象中.
    • Tomcat根据Response对象中的响应数据封装响应消息发送给浏览器.
Request继承体系
  • request的体系是什么?
  • ServletRequest(接口(实现Servlet接口的话,service方法中就传递是这个对象.))
  • HttpServletRequest(接口)
  • Tomcat提供了一个实现类对象 RequestFacade(实现了HttpServletRequest实现类)
Request获取请求行数据代码演示
  • Request对象都有哪些获取请求行数据的方法?

  • package com.itheima.request;
    
    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("/r1")
    public class Request1Servlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /*1.获取请求的方式*/
            String method = req.getMethod();
            System.out.println("请求的方式是:" + method);
            /*2.获取Servlet的路径*/
            String servletPath = req.getServletPath();
            System.out.println("Servlet的路径是:" + servletPath);
            /*3.获取虚拟路径(*) 如果虚拟路径为/的话,那么虚拟路径是没有的.*/
            String contextPath = req.getContextPath();
            System.out.println("虚拟路径是:" + contextPath);
            /*4.获取Get提交的请求参数*/
            String queryString = req.getQueryString();
            System.out.println("请求的参数是:" + queryString);
            /*5.获取请求的URI(*)*/
            String requestURI = req.getRequestURI();
            System.out.println("请求的URI是:" + requestURI);
            StringBuffer requestURL = req.getRequestURL();
            System.out.println("请求的URL是:" + requestURL.toString());
            /*6.获取协议以及版本信息*/
            String protocol = req.getProtocol();
            System.out.println("协议以及版本信息是:" + protocol);
            /*7.获取客户机地址*/
            String remoteAddr = req.getRemoteAddr();
            System.out.println("客户端的Ip地址是:" + remoteAddr);
        }
    }
    
Request获取请求头数据
  • Request对象如何获取请求头数据?
    • getHeader(String headerName) -> 传入的头的键的名称返回的键对应的值,如果没有对应的键,则返回null.
    • getHeader(“USER-AGENT”); getHeader(“REFERER”);
    • getHeaderNames() -> 返回一个Enumeration理解为一个迭代器,这个中封装了所有请求的键的值.
Request获取请求体数据
  • Request对象如何获取请求体数据?
    • 获取流对象 -> req.getReader(); 返回一个缓冲字符输入流用于读取请求体中的数据.
    • 如果用户上传文件/图片 -> 我们需要使用到字节流来读取用户上传的数据.
Request获取请求参数通用方式演示
  • Request有哪些获取参数的通用方式?
    • getParameter(String name) -> String value
      • 一般用于精准获取单个请求参数(key=value)
    • getParameterValues(String name) -> String[] value
      • 一般用于获取复选框(也可以用于获取单个元素[那么返回的数组中只有一个值])
    • getParameterNames() -> Enumeration
      • 获取所有的请求参数的键(只获取键 不获取值)
    • getParameterMap() -> 返回Map<String,String[]> 一般和BeanUtils结合使用.
      • 将请求参数中的键封装为Map的键,将键对应的值封装为Map的值(String[])
  • 获取参数的通用方式有什么特点?
    • 不管是GET提交还是POST提交,都可以使用通用参数的获取方式进行获取,所以说继承了HttpServlet之后,doGet中可以直接调用doPost方法(反之亦可),写一份代码就可以了.
Request获取请求参数中文乱码问题处理
  • 如何会出现请求参数乱码的问题?

    • 当在使用POST提交方式进行中文数据的提交的时候会出现解析为乱码的情况.
    • TOMCAT8解决了GET提交乱码的问题.
  • 如何解决请求参数乱码的问题?

    • 将流的编码设置为与页面相同即可.

    • /*在获取参数之前,将流的编码设置为UTF-8解决POST提交中文乱码的问题*/
      req.setCharacterEncoding("UTF-8");
      
Request请求转发
  • 什么是转发?
    • 转发是服务器内部资源跳转的一种方式(在很多的面试/笔试过程中,会使用转发和重定向进行对比.)
      • 可以用于解耦.
  • 如何进行转发?
    • 获取转发对象 -> request.getRequestDispatcher(String path[Servlet路径]);
    • 执行转发 -> RequestDispatcher的对象forward(request,response);
  • 转发的特点是什么?
    • 转发的时候地址栏不会发生改变.
    • 转发的时候只是发送了1次请求.
    • 转发的时候只能转发到服务器内部,不可以转发到外部资源.
    • 转发的速度很快(因为服务器内部转发)
Request共享数据(域对象)
  • 什么是域对象?
    • 一个有作用范围的可以存放共享数据的容器.
  • 和域对象相关的有哪些方法?
    • 存储数据 setAttribute(String name,Object o);
    • 获取数据 getAttribute(String name) -> 返回的是一个Object对象 如果需要使用方法的话,需要强制类型转换.
    • 删除数据 removeAttribute(String name); -> 没有返回值.
Request获取ServletContext
  • 如何获取ServletContext对象?
    • request.getServletContext();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值