2012-04-23 157 views
46

我正尝试使用嵌入式Jetty构建一个简单的演示应用程序,该应用程序从“html”目录提供静态文件,该目录是当前工作目录的子目录。这个想法是,带有演示jar和内容的目录可以被移动到新的位置并且仍然可以工作。使用嵌入式Jetty服务静态文件

我试过以下的变体,但我一直在404s。

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(); 

更新:这里是作为记录在码头教程的解决方案。由于对正确答案提到的,它采用了ResourceHandler而不是ServletContextHandler

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 2013-07-31 06:31:32

+1

这似乎不适用于码头9 ... – 2015-02-05 13:53:55

+1

如果一个人面临同样的问题与码头9 @see - http://stackoverflow.com/questions/28346438/resourcehandler-stop-hosting-files-with-jetty -9-404-not-found-error-works-fin – 2015-02-05 14:31:15

回答

30

使用的ResourceHandler,而不是ServletContextHandler

+1

确实... http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/handler/ResourceHandler.html – 2012-04-23 18:59:22

+4

诀窍!多谢你们!代码甚至在Jetty教程中给出。卫生署! http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty#Configuring_a_File_Server – HolySamosa 2012-04-23 19:16:00

+1

如果你需要javax.servlet,你仍然可能想使用'ServletContextHandler'。过滤器(详情请参阅下面的评论) – xorcus 2013-10-28 12:18:41

18

使用ResourceHandler服务静态内容和使用DefaultServlet(与ServletContextHandler)之间存在重要的区别。

ResourceHandler(或HandlerList持有多个ResourceHandler实例)被设定为一个上下文处理器,它直接处理请求,并忽略任何注册javax.servlet.Filter的实例。

如果您需要过滤器,唯一的办法是使用ServletContextHandler,添加过滤器,然后添加DefaultServlet,最后设置基准Resource

基地Resource表示ResourceHandler将被初始化的resourceBase路径。如果从多个目录服务静态资源,使用ResourceCollection(这仍然是一个Resource),并与resourceBase字符串数组初始化它:

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

在我小的Web服务器,我有两个文件,一个index.htmlinfo.js找到/src/webapp,我希望他们从嵌入式码头web服务器提供服务。

这就是我如何解决静态内容的问题。

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 – 2016-08-18 06:48:42

2

我设法通过在web.xml中为“css”目录添加映射来实现类似的目的。明确告诉它使用DefaultServlet:

<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>