2010-06-16 101 views
3

当创建JSP页面一两件事,我经常喜欢是做这样的事情的能力:JSP组件创建

<jsp:include page="fancystoryrenderer.jsp" value="${aStoryObjectInMyModel}/> 

...

fancystoryrenderer.jsp 

<div id="fancymainbody"> 
    ... 
    ${theStory.title} 
    ... 
</div> 

这样做的主要重要特征是我可以在不同地点的同一个JSP页面上重复使用相同的组件,而无需复制粘贴组件并为故事变量赋予不同的名称,请注意,故事在JSP中称为“theStory”,而不是“aStoryObjectInMyModel”,我们的模型之间的联系已被打破,在这种情况下,这是一件好事。另外,我知道你可以传递一个参数给JSP视图,但我不想从请求对象中获取属性,我希望能够使用表达式语言中的参数。

你是如何做到这一点的?

我正在使用Spring-MVC和JSP,请不要添加框架,我有兴趣只使用我当前拥有的Web栈来工作。

回答

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> 

这将只是工作:)

4

这可能是使用所谓的 “标记文件” arhcives。标记文件基本上是放在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文件implicit.tld /标签设置标签库版本:

<?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>