SpringMVC
一、概述
1.MVC概述
1)MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
2)模型(dao,service)、视图(jsp)、控制器(servlet)
3)是将业务逻辑、数据、显示分离的方法来组织代码。
4)MVC主要作用是降低了视图与业务逻辑间的双向偶合。
5)MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
2.Spring MVC概述
1)Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的MVC 框架之一
2)Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。
3)一种轻量级的、基于 MVC 的 Web 层应用框架。偏前端而不是基于业务逻辑层。Spring框架的一个后续产品。
3.SpringMVC 怎么用
1) 将 Web 层进行了职责解耦,基于请求-响应模型
以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。
2) 常用主要组件
**1.Controller:**处理器/页面控制器,做的是 MVC 中的 C 的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理
作用:把不同的数据(Model),显示在不同的视图(View)上,
Servlet扮演的就是这样的角色
**2.DispatcherServlet:**前端控制器;
作用:将请求分发到不同的处理器
3.HandlerMapping: 请求映射
到处理器,找谁来处理,如果映射成功返回一个HandlerExecutionChain 对象(包含一个 Handler 处理器(页面控制器)对象、多个 HandlerInterceptor 拦截器对象)
4.View Resolver : 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的 View,进行这种策略模式,很容易更换其他视图技术;
3)SpringMVC详细运行流程图
Springmvc架构原理解析
发起请求到前端控制器(DispatcherServlet)
前端控制器请求HandlerMapping查找 Handler,可以根据xml配置、注解进行查找
处理器映射器HandlerMapping向前端控制器返回Handler
前端控制器调用处理器适配器去执行Handler
处理器适配器去执行Handler
Handler执行完成给适配器返回ModelAndView
处理器适配器向前端控制器返回ModelAndView,ModelAndView是springmvc框架的一个底层对象,包括 Model和view
前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
视图解析器向前端控制器返回View
前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
前端控制器向用户响应结果
各种 ‘ 器 ’
DispatcherServlet:前端控制器
HandlAdapter:处理器适配器
ViewResolver:视图解析器
HandlerMapping:处理器映射器
Filter 过滤器
Listener 监听器
Handler 控制器
interceptor 拦截器
二、视图解析
不论控制器返回一个 String,ModelAndView,View 都会转换为 ModelAndView 对象,由视图解析器解析视图,然后,进行页面的跳转。
1.ModelAndView
ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据。
1) 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
2)添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map<String, ?> modelMap)
3)设置视图:
void setView(View view)
void setViewName(String viewName)
2.视图和视图解析器
1) 请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图
2) Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是 Excel、JFreeChart 等各种表现形式的视图
3) 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦
3.视图
1) 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给户。
2) 为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet包中定义了一个高度抽象的 View 接口:
3) 视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题
三、REST
1.REST:即 Representational State Transfer。
2.Rest架构的主要原则
1.网络上的所有事物都被抽象为资源
2.每个资源都有一个唯一的资源标识符
3.同一个资源具有多种表现形式(xml,json等
4.对资源的各种操作不会改变资源标识符
5.所有的操作都是无状态的
6.符合REST原则的架构方式即可称为RESTful
3.Restful
符合REST约束风格和原则的应用程序或设计就是RESTful
从此请求再也不止get和post
4.RESTFul风格的SringMVC
RestController代码
@Controller
@RequestMapping("/rest")
public class RestController {
@RequestMapping(value="/user/{id}",method=RequestMethod.GET)
public String get(@PathVariable("id") Integer id){
System.out.println("get"+id);
return "/hello";
}
}
前台代码
<form action="rest/user/1" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="put">
</form>
四、@RequestMapping 注解
1.为控制器指定可以处理哪些 URL 请求
2.在控制器的类定义及方法定义处都可标注 @RequestMapping
1 )标记在类上:提供初步的请求映射信息。相对于 WEB 应用的根目录
2 )标记在方法上:提供进一步的细分映射信息。相对于标记在类上的 URL。
3.若类上未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录
4.作用:
DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所对应的处理方法。
5.PathVariable 注解
请求占位符
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过 @PathVariable(“xxx”) 绑定到操作方法的入参中。
五、使用Ajax调用
@RequestMapping("/getPerson")
public void getPerson(String name,PrintWriter pw){
pw.write("hello,"+name);
}
@RequestMapping("/name")
public String sayHello(){
return "name";
}
前台用下面的Jquery代码调用
$(function(){
$("#btn").click(function(){
$.post("mvc/getPerson",{name:$("#name").val()},function(data){
alert(data);
});
});
});
六、返回json格式的字符串
使用 @ResponseBody注解
@Controller
@RequestMapping("/add")
public class jsonController {
@ResponseBody
@RequestMapping("/user")
public User get(){
User u = new User();
u.setId(1);
u.setName("zhangsan");
u.setBirth(new Date());
return u;
}
}