我认为我需要的是在Django中称为反向URL解析。比方说,我有一个是这样的AddUserController:我可以在视图图层中找到弹簧mvc控制器的URL吗?
@Controller
@RequestMapping("/create-user")
public class AddUserController{ ... }
我想一些方法来动态地找到网址到该控制器或形成从视图(JSP)的参数给它一个网址,让我不必硬编码到所有地方的控制器。这在Spring MVC中可能吗?
我认为我需要的是在Django中称为反向URL解析。比方说,我有一个是这样的AddUserController:我可以在视图图层中找到弹簧mvc控制器的URL吗?
@Controller
@RequestMapping("/create-user")
public class AddUserController{ ... }
我想一些方法来动态地找到网址到该控制器或形成从视图(JSP)的参数给它一个网址,让我不必硬编码到所有地方的控制器。这在Spring MVC中可能吗?
您是否考虑过拥有一个bean,将所需的所有控制器URL集合到一个HashMap中,然后将该控制器/ URL映射添加到需要它的任何模型中?每个Spring控制器都可以调用init()方法,您可以让每个控制器将它的名称和URL添加到init()方法中的控制器/ URL映射中,以便在控制器启用时可以使用它。
您可以访问任何JSP文件中的请求对象,而无需手动将对象连接或管理到JSP中。这意味着你可以得到url请求对象的路径,将一个google放入JSP隐式对象中。
这里是一个网页,让你开始http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html
嗯......我并不是真正有兴趣从一个无聊的请求中获取URL。我想要做的是给一个控制器类或引用,并获取将由该控制器服务的URL。事实证明,这是不可能的“开箱即用”。 – Vasil 2009-07-20 11:45:59
我可能会尝试建立这种检查你使用的注释,以便找到合适的匹配标签库:
<x:url controller="myController">
<x:param name="action" value="myAction"/>
</x:url>
标签库的代码可能是这样大致是
这可能会为您的特定情况下工作(@RequestMapping风格),但当你有多个映射时它可能会有点毛毛。也许一个自定义注释会使它更容易。
编辑:
AbstractUrlHandlerMapping :: getHandlerMap,这是你最有可能使用的DefaultAnnotationHandlerMapping继承,返回一个URL映射到处理程序
返回注册的处理程序作为 不可修改的地图,注册的 路径作为键和处理程序对象(或 处理程序的bean名称,如果是 lazy-init处理程序)作为值。
所以你可以迭代,寻找一个合适的匹配,其中“合适的匹配”是任何你想要的。
我在5月份提交了一个改进请求。您可以在这里关注/投票/评论:http://jira.springsource.org/browse/SPR-5779
可以用Java Reflection API解决。通过创建自定义标签库。方法是这样的
Class c = Class.forName("Your Controller");
for(Method m :c.getMethods()){
if(m.getName()=="Your Method"){
Annotation cc = m.getAnnotation(RequestMapping.class);
RequestMapping rm = (RequestMapping)cc;
for(String s:rm.value()){
System.out.println(s);
}
}
}
可能的问题,你可以面对的是
1.Path变量>筛选/ PET /显示/ {ID}所以设置路径名的&值应为支持则在返回url之前替换此String.replace()
2.方法覆盖>只有一种方法没有问题。如果方法重写需要提供参数类型的支持序列您真的很想要Method.getParametersType()
3.多Url到单一方法>像@RequestMapping所以轻松的规则是第一个选择。
4.Ant Like Style Url>像这样*.do
解决这个问题是通过将蚂蚁样式放在最后例如使用多个URL。 @RequestMapping(value={"/pet","/pet/*.do"})
所以可能的链接标签风格
<my:link controller="com.sample.web.PetController" method="show" params="java.lang.Integer">
<my:path name="id" value="1" />
</my:link>
哪里parmas属性是可选的,如果没有方法重写。
可能是我留下来想想一些问题。 :)
这个问题是SpringMVC中没有中心路由器,所有路由都被注册和排序。然后反向路由不是一个静态过程,视图层中的路由分辨率可能难以整合。
检出this project集中路由器(如导轨)和视图层中的反向路由。
Spring HATEOS库允许您创建指向控制器的链接。
很长一段时间我一直在想使用CGLib代理来实现类似的东西,但是太懒惰了。看起来Spring HATEOS library将允许你做它的代理方式和其他方式的各种。
可能有多个URL映射到相同的控制器然后你想要做什么的情况? – 2009-08-28 16:49:02