JSP组件创建

时间:2010-06-16 13:59:07

标签: java jsp spring-mvc

创建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堆栈来实现它。

2 个答案:

答案 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>