问题描述
我想在运行于Tomcat 8的Java EE Web应用程序中使用@WebServlet
批注.
I want to use the @WebServlet
annotation in a Java EE webapp which runs on Tomcat 8.
我已经阅读到我需要在web.xml
中声明Servlet版本3.1,并且我的Servlet需要扩展HttpServlet
.我做了所有这些,但是@WebServlet
仍然不起作用.我正在获取HTTP404.
I have read that I need to declare Servlet Version 3.1 in my web.xml
and that my Servlet needs to extend HttpServlet
. I did all that but still the @WebServlet
doesn't work. I am getting a HTTP 404.
我还尝试在web.xml
中使用metadata-complete="false"
进行配置,但是仍然没有成功.
I also tried my configuration with metadata-complete="false"
in my web.xml
, but still no success.
这是我的web.xml和Servlet.
Here is my web.xml and Servlet.
完整的示例代码可以在GitHub上找到.
The complete sample code can be found on 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();
}
}
}
推荐答案
我知道了.我必须扩展启动Tomcat 8.0.12服务器的方式.
I got it working. I had to extend the way I started my Tomcat 8.0.12 server.
但是,必须完成三件事:
Nevertheless, there are three main things that must be done:
- web.xml 中的
-
web-app version
必须至少为3.0(我使用的是3.1 ) web.xml 中的 -
metadata-complete
可能不正确(default is "false"
) 开始之前,必须将 -
classes
目录添加到嵌入式Tomcat
web-app version
in web.xml has to be at least 3.0 (I used 3.1)metadata-complete
in web.xml may not be true (default is "false"
)classes
directories have to be added to the embedded Tomcat before start
以下是 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>
这是我的Tomcat主类的外观(现在支持@WebServlet
注释):
This is how my Tomcat main class looks like (which supports now @WebServlet
annotations):
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();
}
这篇关于@WebServlet注释不适用于Tomcat 8的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!