熟知request

2014-11-24 01:45:21 · 作者: · 浏览: 0

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对象被销毁,所以再也得不到它携带的信息了。