今天在修改以前项目的时候发现一个bug,在action中用request.setAttribute设置了一个变量,在返回jsp页面后用request.getAttribute去获取这个变量,但是取到的总是空值,检查了半天,突然想起来,这是之前遇到过的一个问题,应该是在struts-config.xml中的forward配置中的redirect="true"引起的,上次出现这个问题,只是改了,没有认真研究,这回要仔细看看,省得以后再忘。
redirect="true"时,会调用sendRedirect进行定向,而sendRedirect定向采用的时"(HTTP status 302 )。
再浏 览器发生页面改变
以下是从网上找到的一些对forward的分析:
redirect="false"时采用的是server-side forward端的定向
public void sendRedirect(String location)
throws IOException {
if (isCommitted())
throw new IllegalStateException
(sm.getString("coyoteResponse.sendRedirect.ise"));
// Ignore any call from an included servlet
if (included)
return;
// Clear any data content that has been buffered
resetBuffer();
// Generate a temporary redirect to the specified location
try {
String absolute = toAbsolute(location);
// public static final int SC_FOUND = 302;
setStatus(SC_FOUND);
setHeader("Location", absolute);
} catch (IllegalArgumentException e) {
setStatus(SC_NOT_FOUND);
}
引起的结果是:
如果采用redirect=true,那么request是传寄不再下一个页面, 而false是可以
forward是不能跨context转发的(例如:/context1/url 的不能用forward 转发到 /context2/url 中去),但是redirect就可以(因为它是浏览器端转发的,是服务器端发送一个http头部信息302,浏览器根据这个信息再进行转发).
如果是用forward转发的话,因为是内部(容器中)转发的,所以也就不用再经过过滤器(filter)的过滤了,但是redirect就要(因为它是多次向服务器请求).
由于forward会屏蔽转发的url,所以呢,当刷新页面时还是向原来的Url进行请求,所以会引起重复提交的问题。