簡體   English   中英

我可以在視圖層中找到spring mvc控制器的URL嗎?

[英]Can I find the URL for a spring mvc controller in the view layer?

我認為我需要的是在Django中稱為反向URL解析。 可以說我有一個類似這樣的AddUserController:

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

我想要的是一些動態查找此控制器的URL或從視圖(JSP)形成帶有參數的URL的方法,所以我不必將URL硬編碼到控制器到處。 這是否可以在Spring MVC中使用?

您是否考慮過將bean所需的所有控制器URL聚合到HashMap中,然后將此控制器/ URL Map添加到需要它的任何模型中? 每個Spring控制器都能夠調用init()方法,你可以讓每個控制器在init()方法中將它的名稱和URL添加到控制器/ URL映射中,這樣它就可以在控制器上線時使用了。

可以用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 Overriding>只有一種方法沒問題。 如果方法覆蓋需要提供參數類型的支持序列你真的想要像Method.getParametersType()

3.Multiple Url to Single Method> like @RequestMapping(value = {“/”,“welcome”})。 如此簡單的規則是先選擇一個。

4.Ant Like Style Url>喜歡這個*.do 。解決這個問題就是使用多個網址,例如在最后放置類似ant的樣式。 @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屬性是可選的。


可能是我想到了一些問題。 :)

您可以在任何JSP文件中訪問請求對象,而無需手動將對象連接或管理到JSP中。 這意味着你可以從請求對象中獲取url路徑,將google轉換為JSP隱式對象。

這是一個幫助您入門的頁面http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html

我可能會嘗試構建一個taglib來檢查您正在使用的注釋,以便找到合適的匹配:

<x:url controller="myController">
    <x:param name="action" value="myAction"/>
</x:url>

Taglib代碼可能大致相似

  1. 向Spring詢問帶有@Controller注釋的已配置bean
  2. 迭代一些合適的順序,在控制器類或bean名稱上尋找一些合適的匹配
  3. 如果@RequestMapping包含params,則替換它們
  4. 返回字符串

這可能適用於您的特定情況(@RequestMapping樣式),但是當您有多個映射時,它可能會有點毛茸茸。 也許自定義注釋會使它更容易。

編輯:

AbstractUrlHandlerMapping :: getHandlerMap,由您最有可能使用的DefaultAnnotationHandlerMapping繼承,返回一個URL映射到Handler

將已注冊的處理程序作為不可修改的Map返回,將注冊的路徑作為鍵,將處理程序對象(或lazy-init處理程序中的處理程序bean名稱)作為值。

所以你可以迭代尋找合適的匹配,其中“合適的匹配”是你想要的。

我在5月份提交了一份增強請求。 您可以在此處關注/投票/評論: http//jira.springsource.org/browse/SPR-5779

這樣做的問題是SpringMVC中沒有中央路由器,其中所有路由都已注冊和訂購。 然后,反向路由不是靜態過程,並且視圖層中的路由分辨率可能難以集成。

在視圖層中查看此項目以獲取集中式路由器(如rails)和反向路由。

Spring HATEOS庫允許您鏈接到控制器。

很長一段時間以來,我一直在考慮使用CGLib代理實現類似的東西,但是太懶了。 看來Spring HATEOS庫將允許您以其他方式執行代理方式和各種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM