熟知request
request的生命周期很短,只活动于浏览器向服务器的一次请求中,当请求执行完,当前对象也将被销毁掉。
request经常用来获取浏览器页面上输入的表格信息——用户名、密码诸如此类也可以在servlet中setAttribute("索引名","索引值")来存储一对object类型的键值对,通过forward或include方法实现请求跳转,区别只是前者不将response中的输出流信息输出,后者则进行输出。由于跳转还是在同一个请求中进行的,request对象并未被销毁,所以能从跳转到的页面中得到键值对中的值。
Java代码
/**
* HelloServlet中的请求处理方法
*/
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.service(req, resp);
resp.setContentType("text/html;charset=gbk");
resp.setCharacterEncoding("gbk");
req.setCharacterEncoding("gbk");
//得到用户发送请求时输入的参数
String username = req.getParameter("username");
req.setAttribute("username", username);
req.getRequestDispatcher("redirect.jsp").forward(req, resp);
//resp.sendRedirect("redirect.jsp");
}
登录界面:当点击登录按钮时,请求被服务器接收,servlet进行处理,将username保存,然后跳转到redirect.jsp中。
跳转界面:跳转到redirect.jsp中,并在页面上显示出了用户名,值得注意的一点,地址栏并没有指向redirect.jsp,间接的证明所有操作都在一个请求中。
firebug:很明显,服务器只收到一个采用post方法的请求。
至于request的生命周期是否只在一个请求中,并没有得到验证。那么如果在两个请求中完成上面的操作,是不是还会得到username呢?
Java代码
/**
* HelloServlet中的请求处理方法
*/
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.service(req, resp);
resp.setContentType("text/html;charset=gbk");
resp.setCharacterEncoding("gbk");
req.setCharacterEncoding("gbk");
//得到用户发送请求时输入的参数
String username = req.getParameter("username");
req.setAttribute("username", username);
//req.getRequestDispatcher("redirect.jsp").forward(req, resp);
//重定向
resp.sendRedirect("redirect.jsp");
}
1、用户名显示为"null",说明request的生命周期是一次请求;2、地址栏指向了redirect.jsp;3、firebug中显示出了两次请求,一次是我指定的"post",另一次应该是默认的"get",response将重定向的信息返回给浏览器,浏览器再进行第二次请求,此时第一个request对象被销毁,所以再也得不到它携带的信息了。
补充:软件开发 , Java ,