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