我正在尝试使用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。
答案 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()