1

我有一个继承的 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,代码似乎会发生一些奇怪的事情,因此转换可能会成为一个更大的问题。

任何建议将不胜感激。

4

1 回答 1

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

   }

   ...
}

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

于 2013-05-21T05:12:22.873 回答