重温Servlet学习笔记--request对象

时间:2021-11-18 04:23:07

  request和response是一对搭档,一个负责请求一个负责响应,都是Servlet.service()方法的参数,response的知识点前面梳理过了,这里只说一下request,在客户端发出每个请求时,服务器都会创建一个request对象,把请求的数据封装到request中,然后在调用Servlet.service()中传递进去.我们在创建一个servlet时通常会使用doGet或者doPost方法,并没有看到service()方法,就是因为父类的service方法已经读取到了request中的请求方式,然后根据请求方式再决定调用你重写的doGet方法还是doPost方法.

  • 一些常见方法:
    • getRemoteAddr()  :获取远程IP地址
    • getMethod():     获取请求方式,GET 或者 POST
    • getHeader(String name) :   获取请求头,例如getHeader("User-Agent"),就可以通过User_agent识别用户操作系统和浏览器信息

这里给出一个url:http://localhost:8080/myPro/AServlet?name="zhangSan"

    • String getScheme():获取协议,http
    • String getServerName():获取服务器名,localhost
    • String getServerPort():获取服务器端口,8080
    • String getContextPath():获取项目名,myPro
    • String getServletPath():获取Servlet路径,/AServlet
    • String getQueryString():获取参数部分,即问号后面的部分。name="zhangSan"
    • String getRequestURI():获取请求URI,等于项目名+Servlet路径。/myPro/AServlet
    • String getRequestURL():获取请求URL,等于不包含参数的整个请求路径。http://localhost:8080/myPro/AServlet
  • 获取请求参数
    • String  getParameter(String name):获取指定名称的请求参数值,适用于单值请求
    • String[] getParameterValues(String name):获取指定名称的请求参数值,适用于多值请求
    • Enumeration<String> getParameterNames():获取所有请求参数名称,可以通过遍历名称获取到每个名称对应的参数值
  • 请求转发和请求包含(在一个请求链中包含多个servlet)
    1. 请求转发:request.getRequestDispatcher("/BServlet").forward(request,response); ---> 最常用
    2. 请求包含:request.getRequestDispatcher("/BServlet").include(request,response);  --->不常用

    那么这两者到底有什么区别呢?假设一个请求先指向了Aservlet,而Aservlet向浏览器输出了一行字"AServlet",然后请求转发到了BServlet,BServlet也向浏览器输出了一行字"BServlet",那么用户在浏览器只能看到"BServlet",而如果是Aservlet请求包含到BServlet,则用户在浏览器中能看到"AservletBservlet",也就是说请求转发不会包含当前servlet的响应体,而请求包含会包含当前页面的响应体,特别注意的是,无论是请求转发还是请求包含都在一个请求范围内,使用的是同一个request和response,而重定向使用了两个request和两个response,这是很大的区别.这里总结一下请求转发和重定向的区别:

  1.  请求转发是一个请求一次响应,而重定向是两次请求两次响应
  2.  请求转发地址栏不变化,而重定向会显示后一个请求的地址
  3.  请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目
  4.  请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名!
  5.  请求转发和重定向效率是转发高!因为是一个请求!
  6.  需要地址栏发生变化,那么必须使用重定向!
  7.  需要在下一个Servlet中获取request域中的数据,必须要使用转发!
  • request域(用来传值)
    1.    void setAttribute(String name, Object value):
    2.    Object getAttribute(String name)