- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用嵌入式 Jetty 9,其中 Jetty 是我的应用程序的一个小角落。我混合了静态内容、servlet 和 jsp。我的 servlet 和 jsp 是我的源代码树的一部分,并进入可执行 jar 并遵循正常的包结构。也许我的一些静态内容会在jar中,但其他静态内容,包括index.html应该放在项目根文件夹中;它可以作为网页内容位于子文件夹中。我的 servlet 和 jsp 被编译到 bin 类树中的某个位置。
我创建了一个 HandlerList,其中包含 servletContext(servlet)、resource_handler(static content)、webAppContext(jsp) 和 DefaultHandler。我的resource_handler 将WelcomeFiles 设置为“index.html”,将ResourceBase 设置为“./web-content”。
我尝试过 HandlerList 的不同顺序。如果我把resource_handler放在第一位,然后主页工作正常,但是resource_handler可以吃掉其他文件。如果我把resource_handler放在最后,那么主页就会得到404。
列表中的第一个工作正常,但当它是第二个或第三个时我会遇到问题。
我知道每个处理程序都会尝试处理上下文路径,如果不能,则将其传递给下一个处理程序。我不太清楚下一个处理程序开始的上下文路径。它是否转到基本上下文/或者是否从前一个处理程序停止的地方继续。为什么它看不到我的index.html?
我希望能够将内容、静态、servlet 或 jsp(几乎)放在我想要的任何地方,并选择上下文路径以在浏览器和具有/上下文的主页上看起来合乎逻辑。然后让服务器找到它。
这是嵌入的,因此我不需要遵守 war 规则。
组织/排序处理程序 - 上下文 -welcomeFiles 的规则是什么?
最佳答案
我正在制定一些规则来回答我的问题,主要是通过实验。
1.当将 ResourceHandler 用于静态内容时,不要使用 setContextPath("/"),因为它会匹配太多。
2.对于每个上下文路径,使用不同的路径,例如,对于 ResourceHandler(1) 使用(例如)/static1,对于 ResourceHandler(2) 使用/static2,对于 servlet 使用/servlet。因为没有“/”路径,所以每个路径都可以轻松映射到它应该提供的服务。
3.不使用 。或 * 在 ResourceHandler 上下文路径上,只是/foo 而不是/foo/* 或 ./foo
4.在 servlet 路径上,请使用 * 来表示路径信息,例如使用/servlet/*。然后在servlet中使用request.getPathInfo()来对*.
中的内容进行排序
5.对于 setWelcomeFiles 只需使用“index.html”。按照 6 中的方式完成路径的其余部分。
6.将index.html放在/web(src旁边)中,然后对于相应的ResourceHandler,setResourceBase =“web”(无斜杠=相对路径)。那么它(很容易)不在可运行的 jar 中
6a。如果您希望将其放入 jar 中,请将其放入 Main.java 旁边的/resources 包中,然后 Eclipse 导出将打包该 jar,而无需求助于 Ant。 (可能需要在这里摆弄 loadResource() ?
7.将 ResourceHandler 分组到 ContextHandlerCollection 中,因为“它基于上下文路径创建一个包含处理程序的 PathMap ”,然后将它们包含在下面的 8 中。
8.使用 HandlerCollection 来收集 Servlet,因为“它会按列表顺序调用所有处理程序,无论响应状态或异常如何”。确实包括 7 个集合。
9.请注意,在index.html 中,路径可以相对于为index.html 提供服务的ResourceHandler 设置的上下文路径,在此示例中为/static1。因此,使用 Servlet 的绝对链接就像 href="/servlet/help"一样,在浏览器中为 localhost:80/servlet/help
。 (或在相对路径上构建方案)
这就是我所掌握的。但事情正在开始发挥作用。我正在使用没有 xml 配置的嵌入式 jetty。我还没有将我的 jsp 与此合并,但我希望我现在有足够的“规则”来做到这一点。
如果专家能够评论或扩展/简化这些经验规则,那就太好了!
(编辑)
当我使用第二个 ResourceHandler 时,它可以正常提供内容(如在浏览器上看到的那样),但随后给出 IllegalStateException。为了查看发生了什么,我重写了 ResourceHandler.handle 方法,并仅使用 super.handle()
记录请求和 isCooperative()
。 isCommited() 显示 true。但是,从句柄返回时,我看到日志消息:
INFO WebServer.configureResourceHandler(2) target=/foo/bar.bar request url=http:\\192.168.2.106:8080/static2/foo/bar.bar, isCommitted=true
WARNING ###### org.eclipse.jetty.server.Response.Committed before 404 null
WARNING ###### org.eclipse.jetty.servlet.ServletHandler./static2/foo/bar.bar
WARNING ###### org.eclipse.jetty.server.HttpChannel./static2/foo/bar.bar
WARNING ###### org.eclipse.jetty.server.HttpChannel.Could not send response error 500: java.lang.IllegalStateException: Committed
看起来ResourceHandler.handle()方法已经提供了内容ok(根据浏览器)并设置了isCooperative true,但是handle()之后的代码不知道它已经被处理了,想要执行 404 但不能,因此记录 500(它无法发送,因为响应已提交)。
我做错了什么还是这是一个错误?
不是错误。我将 ContextHandlerCollection 项目与 HandlerCollection 项目混合在一起。前者由上下文路径过滤,后者则不然。所以我的 servlet 试图处理已经处理过的项目。通过以与静态内容相同的方式处理 servlet 来解决此问题。使用这样的代码:
private ContextHandler configureRootServlet() {
ServletContextHandler context = new ServletContextHandler(); /* Can hold several servlets */
context.setContextPath( "/servlet" );
ServletHandler handler = new ServletHandler();
context.setHandler( handler );
handler.addServletWithMapping( RootServlet.class, "/*");
rootServlet = (RootServlet)handler.getServlets()[0].getServlet();/*We
only added one. Grab the servlet instance he created for us so we can
configure it */
// Configure the servlet
rootServlet.setMain( mainClass );
// etc
return context;
}
然后只需将 ServletContextHandler 添加到 ContextHandlerCollection 即可。请注意,Servlet 映射是相对于上下文的。将它们全部包裹在一起......
ContextHandlerCollection contexts = new ContextHandlerCollection();
contexts.setHandlers(new Handler[]{ configureResourceHandler1()
, configureResourceHandler2(), configureRootServletHandler() });
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers( new Handler[]{ contexts, new DefaultHandler()
,configureRequestLogHandler() });
现在没有服务器错误!
关于java - jetty 9 : How to organise handlers & setWelcomeFiles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27475536/
在没有指定上下文和上下文处理程序的情况下启动 jetty 实例是否正确,然后在服务器启动后继续向其添加上下文。尽管我能够使用可变 HandlerCollection 执行此操作并且日志显示服务器和上下
在没有指定上下文和上下文处理程序的情况下启动 jetty 实例是否正确,然后在服务器启动后继续向其添加上下文。尽管我能够使用可变 HandlerCollection 执行此操作并且日志显示服务器和上下
我正在尝试让 Jetty 在我的 Ubuntu 上自动启动。 我已经完成了这些命令: cp /opt/jetty/bin/jetty.sh /etc/init.d update-rc.d jett
我是 Jetty 和客户端/服务器架构的新手。 我设法在 Eclipse 中编写了一个 jetty 服务器,它可以工作。 但是我怎样才能停止 jetty 服务器呢?我听说过 stop.jar 和 st
我已经使用Jetty / tomcat应用服务器使用Spring Web应用程序工作了大约两年了,但是让我感到困惑的是如何在这些服务器中处理多个请求。我知道 Spring 有助于单例,但我的理解仅限于
我正在尝试使用 jetty 来使用 maven 托管一个简单的 helloworld servlet。我很困惑。 我关注了这些 instructions ,但是当我发出 mvn jetty:run ,
我正在使用 Jetty 9,我有 jetty.base 和 jetty.home,我想知道我什么时候启动 jetty,它以什么样的顺序调用 jetty.base 和 jetty.home,我的意思是一
我有一个 Ubuntu 服务器 10.10 64 位 在 上运行 Web 应用程序 jetty 6.1.24-6 在 Sun 的 JVM ,两者都是从标准 Ubuntu 存储库安装的。 我正在尝试查找
我在集成测试中使用 ShrinkWrap 启动 Jetty 服务器。 问题: 当我启动我的测试 jetty 服务器而不是制作我的 Controller 模型时 - 模型不起作用! 我认为原因是不同的类
使用Gradle帮助运行Jetty 9 我已经看到了在how-to-run-jetty-7-with-specified-war-with-groovy-gradle和setting_up_embed
我正在将一个项目打包到 docker jetty 镜像中,并且我正在尝试访问日志,但没有访问日志。 文件 FROM jetty:9.2.10 MAINTAINER Me "me@me.com" ADD
有没有办法解决jetty引起的文件锁定问题?完全来自 gradle ? 一些澄清: 使用 Gradle Jetty plugin 时通过运行 gradle jettyRun, jetty 导致静态资源
我最近才开始使用 Java(我最近的大部分经验都在 .NET 中)。作为这项工作的一部分,我一直在对 Jetty 和 Tomcat 进行一些比较。 我认为在我们的环境中 Tomcat 的一个功能是内置
我已将 Jetty 嵌入到 Java 应用程序中,并在 Jetty 服务器对象的实例上调用 start() 方法(在设置描述静态和动态 Web 内容位置的处理程序列表之后)。 start() 调用会阻
我正在使用 Jetty 部署生产网站。假设我的网站是 foo.com 当我将浏览器指向一个不存在的上下文(比如 foo.com/notavailable)时,Jetty 会显示一个错误页面,其中包含部
我想使用 Jetty 的嵌入式版本创建一个应用程序。不幸的是,我找不到有关我需要这样做的 jar 文件的任何信息。 Maven 存储库中有几个( http://repo2.maven.org/mave
This answer explains how the server version header can be completely removed通过使用 HttpConfiguration.s
有人可以告诉我DispatcherType在做什么吗? 似乎是重要的配置。 指向ServletContextHandler#addFilter之类的东西对类的使用也没有帮助,对我来说,“ aa”是明智
我正在尝试使用jetty gradle插件运行Jetty服务器进行功能测试。但是,我得到了java.lang.IllegalArgumentException: Object is not of ty
我需要在gradle构建中创建多种不同的模式来运行 jetty 。 它们的系统属性和类路径不同。 如何使用Gradle Jetty插件进行操作? 最佳答案 您可以创建JettyRun类型的多个任务。要
我是一名优秀的程序员,十分优秀!