[英]Lambda expressions in JSP files will not compile (continued)
我在這里找到以下文章: JSP 文件中的 Lambda 表達式將無法編譯
所以我在 Tomcat 的 conf/web.xml 中添加了 compilerSourceVM 和 compilerTargetVM。 (不在項目 web.xml 中)。
所以一般來說我可以使用 stream,但是對於(一些?)lambda 表達式,JSP 不會被 JSP 編譯。
以下是示例。 我想讓 lambda 工作,我不是在第一個示例中尋找更好的編碼。
簡單示例(工作):
<p>
Cookies:<br />
<%
Cookie[] cookies = request.getCookies();
if ( cookies == null || cookies.length == 0 ) {
out.println("No cookies found<br/>");
} else {
out.println("Cookies found size=" + cookies.length + "<br/>");
List<Cookie> cList = Arrays.stream(request.getCookies()).collect(Collectors.toList());
for ( Cookie c : cList ) {
out.println("C: " + c + "<br/>");
}
out.println("Cookies found size=" + cookies.length + "<br/>");
}
%>
</p>
簡單示例(不工作):
我將使用 Stream::forEach 和 lambda 表達式來代替 for 循環並在列表中收集,例如:
Arrays.stream(request.getCookies()).forEach(cookie -> {out.println("Cookie information here<br/>");});
在 Eclipse 中 JSP 將被編譯並且不顯示一些錯誤。
部署到 Tomcat 並調用 URL,我得到:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: [53] in the jsp file: [/report.jsp]
Unhandled exception type IOException
50: } else {
51: out.println("Cookies found size=" + cookies.length + "<br/>");
52: Arrays.stream(request.getCookies()).forEach(cookie -> {
53: out.println("Cookie information here<br/>");
54: });
有什么提示嗎?
提前致謝。
編輯:
我切換到 Tomcat 9。同樣的問題。 我還發現了一些提示,Java 1.8 + stream + lambdas 應該在 Tomcat8+9 中工作。
所以我改變了 lambda 表達式,如:
Arrays.stream(request.getCookies()).forEach(cookie -> {System.out.println("Cookie information here<br/>");});
所以我將“out.println”替換為“System.out.println”。 現在 stream 和 lambda 正在工作。 Println 按預期進入控制台。 還添加了一些“.filter”。 也工作正常。
現在的問題。 為什么我不能在 lambda 表達式中使用 out.println 或 out.write。 在同一個 JSP 中,out.println 在上面示例中顯示的 for-each 循環中工作。 任何想法?
編輯:
發現下一個問題,這是純Java問題,所以當你在Eclipse中編輯一個JSP時。 Eclipse 沒有在編輯器中顯示這個問題。
a.) out.write/out.println 會拋出一個檢查異常,所以我需要一個 try/catch,因為 lambda 不允許檢查異常。
b.) out 變量必須是最終的。 所以你需要一個final JspWriter myOut = out;
c。)您可能必須將 JSP API 庫導入我們的項目。 Gradle 示例: providedCompile 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.0'
您可以嘗試在 web.xml 中添加以下初始化參數嗎?
<init-param>
<param-name>compilerSourceVM</param-name>
<param-value>1.8</param-value>
</init-param>
<init-param>
<param-name>compilerTargetVM</param-name>
<param-value>1.8</param-value>
</init-param>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.