0

我的应用程序以前广泛使用 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"/>

但我不知道该怎么做。任何建议都会很棒。顺便说一下,这个例子只是为了展示,所以不要挂断它,这只是我想表达的想法。

4

1 回答 1

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); %>
于 2012-08-07T18:51:57.400 回答