1 Request的功能
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。
request的功能可以分为以下几种:
1)封装了请求头数据;
2)封装了请求正文数据,如果是GET请求,那么就没有正文;
3)request是一个域对象,可以把它当成Map来添加获取数据;
4)request提供了请求转发和请求包含功能。
2 request域方法1)request是域对象!在JavaWeb中一共四个域对象,其中ServletContext就是域对象,它在整个应用中只创建一个ServletContext对象。request其中一个,request可以在一个请求中共享数据。
2)void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
3)Object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;
4)void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
5)Enumeration getAttributeNames():获取所有域属性的名称;
3 request获取请求参数
最为常见的客户端传递参数方式有两种:
浏览器地址栏直接输入:一定是GET请求;
超链接:一定是GET请求;
表单:可以是GET,也可以是POST,这取决与<form>的method属性值;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="/request01/AServlet?xxx=XXX&yyy=YYY">点击这里</a>
<form action="/request01/AServlet" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
爱好:<input type="checkbox" name="hobby" value="sj"/>睡觉
<input type="checkbox" name="hobby" value="cf"/>吃饭
<input type="checkbox" name="hobby" value="dq"/>打球
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
package com.cug.request;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*GET请求和POST请求的区别:
GET请求:
请求参数会在浏览器的地址栏中显示,所以不安全;
请求参数长度限制长度在1K之内;
GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
POST请求:
请求参数不会显示浏览器的地址栏,相对安全;
请求参数长度没有限制;*/
public class AServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("Get:"+req.getParameter("xxx"));
System.out.println("Get:"+req.getParameter("yyy"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobby");
System.out.println(name+":"+password);
System.out.println(Arrays.toString(hobbys));
//获取请求参数的名称
Enumeration<String> en = req.getParameterNames();
while(en.hasMoreElements()){
System.out.println(en.nextElement());
}
Map<String,String[]> mstr = req.getParameterMap();
for(String key:mstr.keySet()){
String[] values = mstr.get(key);
System.out.println(key+":"+Arrays.toString(values));
}
}
}
4 请求转发和请求包含
package com.cug.servlet.forward;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OneServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("OneServlet...");
resp.setHeader("aaa", "AAA");
// for(int i=0;i<1024*24+1;++i){
// resp.getWriter().print("a");
// }
req.setAttribute("username", "zhangsan");
//等同调用了TwoServlet的service方法
// req.getRequestDispatcher("/TwoServlet").forward(req, resp);//请求转发
req.getRequestDispatcher("/TwoServlet").include(req, resp);//请求转发
}
}
package com.cug.servlet.forward;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TwoServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println(req.getAttribute("username"));
System.out.println("TwoServlet");
resp.getWriter().print("Hello TwoServlet!!!");//设置响应体
}
}
1)如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;如果是使用请求包含,那么没有这个限制;
2)请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);
3)请求包含大多是应用在JSP页面中,完成多页面的合并;
4)请求请求大多是应用在Servlet中,转发目标大多是JSP页面;
5 请求转发与重定向的比较
1)请求转发是一个请求,而重定向是两个请求;
2)请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
3) 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
4)请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
5)重定向的第二个请求一定是GET;