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;
}
}
가치로 접근하고 싶다VALID
JSTL을 사용합니다.으로는, 「」입니다.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가지 선택지가 있지만, 어느 것도 완벽하지 않습니다.
는 ''에 것을 할 수 .
test
★★★★<c:when test="<%= dp.getStatus() == Status.VALID %>">
이것은 열거형을 사용하지만 스크립트렛도 사용합니다.JSP 2.0을 사용합니다. 가장 한 것은, 입니다.
when
를 사용합니다.${}
Session)으로pageContext
할 수 ..tag
파일)을 클릭합니다.문자열과 비교할 수 있습니다.
<c:when test="${dp.status == 'VALID'}">
깔끔해 보이지만 열거값이 중복되어 컴파일러에 의해 검증될 수 없는 문자열을 도입하고 있습니다.따라서 열거형에서 해당 값을 삭제하거나 이름을 바꾸면 코드의 이 부분에 더 이상 액세스할 수 없습니다.기본적으로 매번 코드를 통해 검색/교환해야 합니다.
사용하는 각 열거값을 페이지 컨텍스트에 추가할 수 있습니다.
<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
'itsource' 카테고리의 다른 글
REST 웹 서비스를 위한 Spring 4 vs Jersey (0) | 2022.09.30 |
---|---|
라우터 파라미터에 기반한 Vue http를 사용한 데이터 가져오기 (0) | 2022.09.30 |
VueJS 라우터 - 서브루트와 Vuetify를 사용할 때 여러 활성화루트를 정지하려면 어떻게 해야 하나요? (0) | 2022.09.30 |
PHP에서 변수 이름을 문자열로 가져오려면 어떻게 해야 합니까? (0) | 2022.09.30 |
galera 클러스터에서 노드를 삭제하려면 어떻게 해야 합니까? (0) | 2022.09.29 |