Java 使用嵌入式Jetty服务静态文件
我正在尝试用嵌入式Jetty构建一个简单的演示应用程序,它提供来自“html”目录(当前工作目录的子目录)的静态文件。其想法是,可以将包含演示jar和内容的目录移动到新位置,并且仍然可以工作 我尝试过以下的变体,但我一直得到404Java 使用嵌入式Jetty服务静态文件,java,jetty,embedded-jetty,Java,Jetty,Embedded Jetty,我正在尝试用嵌入式Jetty构建一个简单的演示应用程序,它提供来自“html”目录(当前工作目录的子目录)的静态文件。其想法是,可以将包含演示jar和内容的目录移动到新位置,并且仍然可以工作 我尝试过以下的变体,但我一直得到404 ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextP
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();
更新:以下是Jetty教程中记录的解决方案。如正确答案中所述,它使用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
提供静态内容与使用DefaultServlet
(使用ServletContextHandler
)提供静态内容有一个重要区别
当ResourceHandler
(或包含多个ResourceHandler
实例的HandlerList
设置为上下文处理程序时,它直接处理请求并忽略任何已注册的javax.servlet.Filter实例
如果需要过滤器,唯一的方法是使用ServletContextHandler
,向其中添加过滤器,然后添加DefaultServlet
,最后设置基本资源
基本Resource
表示ResourceHandler
将初始化的resourceBase路径。如果从多个目录提供静态资源,请使用ResourceCollection
(它仍然是资源
),并使用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>
DefaultServlet
org.eclipse.jetty.servlet.DefaultServlet
DefaultServlet
/css/*
这是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();
}
}
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) }
}
}
=====================================
这是gradle.build
文件:
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();
}
}
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
在浏览器中查看此文件是否已送达。确实。。。成功了!谢谢大家!该代码甚至在Jetty教程中给出。啊!如果您需要javax.servlet.Filter(有关详细信息,请参阅下面我的评论),您可能仍然希望使用ServletContextHandler
,当Jetty 6存在时,这个建议是有意义的。如今,对于Jetty 9,这一建议不再有效。看,第一个链接是死的。有人知道如何进入该页面吗?pom.xml文件与此相关:这似乎不适用于jetty 9…如果有人在jetty 9@see中遇到相同的问题-您能看看这个问题吗-