【问题标题】:How to serve JSP files using Jetty?如何使用 Jetty 提供 JSP 文件?
【发布时间】:2011-11-01 21:05:30
【问题描述】:

我正在嵌入码头,提供单个 servlet 和一些静态内容。我从http://download.eclipse.org/jetty/7.4.5.v20110725/dist/ 下载了jetty,并将JETTY_HOME/lib/* 和JETTY_HOME/lib/jsp/* 中的所有jar 添加到ecipe 中的用户库中;这些用户库已添加到我的项目中。如果我将 JSP 文件放在我的静态内容文件夹 (./webapps/static/) 中并在 http://localhost:8080/static/test.jsp 处查看它,则不会评估 java 表达式并显示文件的全部内容。

我错过了什么?

我的主要 java 类:

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class Test {

    public static void main(String[] args) throws Exception {
        Server server = new Server();
        SelectChannelConnector connector = new SelectChannelConnector();
        connector.setPort(8080);
        server.addConnector(connector);               

        // Create a resource handler for static content.
        ResourceHandler staticResourceHandler = new ResourceHandler();
        staticResourceHandler.setResourceBase("./webapps/static/");
        staticResourceHandler.setDirectoriesListed(true);        
        //staticResourceHandler.setWelcomeFiles(new String[]{ "index.html",  });         
        //staticResourceHandler.setCacheControl("no-store,no-cache,must-revalidate");

        // Create context handler for static resource handler.
        ContextHandler staticContextHandler = new ContextHandler();
        staticContextHandler.setContextPath("/static");       
        staticContextHandler.setHandler(staticResourceHandler);        

        // Create servlet context handler for main servlet.
        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        servletContextHandler.setContextPath("/");       
        servletContextHandler.addServlet(new ServletHolder(new HelloServlet()),"/");

        // Create a handler list to store our static and servlet context handlers.
        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { staticContextHandler, servletContextHandler });

        // Add the handlers to the server and start jetty.
        server.setHandler(handlers);
        server.start();
        server.join();
    }           

}

我想要提供的 JSP 文件:

<html>
<body>
Time: <%= new java.util.Date() %>
</body>
</html>

JETTY_HOME/lib/ 中的 jar 列表:

$ ls -1 ./jetty-distribution-7.4.5.v20110725/lib/*.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-ajp-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-annotations-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-client-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-continuation-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-deploy-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-http-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-io-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-jmx-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-jndi-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-overlay-deployer-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-plus-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-policy-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-rewrite-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-security-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-server-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-servlet-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-servlets-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-util-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-webapp-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-websocket-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jetty-xml-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/servlet-api-2.5.jar

JETTY_HOME/lib/jsp/中的jar列表:

$ ls -1 ./jetty-distribution-7.4.5.v20110725/lib/jsp/*.jar
./jetty-distribution-7.4.5.v20110725/lib/jsp/com.sun.el_1.0.0.v201004190952.jar
./jetty-distribution-7.4.5.v20110725/lib/jsp/ecj-3.6.jar
./jetty-distribution-7.4.5.v20110725/lib/jsp/javax.el_2.1.0.v201004190952.jar
./jetty-distribution-7.4.5.v20110725/lib/jsp/javax.servlet.jsp_2.1.0.v201004190952.jar
./jetty-distribution-7.4.5.v20110725/lib/jsp/javax.servlet.jsp.jstl_1.2.0.v201004190952.jar
./jetty-distribution-7.4.5.v20110725/lib/jsp/jetty-jsp-2.1-7.4.5.v20110725.jar
./jetty-distribution-7.4.5.v20110725/lib/jsp/org.apache.jasper.glassfish_2.1.0.v201007080150.jar
./jetty-distribution-7.4.5.v20110725/lib/jsp/org.apache.taglibs.standard.glassfish_1.2.0.v201004190952.jar

更新:@JJ 的建议帮助解决了如何使用码头正确地提供 JSP 文件。我现在唯一的问题是如何阻止码头列出 ./webapps/jsp/ 的目录内容。我目前最基本的修复方法是将 index.html 或 index.jsp 放在 ./webapps/jsp/ 中,但我希望能够配置 jetty 以返回禁止的错误。

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;

public class Test {

    public static void main(String[] args) throws Exception {
        Server server = new Server();
        SelectChannelConnector connector = new SelectChannelConnector();
        connector.setHost("127.0.0.1");
        connector.setPort(8080);
        server.addConnector(connector);

        // Create a resource handler for static content.
        ResourceHandler staticResourceHandler = new ResourceHandler();
        staticResourceHandler.setResourceBase("./webapps/static/");
        staticResourceHandler.setDirectoriesListed(true);

        // Create context handler for static resource handler.
        ContextHandler staticContextHandler = new ContextHandler();
        staticContextHandler.setContextPath("/static");
        staticContextHandler.setHandler(staticResourceHandler);

        // Create WebAppContext for JSP files.
        WebAppContext webAppContext = new WebAppContext();
        webAppContext.setContextPath("/jsp");
        webAppContext.setResourceBase("./webapps/jsp/");
        // ??? THIS DOES NOT STOP DIR LISTING OF ./webapps/jsp/ ???
        webAppContext.setInitParameter("dirAllowed", "false");   

        // Create servlet context handler for main servlet.
        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        servletContextHandler.setContextPath("/");
        servletContextHandler.addServlet(new ServletHolder(new HelloServlet()), "/*");

        // Create a handler list to store our static, jsp and servlet context handlers.
        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { staticContextHandler, webAppContext, servletContextHandler });

        // Add the handlers to the server and start jetty.
        server.setHandler(handlers);    
        server.start();
        server.join();
    }

}

【问题讨论】:

    标签: jsp jetty


    【解决方案1】:

    我认为您缺少一些关键部分,它告诉 Jetty 将提供的文件解析为 JSP 内容,而不是简单的静态文件。如果无法调试您的代码,我无法准确看到您缺少的内容,但是我建议您查看有关嵌入 Jetty 的参考:

    http://docs.codehaus.org/display/JETTY/Embedding+Jetty

    特别是我认为这段代码可能与您的问题有关:

    // assumes that this directory contains .html and .jsp files
    // This is just a directory within your source tree, and can be exported as part of your normal .jar
    final String WEBAPPDIR = "com/xxx/yyy/webapp";
    final Server server = new Server(httpServerPort);
    final String CONTEXTPATH = "/admin";
    
    // for localhost:port/admin/index.html and whatever else is in the webapp directory
    final URL warUrl = this.class.getClassLoader().getResource(WEBAPPDIR);
    final String warUrlString = warUrl.toExternalForm();
    server.setHandler(new WebAppContext(warUrlString, CONTEXTPATH));
    

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 2020-02-26
      • 2012-09-02
      • 2012-05-04
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多