Как вызвать сервлет или веб-сервис из бина JSF? - PullRequest
0 голосов
/ 02 марта 2011

Я серьезно не могу найти правильный способ сделать это.

У меня есть этот метод, и он работает, но, кажется, это обходной путь, чтобы сделать что-то настолько простое.

  FacesContext context = FacesContext.getCurrentInstance();      

    String baseURL = context.getExternalContext().getRequestContextPath();

    String startDateString = sdf.format(startDate);
    String endDateString = sdf.format(endDate);

    String url = baseURL + "/Excel?pkgLineId="+selectedPkgLine.getPkgLineId()+"&dateStart=" + startDateString + "&dateEnd=" + endDateString;

    try {

        String encodeURL = context.getExternalContext().encodeResourceURL(url);
        context.getExternalContext().redirect(encodeURL);
    } catch (Exception e) {
    } finally {
        context.responseComplete();
    }

Я также читал, что вызов сервлетов не считается лучшей практикой.Что если я перенесу свой сервлет в веб-сервис?Как бы я назвал это?Спасибо за любую помощь.

1 Ответ

3 голосов
/ 02 марта 2011

Вы на самом деле не звоните им.Вы перенаправляете ответ на них.Вы в основном говорите веб-браузеру, что он должен запустить новый HTTP-запрос по указанному URL.Является ли это наилучшей практикой или нет, зависит от единственного функционального требования.Насколько намекает данный пример кода, он кажется мне совершенно законным.Хотя я бы, вероятно, использовал для этого обычный HTML <form action="Excel"> вместо <h:form> с управляемым бином.Опять же, это зависит от функциональных требований (просто спросите себя: зачем именно вам нужен JSF для этого конкретного? Проверка? Конкретная постобработка?).

Если вы на самом деле хотите вызвать егои обработайте его ответ программно, тогда вы должны использовать HTTP-клиент API.Базовый API Java SE предлагает для этого голый java.net.URLConnection API.Если это Web-сервис, например, JAX-WS / JAX-RS, то для этого следует использовать клиент, предоставленный API.

См. Также:


Вне зависимости от конкретной проблемы, ручной вызов FacesContext#responseComplete() не требуется при использовании ExternalContext#redirect() (но это необходимо, когда вы вытаскиваете HttpServletResponse из-под крышки JSF и вызываете sendRedirect() на нем).

...