SpringMVC源码(五)Controller控制器3-Servlet相关控制器

xiaoxiao2021-02-28  92

首先看一下两个关于Servlet的控制器。 ServletWrappingController 控制器 解析: 它是与servlet相关的控制器,另外一个与Servlet相关的控制器是ServletForwardingController。 ServletWrappingController 将当前应用中的某个Servlet直接包装为一个Controller,所有到ServletWrappingController的请求实际上是由它内部所包装的这个Servlet 实例来处理的,也就是说内部封装的Servlet实例并不对外开放,对于程序的其他范围是不可见的,适配所有的HTTP请求到内部封装的Servlet实例进行处理。它通常用于对已存的Servlet的逻辑重用上。ServletWrappingController是为了Struts专门设计的,作用相当于代理Struts的ActionServlet。请注意,Struts有一个特殊的要求,因为它解析web.xml找到紫的Servlet映射。因此,你需要制定的DispatherServlet作为“servletName”在这个控制器servlet的名字,认为这样的Struts的DispatcherServlet的映射 (它指的是ActionServlet的)。 内部属性: private Class<?> servletClass; private String servletName; //servlet具体名称 private Properties initParameters = new Properties(); private String beanName; private Servlet servletInstance; //servlet实例 核心方法: protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { this.servletInstance.service(request, response); return null; } 除了实现了父类的抽象方法,它只做了将请求交给了内部自己的servlet实例来处理,servlet实例调用自己的service()方法来进行具体的处理。 -------------------------------------------------------------------------------------------------------------------------------------------- ServletForwardingController 控制器解析: 和ServletWrappingController类似,它也是一个Servlet相关的controller,他们都实现将HTTP请求适配到一个已存的Servlet实现。但是,简单Servlet处理器适配器需要在Web应用程序环境中定义Servlet Bean,并且Servlet没有机会进行初始化和析构。 和ServletWrappingController不同的是,ServletForwardingController将所有的HTTP请求转发给一个在web.xml中定义的Servlet。Web容器会对这个定义在web.xml的标准Servlet进行初始化和析构。 具体代码: protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { RequestDispatcher rd = getServletContext().getNamedDispatcher(this.servletName); if (rd == null) { throw new ServletException("No servlet with name '" + this.servletName + "' defined in web.xml"); } // If already included, include again, else forward. if (useInclude(request, response)) { rd.include(request, response); if (logger.isDebugEnabled()) { logger.debug("Included servlet [" + this.servletName + "] in ServletForwardingController '" + this.beanName + "'"); } } else { rd.forward(request, response); if (logger.isDebugEnabled()) { logger.debug("Forwarded to servlet [" + this.servletName + "] in ServletForwardingController '" + this.beanName + "'"); } } return null; } 它会首先获取servlet配置对应的RequestDispatcher,如果获取的为空说明servlet未配置就会包servlet异常。如果不为空则首先判断请求是否已经处理过,或者response返回,那么就会再次调用包含处理,不进行其他处理了,否则就进行相应的跳转。 具体实现: public class ServletForwarding extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("Spring mvc"); } } web.xml配置: <servlet> <servlet-name>forwarding</servlet-name> <servlet-class>com.core.ServletForwarding </servlet-class> </servlet> springmvc.xml 配置: <bean name="/springmvc" class="org.springframework.web.servlet.mvc.ServletForwardingController"> <property name="servletName" value="forwarding"></property> </bean> 当我们访问springmvc 时,就会被转发到名字叫forwarding的servlet来处理。 引用文章: http://www.bubuko.com/infodetail-1176622.html
转载请注明原文地址: https://www.6miu.com/read-82905.html

最新回复(0)