1
我们知道HandlerMapping ---找到相应的handler
我们也知道HandlerAdapter ---找到相应的handler方法(但针对@RequestMapping的HandlerAdapter也许不同)
2
Spring既是容器,也是框架。
Spring能很好的与各大框架进行了集成,不用spring还要用创建一个工厂来创建对象,这个spring相当与做了这个工厂帮你做了创建对象的功能,
还有它通过AOP帮助你管理事务,你在用Hibernate的时候如果不用spring的时候是不是每次都要写事务的提交这些代码有了它帮你管理后你就不必去管事务提交了没有。
还有它的面向切面编程(AOP)还可以在你写要记录日志的时候添加一条记录后需要在数据里同时添加一条添加成功了或失败的记录那么就可以用Spring里的Aop来处理,虽然不用Aop也能做但是不用Spring的Aop你就会写很多重复的代码了。
3
SpringMVC的原理及流程 ----- SpringMVC的原理及流程
http://www.360doc.com/content/14/1024/23/18637323_419613178.shtml //这个是链接
1) 前端控制器(DispatcherServlet)
2) Handler Mapping --- 通过innotation来实现
3) HandlerAdapter接口的几个实现类
SpringMVC框架的访问方式:
1) 首先由HandlerMapping接口负责找到对应的handler(也就是controller)
2) 再由HandlerAdapter接口负责找到对应的handler method(也就是controller的method)
3) HandlerMapping接口的实现类
a) BeanNameUrlHandlerMapping: 通过对比url和bean的name的匹配:
b) 和DefaultAnnotationHandlerMapping: 主要针对@RequestMapping,已过时
c) RequestMappingHandlerMapping: 主要针对@RequestMapping
4) HandlerAdapter接口的几种形式
a) HttpRequestHandlerAdapter: 要求handler(controller)实现HttpRequestHandler接口
b) SimpleControllerHandlerAdapter: 要求handler(controller)实现Controller接口,
重写ModelAndView handleRequest()方法,重写说明父类和子类有同一个方法;
c) AnnotationMethodHandlerAdapter: 主要针对@RequestMapping,已过时
d) RequestMappingHandlerAdapter: 主要针对@RequestMapping,替代AnnotationMethodHandlerAdapter,在SpringMVC里,HandlerAdapter是不需要我们自己配的;
5) 以SimpleControllerHandlerAdapter 这个类(SpringMVC的自有类)为例:
public class SimpleControllerHandlerAdapter implements HandlerAdapter{
@Override
public boolean supports(Object handler){
//判断handler是否实现了Controller接口
return (handler instanceof Controller);
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception{
//若handler(controller)实现了Controller接口,则调用该接口的方法handleRequest,执行我们在该方法中写的业务逻辑
return ((Controller) handler).handleRequest(request,response);
}
}
6) 我们写一个customized controller:
public class CustomizedController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception{
return new ModelAndView("Hello.");
}
}
得出来的结论是:
HandlerMapping负责找到相应的controller;
HandlerAdapter是适配器模式,负责实现controller相应的方法;
RequestMappingHandlerMapping: 主要针对@RequestMapping;RequestMappingHandlerAdapter: 主要针对@RequestMapping;
HandlerAdapter是SpringMVC已经帮我做好了,不需要自己配;
HandlerMapping是需要我们自己配;
最终由哪个Adapter来完成对具体方法的调度?Controller会跟每个adapter进行适配,最终由SimpleControllerHandlerAdapter来完成对方法的调度;
如果使用了注解,则会由RequestMappingHandlerAdapter完成对方法的调度;
遍历所有的HandlerAdapter......
总之,handleMapping负责找到controller(你告诉我哪个controller要调?), handlerAdapter负责让controller工作;
问ViewResolver哪个是我需要的view?
要求view把页面呈现出来;
Handler是DispatchServlet调用controller的一种中间过渡对象;显然HandlerMapping就是mapping DispatcherServlet and controller;
详情参照: 关于HandlerMapping和HandlerAdapter
http://www.360doc.com/content/14/1024/23/18637323_419613178.shtml
如果模块之间耦合很紧密的话,就很难形成模块的重用
接口的存在,是为了强迫开发者降低模块之间的耦合度
使用接口,就会强迫程序员无法耦合,并且强迫架构师必须在事先考虑好接口的规范
接口更像是一种规矩,他强迫程序开发者按照科学的方式去开发软件
接口,恰好是"强烈要求"所有子类都要写一遍这个方法
接口必须overwrite
理论上:类只能单继承,接口可以多继承(接口应该叫实现);
实践上:我们说类的继承一般继承的是事物的属性,如:姓名,年龄,性别 等,而接口的继承(或者说实现)一般是继承事物的行为,如:行走,飞翔,游泳(这比较抽象,在一般项目中大部分是指对某事物的增删改查等操作)
总之,单继承描述了“is a”的关系,即“子is a父”;
多继承描述了“can do”的关系,即“子can do父”。
抽象类和接口的区别
class AlarmDoor extends Door implements Alarm{}
[servlet-name]-servlet.xml
SimpleUrlHandlerMapping是HandlerMapping的一个实现类
SimpleUrlHandlerMapping :对比url和bean,找到正确的bean
SimpleUrlHandlerMapping是HandlerAdapter的一个实现类
而SimpleControllerHandlerAdapter要求handler实现Controller接口,而controller有handleRequest()方法
所以最后我们的controller要这么写, class的name必须是HomeAction,并实现Controller接口,而且实现其方法
public class HomeAction implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception{
return ModelAndView("hello");
}
}
而SimpleControllerHandlerAdapter会实现对handleRequest()这个方法的调度