一、起因:
在项目的工厂中,由于某个界面根据产品种类显示的产品属性均不相同,所以决定将界面进行拆分,将每一个产品写入一个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的研究,以后要记得改进。