forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道,URL不改变;redirect则是服务器收到请求后发送一个状态头给客 户,客户将再请求一次,这里多了两次网络通信的来往,URL改变。
forward 会将 request state , bean 等等信息带往下一个 jsp
redirect 是送到 client 端后再一次 request , 所以资料不被保留.
使用 forward 你就可以用 getAttribute() 来取的前一个 jsp 所放入的 bean 等等资料示在浏览器地址栏中的URL一般不一样,而且后者以redirect时的参数(地址)为准。
ActionServlet配置
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <-- 配置系统根路径/ --> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/config/struts/strutsConfig.xml</param-value> </init-param> <-- 配置管理员后台模块(Module)的/admin路径 --> <init-param> <param-name>config/admin</param-name> <param-value>/WEB-INF/config/struts/strutsConfig-admin.xml</param-value> </init-param> <!-- 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载;正数的值越小,启动该servlet的优先级越高。 --> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
strutsConfig.xml
<global-forwards> <forward name="index" path="index.do" redirect="true" /> <!-- 画面访问loginAdmin forward的时候,那时的URL路径是带/admin的,/代表当前路径 /../返回不带/admin的URL路径,即根目录路径(对应WebContent目录) --> <forward name="loginAdmin" path="/../WEB-INF/pages/jsp/admin/login.jsp" /> </global-forwards> <action-mappings> <action path="/*" attribute="af" name="fullLazyForm" type="com.comp.proj.web.struts.{1}Action" parameter="method" scope="request" validate="false"> <!-- 系统根路径/URL对应的Action --> <forward name="list" path="/WEB-INF/pages/jsp/{1}/list.jsp" /> </action> </action-mappings>
strutsConfig-manager.xml
<action-mappings> <action path="/manager/*" attribute="af" name="fullLazyForm" type="com.comp.proj.web.struts.manager.{1}Action" parameter="method" scope="request" validate="false"> <!-- 配置管理员后台的/adminURL路径对应的Action,因此要返回到WEB-INFO目录,必须回退一层。 --> <forward name="list" path="/../WEB-INF/pages/jsp/admin/{1}/list.jsp" /> <forward name="success" path="/manager/{1}.do?method=list" redirect="true" /> </action> </action-mappings>
既然有了Module,就存在module之间相互切换访问的问题了
<action-mappings>
<action path="/toModule"
type="org.apache.struts.actions.SwitchAction"/>
...
</action-mappings>
http://localhost:8080/toModule.do?prefix=/admin&page=/index.do
在使用forward的时候配置contextRelative=true
<global-forwards>
<forward name="toModuleB"
contextRelative="true"
path="/moduleB/index.do"
redirect="true"/>
...
</global-forwards>
<html:link module="/moduleB" path="/index.do"/>