Как вызвать сервлет (doGet) в веб-приложении при запуске? - PullRequest
3 голосов
/ 08 июня 2010

Мне нужно вызвать сервлет при запуске приложения, поскольку он содержит некоторую логику инициализации приложения.

Я знаю, что могу установить конфигурацию загрузки при запуске, но это вызовет только метод init сервлета. Мне нужно вызвать метод doGet и передать ему несколько параметров Url. Метод SerGlet doGet ожидает объекты ServletRequest и ServletResponse.

Кроме того, поскольку это кластерное приложение, мне нужно точно знать, к какому узлу я обращаюсь (поскольку один из вариантов - просто открыть сокет и вызвать сервлет).

Каков наилучший вариант для этого?

РЕДАКТИРОВАТЬ: Как пояснение, сервлет уже существует и не может быть изменен. До сих пор кто-то вручную вызывал сервлет из браузера. Мне нужно автоматизировать это.

Ответы [ 4 ]

3 голосов
/ 08 июня 2010

Обычно инициализация / очистка начальной загрузки выполняется с помощью ServletContextListener - вы рассматривали эту возможность?

В качестве альтернативы, вы можете реализовать суперкласс сервлета с логикой инициализации, которая будет вызываться только один раз.

2 голосов
/ 08 июня 2010

Лучшим вариантом является рефакторинг любой логики, используемой в методе doGet, в отдельный метод, который можно вызывать как из init, так и doGet.

Если вы действительно не можете реорганизовать логику (что действительно является единственным хорошим вариантом), вы можете использовать некоторую фиктивную библиотеку. Google говорит, что фиктивные объекты Spring популярны.

Имея пригодную для использования реализацию HttpServletRequest и HttpServletResponse, создайте сервлет, загруженный load-on-startup, и из его метода init найдите соответствующий сервлет из текущего ServletContext и вызовите doGet с соответствующие объекты запроса и ответа. (Да, это довольно плохой клудж, но тебе придется сделать что-то вроде этого.)

Редактировать: Если вы не хотите взламывать файл WAR, возможно, вам следует проверить, есть ли в вашем контейнере сервлета возможность запуска каких-либо перехватов после повторного развертывания / развертывания веб-приложения.

0 голосов
/ 05 мая 2015

Лучший способ сделать это с помощью java.lang.Runtime. Это сработало для меня отлично. Вы можете переопределить метод init, в котором сервлету (здесь мое имя сервлета 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;
    }
0 голосов
/ 08 июня 2010

Это одним словом ужасно , но вы можете использовать для этого java.net.URL / java.net.URLConnection.

new URL("http://localhost/yourservlet").openStream();
...