我有一个我继承的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那么代码似乎会发生一些奇怪的事情,因此转移可能会更加困难。
将非常感激地收到任何建议。
答案 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);
....
}
...
}
你可以看到这个类在某些时候会包含数百个常量。计算利弊,并决定是否需要这个。