需求:现在有这样一个test1.jsp①--->(test2.java)servlet②--->test3.jsp③的请求过程,需要最后一个jsp能获取到第一个jsp页面填写的值
笔者的实现方法:
1.请求转发
在test1.jsp中提交表单
<form action="test2" method="post">
username: <input type="text" name="username">
<input type="submit" value="submit">
</form>
在test2.java中的请求转发代码
RequestDispatcher rd = req.getRequestDispatcher("test3.jsp");
rd.forward(req,resp);
在test3.jsp中获取①中的值
<% String username = request.getParameter("username");
System.out.println(username);
%>
username:<%=username %>
此方法经实践,成功得到①中填写的值,并且可以看到请求转发的请求次数只有一次,浏览器中也只能看出请求到了Servlet页面,实际上在后台已经转向了下一个jsp页面(
注:test6_1.jsp,test6_2.java,test6_3.jsp分别对应的是上文的test1.jsp①--->(test2.java)servlet②--->test3.jsp③下同)
2.重定向
<1>只对②即test2.java中的代码进行修改
resp.sendRedirect("test6_3.jsp");
在③中不能得到①中的值
<2>对②和③进行修改,并且使用Attribute函数,能否取得值?
test2.java
String username = req.getParameter("username");
req.setAttribute("username1",username);
resp.sendRedirect("test6_3.jsp");
test3.jsp
<%
String username = (String)request.getAttribute("username1");
%>
result.<br/>
username:<%=username %>
结果表明:重定向不带参数的跳转是不能获取到第一个jsp中的值。而且由图可以看出重定向方式发生了两次请求。
分析:在Servlet中进行重定向的时候调用了.HttpServletResponse对象的sendRedirect(String location)方法,而Response是响应对象即响应对象的方法,既然调用了响应对象的方法,表明整个请求过程已经结束,服务器开始向客户端返回执行的结果,并让客户端重新请求下一个jsp页面,所以得不到值username为null。