【问题标题】:How to call servlet or web service from JSF backing bean?如何从 JSF 支持 bean 调用 servlet 或 Web 服务?
【发布时间】:2011-07-06 20:46:37
【问题描述】:

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

我有这个方法并且它有效,但是做一些如此基本的事情似乎是一种变通方法。

  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 服务会怎样?我该怎么称呼它?感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    你并没有真正打电话给他们。您正在将响应重定向到他们。您基本上是在告诉网络浏览器它应该在给定的 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 并在其上调用sendRedirect() 时,这是必要的)。

    【讨论】:

    • 再次感谢BaluC(你什么时候写书?)。在这种情况下,我传递了一个 servlet 参数,以便它可以创建一个 Excel 电子表格供用户下载。
    • 是的,我已经根据代码 sn-p 猜到了 :) 至于这本书,之前有好几个人问过我这个问题。我不知道从哪里开始。周围已经有很多好书了。继续在 SO 上发布问题 :)
    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多