是否有办法在@ManagedBean
中使用doGet方法并定义此bean将作出反应的URL。
我正在使用JSF并希望提供一个非常基本的Feed,但为此我需要对get请求做出反应。
我首先用普通的servlet编写它,但现在我注意到我需要来自另一个ManagedBean
的信息,因此我需要一个@ManagedProperty
- 因此JSF ......
我的问题:
是否有URLPattern注释或类似内容?
是否有doGet
方法类似于Servlet的doGet
?
答案 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的那一部分。