SpringMVC
MVC
- M : Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
- V:View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
- C: Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。
SpringMVC项目架构图
下图和描述取自博客:https://blog.csdn.net/u014191220/article/details/81387596
- 用户发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。就是url-pattern的作用,并且会加载springmvc.xml配置文件。
- 前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在springmvc.xml中配置的或者注解的url与对应的处理类找到并进行存储,用map<url,handler>这样的方式来存储。
- HandlerMapping有了映射关系,并且找到url对应的处理器,HandlerMapping就会将其处理器(Handler)返回,在返回前,会加上很多拦截器。
- DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。
- 执行处理器
- 处理器会返回一个ModelAndView对象给HandlerAdapter
- 通过HandlerAdapter将ModelAndView对象返回给前端控制器(DispatcherServlet)
- 前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图(jsp),其实就是将ModelAndView对象中存放视图的名称进行查找,找到对应的页面形成视图对象
- 返回视图对象到前端控制器。
- 视图渲染,就是将ModelAndView对象中的数据放到request域中,用来让页面加载数据的。
- 通过第8步,通过名称找到了对应的页面,通过第10步,request域中有了所需要的数据,那么就能够进行视图渲染了。最后将其返回即可。
SpringMVC核心类和接口
1. DispatcherServlet 前置控制器
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据响应的规则分发到目标Controller来处理,是配置spring MVC的第一步
2. HandlerMapping 处理请求映射
-.SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller
-.DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上
3. HandlerAdapter接口 处理请求的映射
-.AnnotationMethodHandlerAdapter类 通过注解,把一个URL映射到Controller类的方法上
4.Controller接口 – 控制器
-.一般我们使用 @Controller 注解代替实现Controller接口的工作
5.HandlerInterceptor接口 拦截器
-. 一般我们 自定义类来实现 HandlerInterceptor 来完成拦截工作
6.ViewResolver接口 视图
-. 一般我们在springmvc配置文件中配置bean 类为.InternalResourceViewResolver 通过配置前缀后缀 把视图名拼接起来交给View处理
SpringMVC核心注解
1. @Controller
- 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。
2. @RequestMapping
- RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
3. @Autowired
- 自动注入,spring会根据Type去自动注入
4. @PathVariable
- 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。 一般搭配RestFul风格使用
@Controller
public class HelloControllerRestFul {
//原来的访问路径:http://localhost:8080/add?a=2&b=3
//RestFul的访问路径:http://localhost:8080/add/1/2
//两种都是传递参数
//value属性 就是请求的url地址+参数
//method属性 就是限制用什么请求方式访问
@RequestMapping(value="/add/{a}/{b}",method = RequestMethod.GET)
public String add(@PathVariable int a, @PathVariable String b, Model model){
//@PathVariable 路径变量 将参数绑定到url模板上
String result = a + b;
model.addAttribute("msg","结果:" + result);
return "hello";
}
}
5. @ResponseBody
-
配置该注解的方法不会走视图解析器
-
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
-
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
6. @Service
- 用于注解Service层 ,写在ServiceImpl实现类上
7. @Repository
- 用于注解Dao层 ,写在DaoImpl实现类上
8. @Component
- 可以说是通用的注解,用于不知道的类的归属层