簡體   English   中英

如何在啟動時調用Web應用程序中的Servlet(doGet)?

[英]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方法中的任何邏輯重構為可以從initdoGet調用的單獨方法。

如果你真的無法重構邏輯(這確實是唯一的好選擇),你可以使用一些模擬庫。 谷歌稱Spring的模擬對象很受歡迎。

有一個可用的HttpServletRequestHttpServletResponse ,使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM