HttpServletRequest对象
request概述
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。
request的主要功能和方法
- 获取请求头数据
- 获取请求正文数据(get请求无请求正文)
- 域对象功能
- 请求转发和请求包含
获取请求信息
与请求头相关的:
String getHeader(String name)
:获取指定名称的请求头Enumeration getHeaderNames()
:获取所有请求头名称int getIntHeader(String name)
:获取值为int类型的请求头
int getContentLength()
:获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;String getContentType()
:获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;String getMethod()
:返回请求方法,例如:GETLocale getLocale()
:返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;String getCharacterEncoding()
:获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;void setCharacterEncoding(String code)
:设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!String getRemoteAddr()
:返回当前客户端的IP地址;String getRemoteHost()
:返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
与路径相关的:
String getContextPath()
:返回上下文路径,例如:/helloString getQueryString()
:返回请求URL中的参数,例如:name=zhangSanString getRequestURI()
:返回请求URI路径,例如:/hello/oneServletStringBuffer getRequestURL()
:返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;String getServletPath()
:返回Servlet路径,例如:/oneServletString getScheme()
:返回请求协议,例如:http;String getServerName()
:返回主机名,例如:localhostint getServerPort()
:返回服务器端口号,例如:8080
获取请求参数
最为常见的客户端传递参数方式有两种:
- 浏览器地址栏直接输入:一定是GET请求
- 超链接:一定是GET请求
- 表单:可以是GET,也可以是POST,这取决与的method属性值
GET请求和POST请求的区别:
- GET请求:
- 请求参数会在浏览器的地址栏中显示,所以不安全
- 请求参数长度限制长度在1K之内
- GET请求没有请求体,无法通过
request.setCharacterEncoding()
来设置参数的编码
- POST请求:
- 请求参数不会显示浏览器的地址栏,相对安全
- 请求参数长度没有限制
获取请求参数的方法:
String getParameter(String name)
:通过指定名称获取参数值(常用)String[] getParameterValues(String name)
:当多个参数名称相同时,可以使用方法来获取(常用)Enumeration getParameterNames()
:获取所有参数的名字Map getParameterMap()
:获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String
域对象功能
void setAttribute(String name, Object value)
Object getAttribute(String name)
void removeAttribute(String name)
Enumeration getAttributeNames()
请求转发和请求包含
概述:
不管是请求转发还是请求包含,都是指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。这个过程只有一个请求。
请求转发和包含的两种方式
request域对象和context域对象都可以实现:(转发forward,包含include)
request.getRequestDispatcher("/BServlet").forward(request, response);
this.getServletContext().getRequestDispatcher("/CServlet").forward(request, response);
转发和包含的比较
- 如果在
AServlet
中请求转发到BServlet
,那么在AServlet
中就不允许再输出响应体,即不能再使用response.getWriter()
和response.getOutputStream()
向客户端输出,这一工作应该由BServlet
来完成;如果是使用请求包含,那么没有这个限制;- 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:
response.setContentType(”text/html;charset=utf-8”);
- 请求包含大多是应用在JSP页面中,完成多页面的合并;
- 请求请求大多是应用在Servlet中,转发目标大多是JSP页面;
转发和重定向的比较
- 请求转发是一个请求,而重定向是两个请求;
- 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
- 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
- 请求转发对
AServlet
和BServlet
的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;- 重定向的第二个请求一定是GET;