Предполагая сервлетов ...
Если вы полагаетесь на 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.