javax.faces.webapp.FacesServlet.java没有以下方法,如
doGet(), if the servlet supports HTTP GET requests
doPost(), for HTTP POST requests
doPut(), for HTTP PUT requests
doDelete(), for HTTP DELETE requests
它只有service()方法。
doGet()/ doPost()/ doPut()/ doDelete()方法仅特定于javax.servlet.http.HttpServlet.java类
javax.servlet.http.HttpServlet.java扩展为通过HTTP协议与j2ee Web应用程序进行通信。 而javax.faces.webapp.FacesServlet.java也用于通过HTTP进行j2ee Web应用程序通信。
我的问题是JSF应用程序如何通过HTTP进行通信,而javax.faces.webapp.FacesServlet.java没有HTTP特定的方法?
答案 0 :(得分:3)
那些HttpServlet#doXxx()
方法只是一种抽象。不使用它们并不意味着servlet不使用HTTP(此外,如果确实如此,那么首先不会调用servlet)。
如果servlet仅覆盖Servlet#service()
方法,则只意味着servlet具有所有HTTP方法的全局catch-all点。如果有必要,它仍然可以通过HttpServletRequest#getMethod()
确定正在使用的实际HTTP方法。这种方法使程序员无法通过所有doXxx()
方法对相同的代码进行复制。
如果您阅读了FacesServlet
source code,您将找到以下块,其中确定了HTTP方法(行号与JSF 2.2 API匹配):
671 private boolean isHttpMethodValid(HttpServletRequest request) {
672 boolean result = false;
673 if (allowAllMethods) {
674 result = true;
675 } else {
676 String requestMethodString = request.getMethod();
677 HttpMethod requestMethod = null;
678 boolean isKnownHttpMethod;
679 try {
680 requestMethod = HttpMethod.valueOf(requestMethodString);
681 isKnownHttpMethod = true;
682 } catch (IllegalArgumentException e) {
683 isKnownHttpMethod = false;
684 }
685 if (isKnownHttpMethod) {
686 result = allowedKnownHttpMethods.contains(requestMethod);
687 } else {
688 result = allowedUnknownHttpMethods.contains(requestMethodString);
689 }
690
691 }
692
693 return result;
694 }
基本上,实际的HTTP方法仅适用于FacesServlet
,以确定它是否是受支持的方法。如果是,则无论使用何种方法,servlet都将以相同的方式继续处理HTTP请求。