tangguo

我可以在视图层中找到spring mvc控制器的URL吗?

java

我认为我需要在Django中称为反向URL解析。可以说我有一个AddUserController,它像这样:

@Controller
@RequestMapping("/create-user")
public class AddUserController{ ... }

我想要的是一种动态找到此控制器的URL或从视图(JSP)到带有参数的URL的方式,因此我不必将URL硬编码到整个控制器。在Spring MVC中可能吗?


阅读 222

收藏
2020-11-04

共2个答案

小编典典

您是否考虑过将需要的所有控制器URL聚合到HashMap中,然后将此控制器/ URL映射添加到需要它的任何模型中的bean?每个Spring控制器都可以调用init()方法,您可以让每个控制器在init()方法中将其名称和URL添加到控制器/ URL映射中,以便在控制器上线时可以使用。

2020-11-04
小编典典

可以用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 / show / {id}这样,应该支持路径名和值集,然后在返回URL之前替换此String.replace()

2.方法重写>只有一种方法没问题。如果方法重写需要提供您真正想要的参数类型的支持序列,例如Method.getParametersType()

3.Multiple Url to Single Method>,例如@RequestMapping(value = {“ /”,“ welcome”})。如此简单的规则是选择第一个。

4.Ant Like Style Url>像这样.do解决这是通过在最后一个例如放置ant like style来使用多个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属性是可选的。

也许我会去思考一些问题。:)

2020-11-04