【问题标题】:Is there "best practice" for referencing Spring MVC mappings (annotations) in JSPs是否有在 JSP 中引用 Spring MVC 映射(注释)的“最佳实践”
【发布时间】:2013-05-15 05:27:52
【问题描述】:

我已经继承了一个 Spring Web 应用程序,现在我正在扩展它。我经历了海量、蔓延的 Spring XML 文件和重构过程的地狱——我再也回不来了。我现在开始使用注解编写新的控制器代码。

我有控制器,其中 RequestMappings 定义为注释,我将我的 URL 作为最终静态放入控制器中,因此我可以在代码的其他地方引用它们作为返回值。但是,在尝试构建 JSP 时,这一切似乎都碰壁了。

是否有公认的“最佳”方式来做到这一点? (或任何方式?)

为了说明......

public class MyController {
    /**
     * Magic string that defines the base URL for this action
     */
    public static final String BASE_URL = "/do_my_smart_action.do";
    /**
     * Magic string defining parameter name
     */
    public static final String PARAM_ID = "id";

...

    @RequestMapping(value = BASE_URL, method = RequestMethod.GET)
    public ModelAndView beginSmartAction(
        @RequestParam(required = false, value = PARAM_ID) Long id,
        ModelMap model) {

        // Do clever stuff

        return new ModelAndView(TARGET_JSP_NAME, model);
    }

}

我希望在我的 jsp 中能够编写类似...的 URL

<a href="<${BASE_URL}?${PARAM_ID}=${object.id}">Do Smart Action</a>

如果我在代码中更改 BASE_URL 的定义,我希望 JSP 中的链接“正常工作”。

郑重声明,我目前使用的是 Spring 3.0.6、Java 1.5 和 glassfish 3.1.2。前者可以相对容易地碰撞。如果我尝试迁移到 java 1.7,代码似乎会发生一些奇怪的事情,因此转换可能会成为一个更大的问题。

我们将不胜感激地接受任何建议。

【问题讨论】:

  • 部分回答我自己的问题...进一步调查表明javaranch.com/journal/200601/Journal200601.jsp#a3 是一个值得一看的地方
  • 1) 为你的控制器使用@Controller注解,不需要XML配置。 2)您没有将BASE_URL 设置为ModelMap model 中的键/值对,您希望如何在您的视图中访问它(与其他EL 参数类似)?您可以创建一个始终将常量添加到模型中的方法。如何设计它取决于您。
  • 1) 我知道。我继承了这一点,并且正在重构以使用注释(除其他外)。 2)谢谢你。与以往一样,关键在于问题和我设法遗漏的部分。问题是从其他人驱动的 jsps 链接到 this 控制器。因此,如果我有一个包含一组 Bar 对象的 Foo 对象(以及关联的控制器和 jsps),并且我想从 Foo JSP 链接到 Bar JSP。根据您所说,我意识到解决方案是将 target 控制器中的 URLS 添加到 source 控制器的ModelMap
  • 你能不能查看不简单的引用自己的URL?

标签: spring jsp dry spring-annotations


【解决方案1】:

你可以有一个用@ModelAttribute("baseUrl")注解的方法,它只返回BASE_URL,它可以在jsp中作为${baseUrl}访问。但这仅适用于通过此控制器呈现的页面。其他控制器会有不同的${baseUrl},会比较混乱。

我认为你实际上并不需要那个。在 jsp 中硬编码 url 并不是什么大问题 - 重构不会那么容易(但它仍然很容易 - 只需搜索和替换)。

如果你真的觉得你需要这些,你可以将所有的 URL 常量提取到一个类中,这是一个拦截器HandlerInterceptor,你可以在那里将它们全部填充到模型中。例如

public class ControllerUriPopulatingInterceptor implements HandlerInterceptor  {
   public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView model)
            throws Exception {
    model.addAttribute("usersBaseUrl", USERS_BASE_URL);
    model.addAttribute("articlesBaseUrl", ARTICLES_BASE_URL);
    ....

   }

   ...
}

您可以看到,这个类有时会包含数百个常量。计算利弊,然后决定是否需要。

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 2017-01-22
    • 2019-05-27
    • 2020-10-26
    • 2015-09-11
    • 2023-03-18
    • 2015-04-19
    • 2011-05-18
    • 2012-12-23
    相关资源
    最近更新 更多