我正在嘗試enum在 EL 內的 JSP 頁面中進行比較。這應該支持 EL 版本 3.0(我正在使用)及更高版本。這是我正在使用的代碼和組態檔:
index.jsp:
<%@page import="net.myapp.MyClass" %>
<%@page import="net.myapp.MyClass.NestedEnum" %>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@page isELIgnored="false" %> <%-- default --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
MyClass mc = new MyClass();
MyClass.NestedEnum[] enums = new MyClass.NestedEnum[]
{MyClass.NestedEnum.NE_VALUE_A, MyClass.NestedEnum.NE_VALUE_B};
request.setAttribute("enums", enums);
%>
<html>
<body>
<h2>Enums in EL</h2>
<c:forEach var="evalue" items="${enums}">
<c:choose>
<c:when test="${evalue == NE_VALUE_A}">
Value is NE_VALUE_A.
</c:when>
<c:when test="${evalue == NestedEnum.NE_VALUE_A}">
Value is NestedEnum.NE_VALUE_A.
</c:when>
<%-- This causes: javax.el.PropertyNotFoundException: No public static field named [NestedEnum] was found on (exported for Java 9 ) class [net.myapp.MyClass]
<c:when test="${evalue == MyClass.NestedEnum.NE_VALUE_A}">
Value is MyClass.NestedEnum.NE_VALUE_A.
</c:when>
--%>
<c:otherwise>
Not value NE_VALUE_A. Actual value: ${evalue}
</c:otherwise>
</c:choose>
<br/>
</c:forEach>
</body>
</html>
MyClass.java:
package net.myapp;
public class MyClass {
private final NestedEnum value = NestedEnum.NE_VALUE_A;
public static enum NestedEnum {
NE_VALUE_A, NE_VALUE_B
}
public NestedEnum getValue() {
return value;
}
}
網頁.xml:
<web-app id="my-webapp" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Archetype Created Web Application</display-name>
</web-app>
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- <dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>-->
</dependencies>
<build>
<finalName>my-webapp</finalName>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
塊中的比較when總是失敗,我得到了otherwise塊的輸出。如果我使用字串比較,例如,
<c:when test="${evalue == 'NE_VALUE_A'}">
然后比較成功。但是,我想知道為什么與列舉值的比較失敗。
PS:應用部署在tomcat服務器上,版本9.0.31。作業系統使用 Java 11。
uj5u.com熱心網友回復:
最簡單的方法是將其與字串進行比較:
<c:when test="${evalue == 'NE_VALUE_A'}">
這是因為 EL 的型別強制規則。
EL 規范的第 1.8.2 節說,以下強制規則適用于相等比較:
如果 A 或 B 是列舉,則將 A 和 B 都強制為列舉,應用運算子
第 1.18.6 節規定了強制轉換為列舉型別“T”的規則:
如果 A 是 String 呼叫 Enum.valueOf(T.getClass(), A) 并回傳結果。
<%page import="…" %>支持您一直嘗試使用的語法,但事實證明,使用該指令無法成功匯入嵌套類名。這可能是因為真正的類名類似于net.myapp.MyClass$NestedEnum.
我不知道您是否可以將該名稱傳遞給<%page import指令。我從未嘗試過。
(而且我一直想知道為什么常規 Java 編譯器允許在import沒有單詞的常規陳述句中嵌套類名static;我在 Java 語言規范中找不到對它的支持。)
如果您使列舉型別成為頂級類,則您的 EL 測驗應該可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/474342.html
上一篇:Mysql容器密碼安全
下一篇:四個非零非負值
