[英]Spring MVC unit tests - can I pass URL (with params) to controller?
[英]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代碼可能大致相似
這可能適用於您的特定情況(@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.