1、MVC(Model、View、Controller)
即:模型、视图、控制器的简写,是一种软件设计规范
模型:dao、service,数据模型,提供要展示的数据,包含数据和行为
视图:jsp,负责进行模型的展示
控制器:servelet,接收用户请求、返回模型数据给视图,相当于一个调度员
SpringMVC
- 轻量简单高效
- 基于请求响应的MVC框架
- 约定由于配置
- 功能强大:RESTful、数据验证、格式化、本地化、主题
- 简洁灵活
Spring 中的一部分,实现MVC的轻量级Web框架
Spring 的web框架围绕DispatcherServlet 设计,他的作用是将请求分发到不同的处理器
2、SpringMVC 的执行原理
- 用户请求找到DispatchServlet, DispatchServlet中绑定了一个SpringMVC 的配置文件,根据配置就能够找到 这个SpringMVC 的配置文件。
- SpringMVC 配置文件中的处理器映射器,能够找到 用户 url 中的控制器,并将这个控制器返回出去。
- 处理器适配器就找到映射器返回的Controller来处理具体的业务,最终返回一个ModelAndView ,并由HandlerAdapter将视图逻辑名或模型返回给DispatcherServlet
- 最后视图解析器根据处理器适配器返回的ModelAndView,视图解析器会将前缀、后缀以及用户请求的页面名称拼接起来,调用具体的视图最终呈现给用户
3、Controller配置
实现Controller接口
- 添加web 框架支持
- web.xml配置文件
- springmvc-config.xml 配置文件
- controller
- 视图层
- 缺点:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦;
通过注解开发
- web.xml 配置文件
- 注册DispathcerServlet
- 关联 springmvc 配置文件
- 启动级别
- 拦截
- SpringMVC-config.xml 配置文件
- 让IOC 的注解生效
- 静态资源过滤
- MVC的注解驱动
- 配置视图解析器
- controller
- 标识controller
- 标识访问路径 @RequestMapping
- 定义一个方法,返回值为标识层页面,封装数据用Model
- 创建视图层
视图是被复用的,而控制器与视图之间是弱偶合关系。
注解方式是平时使用的最多的方式!
4、RestFul 风格
- Restful就是一个资源定位及资源操作的风格,只是一种风格。
- 基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。更快速、更安全。
- 获得参数更加方便,框架会自动进行类型转换。
**传统方式操作资源 :**通过不同的参数来实现不同的效果!方法单一,post 和 get
**使用RESTful操作资源 :**可以通过不同的请求方式来实现不同的效果!但是功能可以不同!
@PathVariable :路径变量,让方法参数的值对应绑定到URL模板变量上。
@RequestMapping( value=“URL” method=RequestMethod.XXX ),value/path 来定义路径,method来定义请求方式
组合注解:
就分别对应给method属性设置这些请求方式
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
组合注解的作用:
@RequestMapping(value = “url” method =RequestMethod.GET) == @GetMapping( “url” )
5、转发和重定向
我们通常会使用视图解析器来实现页面的转发和重定向
重定向地址栏会变化
无需视图解析器
@Controller
public class ResultSpringMVC {
@RequestMapping("/rsm/t1")
public String test1(){
//转发
return "/index.jsp";
}
@RequestMapping("/rsm/t2")
public String test2(){
//转发二
return "forward:/index.jsp";
}
@RequestMapping("/rsm/t3")
public String test3(){
//重定向
return "redirect:/index.jsp";
}
}
使用视图解析器
// 2. 使用视图解析器,return的时候默认是转发操作
// 重定向直接加上 redirect:/XXX 就可以
@RequestMapping(value="/test2")
public String test2(){
return "test2";
}
@RequestMapping(value="/test")
public String test(){
// 重定向
return "redirect:/test2";
}
6、参数处理
- 单一值:请求中的参数可以直接被controller 接收
- 对象 :将Controller 中的方法参数设置为 实体类,url中的域名称设置为实体类的属性即可被接收
如果域名称和方法中的参数名不一致则可以使用 @RequestParam(“xxxx”) xxx表示提交域传入的域名称
每个从前端接收到的参数都要使用这个注解(清楚明了,更好的配置)
7、乱码问题
我们可以使用过滤器来解决这个问题,注意 /* 才会过滤jsp文件
- 自定义过滤器
- SpringMVC提供的过滤器
- 大神的过滤器
8、JSON
- JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
- 采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。任何JavaScript 支持的类型都可以通过 JSON 来表示
语法要求:
- 对象表示为键值对,数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 和 JavaScript 对象转换
- JSON字符串 =》 JavaScript 对象, JSON.parse()
- JavaScript 对象 =》 JSON字符串,JSON.stringify()
Jackson
- @RestContrller 作用于一个Controller ,让这个Controller中的所有方法都返回json 字符串
- @ResponseBody 作用于一个方法,返回json字符串。
- 对java 对象的转换
- 对象
- 列表
- Date
- JsonUtil 类
乱码问题
-
@RequestMapping 的 produces 属性
//produces:指定响应体返回类型和编码 @RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")
-
Spring 统一配置
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="failOnEmptyBeans" value="false"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>