我的应用程序以前广泛使用过jsp2.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"/>但我不确定该怎么做。任何建议都是很棒的。顺便说一句,这个例子只是作秀,所以不要纠结于它,这正是我想要理解的想法。
发布于 2012-08-08 02:51:57
好吧,我使用scriptlets是因为缺少更好的实现:
<%@ 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); %>https://stackoverflow.com/questions/11844819
复制相似问题