我认为我需要的是在Django中称为反向URL解析。假设我有一个类似这样的AddUserController:
@Controller
@RequestMapping("/create-user")
public class AddUserController{ ... }
我想要的是一些动态查找此控制器的url或从视图(JSP)形成带有参数的url的方法,因此我不必将url硬编码到控制器到处。这是否可以在Spring MVC中使用?
答案 0 :(得分:2)
您是否考虑过将bean所需的所有控制器URL聚合到HashMap中,然后将此控制器/ URL Map添加到需要它的任何模型中?每个Spring控制器都能够调用init()方法,你可以让每个控制器在init()方法中将它的名称和URL添加到控制器/ URL映射中,这样它就可以在控制器上线时使用了。 / p>
答案 1 :(得分:2)
可以使用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 Variable>喜欢这个/ pet / show / {id}这样一套路径名称& value应该是支持然后在返回url
之前替换此String.replace()2.Method Overriding>只有一种方法没问题。如果方法覆盖需要提供参数类型的支持序列,你真正想要的是Method.getParametersType()
3.多个URL到单个方法>比如@RequestMapping(value = {“/”,“welcome”})。如此简单的规则是先选择一个。
4.Ant Like Style Url>像这样*.do
来解决这个问题就是通过在最后放置类似样式的ant来使用多个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属性是可选的。
我可能会想到一些问题。 :)
答案 2 :(得分:1)
您可以在任何JSP文件中访问请求对象,而无需手动将对象连接或管理到JSP中。这意味着你可以从请求对象中获取url路径,将google转换为JSP隐式对象。
这是一个让您入门的页面http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html
答案 3 :(得分:1)
我可能会尝试构建一个taglib来检查您正在使用的注释,以便找到合适的匹配项:
<x:url controller="myController">
<x:param name="action" value="myAction"/>
</x:url>
Taglib代码可能大致类似于
这可能适用于您的特定情况(@RequestMapping样式),但是当您有多个映射时,它可能会有点毛茸茸。也许自定义注释会使其更容易。
编辑:
AbstractUrlHandlerMapping :: getHandlerMap,由您最有可能使用的DefaultAnnotationHandlerMapping继承,返回一个URL映射到Handler
将注册的处理程序作为一个返回 不可修改的地图,已注册 路径作为键和处理程序对象(或 处理程序bean名称,如果是 lazy-init handler)作为值。
所以你可以迭代寻找合适的匹配,其中“合适的匹配”就是你想要的。
答案 4 :(得分:1)
我在五月份提交了一份增强请求。您可以在此处关注/投票/评论:http://jira.springsource.org/browse/SPR-5779
答案 5 :(得分:0)
问题在于SpringMVC中没有中央路由器,其中所有路由都已注册和订购。然后反向路由不是静态过程,并且视图层中的路由分辨率可能难以集成。
在视图层中查看this project集中路由器(如rails)和反向路由。
答案 6 :(得分:0)
Spring HATEOS库允许您链接到控制器。
很长一段时间以来,我一直在考虑使用CGLib代理实现类似的东西但是太懒了。看来Spring HATEOS library将允许您以代理方式和其他各种方式执行此操作。