是否存在用于在JSP中引用Spring MVC映射(注释)的“最佳实践”

时间:2013-05-20 15:43:26

标签: spring jsp dry spring-annotations

我有一个我继承的Spring Web应用程序,现在我正在扩展。我经历了庞大,庞大的Spring XML文件和重构过程的地狱 - 我永远不会回来的时间。我现在开始使用注释编写新的Controller代码。

我有控制器将RequestMappings定义为注释,并且我将我的URL作为最终静态放在Controller中,因此我可以将它们作为返回值引用到代码中的其他位置。但是,在尝试构建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那么代码似乎会发生一些奇怪的事情,因此转移可能会更加困难。

将非常感激地收到任何建议。

1 个答案:

答案 0 :(得分:1)

您可以使用@ModelAttribute("baseUrl")注释的方法只返回BASE_URL,并且可以在jsp中将其作为${baseUrl}进行访问。但这仅适用于通过此控制器呈现的页面。其他控制器会有不同的${baseUrl},这会让人感到困惑。

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

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

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);
    ....

   }

   ...
}

你可以看到这个类在某些时候会包含数百个常量。计算利弊,并决定是否需要这个。