JSF提供了非常基本的REST get方法

时间:2011-10-01 08:51:30

标签: java jsf rest servlets get

是否有办法在@ManagedBean中使用doGet方法并定义此bean将作出反应的URL。

我正在使用JSF并希望提供一个非常基本的Feed,但为此我需要对get请求做出反应。

我首先用普通的servlet编写它,但现在我注意到我需要来自另一个ManagedBean的信息,因此我需要一个@ManagedProperty - 因此JSF ......

我的问题:

  • 是否有URLPattern注释或类似内容?

  • 是否有doGet方法类似于Servlet的doGet

2 个答案:

答案 0 :(得分:4)

如果您需要RESTful网络服务,请使用JAX-RS(例如Jersey)代替JSF。

或者,如果您只想要JSF的“漂亮”(类似REST)URL,请使用PrettyFaces

答案 1 :(得分:4)

假设servlets ......

如果您依赖于JSF context,那么诀窍就是让FacesServlet执行代码。 FacesServlet负责创建和销毁请求上下文。

以下是我们要调用的托管bean:

@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,但使用filter来处理它是微不足道的:

@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() {} 
}

结果网址看起来像http://host/context/rest


此解决方案有点破解,仅适用于servlet环境。更好的方法可能是添加自定义ResourceHandler,但我没有花太多时间来调查API的那一部分。