JSF предоставляет очень простой метод получения REST - PullRequest
3 голосов
/ 01 октября 2011

Есть ли способ иметь метод doGet в @ManagedBean и определять URL-адрес, на который будет реагировать этот компонент.

Я использую JSF и хочу предоставить действительно базовый канал, но для этого мне нужно отреагировать на запрос get.

Сначала я написал это с обычными сервлетами, но теперь я заметил, что мне нужна информация от другого ManagedBean, поэтому мне нужен @ManagedProperty - следовательно, JSF ...

Мои вопросы:

  • Есть ли аннотация URLPattern или аналогичная?

  • Есть ли метод doGet, который похож на doGet сервлета *? 1020 *

Ответы [ 2 ]

4 голосов
/ 01 октября 2011

Предполагая сервлетов ...

Если вы полагаетесь на JSF context , уловка будет в том, чтобы получить FacesServlet для выполнения кода. FacesServlet отвечает за создание и уничтожение контекста запроса.

Вот управляемый бин, который мы хотим вызвать:

@ManagedBean @RequestScoped
public class Restlike {
  public void respond() {
   FacesContext context = FacesContext.getCurrentInstance();
   ExternalContext ext = context.getExternalContext();
   HttpServletResponse response = (HttpServletResponse) ext.getResponse();
   response.setContentType("text/plain; charset=UTF-8");
    try {
      PrintWriter pw = response.getWriter();
      pw.print("Hello, World!");
    } catch (IOException ex) {
      throw new FacesException(ex);
    }
    context.responseComplete();
  }
}

Вот представление заполнителя, которое выполнит код. resty.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<metadata xmlns="http://java.sun.com/jsf/core">
  <event type="preRenderView" listener="#{restlike.respond}"/>
</metadata>

Нажатие resty.faces выглядит не очень RESTful, но с фильтром работать тривиально:

@WebFilter("/rest/*")
public class RestyFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
                       FilterChain chain) throws IOException, ServletException {
    request.getRequestDispatcher("/resty.faces").forward(request, response);
  }

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {}

  @Override
  public void destroy() {} 
}

Результирующий URL будет выглядеть примерно так: http://host/context/rest


Это решение немного взломано и применимо только к средам сервлетов. Лучшим подходом может быть добавление пользовательского ResourceHandler, но я не потратил много времени на изучение этой части API.

4 голосов
/ 01 октября 2011

Если вам нужен веб-сервис RESTful, используйте JAX-RS (например, Джерси ) вместо JSF.

Или, если вы просто хотите "симпатичный"(REST-подобные) URL для JSF, используйте PrettyFaces .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...