문제

이 질문은 이미 여기에 답이 있습니다.

다양한 세션 속성의 이름을 정의하는 수업이 있습니다.

class Constants {
    public static final String ATTR_CURRENT_USER = "current.user";
}

JSP 내에서 이러한 상수를 사용하여 이러한 속성의 존재를 테스트하고 싶습니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.example.Constants" %>

<c:if test="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}">
    <%-- Do somthing --%>
</c:if>

그러나 나는 sytax를 올바르게 얻을 수없는 것 같습니다. 또한 여러 곳에서 위의 긴 테스트를 반복하지 않기 위해 결과를 로컬 (페이지 스코핑) 변수에 할당하고 대신 참조하고 싶습니다. 나는 이것을 할 수 있다고 믿는다 <c:set>, 그러나 다시 올바른 구문을 찾기 위해 고군분투하고 있습니다.

업데이트: 아래의 제안에 따라 시도했습니다.

<c:set var="nullUser" scope="session"
value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />

작동하지 않았습니다. 대신, 나는 상수의 문자 값을 대체하려고 시도했다. 또한 페이지 내용에 상수를 추가하여 페이지가 렌더링 될 때 상수의 값을 확인할 수 있습니다.

<c:set var="nullUser" scope="session"
value="${sessionScope['current.user'] eq null}" />
<%= "Constant value: " + WebHelper.ATTR_CURRENT_PARTNER %>

이것은 잘 작동했으며 페이지에 예상 값 "current.user"를 인쇄했습니다. 나는 문자열 문자를 사용하는 이유를 설명하기 위해 상실하지만, 둘이 같은 값을 갖는 것처럼 보일 때 상수에 대한 참조는 그렇지 않습니다. 돕다.....

도움이 되었습니까?

해결책

예전에서 작동하지 않습니다 ATTR_CURRENT_USER 상수는 JSTL 태그에 보이지 않으며, 이는 속성이 Getter 함수에 의해 노출 될 것으로 예상합니다. 나는 그것을 시도하지 않았지만 당신의 상수를 노출시키는 가장 깨끗한 방법은 대표적인 태그 라이브러리.

ETA : 내가 준 오래된 링크는 작동하지 않았습니다. 이 답변에서 새로운 링크를 찾을 수 있습니다. JSP의 Java 상수

보고있는 동작을 명확히하기위한 코드 스 니펫 : 샘플 클래스 :

package com.example;

public class Constants
{
    // attribute, visible to the scriptlet
    public static final String ATTR_CURRENT_USER = "current.user";

    // getter function;
    // name modified to make it clear, later on, 
    // that I am calling this function
    // and not accessing the constant
    public String getATTR_CURRENT_USER_FUNC()
    {
        return ATTR_CURRENT_USER;
    }


}    

JSP 페이지의 스 니펫, 샘플 사용을 표시 :

<%-- Set up the current user --%>
<%
    session.setAttribute("current.user", "Me");
%>

<%-- scriptlets --%>
<%@ page import="com.example.Constants" %>
<h1>Using scriptlets</h1>
<h3>Constants.ATTR_CURRENT_USER</h3>
<%=Constants.ATTR_CURRENT_USER%> <br />
<h3>Session[Constants.ATTR_CURRENT_USER]</h3>
<%=session.getAttribute(Constants.ATTR_CURRENT_USER)%>

<%-- JSTL --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="cons" class="com.example.Constants" scope="session"/>

<h1>Using JSTL</h1>
<h3>Constants.getATTR_CURRENT_USER_FUNC()</h3>
<c:out value="${cons.ATTR_CURRENT_USER_FUNC}"/>
<h3>Session[Constants.getATTR_CURRENT_USER_FUNC()]</h3>
<c:out value="${sessionScope[cons.ATTR_CURRENT_USER_FUNC]}"/>
<h3>Constants.ATTR_CURRENT_USER</h3>
<c:out value="${sessionScope[Constants.ATTR_CURRENT_USER]}"/>
<%--
Commented out, because otherwise will error:
The class 'com.example.Constants' does not have the property 'ATTR_CURRENT_USER'.

<h3>cons.ATTR_CURRENT_USER</h3>
<c:out value="${sessionScope[cons.ATTR_CURRENT_USER]}"/>
--%>
<hr />

이 출력 :

스크립트를 사용합니다

constants.attr_current_user

현재 사용자

세션 [constants.attr_current_user


JSTL 사용

constants.getattr_current_user_func ()

현재 사용자

세션 [constants.getattr_current_user_func ()

constants.attr_current_user



다른 팁

주제는 꽤 오래되었지만 어쨌든 .. :)

JSTL을 통해 상수를 사용할 수있는 좋은 솔루션을 찾았습니다. 반사를 사용하여지도를 준비하고 원하는 곳에 두어야합니다.

맵에는 항상 상수 클래스에서 정의하는 모든 상수가 포함됩니다. 리스너를 사용하여 ServletContext에 넣고 JSTL에서 상수를 즐길 수 있습니다.

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


상수는 여기에 맵을 컨텍스트에 넣은 키입니다 :-)


다음은 상수 필드의 맵을 만드는 내 코드 조각입니다.

Map<String, Object> map = new HashMap<String, Object>();
Class c = Constants.class;
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
   int modifier = field.getModifiers();
   if (Modifier.isPublic(modifier) && Modifier.isStatic(modifier) && Modifier.isFinal(modifier)) {
      try {
         map.put(field.getName(), field.get(null));//Obj param of get method is ignored for static fields
      } catch (IllegalAccessException e) { /* ignorable due to modifiers check */ }
   }
}

상수를 정의 할 수 있습니다 .attr_current_user는 다음과 같이 c : set의 변수로 다음과 같이 정의 할 수 있습니다.

<c:set var="ATTR_CURRENT_USER" value="<%=Constants.ATTR_CURRENT_USER%>" />
<c:if test="${sessionScope[ATTR_CURRENT_USER] eq null}">     
    <%-- Do somthing --%> 
</c:if> 

EL에서는 정적 특성에 액세스 할 수 없습니다. 내가 사용하는 해결 방법은 정적 값에 할당하는 비 정적 변수를 만드는 것입니다.

public final static String MANAGER_ROLE = 'manager';
public String manager_role = MANAGER_ROLE;

나는 Lombok을 사용하여 Getter와 Setter를 생성하여 꽤 좋습니다. EL은 다음과 같습니다.

${bean.manager_role}

전체 코드 http://www.ninthavenue.com.au/java-constants-in-jsp-and-jsf-el

나는 토론에 늦었지만 나의 접근 방식은 조금 다릅니다. 사용자 정의 태그 핸들러를 사용하여 JSP 페이지에 필요한 상수 값 (숫자 또는 문자열)을 제공합니다. 내가 한 방법은 다음과 같습니다.

모든 상수를 유지하는 수업이 있다고 생각합니다.

public class AppJspConstants implements Serializable {
    public static final int MAXLENGTH_SIGNON_ID = 100;
    public static final int MAXLENGTH_PASSWORD = 100;
    public static final int MAXLENGTH_FULLNAME = 30;
    public static final int MAXLENGTH_PHONENUMBER = 30;
    public static final int MAXLENGTH_EXTENSION = 10;
    public static final int MAXLENGTH_EMAIL = 235;
}

또한이 매우 간단한 사용자 정의 태그가 있습니다.

public class JspFieldAttributes extends SimpleTagSupport {
    public void doTag() throws JspException, IOException {
        getJspContext().setAttribute("maxlength_signon_id", AppJspConstants.MAXLENGTH_SIGNON_ID);
        getJspContext().setAttribute("maxlength_password", AppJspConstants.MAXLENGTH_PASSWORD);
        getJspContext().setAttribute("maxlength_fullname", AppJspConstants.MAXLENGTH_FULLNAME);
        getJspContext().setAttribute("maxlength_phonenumber", AppJspConstants.MAXLENGTH_PHONENUMBER);
        getJspContext().setAttribute("maxlength_extension", AppJspConstants.MAXLENGTH_EXTENSION);
        getJspContext().setAttribute("maxlength_email", AppJspConstants.MAXLENGTH_EMAIL);

        getJspBody().invoke(null);
    }
}

그런 다음 StringHelper.tld가 있습니다. 내부, 나는 이것을 가지고있다 :

<tag>
    <name>fieldAttributes</name>
    <tag-class>package.path.JspFieldAttributes</tag-class>
    <body-content>scriptless</body-content>
    <info>This tag provide HTML field attributes that CCS is unable to do.</info>
</tag>

JSP에는 StringHelper.tld를 정상적인 방법으로 포함시킵니다.

<%@ taglib uri="/WEB-INF/tags/StringHelper.tld" prefix="stringHelper" %>

마지막으로 태그를 사용하고 EL을 사용하여 필요한 값을 적용합니다.

        <stringHelper:fieldAttributes>
[snip]
            <form:input path="emailAddress" cssClass="formeffect" cssErrorClass="formEffect error" maxlength="**${maxlength_email}**"/>&nbsp;
            <form:errors path="emailAddress" cssClass="error" element="span"/>
[snip]
        </stringHelper:fieldAttributes>

Custom EL Resolver를 EL Resolver 체인에 플러그인하여 상수를 해결합니다. EL Resolver는 Java 클래스 확장입니다 javax.el.elresolver 수업.

감사,

먼저, 구문에 추가 "]가 오류가 발생했습니다.

이를 해결하고 변수를 설정하려면 다음을 수행합니다.

<c:set var="nullUser" 
    scope="session" 
    value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />

<c:if test="${nullUser}">
     <h2>First Test</h2>
</c:if>
<c:if test="${nullUser}">
     <h2>Another Test</h2>
</c:if>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top