我需要在应用程序启动时调用Servlet,因为它包含一些应用程序初始化逻辑。
我知道我可以设置load-on-startup配置,但这只会调用Servlet的init方法。我需要调用一个doGet方法并将一些Url参数传递给它。 Servlet doGet方法需要ServletRequest和ServletResponse对象。
此外,由于这是集群应用程序,我需要确切知道我正在访问哪个节点(因为一个选项只是打开一个套接字并调用一个Servlet)。
执行此操作的最佳选择是什么?
编辑:作为澄清,Servlet已经存在且无法修改。到现在为止,有人会从浏览器手动调用Servlet。我需要自动化这个。
答案 0 :(得分:3)
通常,使用ServletContextListener实现bootstrup初始化/关闭清理 - 您是否考虑过此选项?
或者,作为一个丑陋的黑客,您可以使用初始化逻辑实现一个servlet超类,只需调用一次。
答案 1 :(得分:2)
最好的选择是将doGet
方法中的任何逻辑重构为可以从init
和doGet
调用的单独方法。
如果你真的无法重构逻辑(这确实是唯一的好选择),你可以使用一些模拟库。谷歌称Spring's mock objects很受欢迎。
使用HttpServletRequest
和HttpServletResponse
的可用实现,使用load-on-startup
加载一个servlet,并从其init
方法中,从当前{{找到相关的servlet 1}},并使用适当的请求和响应对象调用ServletContext
。 (是的,这是一个非常糟糕的kludge,但你必须做这样的事情。)
编辑:如果你不想破解WAR文件,也许你应该检查一下你的servlet容器是否有可能在重新/部署web应用程序后运行某种钩子。
答案 2 :(得分:0)
这只是一个单词糟糕,但您可以使用java.net.URL
/ java.net.URLConnection
。
new URL("http://localhost/yourservlet").openStream();
答案 3 :(得分:0)
使用java.lang.Runtime执行此操作的最佳方法。它完美地为我工作。你可以覆盖init方法,其中servlet(这里我的servlet名称是BackEndServlet)你必须调用doGet或doPost方法。
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
String url = "http://localhost:8080"+config.getServletContext().getContextPath()+"/BackEndServlet";
System.out.println(url);
String os = System.getProperty("os.name").toLowerCase();
Runtime rt = Runtime.getRuntime();
try{
if (os.indexOf( "win" ) >= 0) {
// this doesn't support showing urls in the form of "page.html#nameLink"
rt.exec( "rundll32 url.dll,FileProtocolHandler " + url);
} else if (os.indexOf( "mac" ) >= 0) {
rt.exec( "open " + url);
} else if (os.indexOf( "nix") >=0 || os.indexOf( "nux") >=0) {
// Do a best guess on unix until we get a platform independent way
// Build a list of browsers to try, in this order.
String[] browsers = {"epiphany", "firefox", "mozilla", "konqueror",
"netscape","opera","links","lynx"};
// Build a command string which looks like "browser1 "url" || browser2 "url" ||..."
StringBuffer cmd = new StringBuffer();
for (int i=0; i<browsers.length; i++)
cmd.append( (i==0 ? "" : " || " ) + browsers[i] +" \"" + url + "\" ");
rt.exec(new String[] { "sh", "-c", cmd.toString() });
} else {
return;
}
}catch (Exception e){
return;
}
return;
}