我真的找不到正确的方法来做到这一点。
我有这种方法并且它有效,但似乎有点像做一些基本的事情。
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服务怎么办?我怎么去打电话呢?谢谢你的帮助。
答案 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}时,这是必要的在它上面。)