2012-04-23 14 views
46

私は現在の作業ディレクトリのサブディレクトリである "html"ディレクトリから静的ファイルを提供する埋め込みJettyを使って簡単なデモアプリケーションを構築しようとしています。アイデアは、デモ用のjarとコンテンツを含むディレクトリを新しい場所に移動しても動作させることができるということです。Jettyが埋め込まれた静的ファイルの処理

私は以下のバリエーションを試しましたが、私は404を得続けます。

ServletContextHandler context = 
         new ServletContextHandler(ServletContextHandler.SESSIONS); 
context.setContextPath("/"); 

context.getInitParams().put(
         "org.eclipse.jetty.servlet.Default.resourceBase", "html"); 
context.addServlet(new ServletHolder(new DefaultServlet()), "/html"); 

Server jetty = new Server(8080); 
jetty.setHandler(context); 

jetty.start(); 

更新:突堤のチュートリアルに記載されているようにここソリューションです。正しい答えで述べたように、それは代わりにServletContextHandlerResourceHandlerを使用しています。

Server server = new Server(); 
    SelectChannelConnector connector = new SelectChannelConnector(); 
    connector.setPort(8080); 
    server.addConnector(connector); 

    ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setDirectoriesListed(true); 
    resource_handler.setWelcomeFiles(new String[]{ "index.html" }); 

    resource_handler.setResourceBase("."); 

    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() }); 
    server.setHandler(handlers); 

    server.start(); 
    server.join(); 
+0

これで動作しますpom.xmlファイル:https://code.google.com/p/ram-badger/source/browse/trunk/static-jetty/pom明示的にデフォルトサーブレットを使用するためにそれを伝えます。 xml – cwash

+1

これはjetty 9で動作しないようです... –

+1

jetty 9と同じ問題が発生している場合は、この問題が発生します。@see - http://stackoverflow.com/questions/28346438/resourcehandler-stop-hosting-files-with-jetty -9-404-not-found-error-works-fin –

答えて

30

ResourceHandlerの代わりServletContextHandlerを使用してください。

+1

確かに... http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/handler/ResourceHandler.html –

+4

それはトリックをやった!みんなありがとう!このコードはJettyのチュートリアルでも提供されています。ドー! http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty#Configuring_a_File_Server – HolySamosa

+1

javax.servletが必要な場合は、依然として 'ServletContextHandler'を使用することができます。フィルター(詳細は下記の私のコメントを参照してください) – xorcus

18

ResourceHandlerを使用し、DefaultServletServletContextHandler)を使用して静的コンテンツを配信する場合、重要な違いがあります。

ResourceHandler(または複数のコンテキストを保持する)がコンテキストハンドラとして設定されている場合、要求を直接処理し、登録されているjavax.servlet.Filterインスタンスを無視します。

フィルタが必要な場合は、ServletContextHandlerを使用してフィルタを追加し、次にDefaultServletを追加し、最後にベースをResourceに設定してください。

ベースResourceは、リソースベースパスResourceHandlerが初期化されることを表します。複数のディレクトリから静的リソースを提供する場合は、(まだResourceです)ResourceCollectionを使用してresourceBase文字列の配列でそれを初期化:私の小さなウェブサーバで

ResourceCollection resourceCollection = new ResourceCollection(); 
resourceCollection.setResources(getArrayOfResourceBaseDirs()); 
12

を私は2つのファイル、index.htmlinfo.jsを持っています/src/webappの下にあります。私はそれらを埋め込み桟橋ウェブサーバーから提供したいと思います。

これは、静的コンテンツの問題を解決する方法です。

Server server = new Server(8080); 

ServletContextHandler ctx = new ServletContextHandler(); 
ctx.setContextPath("/"); 

DefaultServlet defaultServlet = new DefaultServlet(); 
ServletHolder holderPwd = new ServletHolder("default", defaultServlet); 
holderPwd.setInitParameter("resourceBase", "./src/webapp/"); 

ctx.addServlet(holderPwd, "/*"); 
ctx.addServlet(InfoServiceSocketServlet.class, "/info"); 

server.setHandler(ctx); 

チャームのように働いた!

+2

をご覧ください。この質問をご覧ください - http://stackoverflow.com/questions/39011587/jetty-files-outside-war-and-context –

2

web.xmlの "css"ディレクトリのマッピングを追加することで、同様のことを達成できました。

<servlet> 
    <servlet-name>DefaultServlet</servlet-name> 
    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>DefaultServlet</servlet-name> 
    <url-pattern>/css/*</url-pattern> 
</servlet-mapping> 
関連する問題