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

2022-09-03 07:56:49

我认为我需要的是Django中的反向URL解析。假设我有一个AddUserController,如下所示:

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

我想要的是某种方法来动态查找此控制器的url,或者从视图(JSP)中形成一个带有参数的url,这样我就不必将url硬编码到所有位置的控制器。这在春季MVC中可能吗?


答案 1

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


答案 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} 所以应该支持路径名和值的集合,然后在返回 url 之前替换这个 String.replace()

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

3.多个URL到单个方法>如@RequestMapping(value={“/”, “welcome”})。所以简单的规则是选择第一个。

4.蚂蚁喜欢样式 url > 像这样解决这个问题是通过使用多个url,在最后一个例如中放置蚂蚁般的样式。*.do@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 属性是可选的。


可能是我留下来想一些问题。:)