代码之家  ›  专栏  ›  技术社区  ›  Dan

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

  •  3
  • Dan  · 技术社区  · 14 年前

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

    我知道我可以设置启动时的加载配置,但这只会调用servlet的init方法。我需要调用一个doget方法并向它传递一些url参数。 servlet doget方法需要servletrequest和servletresponse对象。

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

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

    编辑:作为澄清,servlet已经存在,不能修改。到目前为止,有人会从浏览器手动调用servlet。我需要把这个自动化。

    4 回复  |  直到 9 年前
        1
  •  2
  •   gustafc    14 年前

    最好的选择是重构 doGet 方法转换为一个单独的方法,可以从 init 多吉特 .

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

    具有可使用的 HttpServletRequest HttpServletResponse ,使servlet加载 load-on-startup 以及从它 初始化 方法,根据当前 ServletContext 并调用 多吉特 使用适当的请求和响应对象。(是的,这是一个相当糟糕的拼字游戏,但你必须做这样的事情。)

    编辑: 如果您不想黑客的战争文件,也许您应该检查您的servlet容器是否有可能运行某种钩子后,您重新/部署一个Web应用程序。

        2
  •  3
  •   Vasil Remeniuk    14 年前

    通常,bootstrup初始化/关闭清理是通过 ServletContextListener -你考虑过这个选择吗?

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

        3
  •  0
  •   BalusC    14 年前

    这是一个字 可怕的 但是你可以用 java.net.URL / java.net.URLConnection 为此。

    new URL("http://localhost/yourservlet").openStream();
    
        4
  •  0
  •   Subbu    9 年前

    最好的方法是使用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;
        }