spring AbstractController Controller

飘逸的逸 发布于 2013/04/17 15:59
阅读 2K+
收藏 0

刚接触spring MVC,在参考书上看到spring在写请求的控制器的时候,有两种方式.

1. extends AbstractController,继承AbstractController类

2. implements Controller,实现Controller接口

这两个方式都可以,因为AbstractController实现了接口Controller,所以都只要重写

protected ModelAndView handleRequestInternal(HttpServletRequest req,HttpServletResponse resp) throws Exception返回一个ModelAndView就好了.

请问一下各位,这两种方式在实际中有什么区别吗?


加载中
0
爱吃大肉包
爱吃大肉包

AbstractController也是实现了 Controller接口,它在这个之上扩展了一些常用的HTTP的功能,源码如下

public abstract class AbstractController extends WebContentGenerator implements Controller {
所以当你用 AbstractController的时候,可以进行一些开发中常用属性的设置

/** Set of supported HTTP methods */
	private Set<String>	supportedMethods;

	private boolean requireSession = false;

	/** Use HTTP 1.0 expires header? */
	private boolean useExpiresHeader = true;

	/** Use HTTP 1.1 cache-control header? */
	private boolean useCacheControlHeader = true;

	/** Use HTTP 1.1 cache-control header value "no-store"? */
	private boolean useCacheControlNoStore = true;

	private int cacheSeconds = -1;
看它实现方法

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		// Delegate to WebContentGenerator for checking and preparing.
		checkAndPrepare(request, response, this instanceof LastModified);

		// Execute handleRequestInternal in synchronized block if required.
		if (this.synchronizeOnSession) {
			HttpSession session = request.getSession(false);
			if (session != null) {
				Object mutex = WebUtils.getSessionMutex(session);
				synchronized (mutex) {
					return handleRequestInternal(request, response);
				}
			}
		}
		
		return handleRequestInternal(request, response);
	}

所以你的继承类实现虚拟方法 handleRequestInternal,就可以完成一些常用的功能了。

说白了也算设计模式中的一个装饰器模式的应用

0
逝水fox
逝水fox
其实用@ Controller和@RequestMapping注解就好了,没有必要去特别继承或者实现特定的类和接口
0
飘逸的逸
飘逸的逸

@逝水fox, @爱吃大肉包

你的这个是注解的方式吧,刚才试了改了一下

配置文件改动

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
改成
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>  
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

方法改成了

@Controller
@RequestMapping("/hello")
public class SayHello{
	
@RequestMapping(value = "anno", method = RequestMethod.GET)  
public ModelAndView test1() {  
    ModelAndView mav = new ModelAndView();  
    mav.setViewName("/ftl/hello");
    mav.addObject("message", "我的返回类型是ModelAndView.");  
    return mav;  
}
这样我通过http://localhost:8080/webApp/hello/anno就可以了.在定义其他的mapping 例如anno2,这样就可以在一个controller类中定义多个不同的方法了.

这种这种方式要细心点,容易写错吧,不过比较自由点,不知道后面如果多了,改动起来是不是方便.

再根据#2的方法,根据需要继承AbstractController也许就可以用上一些HTTP的方法了.

多谢二位.

返回顶部
顶部