我認爲我需要的是在Django中稱爲反向URL解析。比方說,我有一個是這樣的AddUserController:我可以在視圖圖層中找到彈簧mvc控制器的URL嗎?
@Controller
@RequestMapping("/create-user")
public class AddUserController{ ... }
我想一些方法來動態地找到網址到該控制器或形成從視圖(JSP)的參數給它一個網址,讓我不必硬編碼到所有地方的控制器。這在Spring MVC中可能嗎?
我認爲我需要的是在Django中稱爲反向URL解析。比方說,我有一個是這樣的AddUserController:我可以在視圖圖層中找到彈簧mvc控制器的URL嗎?
@Controller
@RequestMapping("/create-user")
public class AddUserController{ ... }
我想一些方法來動態地找到網址到該控制器或形成從視圖(JSP)的參數給它一個網址,讓我不必硬編碼到所有地方的控制器。這在Spring MVC中可能嗎?
您是否考慮過擁有一個bean,將所需的所有控制器URL集合到一個HashMap中,然後將該控制器/ URL映射添加到需要它的任何模型中?每個Spring控制器都可以調用init()方法,您可以讓每個控制器將它的名稱和URL添加到init()方法中的控制器/ URL映射中,以便在控制器啓用時可以使用它。
您可以訪問任何JSP文件中的請求對象,而無需手動將對象連接或管理到JSP中。這意味着你可以得到url請求對象的路徑,將一個google放入JSP隱式對象中。
這裏是一個網頁,讓你開始http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html
嗯......我並不是真正有興趣從一個無聊的請求中獲取URL。我想要做的是給一個控制器類或引用,並獲取將由該控制器服務的URL。事實證明,這是不可能的「開箱即用」。 – Vasil 2009-07-20 11:45:59
我可能會嘗試建立這種檢查你使用的註釋,以便找到合適的匹配標籤庫:
<x:url controller="myController">
<x:param name="action" value="myAction"/>
</x:url>
標籤庫的代碼可能是這樣大致是
這可能會爲您的特定情況下工作(@RequestMapping風格),但當你有多個映射時它可能會有點毛毛。也許一個自定義註釋會使它更容易。
編輯:
AbstractUrlHandlerMapping :: getHandlerMap,這是你最有可能使用的DefaultAnnotationHandlerMapping繼承,返回一個URL映射到處理程序
返回註冊的處理程序作爲 不可修改的地圖,註冊的 路徑作爲鍵和處理程序對象(或 處理程序的bean名稱,如果是 lazy-init處理程序)作爲值。
所以你可以迭代,尋找一個合適的匹配,其中「合適的匹配」是任何你想要的。
我在5月份提交了一個改進請求。您可以在這裏關注/投票/評論:http://jira.springsource.org/browse/SPR-5779
可以用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屬性是可選的,如果沒有方法重寫。
可能是我留下來想想一些問題。 :)
這個問題是SpringMVC中沒有中心路由器,所有路由都被註冊和排序。然後反向路由不是一個靜態過程,視圖層中的路由分辨率可能難以整合。
檢出this project集中路由器(如導軌)和視圖層中的反向路由。
Spring HATEOS庫允許您創建指向控制器的鏈接。
很長一段時間我一直在想使用CGLib代理來實現類似的東西,但是太懶惰了。看起來Spring HATEOS library將允許你做它的代理方式和其他方式的各種。
可能有多個URL映射到相同的控制器然後你想要做什麼的情況? – 2009-08-28 16:49:02