ITEEDU

AbstractController

org.springframework.web.servlet.mvc.AbstractController 类别是 Controller 介面的简单 实作,使用 Template Method 模式实作了使用者的请求处理的流程,包括了对快取标头(Caching header)的处理、检验对请求方法(GET、POST)的支援、Session 的取得与同步化(synchronized) 等,如果您需要对这些议题 作处理,则可以使用 AbstractController 类别。

AbstractController 从 handleRequest()方法被 DispatcherServlet 呼叫开始的工作流程如下所 示:

1. DispatcherServlet 呼叫 handleRequest()方法。
2. 根据"supportedMethods"的设定来检验支援的请求方法,如果方法不支援则丢出 ServletException。
3. 根据"requireSession"的设定决定请求是否需要使用 Session,尝试取得 Session,如 果没有取得 Session 则丢出 ServletException。
4. 根据"cacheSeconds"的设定决定是否设定快取标头(Caching header)。
5. 呼叫 handleRequestInternal()方法,根据"synchronizeOnSession"的决定是否对 Session 进行同步化(synchronized)。

对于 AbstractController 类别的工作流程,您只要有个基本的了解就可以了,您可以直接继承 AbstractController 类别,并重新定义它的 handleRequestInternal()方法来实作请求的处理, 例如:

public class SomeController extends AbstractController {
	protected ModelAndView handleRequestInternal( HttpServletRequest request,
				HttpServletResponse response) 
				throws Exception {
		....
		return new ModelAndView("view", "modelName", model);
	}
	..
}

使用 AbstractController 类别的话,您可以直接操作它已经定义好的一些方法,例如您可以呼 叫 setSupportedMethods()方法,设定所允许的请求方式,例如 Controller 实作时若如下撰写 的话,则只支援 POST 的请求:

package onlyfun.caterpillar;
...
public class HelloController extends AbstractController {
	...
	public HelloController() {
		this.setSupportedMethods(
		new String[] {"GET", "POST", "HEAD"});
	}
	protected ModelAndView handleRequestInternal( 
			HttpServletRequest req, 
			HttpServletResponse res)
			throws Exception {
		...
	}
}

如果以不 允许的方 式请求的 话,则 Controller 在处理的 时候会丢 出 org.springframework.web.servlet.support.RequestMethodNotSupportedException 的例外。