嵌入式Jetty:未初始化Servlet

时间:2014-10-29 20:30:54

标签: java servlets jetty embedded-jetty

我正在尝试使用servlet在一个应用程序中嵌入Jetty服务器。

当我点击网址时:https://127.0.0.1:8443/hello

我明白了:

  

HTTP错误:503

     

访问/hello.html时遇到问题。原因是:

javax.servlet.UnavailableException: Servlet not initialized
     

由Jetty提供://

这是我的代码:

public class Main 
{
  public static void main(String[] args) throws Exception 
  {
    // path to keystore.
    String jetty_home = System.getProperty("jetty.home","c:\\jetty.home");
    System.setProperty("jetty.home", jetty_home);

    // Create a basic jetty server object 
    Server server = new Server();

    // HTTP Configuration
    HttpConfiguration http_config = new HttpConfiguration();
    http_config.setSecureScheme("https");
    http_config.setSecurePort(8443);
    http_config.setOutputBufferSize(32768);

    // SSL Context Factory for HTTPS
    SslContextFactory sslContextFactory = new SslContextFactory();
    sslContextFactory.setKeyStorePath(jetty_home + "\\keystore");
    sslContextFactory.setKeyStorePassword("password");
    sslContextFactory.setKeyManagerPassword("password");

    // HTTPS Configuration
    HttpConfiguration https_config = new HttpConfiguration(http_config);
    https_config.addCustomizer(new SecureRequestCustomizer());

    // HTTPS connector
    ServerConnector https = new ServerConnector(server,
        new SslConnectionFactory(sslContextFactory, "http/1.1"),
        new HttpConnectionFactory(https_config));
    https.setPort(8443);

    // Set the connectors
    server.setConnectors(new Connector[] {  https });

    // Specify the Session ID Manager
    HashSessionIdManager idmanager = new HashSessionIdManager();
    server.setSessionIdManager(idmanager);

    // Sessions are bound to a context.
    ServletContextHandler context = new ServletContextHandler(null, "/", ServletContextHandler.SESSIONS|ServletContextHandler.NO_SECURITY);
    server.setHandler(context);

    // Create the SessionHandler (wrapper) to handle the sessions
    HashSessionManager manager = new HashSessionManager();
    SessionHandler sessions = new SessionHandler(manager);
    context.setHandler(sessions);

    // handle the servlets in the session inside of SessionHandler 
    ServletHandler servletHandler = new ServletHandler();
    sessions.setHandler(servletHandler);

    // tree should look like this:
    // Server
    //   + Connector -> HTTPS
    //      + ContextHandler( "/" )
    //         + SessionHandler
    //             + servletHandler

    // set up the servlet
    ServletHolder servletHolder = new ServletHolder(Main.MyServlet.class);

    servletHandler.addServletWithMapping(servletHolder, "/*");

    // Start the server
    server.start();
    server.join();
  }

  public static class MyServlet extends HttpServlet
  {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
      resp.getOutputStream().print("<html><body><h1>Hello</h1></body></html>");
    }
  }
}

我错过了什么?如何/在何处初始化servlet。

1 个答案:

答案 0 :(得分:3)

由于您没有说明Jetty的版本,我假设您使用的是Jetty 9.2.3.v20140905

这段代码是奇数

// Sessions are bound to a context.
ServletContextHandler context = new ServletContextHandler(null, "/",
   ServletContextHandler.SESSIONS|ServletContextHandler.NO_SECURITY);
server.setHandler(context);  // <-- this is the ServletContext

// Create the SessionHandler (wrapper) to handle the sessions
HashSessionManager manager = new HashSessionManager();
SessionHandler sessions = new SessionHandler(manager);
context.setSessionHandler(sessions); // <-- set the session handler

// set up the servlet
ServletHolder servletHolder = new ServletHolder(Main.MyServlet.class);
context.addServlet(servletHolder, "/*");

首先,不要自己管理ServletHandler,你只是撤消ServletContextHandler本身所做的所有工作。

另外,不要自己管理处理程序树,让内部人员管理正确的链接,因此切换到.setSessionHandler()

最后,使用context.addServlet()代替.addServletWithMapping()

相关问题