javax.faces.webapp.FacesServlet如何通过HTTP工作?

时间:2015-08-14 07:04:33

标签: java http jsf java-ee servlets

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特定的方法?

1 个答案:

答案 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请求。