Ich möchte die Annotation @WebServlet
in einer Java EE-Webapp verwenden, die auf Tomcat 8 ausgeführt wird.
Ich habe gelesen, dass ich Servlet Version 3.1 in meinem web.xml
deklarieren muss und dass mein Servlet HttpServlet
erweitern muss. Ich habe das alles gemacht, aber der @WebServlet
funktioniert nicht. Ich bekomme ein HTTP 404.
Ich habe auch meine Konfiguration mit metadata-complete="false"
in meinem web.xml
ausprobiert, aber immer noch keinen Erfolg.
Hier ist meine web.xml und mein Servlet.
Den vollständigen Beispielcode finden Sie auf GitHub .
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
<!-- http://stackoverflow.com/a/7924117/451634 -->
<!-- Put "-1" to disable this feature -->
<context-param>
<param-name>facelets.REFRESH_PERIOD</param-name>
<param-value>1</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<!-- JSF -->
<listener>
<listener-class>org.Apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
<!-- CDI -->
<listener>
<listener-class>org.Apache.webbeans.servlet.WebBeansConfigurationListener</listener-class>
</listener>
</web-app>
TestServlet.Java
import Java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "TestServlet", urlPatterns = {"*.serve"})
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try (ServletOutputStream out = resp.getOutputStream()) {
out.write("Hello World".getBytes());
out.flush();
}
}
}
Ich habe es zum Laufen gebracht. Ich musste die Art und Weise erweitern, wie ich meinen Tomcat 8.0.12-Server gestartet habe.
Trotzdem gibt es drei Hauptpunkte, die getan werden müssen:
web-app version
in web.xml muss mindestens 3.0 sein ( ich habe 3.1 verwendet)metadata-complete
in web.xml ist möglicherweise nicht wahr (default is "false"
)classes
-Verzeichnisse müssen vor dem Start zum eingebetteten Tomcat hinzugefügt werdenHier ist ein Beispiel für die Datei web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="3.1"
metadata-complete="false"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
So sieht meine Tomcat-Hauptklasse aus (die jetzt @WebServlet
-Annotationen unterstützt):
public static void main(String[] args) throws Exception {
String contextPath = "/";
String webappDirLocation = "src/main/webapp/";
String baseDirectory = new File(webappDirLocation).getAbsolutePath();
Tomcat tomcat = new Tomcat();
Tomcat.setPort(8080);
StandardContext context = (StandardContext) Tomcat.addWebapp(contextPath, baseDirectory);
// Additions to make @WebServlet work
String buildPath = "target/classes";
String webAppMount = "/WEB-INF/classes";
File additionalWebInfClasses = new File(buildPath);
WebResourceRoot resources = new StandardRoot(context);
resources.addPreResources(new DirResourceSet(resources, webAppMount, additionalWebInfClasses.getAbsolutePath(), contextPath));
context.setResources(resources);
// End of additions
Tomcat.start();
Tomcat.getServer().await();
}
Wie wäre es mit @ServletComponentScan?
Beispiel aus http://www.baeldung.com/spring-servletcomponentscan
@ServletComponentScan
@SpringBootApplication
public class SpringBootAnnotatedApp {
public static void main(String[] args) {
SpringApplication.run(SpringBootAnnotatedApp.class, args);
}
}
Versuchen Sie, dies hinzuzufügen:
((StandardJarScanner) context.getJarScanner()).setScanAllDirectories(true);