itsource

JSTL과 함께 EL을 사용하여 Enum 값에 액세스합니다.

mycopycode 2022. 9. 30. 11:09
반응형

JSTL과 함께 EL을 사용하여 Enum 값에 액세스합니다.

Status라는 이름의 Enum이 다음과 같이 정의되어 있습니다.

public enum Status { 

    VALID("valid"), OLD("old");

    private final String val;

    Status(String val) {
        this.val = val;
    }

    public String getStatus() {
        return val;
    }

}

가치로 접근하고 싶다VALIDJSTL을 사용합니다.으로는, 「」입니다.test「」의 <c:when>

<c:when test="${dp.status eq Status.VALID">

이게 가능한지 모르겠어요.

문자열과의 간단한 비교는 다음과 같습니다.

<c:when test="${someModel.status == 'OLD'}">

Spring MVC를 사용하는 경우 Spring Expression Language(SPEL)가 도움이 됩니다.

<spring:eval expression="dp.status == T(com.example.Status).VALID" var="isValid" />
<c:if test="${isValid}">
   isValid
</c:if>

여기에는 3가지 선택지가 있지만, 어느 것도 완벽하지 않습니다.

  1. 는 ''에 것을 할 수 .test★★★★

    <c:when test="<%= dp.getStatus() == Status.VALID %>">

    이것은 열거형을 사용하지만 스크립트렛도 사용합니다.JSP 2.0을 사용합니다. 가장 한 것은, 입니다.when를 사용합니다.${}Session)으로 pageContext할 수 ..tag파일)을 클릭합니다.

  2. 문자열과 비교할 수 있습니다.

    <c:when test="${dp.status == 'VALID'}">

    깔끔해 보이지만 열거값이 중복되어 컴파일러에 의해 검증될 수 없는 문자열을 도입하고 있습니다.따라서 열거형에서 해당 값을 삭제하거나 이름을 바꾸면 코드의 이 부분에 더 이상 액세스할 수 없습니다.기본적으로 매번 코드를 통해 검색/교환해야 합니다.

  3. 사용하는 각 열거값을 페이지 컨텍스트에 추가할 수 있습니다.

    <c:set var="VALID" value="<%=Status.VALID%>"/>

    그러면 다음과 같이 할 수 있습니다.

    <c:when test="${dp.status == VALID}">

스크립트렛도 사용하지만 마지막 옵션(3)이 더 좋습니다.사용자가 값을 설정할 때만 이 값이 사용되기 때문입니다.나중에 다른 EL 조건과 함께 더 복잡한 EL 식에서 사용할 수 있습니다.(1)에서는을 (1) EL에서 할 수 .test의 "Atribute" 의 when붙이다

문제를 완전히 해결하려면 다음 작업을 수행해야 합니다.

<% pageContext.setAttribute("old", Status.OLD); %>

그 후, 다음과 같이 할 수 있었습니다.

<c:when test="${someModel.status == old}"/>...</c:when>

예상대로 작동했어요.

다음으로 두 가지 가능성을 제시하겠습니다.

JSP EL 3.0 상수

버전 3.0 이상의 EL을 사용하고 있는 한 다음과 같이 상수를 페이지로 Import할 수 있습니다.

<%@ page import="org.example.Status" %>
<c:when test="${dp.status eq Status.VALID}">

그러나 일부 IDE는 IntelliJ 등 아직 이를 인식하지 못하기 때문에 실행 시까지 오타가 발생해도 경고를 받지 않습니다.

IDE가 제대로 지원되면 이 방법을 사용하는 것이 좋습니다.

도우미 방법

getters를 열거형에 추가할 수 있습니다.

public enum Status { 
  VALID("valid"), OLD("old");

  private final String val;

  Status(String val) {
    this.val = val;
  }

  public String getStatus() {
    return val;
  }

  public boolean isValid() {
    return this == VALID;
  }

  public boolean isOld() {
    return this == OLD;
  }
}

다음으로 JSP에서 다음을 수행합니다.

<c:when test="${dp.status.valid}">

이 기능은 모든 IDE에서 지원되며 아직 EL 3.0을 사용할 수 없는 경우에도 사용할 수 있습니다.이것이 내가 지금 하고 있는 일이다. 왜냐하면 그것은 모든 논리를 내 열거에 포함시키기 때문이다.

또한 열거형을 저장하는 변수가 null일 수 있는 경우에도 주의하십시오.코드가 null이 아님을 보증하지 않는 경우 먼저 확인해야 합니다.

<c:when test="${not empty db.status and dp.status.valid}">

이 방법은 JSP에서 중간값을 설정하는 방법보다 우수하다고 생각합니다.왜냐하면 열거를 사용해야 하는 각 페이지에서 중간값을 설정해야 하기 때문입니다.단, 이 솔루션에서는 getter를 한 번만 선언하면 됩니다.

이 목적을 위해 다음 작업을 수행합니다.

<c:set var="abc">
    <%=Status.OLD.getStatus()%>
</c:set>

<c:if test="${someVariable == abc}">
    ....
</c:if>

보기엔 못생겼지만 효과가 있어요!

코넬의 질문에 대한 답변은 없지만, 다른 대본 예제에 대한 언급이 있습니다.대부분의 표현은 에 대해 암묵적으로 신뢰합니다.toString()단,Enum.valueOf()로부터 또는 로부터의 가치를 기대한다.Enum.name()소유물.따라서 다음과 같이 사용해야 합니다.

<% pageContext.setAttribute("Status_OLD", Status.OLD.name()); %>
...
<c:when test="${someModel.status == Status_OLD}"/>...</c:when>

다음과 같은 메서드를 열거에 추가합니다.

public String getString() {
    return this.name();
}

예를들면

public enum MyEnum {
    VALUE_1,
    VALUE_2;
    public String getString() {
        return this.name();
    }
}

다음으로 다음을 사용할 수 있습니다.

<c:if test="${myObject.myEnumProperty.string eq 'VALUE_2'}">...</c:if>

MVC 프레임워크를 사용할 때 컨트롤러에 다음을 넣습니다.

request.setAttribute(RequestParameterNamesEnum.INBOX_ACTION.name(), RequestParameterNamesEnum.INBOX_ACTION.name());

이를 통해 JSP 페이지에서 다음을 사용할 수 있습니다.

<script> var url = 'http://www.nowhere.com/?${INBOX_ACTION}=' + someValue;</script>

비교에도 사용할 수 있습니다.

<c:when test="${someModel.action == INBOX_ACTION}">

스트링 리터럴을 넣는 것보다 더 좋아

<%@ page import="com.example.Status" %>

1. ${dp.status eq Title.VALID.getStatus()}
2. ${dp.status eq Title.VALID}
3. ${dp.status eq Title.VALID.toString()}
  • 가져오기를 JSP 페이지 머리글 맨 에 배치합니다.
  • getStatus 메서드로 작업하려면 #1을 사용합니다.
  • enum 요소 자체에 대해 작업하려면 #2 또는 #3 중 하나를 사용합니다.
  • eq 대신 ==를 사용할 수 있습니다.

jsps/tag 파일에 Java 코드를 혼재시키는 것은 일반적으로 나쁜 관행이라고 생각합니다.'eq'를 사용하면 다음과 같은 효과를 얻을 수 있습니다.

<c:if test="${dp.Status eq 'OLD'}">
  ...
</c:if>

쓸 점이 많을 때 이렇게 하는데...

public enum Status { 

    VALID("valid"), OLD("old");

    private final String val;

    Status(String val) {
        this.val = val;
    }

    public String getStatus() {
        return val;
    }

    public static void setRequestAttributes(HttpServletRequest request) {
        Map<String,String> vals = new HashMap<String,String>();
        for (Status val : Status.values()) {
            vals.put(val.name(), val.value);
        }
        request.setAttribute("Status", vals);
    }

}

JSP

<%@ page import="...Status" %>
<% Status.setRequestAttributes(request) %>

<c:when test="${dp.status eq Status.VALID}">
...

Java 클래스의 경우:

    public class EnumTest{
    //Other property link
    private String name;
    ....

        public enum Status {
                ACTIVE,NEWLINK, BROADCASTED, PENDING, CLICKED, VERIFIED, AWARDED, INACTIVE, EXPIRED, DELETED_BY_ADMIN;
            }

        private Status statusobj ;

    //Getter and Setters
}

이것으로 POJO와 enum obj가 생성됩니다.이제 EnumTest는 servlet 또는 컨트롤러 클래스 세션을 사용하여 session 개체로 설정합니다.setAttribute("enumTest", EnumTest);

[ JSP ]페이지에서

<c:if test="${enumTest.statusobj == 'ACTIVE'}">

//TRUE??? THEN PROCESS SOME LOGIC

언급URL : https://stackoverflow.com/questions/123598/access-enum-value-using-el-with-jstl

반응형