[英]How to invoke a Servlet (doGet) in a web application on startup?
我需要在應用程序啟動時調用Servlet,因為它包含一些應用程序初始化邏輯。
我知道我可以設置load-on-startup配置,但這只會調用Servlet的init方法。 我需要調用一個doGet方法並將一些Url參數傳遞給它。 Servlet doGet方法需要ServletRequest和ServletResponse對象。
此外,由於這是集群應用程序,我需要確切地知道我正在訪問哪個節點(因為一個選項只是打開一個套接字並調用一個Servlet)。
執行此操作的最佳選擇是什么?
編輯:作為澄清,Servlet已經存在,無法修改。 到現在為止,有人會從瀏覽器手動調用Servlet。 我需要自動化這個。
通常,使用ServletContextListener實現bootstrup初始化/關閉清理 - 您是否考慮過此選項?
或者,作為一個丑陋的黑客,你可以用初始化邏輯實現一個servlet超類,它只會被調用一次。
最好的選擇是將doGet
方法中的任何邏輯重構為可以從init
和doGet
調用的單獨方法。
如果你真的無法重構邏輯(這確實是唯一的好選擇),你可以使用一些模擬庫。 谷歌稱Spring的模擬對象很受歡迎。
有一個可用的HttpServletRequest
和HttpServletResponse
,使servlet加載load-on-startup
,並從其init
方法,從當前的ServletContext
找到相關的servlet,並使用適當的請求和響應對象調用doGet
。 (是的,這是一個非常糟糕的kludge,但你必須做這樣的事情。)
編輯:如果您不想破解WAR文件,也許您應該在重新/部署Web應用程序后檢查您的servlet容器是否可以運行某種掛鈎。
這是一個可怕的詞,但你可以使用java.net.URL
/ java.net.URLConnection
。
new URL("http://localhost/yourservlet").openStream();
使用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.