【发布时间】:2016-09-27 15:29:18
【问题描述】:
我正在学习 Java EE 7 Servlet,并尝试使用嵌入式 Jetty (v 9.3.7) 从 Java EE 7 教程中部署 hello2 example,但收效甚微。 hello2 由两个 servlet 和一个图像文件组成。配置有注释,项目没有任何web.xml。
在嵌入式 Jetty examples 的 WebAppContext 部分之后,我创建了这个主类来启动我的嵌入式服务器:
public class MyServer {
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
String webappPath = new File(MyServer.class.getProtectionDomain().getCodeSource().getLocation().getFile())
.getParentFile().getParentFile().getAbsolutePath();
WebAppContext webapp = new WebAppContext(webappPath, "");
webapp.setConfigurations(new Configuration[]{
new AnnotationConfiguration()});
server.setHandler(webapp);
server.start();
server.join();
}
}
据我了解,由于 Jetty 是一个 Java EE Web 容器,它应该能够按原样服务于示例 Serlvet 项目,我只需要指向 war 文件夹结构。以下是项目的结构:
-- hello2
\-- src
\-- main
+-- java
│ +-- MyServer.java
│ \-- javaeetutorial
│ \-- hello2
│ +-- GreetingServlet.java
│ \-- ResponseServlet.java
\-- webapp
+-- WEB-INF
│ \-- classes
│ +-- MyServer.class
│ \-- javaeetutorial
│ \-- hello2
│ +-- GreetingServlet.class
│ \-- ResponseServlet.class
+-- index.html
\-- resources
\-- images
\-- duke.waving.gif
hello2 示例代码可以在here 找到。以下是GreetingServlet的部分内容
@WebServlet("/greeting")
public class GreetingServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
....
和ResponseServlet
@WebServlet("/response")
public class ResponseServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
....
文件被编译为hello2/webapp/classes/,从而使webapp 文件夹成为分解的WAR。 index.html 是我添加的内容,只是为了测试 Jetty 是否能够接收到它。结果是当我访问 localhost:8080、localhost:8080/greeting 或 localhost:8080/response 时出现错误 404
如果我添加WebXmlConfiguration 和webapp.setConfigurations(),然后像webapp.setResourceBase(webappPath) 这样设置资源库,我就可以进入Jetty 的静态文件服务器。这是因为 Jetty 然后使用默认的web.xml,它将自己的 servlet 添加到服务器以提供文件服务。但即便如此,我的带注释的 servlet 也没有被拾取。
我让 Jetty 读取带注释的 servlet 配置的方法是使用 WebAppContext.getMetadata().setWebInfClassesDirs() 显式设置 WEB-INF 目录:
webapp.getMetaData().setWebInfClassesDirs(
Arrays.asList(Resource.newResource(
MyServer.class.getProtectionDomain().getCodeSource().getLocation())));
然后,servlet 会按预期响应,但这不会为我的index.html 或图像文件提供服务。我还将资源库设置为无用。所以我想要的是 Jetty 在没有 web.xml 的情况下为我的 Web 应用程序提供服务,只需将其指向分解的 WAR 目录即可。显然我错过了一些东西。
【问题讨论】:
标签: java servlets embedded-jetty