【问题标题】:How to configure Jetty Handlers?如何配置 Jetty 处理程序?
【发布时间】:2015-03-21 05:48:30
【问题描述】:

我在为我的 Web 应用程序设置处理程序时遇到问题,我想要的是:让 HTTPServlet 使用 doGet 和 doPost 方法处理一些请求(如何从这些方法中加载 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 });

在这个例子中,当使用没有 Main servlet 的 root handler 时,它会加载所有的静态内容和 jsp 页面,但是当添加 main servlet 时,它不再加载任何静态内容,并且响应所有对静态内容的请求一个空的 html 页面。

【问题讨论】:

    标签: java jsp jetty handlers


    【解决方案1】:

    当您使用 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);
            }
        }
    }
    

    【讨论】:

    • 谢谢,加载静态内容和 servlet 内容现在可以同时工作,但是加载 jsp 页面不起作用(我得到那个空页面)。请注意,如果没有 HTTPServlet,JSP 页面会正确加载
    • 支持 JSP 的嵌入式 Jetty 需要更多设置。请参阅github.com/jetty-project/embedded-jetty-jsp的官方示例
    • 谢谢,我已经到了。我正在这样做并且它正在工作,这是多么糟糕的做法? response.sendRedirect("jsp/index.jsp");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    相关资源
    最近更新 更多