2013-03-26 54 views
0

所以我正在寫一個Spring 3 Web應用程序與JSP視圖和JSTL標記。他們通常工作得很好,但有一個控制器調用不能正確獲取標籤。JSTL對象在URL中,而不是在標記上下文

ModelAndView mav = new ModelAndView(
    new RedirectView(RequestUtil.getWebAppRoot(request) + clientShortName, false) 
); 
mav.addObject("status","Session for interface successfully removed"); 
return mav; 

所以,當我去引用它在我看來,我將有一個線,看起來像:

<p>status="${status}"</p> 

剛剛顯示爲:

status="" 

現在我會通常只是將此視爲導致我的視​​圖呈現不當的原因,但實際上我發現此座標附加到我的網址中:

?status=Session+for+interface+zFXDEV3+successfully+removed 

因此,這給我留下了兩個問題:

  1. 爲什麼我不能從JSTL標記引用的對象?
  2. 如果我不能將它作爲標記上下文的一部分,它在URL中做了什麼?

和任何人想知道,這個類的類型有:

org.springframework.web.servlet.view.RedirectView.RedirectView 
org.springframework.web.servlet.ModelAndView.ModelAndView(View view) 
+0

這不是JSTL,而是[Expression Language](http://stackoverflow.com/tags/el/info)(俗稱EL)。問題在於EL會在請求屬性中查找變量,但是當您重定向到JSP時,您具有'status'作爲請求參數。 – 2013-03-26 14:41:47

+0

在處理重定向url的Controller返回的視圖中,此行是否爲'

status =「$ {status}」

'? – 2013-03-26 14:45:48

回答

3

這不是JSTL,而是Expression Language(俗稱EL)。問題是,EL ${status}將在請求屬性中查找變量,但是當您重定向到JSP時,您的狀態爲請求參數,但不是請求屬性(請注意,當您重定向到頁面時,這是正常行爲)。

對於一個更好的例子(從StackOverflow的表達式語言代碼所),這是在執行什麼:

<% 
    String status = (String) pageContext.findAttribute("status"); 
    if (status != null) { 
     out.print(status); 
    } 
%> 

你這裏有兩個可能的選擇:

  1. 正如@SotiriosDelimanolis指出,此URL的@Controller類應接受請求參數並將它們添加爲請求屬性。如果將來可以添加更多的請求參數,那麼很多工作。

  2. 使用EL的${param}對象,可以讓您訪問請求參數。使用這個,你應該改變${status}${param.status}。故事結局。

+0

爲$'param}解決方案+1。 – 2013-03-26 14:56:54

+0

只需使用$ {param.status}即可投入生產接受這是最無痛和可擴展的解決方案。 – darkpbj 2013-03-26 15:01:32

1

因爲它是一個RedirectView。 Javadoc中說:

默認情況下,所有的原始模型屬性(或其集合)是 公開爲HTTP查詢參數(假設他們還沒有被用作 URI模板變量),但這種行爲可以通過改變 重寫isEligibleProperty(String,Object)方法。

因此,您的String對象將作爲查詢參數添加到新的重定向請求中。它們不再作爲新請求的模型/請求屬性。

處理重定向URL的@Controller應該重新添加屬性到模型。

+0

我只同意你答案的最後一行。 – 2013-03-26 14:42:13

+0

啊哈,這很有道理。我會試一試,如果它很好,我會接受它。 – darkpbj 2013-03-26 14:42:41

+0

@LuiggiMendoza,你能詳細說明一下嗎? – darkpbj 2013-03-26 14:43:02

相關問題