我有一个需要动态命名的页面范围变量的标记。
someTag.tag
<%@ tag language="java" pageEncoding="UTF-8" dynamic-attributes="expressionVariables" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="expression" required="true" type="java.lang.String" %>
<c:out value="${expression}" /> <%-- this is just an example, I use expressions differently, they are not jsp el actually --%>
和用法示例
<%@ taglib prefix="custom_tags" tagdir="/WEB-INF/tags/custom_tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="someAttr" value="someValue" />
<custom_tags:someTag expression="someMethod(#localAttr)" localAttr="${someAttr}" />
我需要将localAttr
添加到代码的页面范围,但jstl <c:set var='${....}'... />
不接受动态名称。
我目前使用以下scriptlet:
<c:forEach items="${expressionVariables}" var="exprVar">
<% jspContext.setAttribute(((java.util.Map.Entry)jspContext.getAttribute("exprVar")).getKey().toString(), ((java.util.Map.Entry)jspContext.getAttribute("exprVar")).getValue()); %>
</c:forEach>
还有其他方法吗?
答案 0 :(得分:1)
你的技术是正确的。您可以使用自定义标记来执行此操作,因为您使用的是自定义标记。您也可以使用您的技术,但通过执行以下操作使其更具可读性/可维护性:
<c:forEach items="${expressionVariables}" var="exprVar">
<c:set var="key" value="${exprVar.key}"/>
<c:set var="value" value="${exprVar.value}"/>
<% jspContext.setAttribute(jspContext.getAttribute("key"), jspContext.getAttribute("value")); %>
</c:forEach>
但显然这只是一种偏好。
如果您使用自定义标记,它将减少为JSTL中的单行:
<custom_tags:loadPageVars expression="${expressionVariables}"/>
你只需循环上表达变量并设置上下文变量,就像在上面的For循环中一样。
**
另一个想法...如果你总是需要在调用custom_tags之前设置pageScope变量:someTag或者在调用之后立即设置变量,你可以修改该标签的代码并在TagSupport中设置上下文变量。例如,doAfterBody()[if after]或BodyTagSupport.doInitBody()[if before]方法。