簡體   English   中英

JSP 文件中的 Lambda 表達式將無法編譯(續)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM