如何在启动时调用Web应用程序中的Servlet(doGet)?

时间:2010-06-07 21:31:19

标签: java web-applications servlets startup

我需要在应用程序启动时调用Servlet,因为它包含一些应用程序初始化逻辑。

我知道我可以设置load-on-startup配置,但这只会调用Servlet的init方法。我需要调用一个doGet方法并将一些Url参数传递给它。 Servlet doGet方法需要ServletRequest和ServletResponse对象。

此外,由于这是集群应用程序,我需要确切知道我正在访问哪个节点(因为一个选项只是打开一个套接字并调用一个Servlet)。

执行此操作的最佳选择是什么?

编辑:作为澄清,Servlet已经存在且无法修改。到现在为止,有人会从浏览器手动调用Servlet。我需要自动化这个。

4 个答案:

答案 0 :(得分:3)

通常,使用ServletContextListener实现bootstrup初始化/关闭清理 - 您是否考虑过此选项?

或者,作为一个丑陋的黑客,您可以使用初始化逻辑实现一个servlet超类,只需调用一次。

答案 1 :(得分:2)

最好的选择是将doGet方法中的任何逻辑重构为可以从initdoGet调用的单独方法。

如果你真的无法重构逻辑(这确实是唯一的好选择),你可以使用一些模拟库。谷歌称Spring's mock objects很受欢迎。

使用HttpServletRequestHttpServletResponse的可用实现,使用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;
    }