Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp使用Jsp:include模拟自定义标记?_Jsp_Jspinclude_Custom Tag - Fatal编程技术网

Jsp使用Jsp:include模拟自定义标记?

Jsp使用Jsp:include模拟自定义标记?,jsp,jspinclude,custom-tag,Jsp,Jspinclude,Custom Tag,我的应用程序以前广泛使用过JSP2.0自定义标记。与jsp:includes相比,我们更喜欢这些,因为我们不必手动将对象设置到请求范围中。然而,自定义标记对我们来说有一个主要限制,即不能动态调用它们。在我们这样规模的应用程序中,这迫使我们改用jsp:includes 因此,我们有很多代码如下所示: <c:set var="product" value="${product}" scope="request" /> <jsp:include page="${product.nam

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

除了看起来丑陋之外,它还容易出错,所以我想将其封装到一个标记中,以充分利用这两个方面,一个在幕后调用动态jsp的自定义标记。我尝试了一个名为“include”的自定义标记,如下所示:

<c:set var="product" value="${product}" scope="request" />
<jsp:include page="${product.name}.jsp" />
<c:remove var="product" scope="request"/>
<%@ 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标记中使用表达式。我怎样才能做到这一点?我愿意在这个标签中使用scriptlets,因为它对我们的应用程序来说是值得的

理想情况下,我希望能够编写一个标签,接受无限数量的参数,如下所示:

<i:include product="${product}" order="${order}" page="${product.name}.jsp"/>


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

由于缺乏更好的实现,我选择了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); %>


您所说的“不能动态调用它们”是什么意思?我可以使用jsp:include和动态生成的路径值,例如,如果我有3个产品和3个jsp include,我可以调用。如果我有3个标签,我就不能做任何事情,比如你为什么不简单地使用一个标签
,然后根据产品标签内的name参数决定标签必须做什么(例如使用
)?问题是它需要巨大的:choose语句来确定正确的操作过程(这是我们最初的实现)。调用动态JSP要简单得多,代码也要少得多,唯一真正需要注意的是,它使请求范围变得丑陋且容易出错