2014-10-06 6 views
5

Mam następujący kod do korzystania z osadzonego serwera Jetty obok prostego serwletu i strony internetowej .jsp. Jednak po kompilacji i uruchamiania kodu:Wbudowany serwer Jetty - brak obsługi JSP dla /, nie znaleziono 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 

pojawia się błąd:

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

A przechodząc do /index.jsp daje błąd 500.

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

Czytałem ten post ale nie sądzę rozwiązanie stosuje się tutaj, bo biegnę Jetty osadzone raczej niż przy użyciu start.jar.

Jak mogę rozwiązać ten błąd, aby serwer działał poprawnie i wyświetlał strony .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> 

To mój stru projekt braz:

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

Musisz wywołać java z nazwą klasy, więc 'com.test.ServerMain' zamiast' com/test/ServerMain' (dla javac jest poprawny) – msrd0

+0

Dzięki @ msrd0, to faktycznie działa poprawnie, używając 'java com. test.ServerMain' i 'java com/test/ServerMain' ale dzięki za wskazówkę. –

+0

Czy jesteś pewien, że używane biblioteki zawierają klasę "org.apache.jasper.servlet.JspServlet"? 'jar tf lib/servlet-api.jar' pomoże – msrd0

Odpowiedz

2

Wydaje się jakbyś brakuje JAR-pliku, który zawiera klasę org.apache.jasper.servlet.JspServlet. Pobierz plik JAR zawierający go (spójrz na here) i dodaj go do swojej ścieżki klas. Również na marginesie należy zastąpić com/test/ServerMain prawdziwą nazwą klasy, com.test.ServerMain. Ci java stwierdzenie powinno wyglądać następująco:

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

Gdzie dokładnie powinienem umieścić ten JAR? –

+0

@HelpingHands to nie ma znaczenia, o ile wprowadzisz poprawną ścieżkę jako ścieżkę klasy do polecenia java – msrd0

3

Nawiasem mówiąc, jest to projekt github, prowadzony przez Jetty Project, demonstrując poparcie JSP w Jetty wbudowanych.

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

+0

Dzięki @Joakim, po rozejrzeniu się wydaje się, że istnieje kilka zależności zależnych od pliku JAR, aby uzyskać obsługę JSP Jaspca pracować wewnątrz pomostu. Miałem nadzieję, że będzie tylko jeden plik jar do pobrania, aby mój projekt był lekki i przenośny, ale nie mogłem go znaleźć. Ostatecznie zdecydował, że wsparcie jsp nie było warte dodatkowej wagi. –

+0

@ Rob144 heh, JSP nie jest lekki. Zwłaszcza jeśli używasz artefaktów Glassfish/Jasper, nieco mniej, jeśli używasz artefaktów Apache/Jasper. –

+0

@ Rob144 również użycie 'jetty-all.jar' jest antytezą wagi lekkiej, dosłownie zawiera wszystko i zlew kuchenny dostępny w Jetty, z czego większość projektów wykorzystuje mniej niż 30%. W rzeczywistości sposób, w jaki struktura kodu jest skonstruowana, nie byłaby w stanie wykorzystać 100% tego słoika w jednym projekcie (ponieważ niektóre funkcje są opcjonalne i raz użyte wyłącznie zabraniają używania innych funkcji) –

2

nie próbowałem dla osadzonych Jetty ale podczas uruchamiania Jetty 9.3 jako usługę trzeba dodać obsługę JSP.

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

Gdzie JETTY_BASE to folder gdzie można wdrożyć aplikację, która jest oddzielona od JETTY_HOME. Zgaduję więc, że wbudowany Jetty potrzebowałby podobnej konfiguracji.

+0

Jak ustawić obsługę JSP w kodzie Java? jakiejkolwiek próbki proszę? –

+1

JSP po prostu działa. Jeśli upuścisz plik JSP wewnątrz folderu w katalogu głównym aplikacji webapps, możesz uruchomić go bezpośrednio. Jednak niektóre frameworki (takie jak Spring) mogą wymagać dodatkowej konfiguracji, aby dostać się do określonej strony. – Nux

+0

Nux, zaoszczędziłeś mi dzisiaj wiele czasu. Dziękuję Ci. Nie podejrzewałbym, że coś takiego jak JSP będzie modułem. (Nowy na Jetty) –

Powiązane problemy