ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

 

ServletRequest 基本概念


JavaWeb中的 "Request"对象 
实际为   HttpServletRequest  或者  ServletRequest,   两者都为接口
服务器接收请求后,将请求数据进行对象封装
 
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
 

功能大致分类

request的功能可以分为以下几种:
  • 封装了请求头数据;
  • 封装了请求正文数据,如果是GET请求,那么就没有正文;
  • request是一个域对象,可以把它当成Map来添加获取数据;
  • request提供了请求转发和请求包含功能。

request是四大域对象之一
其他是ServletContext  Session  PageContext
 

Request的域方法


用来存储一个对象,也可以称之为存储一个域属性
void setAttribute(String name, Object value);
例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。
请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
 
用来获取request中的数据
Object getAttribute(String name);
当前在获取之前需要先去存储才行,
例如:
String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;
 
用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
void removeAttribute(String name);
 
获取所有域属性的名称;
Enumeration getAttributeNames();
 
 

获取请求头数据

 
获取指定名称的请求头;
String getHeader(String name);
 
获取所有请求头名称;
Enumeration getHeaderNames();
 
获取值为int类型的请求头。
int getIntHeader(String name);
 
 

获取请求相关的其它方法

 
还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法
 
获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;
int getContentLength();
 
获取请求类型,如果请求是GET,那么这个方法返回null;
如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;
String getContentType();

返回请求方法,例如:GET
String getMethod();

返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
Locale getLocale();

获取请求体编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;
String getCharacterEncoding();
 
设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!
void setCharacterEncoding(String code);

返回请求协议,例如:http;
String getScheme();
 
返回主机名,例如:localhost   或者 127.0.0.1
String getServerName();
 
返回服务器端口号,例如:8080
int getServerPort();
 
返回请求URI路径,例如:/servlet/ServletA
String getRequestURI();

返回请求URL路径,例如:http://localhost:8080/servlet/ServletA,
即返回除了参数以外的路径信息;
StringBuffer getRequestURL();
 
返回请求URL中的参数,例如:name=zhangsan&age=28
String getQueryString();
 
返回上下文路径,例如:/servlet
String getContextPath();
 
返回Servlet路径,例如:/ServletA
String getServletPath();
 
返回当前客户端的IP地址;
String getRemoteAddr();

返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
String getRemoteHost();
 
 
 
上面的路径示例   假定请求地址为:
http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&age=28
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
 
 

 

获取请求参数

 
最为常见的客户端传递参数方式有两种GET 和 POST:
 
浏览器地址栏直接输入:一定是GET请求;
超链接:一定是GET请求;
表单:可以是GET,也可以是POST,这取决与<form>的method属性值;
 
GET请求和POST请求的区别
 
GET请求:
请求参数会在浏览器的地址栏中显示,所以不安全;
请求参数长度限制长度在1K之内;
GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

POST请求:
请求参数不会显示浏览器的地址栏,相对安全;
请求参数长度没有限制;
 

获取请求参数的具体方法
根据参数名称获取参数
public String getParameter(String name); 

页面一个超链接一个表单
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
<body>

<a href="/servlet/ServletA?name=zhangsan&age=28">超链接</a>

<hr/>

<form action="/servlet/ServletA" method="post">

参数1:<input type="text" name="name"/><br/>

参数2:<input type="text" name="age"/><br/>

<input type="submit" value="提交"/>

</form>

</body>
Servlet中java代码(doGet  doPost  都一样可以)
System.out.println("request.getParameter(\"name\"): " + request.getParameter("name"));

System.out.println("request.getParameter(\"age\"): " + request.getParameter("age"));
 
打印结果:
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
 
 
当多个参数名称相同时,可以使用方法来获取
String[] getParameterValues(String name);

http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&name=lisi
System.out.println("request.getParameter(\"name\"): " + request.getParameter("name"));

String[] names = request.getParameterValues("name");

System.out.println(Arrays.toString(names));
 
打印结果:
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段 
可以看得出来request.getParameter("name")  打印的是第一个
 
 
获取所有参数的名称
public Enumeration getParameterNames();
 
http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&age=28&sex=male
Enumeration pNames = request.getParameterNames();

while(pNames.hasMoreElements()) {

System.out.println(pNames.nextElement());

}
 
打印信息
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
 
 
 
获取所有参数封装到Map中,其中key为参数名,value为参数值
因为一个参数名称可能有多个值,所以参数值是String[],而不是String
public Map getParameterMap();
 
http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&age=28&sex=male&name=lisi&age=18
//转换为Map

Map<String,String[]> paramMap = request.getParameterMap();

//获取键,根据键获取值数组

for(String name : paramMap.keySet()) {

String[] values = paramMap.get(name);

System.out.println(name + ": " + Arrays.toString(values));

}
打印结果:
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
 

 

请求转发和请求包含  

RequestDispatcher        forward    include

 
无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。
 
请求转发与请求包含比较
1.如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,
        即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;
        如果是使用请求包含,那么没有这个限制;
2.请求转发虽然不能输出响应体,但还是可以设置响应头的
         例如:response.setContentType(”text/html;charset=utf-8”);
3.请求包含大多是应用在JSP页面中,完成多页面的合并;
4.请求转发大多是应用在Servlet中,转发目标大多是JSP页面;
 
ServletA中代码如下:
response.getWriter().println("ServletA");

//获取“调度器”,其中参数为BServlet绑定的URL,即BServlet的<url-pattern>值。

RequestDispatcher rd = request.getRequestDispatcher("/ServletB");

rd.forward(request, response);
B中仅仅响应信息
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
 
请求http://127.0.0.1:8080/servlet/ServletA
页面数据为:
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
可以看得到,虽然A中有response.getWriter().println("ServletA");  但是没有任何的结果,请求直接被转发了
 
请求 http://127.0.0.1:8080/servlet/ServletA
ServletA中代码如下:
response.getWriter().println("ServletA");

//获取“调度器”,其中参数为BServlet绑定的URL,即BServlet的<url-pattern>值。

RequestDispatcher rd = request.getRequestDispatcher("/ServletB");

rd.include(request, response);
 
页面数据为:
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
 
 
此时A和B    Servlet的响应都可以正常输出,也就是响应进行了合并
 
ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
 
 

请求转发与重定向比较

请求转发是一个请求,而重定向是两个请求;
请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
请求转发对ServletA和ServletB的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
重定向的第二个请求一定是GET;
 
 
 
 
 
 
 
 
 
 
 
 
上一篇:【转】swift实现ios类似微信输入框跟随键盘弹出的效果


下一篇:用Apache Kafka构建流数据平台的建议