我试图建立与从“HTML”目录是当前工作目录的子目录提供静态文件中嵌入码头一个简单的演示应用程序。 这个想法是,演示的罐子和内容的目录可以被移动到新位置,仍然工作。
我试过以下的变化,但我不断收到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();
更新:这是作为记录在码头教程的解决方案。 由于对正确答案提到的,它采用了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();
使用ResourceHandler
而不是ServletContextHandler
。
有服务使用静态内容的一个重要区别ResourceHandler
和使用DefaultServlet
(带ServletContextHandler
)。
当ResourceHandler
(或HandlerList
持有多个ResourceHandler
实例)被设定为一个上下文处理器,它直接处理请求,并忽略任何注册javax.servlet.Filter的实例。
如果你需要的过滤器,唯一的办法去了解它使用的是ServletContextHandler
,加入过滤器,然后添加一个DefaultServlet
最后,设置基础Resource
。
基座Resource
表示resourceBase路径ResourceHandler
将与初始化。 如果从多个目录服务静态资源,使用ResourceCollection
(这仍然是一个Resource
),并与resourceBase字符串数组初始化它:
ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());
在我小的Web服务器,我有两个文件,一个index.html
和info.js
下找到/src/webapp
,我想他们从嵌入式Jetty 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);
工作就像一个魅力!
我成功地实现通过添加映射在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>
这是Main.java
文件:
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
public class Main
{
public static void main(String[] args) throws Exception
{
Server server = new Server(8080);
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setResourceBase("C:/Users/serge.klimkovitch/Documents/images");
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
server.setHandler(handlers);
server.start();
server.join();
}
}
=====================================
这是gradle.build
文件:
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'SheetsQuickstart'
sourceCompatibility = 1.7
targetCompatibility = 1.7
version = '1.0'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.16.v20190411'
}
jar {
manifest {
attributes(
'Main-Class': 'SheetsQuickstart'
)
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
=====================================
假设下列文件存在: C:\Users\serge.klimkovitch\Documents\images\image.html
然后,在Eclipse中运行,并转到http://localhost:8080/image.html
在浏览器中看到被服务这个文件。