javax.faces.webapp.FacesServlet如何在HTTP上工作



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扩展为j2ee web应用程序通过HTTP协议进行通信。而javax.faces.webapp.FacesServlet.java也用于j2ee web应用程序的HTTP通信。

我的问题是JSF应用程序如何通过HTTP通信,而javax.faces.webapp.FacesServlet.java没有HTTP特定的方法?

这些HttpServlet#doXxx()方法只是一个抽象。不使用它们并不意味着servlet不使用HTTP(而且,如果这是真的,servlet将不会首先被调用)。

如果servlet只覆盖Servlet#service()方法,这仅仅意味着servlet对所有HTTP方法都有一个全局捕获点。如果有必要的话,它可以在某些时候通过HttpServletRequest#getMethod()确定实际使用的HTTP方法。这种方法使程序员不必在所有doXxx()方法上复制粘贴相同的代码。

如果您阅读FacesServlet源代码,您会发现下面的代码块确定了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请求,而不管使用的方法是什么。

相关内容

  • 没有找到相关文章

最新更新