struts1中有3种方法可以实现模块间跳转。
1. 使用Struts内建的SwitchAction类
SwitchAction类是Struts内建的最有用的Action类之一,是专门为实现页面调转而设计的。在SwitchAction类内部,自动实现了消息资源和模块前缀的转换等操作。直接使用SwitchAction类只需要在Struts配置文件中声明即可,声明使用SwitchAction类的配置片段如下。
<action-mappings>
<action
path="/toModule"
type="org.apache.struts.actions.SwitchAction"/>
</action-mappings>
其中path="/toModule"指明了该Action类的访问路径。如果要从当前模块跳转到另一模块moduleB,则该链接的形式为:
http://localhost:8080/xxx/toModule.do?prefix=/moduleB&page=/index.do
如果要调转到的模块是默认模块,默认模块的模块前缀是空串,链接的形式为:
http://localhost:8080/xxx/toModule.do?prefix=&page=/index.do
2. 使用转发
可以在全局或局部转发中显式地将转发配置为跨模块的转发。配置全局转发为跨模块转发的示例代码如下:
<global-forwards>
<forward
name="toModuleB"
contextRelative="true
path="/moduleB/index.do"
redirect="true"/>
……
</global-forwards>
其中contextRelative属性设为true时表示当前path属性以/开头时,给出的是相对于当前上下文的URL。
也可以把局部转发配置为跨模块转发
<action-mappings>
<action ... >
<forward name="success" contextRelative="true" path="/moduleB/index.do" redirect="true"/>
</action>
……
</action-mappings>
3. 使用<html:link>标记
<html:link>是Struts自定义标记,对超链接的行为进行了定制和封装。利用<html:link>标记可以直接将超链接声明为跨模块的跳转,使用方法为:
<html:link module="/moduleB" path="/index.do"/>
使用传统的html访问资源
<a href="/moduleB/Index.do">跳转</a>
使用struts1的标签库时需要注意的问题:
模块中的JSP页面如果使用了<html:form>标记来获得formbean中的数据,一定要注意,这种JSP页面不能直接作为直接的链接让用户点击,而是应该在该模块的action中,使用非重定向forward转入,否则该页面中的<html:form>会导致错误。
另外,jsp页面中,<html:form>标记的action属性要直接设置为该模块中对应的action的path属性,不需要加上模块的前缀。鉴于这些原因,一般都会把模块中的JSP页面放入/WEB-INF目录中的某个文件夹,比如/WEB-INF/jsps目录,由于/WEB-INF目录不能直接被用户访问,这样,就会阻止用户无意中访问了对应的JSP文件而造成的错误。
原因如下:
html:form标签是怎样对action属性处理的:
/**
* Return the form action converted into a server-relative URL.
*/
public static String getActionMappingURL(String action, PageContext pageContext) {
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
StringBuffer value = new StringBuffer(request.getContextPath());
ModuleConfig config =
(ModuleConfig) pageContext.getRequest().getAttribute(Globals.MODULE_KEY);
if (config != null) {
value.append(config.getPrefix());
}
.....................
return (value.toString());
}
此处的Globals.MODULE_KEY是ActionServlet处理request请求时,根据servletContext取得的prefix放进去的ModuleConfig。
所以,如果prefix为""的话(即struts默认的模块),只能从当前默认的ModuleConfig中查询action的路径