Servlets 如何将servlet动态添加到jetty服务器?
我创建了一个jetty服务器,并希望以编程方式动态添加servlet 我设置了日志记录和控制台,然后继续创建服务器,如下所示:Servlets 如何将servlet动态添加到jetty服务器?,servlets,jetty,embedded-jetty,jetty-8,Servlets,Jetty,Embedded Jetty,Jetty 8,我创建了一个jetty服务器,并希望以编程方式动态添加servlet 我设置了日志记录和控制台,然后继续创建服务器,如下所示: Connector httpConn = null; Connector httpsConn = null; HandlerCollection handlers = new HandlerCollection(); httpConn = new SelectCh
Connector httpConn = null;
Connector httpsConn = null;
HandlerCollection handlers = new HandlerCollection();
httpConn = new SelectChannelConnector();
httpConn.setPort( httpPort );
httpConn.setName( "HTTPConnector" ); // simillar setup for httpsConn if needed
contextHandlers = new ContextHandlerCollection();
if( launchServlets ) {
// this is more or less the same servlet creation code as below but for launching
// static servlets (in this example, there are none)
holders = initializeServlets( configFilePath );
}
handlers.addHandler( contextHandlers );
server = new Server();
if( httpConn != null ) {
server.addConnector( httpConn );
}
if( httpsConn != null ) {
server.addConnector( httpsConn );
}
server.setGracefulShutdown( 1000 ); /
server.setStopAtShutdown( true );
server.setHandler( handlers );
server.start();
if( launchServlets ) {
// Catch any exception that occurs during servlet init()
// (must be called after server.start() )
for( int i = 0; i < holders.length; i++ ) {
if( holders[ i ] != null ) {
Exception initEx = holders[ i ].getUnavailableException();
if( initEx != null ) {
server.stop();
throw initEx;
}
}
}
}
虽然我的动态servlet启动代码看起来正常工作,但控制台没有显示servlet正在初始化。当launchServlets=true时,代码将静态地启动servlet,一切正常,但我希望动态地启动它们
我是否必须手动使servlet初始化(我以为servlet被隔离到它们自己的内存空间中)?我如何告诉Jetty启动新的Servlet
更新:到目前为止,我唯一能够启动servlet的方法是通过server.stop()/server.join()/server.start()。我想添加servlet(并删除——但这是一个额外的问题)以不中断对现有servlet的服务
我使用的是jetty-all-server-8.1.3和servlet api 3.0
提前感谢您的帮助/提示 我不确定这样做是否安全,但我已经通过在ServletContextHandler()上调用start()来启动serlvlet,而不是停止和启动服务器 这对8.1.3和9.2.4都有效(我在升级到ServletAPI的3.1的同时也升级到了9.2.4) 希望这能帮助其他有兴趣做类似事情的人。Tombstone!真正地我很确定大部分的观点都是我的!有介绍CS作业问题的人在这里获得更多投票。
boolean isSecureOnly = false; // function that decides suppressed for now
String[] connectors;
MyServlet myServlet = new MyServlet();
ServletHolder holder = new ServletHolder( myServlet );
holder.setInitParameter( Constants.CONF_INIT_STRING_PARAM, configString );
holder.setInitParameter( Constants.CONF_INIT_NAME_PARAM, myName );
ServletContextHandler handler = new ServletContextHandler();
if( details != null ) {
details.sch = handler;
}
String contextPath = MyConfig.getContextPath( myProps, myName );
handler.setContextPath( contextPath );
handler.setAllowNullPathInfo( true );
// bind the servlet to the connectors it should be listening to
if( isSsl ) {
if( isSecureOnly ) {
connectors = new String[ 1 ];
connectors[0] = Constants.CONF_HTTPS_CONNECTOR;
} else {
connectors = new String[ 2 ];
connectors[0] = Constants.CONF_HTTPS_CONNECTOR;
connectors[1] = Constants.CONF_HTTP_CONNECTOR;
}
} else {
if( isSecureOnly ) {
throw new ConfigException( 50051 );
}
connectors = new String[ 1 ];
connectors[0] = Constants.CONF_HTTP_CONNECTOR;
}
handler.setConnectorNames( connectors );
if( myName != null ) {
handler.setDisplayName( MyMessage.message( 10025, myName ) );
} else {
handler.setDisplayName( MyMessage.message( 10001 ) );
}
handler.addServlet( holder, "/*" );
contextHandlers.addHandler( handler );
contextHandlers.mapContexts();
Exception initEx = holder.getUnavailableException();
if( initEx != null ) {
// deal with error
}