为什么我们需要struts中的全局转发和全局异常?

时间:2012-12-13 10:47:29

标签: java java-ee struts

我在struts中有一个基本问题为什么我们需要在struts-config.xml中使用<global-forwards><global-exceptions>。如果我们可以使用<action-mappings>本身实现相同的目标。

2 个答案:

答案 0 :(得分:38)

<global-forwards>

考虑您正在验证不同网址的用户名密码,例如update.do,insert.do delete.do等。如果它是有效用户,您需要继续执行必要的操作。如果没有转发到登录页面。请参阅下面的映射

<action-mappings>        
    <action path="/insert" type="controller.Insert">
        <forward name="success"  path="/insert.jsp"/>
        <forward name="failure"  path="/login.jsp"/>
    </action>     
    <action path="/update" type="controller.Update">
        <forward name="success"  path="/update.jsp"/>
        <forward name="failure"  path="/login.jsp"/>
    </action>
    <action path="/delete" type="controller.Delete">
        <forward name="success"  path="/delete.jsp"/>
        <forward name="failure"  path="/login.jsp"/>
    </action>        
</action-mappings>

您可以在<forward name="failure" path="/login.jsp"/>中声明这一点,而不是重复<global-forwards>

 <global-forwards>
   <forward name="failure"  path="/login.jsp"/>
</global-forwards>

现在,您可以删除动作映射中的<forward name="failure" path="/login.jsp"/>


<global-exceptions>

如果您收到java.Io异常而不是手动处理每个异常,您可以全局声明如下。

<global-exceptions>
    <exception type="java.io.IOException" path="/pages/error.jsp"/>
</global-exceptions>

我希望这能澄清你的问题。

答案 1 :(得分:3)

如果您正在讨论Struts 1,global-exceptions ExceptionHandlersException处理所有操作的Global-forwards,那么您不必为每个操作声明它并避免重复

global-forward有同样的想法。如果您在不同的操作中使用相同的路径转发,则可以通过仅声明一个global-forwards来避免重复,并且所有操作都可以使用它。使用<forward name="loginLink" path="/login" />,您还可以避免jsps中的硬编码网址,例如,您可以声明全局转发,例如<html:link forward="loginLink">Login</html:link> 然后在你的jsp {{1}}。