java - 如何配置 Jetty 处理程序?

标签 java jsp jetty handlers

我在为我的 Web 应用程序设置处理程序时遇到问题,我想要的是:使用 doGet 和 doPost 方法由 HTTPServlet 处理一些请求(如何从这些方法中加载 JSP 页面?)能够加载静态内容(html、JS、CSS)

按照我现在的设置方式,我只能选择其中之一,无法同时使用。

我会解释:

Server server = new Server(5000);

   // This is the resource handler for JS & CSS

    ResourceHandler resourceHandler = new ResourceHandler();

    resourceHandler.setResourceBase(".");

    resourceHandler.setDirectoriesListed(false);

   // This is the context handler for the HTTPServlet

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);

    context.setContextPath("/");

    context.addServlet(new ServletHolder(new Main()),"/*");

   // this is the Handler list for both handlers

    HandlerList handlerList = new HandlerList();

    handlerList.setHandlers(new Handler[] { context ,resourceHandler});

/*

     If I add them in this order, all requests will be handled by the "context" and no static resource is loaded

     If I invert the order, the index page page is loaded by the resource handler, which means, If I activate directory listings, it gives me a list of all directories, otherwise it's just a blank page

     I tried working with a WebAppContext to load JSP pages but I still had some problems with which handler should handle which requests

*/

    server.setHandler(handlerList);

    server.start();

    server.join();

谢谢

**编辑:**

我遇到的问题是我的 HTTP servlet 的行为方式如下: 处理所有请求,不会为资源处理程序留下任何内容,因此当脚本请求 .js 脚本时,它会返回一个空的 html 页面。 这是一个例子:

    WebAppContext root = new WebAppContext();

    root.setParentLoaderPriority(true);
    root.setContextPath("/");
    root.setResourceBase(".");
    root.setWelcomeFiles(new String[] {"test.jsp"});
    root.addServlet(new ServletHolder(new Main()),"/*");

    HandlerList handlerList = new HandlerList();
    handlerList.setHandlers(new Handler[] { root });

在这个例子中,当使用没有主servlet的根处理程序时,它加载所有静态内容和jsp页面,但是当添加主servlet时,它不再加载任何静态内容,并响应所有对静态内容的请求一个空的 html 页面。

最佳答案

当您使用 servlet 时,servlet 链的末尾总是有一个终止点。

可以是:

如果您希望 ResourceHandler 只用于提供静态内容,请使用 DefaultServlet 来实现您自己的目的(这是一个更好的选择,并且还支持更多功能。例如范围请求、缓存、自动 gzip、内存映射文件服务等)

示例:

package jetty;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class ManyDefaultServlet
{
    public static void main(String[] args)
    {
        System.setProperty("org.eclipse.jetty.servlet.LEVEL","DEBUG");

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

        // Setup the basic application "context" for this application at "/"
        // This is also known as the handler tree (in jetty speak)
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);

        // The filesystem paths we will map
        String homePath = System.getProperty("user.home");
        String pwdPath = System.getProperty("user.dir");

        // Fist, add special pathspec of "/home/" content mapped to the homePath
        ServletHolder holderHome = new ServletHolder("static-home", DefaultServlet.class);
        holderHome.setInitParameter("resourceBase",homePath);
        holderHome.setInitParameter("dirAllowed","true");
        holderHome.setInitParameter("pathInfoOnly","true");
        context.addServlet(holderHome,"/home/*");

        // Lastly, the default servlet for root content
        // It is important that this is last.
        ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class);
        holderPwd.setInitParameter("resourceBase",pwdPath);
        holderPwd.setInitParameter("dirAllowed","true");
        context.addServlet(holderPwd,"/");

        try
        {
            server.start();
            server.dump(System.err);
            server.join();
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.err);
        }
    }
}

关于java - 如何配置 Jetty 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28088726/

相关文章:

java - 类路径和 java.library.path 之间的区别?在linux和windows下如何设置?

java - 使用 maven exec :java plugin under Windows 的 JSP 的类路径问题

java - 小服务程序测试

maven - Jetty注解超时原因

Java - 如何最好地循环并将值存储到 ArrayList 中

Java getElmentsByTagName 与通配符

java - 仅在没有检查的情况下,空对象模式是否有意义?

java - J2ee session 跟踪

java - 如何将 JSP 页面解析为 XML 文件?

servlets - jetty 6 index.html 欢迎页面无法正常工作