2014-09-02 1 views
2

У меня есть тег, который должен иметь динамически называемые переменные с областью видимости.create variable с динамическим именем

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='${....}'... /> не принимает динамические имена.

я в настоящее время используют следующие скриптлете:

<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

Возможный дубликат [Динамические имена переменных Java] (http://stackoverflow.com/questions/5805843/dynamic-variable-names-java) – Raedwald

+0

@Raedwald, этот вопрос нигде рядом с моими –

ответ

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}"/> 

И вы бы просто петля на expressionVariables и установить контекстные переменные так же, как вы делаете в вашей For цикл выше.

**

Еще одна мысль ... если вы всегда нужны переменные PageScope устанавливается либо непосредственно перед вызовом custom_tags: someTag или сразу после его вызова, вы можете изменить код этого тега и либо установить контекстные переменные Например, методы TagSupport.doAfterBody() [if after] или BodyTagSupport.doInitBody() [if before].