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

首先看一下两个关于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来处理。








引用文章:

猜你喜欢

转载自blog.csdn.net/superpojo/article/details/72918242