创建JSP页面时,我经常喜欢的一件事就是能够做到这样的事情:
<jsp:include page="fancystoryrenderer.jsp" value="${aStoryObjectInMyModel}/>
...
fancystoryrenderer.jsp
<div id="fancymainbody">
...
${theStory.title}
...
</div>
这个的主要重要特征是我可以在不同地方的同一个JSP页面上重用相同的组件,而不必复制粘贴组件并给故事变量赋予不同的名称,注意故事被称为“theStory”in JSP而不是“aStoryObjectInMyModel”,我们的模型之间的联系已被视图打破,这在这种情况下是一件好事。另外,我知道你可以将参数传递给JSP视图,但我根本不想从请求对象中获取属性,我希望能够使用表达式语言中的参数。
你是怎么做到的?
我正在使用Spring-MVC和JSP,请不要添加框架,我有兴趣只使用我目前拥有的Web堆栈来实现它。
答案 0 :(得分:4)
将所需的模型放在请求(或更广泛的)范围内,它只是在没有“传递”它的情况下工作。
如果这个需求背后的实际移动是因为你将页面包含在内部,例如一个JSTL c:forEach
循环(它将当前迭代的项放在本地范围内,这对于所包含的JSP页面确实是不可访问的),然后你可以使用c:set
进行设置。
<c:forEach items="${items}" var="item">
<c:set var="currentitem" value="${item}" scope="request" />
<jsp:include page="include.jsp" />
</c:forEach>
使用include.jsp
:
<p>Current item: ${currentitem}</p>
它只会起作用:)。
答案 1 :(得分:4)
这可以是使用所谓的“标记文件”的方式。标记文件基本上是放在WEB-INF /标签下的jsps,然后可以像taglib一样使用。我在这个例子中使用的是xml语法,但它也应该使用较旧的语法。
/WEB-INF/tags/mytag.jspx
<?xml version='1.0' encoding='utf-8'?>
<jsp:root version="2.1" xmlns:jsp="http://java.sun.com/JSP/Page">
<jsp:directive.attribute name="mybean" required="true" rtexprvalue="true" type="mypackage.MyBean"/>
<div>
${mybean.myproperty}
</div>
</jsp:root>
test.jspx
<?xml version='1.0' encoding='utf-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:tags="urn:jsptagdir:/WEB-INF/tags/">
<jsp:directive.page contentType="text/html; charset=utf-8"/>
<div>
<tags:mytag mybean="${mymodel.mybean}"/>
</div>
</jsp:root>
您可能还需要WEB-INF / tags中的文件implicit.tld来设置taglib版本:
<?xml version='1.0' encoding='utf-8'?>
<taglib xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1" xmlns="http://java.sun.com/xml/ns/javaee">
<tlib-version>2.1</tlib-version>
</taglib>