我的应用程序以前广泛使用过jsp 2.0自定义标记。我们首选jsp:includes因为我们不必手动将对象设置为请求范围。但是,自定义标签对我们有一个主要限制,它无法动态调用它们。在我们的大小的应用程序中,这迫使我们使用jsp:includes代替。
所以我们有很多看起来像这样的代码:
<c:set var="product" value="${product}" scope="request" />
<jsp:include page="${product.name}.jsp" />
<c:remove var="product" scope="request"/>
除了看起来很难看它的错误,所以我想把它封装到一个标签中以获得两全其美,一个在幕后调用动态jsp的自定义标签。我尝试了一个名为'include'的自定义标签:
<%@ attribute name="name" rtexprvalue="true" required="true" %>
<%@ attribute name="value" rtexprvalue="true" required="true" %>
<%@ attribute name="page" rtexprvalue="true" required="true" type="java.lang.Object" %>
<c:set var="${name}" value="${value}" scope="request" />
<jsp:include page="${page}" />
<c:remove var="${name}" scope="request"/>
但它不起作用,因为c:set不允许var标记中的表达式。我怎样才能做到这一点?我愿意在这个标签中使用scriptlet只是因为它值得我们的应用程序的价值。
理想情况下,我希望能够编写一个接受无限数量参数的标记,如下所示:
<i:include product="${product}" order="${order}" page="${product.name}.jsp"/>
但我不知道该怎么做。任何建议都会很棒。顺便说一下这个例子只是为了展示,所以不要挂断它,这只是我想要的想法。
答案 0 :(得分:0)
由于缺乏更好的实现,我使用了scriptlet:
<%@ attribute name="page" rtexprvalue="true" required="true" %>
<%@ attribute name="name" rtexprvalue="true" required="true" %>
<%@ attribute name="value" rtexprvalue="true" required="true" type="java.lang.Object" %>
<% request.setAttribute(name, value); %>
<jsp:include page="${page}" />
<% request.removeAttribute(name); %>