2009-07-04 82 views
14

我認爲我需要的是在Django中稱爲反向URL解析。比方說,我有一個是這樣的AddUserController:我可以在視圖圖層中找到彈簧mvc控制器的URL嗎?

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

我想一些方法來動態地找到網址到該控制器或形成從視圖(JSP)的參數給它一個網址,讓我不必硬編碼到所有地方的控制器。這在Spring MVC中可能嗎?

+0

可能有多個URL映射到相同的控制器然後你想要做什麼的情況? – 2009-08-28 16:49:02

回答

2

您是否考慮過擁有一個bean,將所需的所有控制器URL集合到一個HashMap中,然後將該控制器/ URL映射添加到需要它的任何模型中?每個Spring控制器都可以調用init()方法,您可以讓每個控制器將它的名稱和URL添加到init()方法中的控制器/ URL映射中,以便在控制器啓用時可以使用它。

+0

我會嘗試製作我自己的HandlerInterceptor,它可以聚合控制器 - > url映射,並將它們廣告給每個ModelAndView,以供每個請求使用。但是,這還沒有達到django網址分辨率和反向分辨率所能達到的水平。 – Vasil 2009-07-04 19:19:00

+0

我明白你的觀點。 Django很好地集中了url模式,甚至允許它們的名字。我已經跳進Spring源代碼來弄清楚事情是如何完成的,但它並沒有太多樂趣 – jottos 2009-07-04 20:07:13

1

您可以訪問任何JSP文件中的請求對象,而無需手動將對象連接或管理到JSP中。這意味着你可以得到url請求對象的路徑,將一個google放入JSP隱式對象中。

這裏是一個網頁,讓你開始http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html

+0

嗯......我並不是真正有興趣從一個無聊的請求中獲取URL。我想要做的是給一個控制器類或引用,並獲取將由該控制器服務的URL。事實證明,這是不可能的「開箱即用」。 – Vasil 2009-07-20 11:45:59

1

我可能會嘗試建立這種檢查你使用的註釋,以便找到合適的匹配標籤庫:

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

標籤庫的代碼可能是這樣大致是

  1. 向春天的配置豆類與註解@Controller
  2. 迭代在一些合適的順序尋找在控制器類或bean名稱一些合適的比賽
  3. 如果@RequestMapping包括參數,可以再替換他們
  4. 返回字符串

這可能會爲您的特定情況下工作(@RequestMapping風格),但當你有多個映射時它可能會有點毛毛。也許一個自定義註釋會使它更容易。

編輯:

AbstractUrlHandlerMapping :: getHandlerMap,這是你最有可能使用的DefaultAnnotationHandlerMapping繼承,返回一個URL映射到處理程序

返回註冊的處理程序作爲 不可修改的地圖,註冊的 路徑作爲鍵和處理程序對象(或 處理程序的bean名稱,如果是 lazy-init處理程序)作爲值。

所以你可以迭代,尋找一個合適的匹配,其中「合適的匹配」是任何你想要的。

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變量>篩選/ 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屬性是可選的,如果沒有方法重寫。


可能是我留下來想想一些問題。 :)

0

這個問題是SpringMVC中沒有中心路由器,所有路由都被註冊和排序。然後反向路由不是一個靜態過程,視圖層中的路由分辨率可能難以整合。

檢出this project集中路由器(如導軌)和視圖層中的反向路由。

0

Spring HATEOS庫允許您創建指向控制器的鏈接。

很長一段時間我一直在想使用CGLib代理來實現類似的東西,但是太懶惰了。看起來Spring HATEOS library將允許你做它的代理方式和其他方式的各種。

相關問題