【问题标题】:How do you create controller specific view resolvers in Spring MVC?如何在 Spring MVC 中创建特定于控制器的视图解析器?
【发布时间】:2012-11-18 21:36:15
【问题描述】:

在 Struts 中,您经常在 struts 配置文件中为控制器定义成功和失败视图,例如:

<action path="/Home" type="org.sample.HomeAction">
<forward name="success" path="/views/Home.jsp"/>
<forward name="failure" path="/views/Error.jsp"/>
</action>
<action path="/AddCustomer" type="org.sample.AddCustomerAction">
<forward name="success" path="/views/AddCustomer.jsp"/>
<forward name="failure" path="/views/AddCustomerError.jsp"/>
</action>

如果这样做,相同的逻辑视图名称(成功和失败)可以解析为不同的 jsps,具体取决于调用它们的控制器。相比之下,在最简单的 spring 设置中,视图解析器是全局的。在 Spring MVC 中复制这种配置的最简单方法是什么?

我知道一种方法是使用 SimpleFormController,它具有 getFormView() 和 getSuccessView() 方法,但我不希望有必须从该类继承的限制。有没有更通用的方法来进行控制器特定的视图分辨率?

我正在调查的场景是将大量 Struts 代码迁移到 Spring。旧代码广泛使用“成功”和“失败”。理想情况下,我只想使用现有的 Spring 视图解析器并复制相同的配置。例如

<bean class="some.spring.view.resolver">
    <property>
        <controller name="org.sample.HomeAction">
             <view name="success" value="/views/Home.jsp"/>
             <view name="failure" value="/views/Error.jsp"/>
        </controller>
        <controller name="org.sample.AddCustomerAction">
             <view name="success" value="/views/AddCustomer.jsp"/>
             <view name="failure" value="/views/AddCustomerError.jsp"/>
        </controller>               
</bean>

是否有现有的 Spring 视图解析器支持根据调用它们的控制器将相同的逻辑视图名称解析为不同的值?还是我需要自己编写或更新逻辑视图名称以使其全局唯一?

谢谢。

【问题讨论】:

    标签: spring-mvc struts


    【解决方案1】:

    您可以从控制器方法返回不同的视图名称:

    @RequestMapping("/home")
    public String home() {
    
      try {
       // Some logic
    
       return "home";
      } catch (Exception e) {
        return "error";
      }
    }
    

    这将根据调用控制器方法的结果解析适当的 jsp 视图。这与 struts2 返回表示 action 方法结果的字符串的方法非常相似,只是不需要额外的 xml 将结果字符串映射到 jsp 视图。

    【讨论】:

    • 您如何建议将 home 和 error 解析为实际视图?根据调用逻辑名称的控制器,它们将如何解析为不同的 jsps?例如如果从 Home 控制器调用“error”,它可能会转到“homeError.jsp”,但如果从 CustomerFormController 调用“error”,它可能会转到“customerFormError.jsp”。
    • Home 和错误将由标准的 spring 视图解析器解析为视图。如果您需要为每个控制器使用不同的 jsps,您只需返回不同的字符串。没有必要使用 home 和 error。您可以使用 customerformerror 和 homeerror 等。
    • 您真正要做的就是将struts 保存在xml 中的逻辑移动到您的控制器方法中。我认为这是一个巨大的进步。
    • 抱歉,我仍然不明白这如何允许相同的逻辑视图名称解析为来自不同控制器的不同视图?我需要“成功”来解决一个控制器的一件事,以及另一个控制器的另一件事。怎么说呢?
    • 我的意思是不要使用字符串“成功”等。您使用要解析的实际视图名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2014-01-29
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多