struts1多模块的问题
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:linkmodule="/moduleB" path="/index.do"/>
/*** 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的路径
?
?
?