如何从JSF支持bean调用servlet或Web服务?

时间:2011-03-01 22:03:10

标签: java jsf-2 java-ee-6

我真的找不到正确的方法来做到这一点。

我有这种方法并且它有效,但似乎有点像做一些基本的事情。

  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();
    }

我还读到调用servlet不被认为是最佳实践。如果我将servlet移动到Web服务怎么办?我怎么去打电话呢?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

你并没有真正打电话给他们。您正在将响应重定向到它们。您基本上告诉webbrowser它应该在给定的URL上触发新的HTTP请求。这是否是最佳实践取决于唯一的功能要求。就给定的代码示例提示,对我来说似乎完全合法。虽然我可能已经使用了普通的HTML <form action="Excel">而不是带有托管bean的<h:form>。同样,这取决于功能需求(只要问问自己:为什么你需要JSF来完成这个特定的?验证?特定的后处理?)。

如果实际想要以编程方式调用它并处理其响应,那么您应该使用HTTP客户端API。基本的Java SE API为此提供了裸java.net.URLConnection API。如果它是Web服务,例如JAX-WS / JAX-RS,那么您应该使用API​​提供的客户端。

另见:


与具体问题无关,当您使用ExternalContext#redirect()时,不需要手动调用FacesContext#responseComplete()(但是当您从JSF封面下拖动HttpServletResponse并调用{{1}时,这是必要的在它上面。)