一、起因:
在項目的工廠中,由於某個界面根據產品種類顯示的產品屬性均不相同,所以決定將界面進行拆分,將每一個產品寫入一個jsp界面,分別命名為product0.jsp、product1.jsp,在主界面根據產品id,分別用<c:import>標簽引入對應的界面即可。
這樣做的好處是:將可變得界面進行解耦之后,如果增加一個產品,僅需增加一個界面即可,不會影響到其他界面的元素,便於橫向擴展,減少了原來主界面的代碼量,提升了維護性。
因為引入界面時候,有一個參數需要傳遞到被引入界面,卻引發了個小小的疑問,經過查找,最終解決了,此處記錄解決經歷,以備以后參考。
二、問題描述
jsp界面中引入界面有:
1、<c:import url="inlayingJsp.jsp"></c:import>
2、<%@ include file="inlayingJsp.jsp" %>
3、<jsp:include page="inlayingJsp.jsp" flush="true"/>
我的工作中,主要使用jstl進行編輯jsp界面,所以選擇第一種。如果網被引入界面傳遞參數,第一反應是如下寫法
<c:import url="inlayingJsp.jsp?opType=edit"></c:import>
可是在子界面以${opType},取值為空。
懷疑是否沒有傳遞過來,查了下標簽的使用方法,將參數的傳遞方法改為
<c:import url="inlayingJsp.jsp"> <c:param name="opType" value="edit"/> </c:import>
這是標准的jstl的傳遞參數寫法,但是很不幸,仍然無法取到值。
接着研究了下標簽,發現其他參數,比如var,可是嘗試后還是不行。
在網上看到有一篇文章,將百度引為子頁,語法為:
<c:import url="https://www.baidu.com/s"> <c:param name="wd" value="搜索內容"/> </c:import>
試了下,子頁不但顯示了百度,而且確實進入了搜索界面。於是考慮之前子頁獲取參數的方法是否有誤。
試了下標准的jsp寫法,可以正確獲取到值:
<% String opType=request.getParameter("opType"); out.print(opType); %>
問題鎖定為el表達式有問題,繼續google之,正確寫法為:
${param.opType}
三、結論
問題其實很小,但也花了快一個小時,回想起來主要是一直使用jstl進行界面編寫,缺乏對原生jsp的研究,以后要記得改進。