2014-09-02 2 views
2

동적으로 이름이 지정된 페이지 범위 변수가 필요한 태그가 있습니다.동적 이름을 사용하여 변수 생성

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에 단지 루프 것 당신이 당신의 경우에서와 마찬가지로 상황에 맞는 변수를 설정 위의 루프.

**

또 다른 생각 ... 당신은 항상 pageScope 변수를 잘 custom_tags를 호출하기 전에 중 하나를 설정해야하는 경우 : someTag 또는 오른쪽을 호출 한 후, 해당 태그의 코드를 수정하거나 컨텍스트 변수를 설정할 수 있습니다 예를 들어 TagSupport.doAfterBody() [if after] 또는 BodyTagSupport.doInitBody() [if before] 메서드를 호출합니다.