我正在學習Java EE 7 Servlets,並嘗試使用嵌入式Jetty(v 9.3.7)從Java EE 7教程部署hello2
example,但收效甚微。 hello2
由兩個servlet和一個圖像文件組成。該配置被註釋並且該項目沒有任何web.xml。使用帶註釋的配置文件的嵌入式碼頭
繼WebAppContext
部分從嵌入碼頭examples我創造了這個主類以啓動我的嵌入式服務器:
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();
}
}
據我瞭解,由於碼頭是一個Java EE Web容器,它應該能夠服務於示例Serlvet項目是,我只需要指向戰爭文件夾結構。以下是該項目的結構:
-- 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。以下是該文件被編譯爲hello2/webapp/classes/
從而使webapp
文件夾的分解WAR的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 {
....
某些部分。我添加index.html是爲了測試Jetty是否選擇它。其結果是,我得到404錯誤當我訪問本地主機:8080,本地主機:8080 /問候或本地主機:8080 /響應
如果我添加WebXmlConfiguration
與webapp.setConfigurations()
,然後設置類似webapp.setResourceBase(webappPath)
的資源基礎,我設法進入Jetty的靜態文件服務器。這是因爲Jetty然後使用默認的web.xml
,它將用於文件服務目的的servlet添加到服務器。但即使如此,我的註釋servlet沒有拿起。
我有碼頭閱讀註釋servlet配置是通過設置WEB-INF
目錄的方式明確使用WebAppContext.getMetadata().setWebInfClassesDirs()
:
webapp.getMetaData().setWebInfClassesDirs(
Arrays.asList(Resource.newResource(
MyServer.class.getProtectionDomain().getCodeSource().getLocation())));
然後,servlet的反應不如預期,但這並不爲我的index.html
或圖像文件。我也將資源庫設置爲無用。所以我想要的是Jetty無需web.xml
即可爲我的Web應用程序提供服務,並且只需將它指向展開的WAR目錄即可。顯然我錯過了一些東西。
正如我在我的問題中寫的,我使用註釋來配置,而不是在Java EE 7中可選的web.xml。另外,我相信我不需要WEB-INF/lib,因爲我沒有使用它。我只使用了AnnotationConfiguration,因爲我配置了註釋中的所有內容,我想了解它爲什麼不起作用。我的理論是,這個設置應該適用於所有支持servlet容器的Java EE 7。 – qtips
即使您沒有實際的文件,您仍然需要配置,因爲這是如何設置webapp元數據的。沒有配置,沒有元數據,沒有關於設置的知識,等等。元數據是構建在所有這些配置上的。只有Annotation/Plus/Env是可選的,其餘都是必需的。 –
添加WebInfConfiguration時,Jetty開始閱讀我的註釋配置:)我仍然認爲我不應該需要WebXmlConfiguration,因爲我看到Jetty使用默認的web.xml來設置一些內置的servlet。但沒有它,Jetty不會服務我的index.html。爲什麼必須添加自己的web.xml以支持靜態內容?我想我被Jettys WebAppContext弄糊塗了;它用於專門爲Web應用程序提供服務(與ServletContextHandler相比),但不支持標準的Java EE配置,不使用setConfigurations。 – qtips