2011-04-25 18 views
3

我有完全一樣的基本問題about accessing jsp:param values作爲這張海報;遵循他的例子完全不適合我。通過jsp:include傳入的參數似乎並未顯示在包含的文件中。我的設置有什麼特別的嗎?爲什麼jsp:包含參數不可見

來電:

<div> 
    <jsp:include page="../../../common/callee.jsp"> 
     <jsp:param name="justinVar" value="primary" /> 
    </jsp:include>  
</div> 

callee.jsp:

<i>method 1: [</i><b><%= request.getParameter("justinVar") %></b><i>]</i> 
<p/> 
<i>method 2: [</i><b>${param.justinVar}</b><i>]</i> 
<p/> 
<i>method 3: [</i><b>${justinVar}</b><i>]</i> 
<p/> 

最終輸出:

method 1: [null] 

method 2: [] 

method 3: [] 

更新: 以下解決方法確實工作,這似乎是錯誤的,但也許它工作的事實揭示了一些不起作用的事情。

<c:set var="justinVar" value="justinVARisHere" scope="request" /> 
<jsp:include page="../../../common/callee.jsp" /> 
+1

第一和第二應該工作(其中第一個是老式的,差的辦法BTW)。第三個錯誤,它只掃描page/request/session/servletcontext屬性,而不是請求參數。你確定你正在運行你認爲你正在運行的代碼嗎?你不是在* real *代碼中動態地填充'jsp:param'的'value'屬性嗎? – BalusC 2011-04-25 16:28:43

+0

那麼,我的目標是爲一個複雜的bean創建一個參數化的編輯器。我想讓這些編輯器中的1-2個顯示在頁面上並綁定到頁面bean的子對象,該參數應該是該子對象的對象路徑名稱。這個例子是'真正的代碼',因爲我不能得到任何東西來工作,並回到基礎。 – Justin 2011-04-25 16:50:14

+0

你使用的是什麼JSP/Servlet容器make/version? Servlet版本是你的'web.xml'被聲明的?在webapp的'WEB-INF/lib'中有沒有servlet容器特定的庫? EL只是在Servlet 2.4/JSP 2.0以後的版本中才開始使用,但是否則你會在HTML輸出中看到未被解析的EL代碼,這在這裏就不是這種情況。儘管我在這裏的黑暗中拍攝了一些東西,但這也無法解釋爲什麼舊的方式也不能提供任何東西。您不得運行您認爲正在運行的代碼。清理環境,清理服務器工作文件夾,重新創建測試文件等。 – BalusC 2011-04-25 16:53:12

回答

3

要明確的問題,嘗試調試/在Java代碼中的打印EL ${param}HttpServletRequest#getParameterMap()探索整個地圖。它必須提供有關地圖真實包含的信息的見解。

+0

我的servlet使用HttpServletRequest的自定義包裝來完成REST完整參數解析。這是干擾Jasper表現jsp:include的方法。 – Justin 2011-04-26 21:13:19

0

我跟蹤了生成的java源代碼,它看起來很合理。發生以下兩種情況之一:org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode正在搞亂變量名稱,或者使用的類加載器解析爲JspRuntimeLibrary,而不是驅動Web應用程序的實例。

// caller.jsp .... 
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, 
    "callee.jsp" + (("callee.jsp").indexOf('?')>0? '&': '?') + 
    org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("justinVar", 
    request.getCharacterEncoding())+ "=" + 
    org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("primary", 
    request.getCharacterEncoding()), out, true 
); 

查看Jasper的運行時,我們發現這個gem。不清楚這是否是問題,但是呈現的頁面是來自defaultParent.jsp的jsp:include,儘管jsp:params傳遞到defaultParent的jsp:include中似乎也沒有顯示出來。

958   // FIXME - It is tempting to use request.getRequestDispatcher() to 
    959   // resolve a relative path directly, but Catalina currently does not 
    960   // take into account whether the caller is inside a RequestDispatcher 
    961   // include or not. Whether Catalina *should* take that into account 
    962   // is a spec issue currently under review. In the mean time, 
    963   // replicate Jasper's previous behavior 
+1

這些字符串不包含任何在URL中不合法的特殊字符。 – BalusC 2011-04-26 19:28:38

+0

查看URLEncode的源代碼,輸出的東西將是ISO-8859-1,它不會導致任何問題。我懷疑可能有兩個JspRuntimeLibrary實例(由兩個類加載器構成),其中一個可能是非法的。 – Justin 2011-04-26 19:40:14

+0

'URLEncoder'不應吞下角色。可能發生的最糟糕的事情是你得到畸形的字符。 – BalusC 2011-04-26 19:46:03

1

沒錯。 我有一個類似的問題,在過去的一個小時左右,我找到了解決方案。

我有index.jsp,並試圖在其中包含news.jspf文本從index.jsp中的jsp參數 它沒有奏效。它只是將news.jspf EL顯示爲普通文本。

我將包含的文件擴展名從.jspf更改爲.jsp,並解決了問題。

我正在使用Eclipse,這可能是也可能不是一個因素。

好運

0

這項工作在我的Liferay門戶

ParamUtil.getString(PortalUtil.getOriginalServletRequest(request), "justinVar")