Bagaimana cara menjalankan Java 8 lambda di file JSP

Sep 25 2020

Ini adalah proyek Java JSP dengan manajemen Maven, dan menjalankan Jetty secara lokal.

Aku punya masalah di mana saya mendapatkan error ini ketika mencoba untuk menjalankan lambda di .jspffile: Lambda expressions are allowed only at source level 1.8 or above.

Setup saya:

  • Dalam struktur proyek di Intellij IDEA saya telah menetapkan SDK Proyek dan bahasa Proyek ke Java 8.
  • Tingkat bahasa modul adalah 8 - Lambdas, jenis anotasi, dll.
  • Menggunakan <maven.compiler.source>1.8</maven.compiler.source>dan<maven.compiler.target>1.8</maven.compiler.target>
  • Versi bytecode proyek disetel ke 1.8
  • Versi terbaru Jetty (v9.4.31.x)
  • Proyek ini menggunakan jetty-jspc-maven-pluginplugin yang sudah saya setel sourceVersiondan targetVersionke 1.8 in<configuration>

Apakah ada sesuatu yang saya lewatkan, atau apakah Java 8 sama sekali tidak mungkin dengan JSP / jspc

Jawaban

JoakimErdfelt Sep 25 2020 at 20:59

Yang ada https://github.com/jetty-project/embedded-jetty-jspmemiliki contoh menyiapkan compilerSourceVMdan compilerTargetVMmengizinkan *.jspfile Anda menggunakan fitur Java 8, seperti lambda's.

Pada dasarnya Anda mengkonfigurasi file JettyJspServlet

// Create / Register JSP Servlet (must be named "jsp" per spec)
ServletHolder holderJsp = new ServletHolder("jsp", JettyJspServlet.class);
holderJsp.setInitOrder(0);
holderJsp.setInitParameter("logVerbosityLevel", "DEBUG");
holderJsp.setInitParameter("fork", "false");
holderJsp.setInitParameter("xpoweredBy", "false");
holderJsp.setInitParameter("compilerTargetVM", "1.8");
holderJsp.setInitParameter("compilerSourceVM", "1.8");
holderJsp.setInitParameter("keepgenerated", "true");
servletContextHandler.addServlet(holderJsp, "*.jsp");

Saya melanjutkan dan menambahkan lambda.jsp yang menggunakan lambda sederhana dalam JSP untuk membuktikannya. (lambda's dicampur dengan jsp's JspWriter agak rumit, itu bukan pilihan terbaik dari contoh di belakang)