2014-10-06 24 views
5

Ho il seguente codice per utilizzare un server Jetty integrato insieme a un semplice servlet e una pagina web .jsp. Tuttavia, dopo la compilazione e l'esecuzione del codice:Embedded Jetty Server - NO supporto JSP per /, non trovato org.apache.jasper.servlet.JspServlet

javac -cp lib/servlet-api.jar:lib/jetty-all.jar com/test/MyServlet.java 
javac -cp lib/servlet-api.jar:lib/jetty-all.jar com/test/ServerMain.java 
java -cp .:lib/servlet-api.jar:lib/jetty-all.jar com/test/ServerMain 

ottengo un errore:

INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet 

E la navigazione verso /index.jsp dà un errore 500.

HTTP ERROR 500 
Problem accessing /index.jsp. 
Reason: 
JSP support not configured 

ho letto questo post ma non credo che la soluzione si applica qui perché sto correndo Jetty incorporato, piuttosto che utilizzare lo start.jar.

Come posso risolvere questo errore in modo che il server esegua e serva correttamente le pagine .jsp?

ServerMain.java

package com.test; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.webapp.WebAppContext; 

public class ServerMain { 

    public static void main(String[] args) throws InterruptedException { 

     Server server = new Server(8080); 
     WebAppContext webApp = new WebAppContext(); 
     webApp.setDescriptor("web.xml"); 
     webApp.setResourceBase(""); 
     webApp.setParentLoaderPriority(true); 
     server.setHandler(webApp); 

     try { 
      server.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 
     server.join(); 
    } 
} 

MyServlet.java

package com.test; 

import java.io.IOException; 
import java.util.Properties; 

import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class MyServlet extends HttpServlet { 
    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 

     resp.setContentType("text/plain"); 
     resp.getWriter().println("Hello, this is a testing servlet. \n\n"); 
     Properties p = System.getProperties(); 
     p.list(resp.getWriter()); 

    } 
} 

web.xml

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE web-app PUBLIC "-//Oracle Corporation//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> 
    <servlet> 
     <servlet-name>MyServlet</servlet-name> 
     <servlet-class>com.test.MyServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>MyServlet</servlet-name> 
     <url-pattern>/test</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

Questo è il mio progetto stru cture:

webapp 
----com 
    ----test 
     ----MyServlet.java 
     ----ServerMain.java 
     ----index.jsp 
     ----web.xml 
----lib 
    ----jetty-all.jar 
    ----servlet-api.jar 
+0

È necessario chiamare java con il nome della classe, quindi 'com.test.ServerMain' invece di' com/test/ServerMain' (per javac è corretto) – msrd0

+0

Grazie @ msrd0, viene eseguito correttamente utilizzando 'java com. test.ServerMain' e 'java com/test/ServerMain' ma grazie per il suggerimento. –

+0

Sei sicuro che le librerie in uso includano la classe 'org.apache.jasper.servlet.JspServlet'? 'jar tf lib/servlet-api.jar' sarebbe di aiuto – msrd0

risposta

2

Sembra che vi state perdendo un file JAR, che include la classe org.apache.jasper.servlet.JspServlet. Scarica un file JAR che lo contiene (guarda here) e aggiungilo al classpath. Inoltre, su una nota a margine, è necessario sostituire com/test/ServerMain con il nome della classe reale, com.test.ServerMain. Si dichiarazione java dovrebbe assomigliare a questo:

java -cp ".:lib/servlet-api.jar:lib/jetty-all.jar:lib/apache-jasper.jar" com.test.ServerMain 
+0

Dove dovrei mettere esattamente questo JAR? –

+0

@HelpingHands non importa finché si immette il percorso corretto come classpath al comando java – msrd0

3

Per inciso, c'è un progetto github, gestito dal Progetto Jetty, dimostrando supporto JSP in Jetty embedded.

https://github.com/jetty-project/embedded-jetty-jsp

+0

Grazie a @Joakim, dopo aver guardato attorno sembra che ci siano un numero di dipendenze file jar necessarie per ottenere il supporto jsp di jasper lavorare dentro il molo Speravo che ci fosse solo un file jar da scaricare per mantenere il mio progetto leggero e portatile, ma non riuscivo a trovarne uno. Infine, il supporto jsp deciso non valeva il peso extra. –

+0

@ Rob144 heh, JSP è tutto tranne che leggero. Soprattutto se usi gli artefatti Glassfish/Jasper, un po 'meno quando usi le risorse di Apache/Jasper. –

+0

@ Rob144 inoltre, l'uso di 'jetty-all.jar' è l'antitesi della leggerezza, contiene letteralmente tutto e il lavello della cucina che Jetty ha a disposizione, di cui la maggior parte dei progetti usa meno del 30%. In effetti, il modo in cui è strutturato il codice, sarebbe impossibile utilizzare il 100% di quel jar in un singolo progetto (poiché alcune funzionalità sono facoltative e una volta utilizzate esclusivamente per impedire l'utilizzo di altre funzionalità) –

2

non hanno provato per embedded Jetty, ma durante l'esecuzione Jetty 9.3 come un servizio è necessario aggiungere il supporto JSP.

cd $JETTY_BASE 
$JAVA_HOME/bin/java -jar $JETTY_HOME/start.jar --add-to-startd=jsp 

Dove JETTY_BASE è la cartella in cui si distribuisce l'applicazione che è separato da JETTY_HOME. Quindi immagino che Jetty embedded abbia bisogno di una configurazione simile.

+0

Come impostare il supporto JSP nel codice Java? qualsiasi campione per favore? –

+1

JSP funziona solo. Se si rilascia un file JSP in una cartella nella root di webapps, è possibile eseguirlo direttamente. Tuttavia alcuni framework (come Spring) potrebbero richiedere alcune impostazioni extra per arrivare a una determinata pagina. – Nux

+0

Nux, mi hai risparmiato un sacco di tempo stasera. Grazie. Non avrei sospettato che qualcosa come JSP sarebbe stato un modulo. (Nuovo al molo) –