[英]How to call servlet or web service from JSF backing bean?
我嚴重找不到正確的方法。
我有這種方法,它可以工作,但是似乎可以做一些基本的事情。
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服務怎么辦? 我該怎么打電話呢? 謝謝你的幫助。
你不是真的在打電話給他們。 您正在將響應重定向到他們。 您基本上是在告訴Web瀏覽器,它應該在給定的URL上觸發新的HTTP請求。 這是否是最佳實踐,取決於唯一的功能要求。 就給定的代碼示例而言,對我來說似乎完全合法。 盡管我可能為此使用了普通的HTML <form action="Excel">
,而不是帶有托管bean的<h:form>
。 同樣,這取決於功能要求(問一下自己:為什么對這個特定的JSF到底需要JSF,驗證或特定的后處理?)。
如果您實際上要調用它並以編程方式處理它的響應,則應該使用HTTP客戶端API。 基本的Java SE API為此提供了裸露的java.net.URLConnection
API。 如果它是一個Web服務,例如JAX-WS / JAX-RS,那么您應該為此使用API提供的客戶端。
與具體問題無關,當您使用ExternalContext#redirect()
時,無需手動調用FacesContext#responseComplete()
(但是從JSF封面sendRedirect()
HttpServletResponse
並在其上調用sendRedirect()
時,這是必需的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.