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请求,而不管使用的方法是什么。