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: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属性要直接设置为该模块中对应的actionpath属性,不需要加上模块的前缀。鉴于这些原因,一般都会把模块中的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的路径

猜你喜欢

转载自jxyang.iteye.com/blog/1742852