环境
- jdk1.8
- maven
- Idea
MVC 设计模式一般指 MVC 框架
-
M(Model)指数据模型层,模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)
-
V(View)指视图层,负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能
-
C(Controller)指控制层,负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端
使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。 -
Servlet 及 JSP 开发时,JavaBean 相当于 Model,Servlet 相当于 Controller,JSP 相当于 View
MVC优缺点
优点
- 多视图共享一个模型,大大提高了代码的可重用性
- MVC 三个模块相互独立,松耦合架构
- 控制器提高了应用程序的灵活性和可配置性
- 有利于软件工程化管理 总之,我们通过 MVC 设计模式最终可以打造出一个松耦合+高可重用性+高可适用性的完美架构。
缺点
- 原理复杂
- 增加了系统结构和实现的复杂性
- 视图对模型数据的低效率访问
全注解体验SpringMVC
- 创建maven-webapp项目,在src--main下添加,java文件夹标记为source root,新建resources文件夹标记为resource root
- 新建package.config,然后新建SpringConfig.java 、 servletConfig.java
package com.leo.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.leo.controller")
public class SpringConfig {
}
---
package com.leo.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
public class ServletInitConfig extends AbstractDispatcherServletInitializer {
// 加载springmvc对应的容器对象
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
// 过滤哪些请求
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
// 加载spring对应的容器对象
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
- 控制器处理请求
package com.leo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("hello world");
return "{'info':'user controller'}";
}
}
-
配置 maven启动的tomcat,tomcat7:run
-
访问
排出加载的类
根据配置类加载bean
GET 请求的参数传递
字符集过滤
请求中name和方法中的username绑定传参
- 如果参数名和类型中的字段完全匹配,会自动的装配到类中
- 如果接收参数的类中有引用类型的数据,只需要根据类型中的数据填写依然会被收到
接收数组参数
把参数放进集合,传参没有区别,接收参数使用@RequestParm
通过HttpServletRequest接收请求参数
@RequestMapping("/login")
public String login(HttpServletRequest request, Model model) {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if ("root".equals(name)&& "123456".equals(pwd)) {
model.addAttribute("message", "登录成功");
return "main"; // 登录成功,跳转到 main.jsp
} else {
model.addAttribute("message", "用户名或密码错误");
return "login";
}
}
通过@PathVariable接收URL中的请求参数
@RequestMapping("/login/{name}/{pwd}")
public String login(@PathVariable String name, @PathVariable String pwd, Model model) {
if ("root".equals(name)
&& "123456".equals(pwd)) {
model.addAttribute("message", "登录成功");
return "main"; // 登录成功,跳转到 main.jsp
} else {
model.addAttribute("message", "用户名或密码错误");
return "login";
}
}
通过@RequestParam接收请求参数
在方法入参处使用 @RequestParam 注解指定其对应的请求参数。@RequestParam 有以下三个参数:
- value:参数名
- required:是否必须,默认为 true,表示请求中必须包含对应的参数名,若不存在将抛出异常
- defaultValue:参数默认值
@RequestMapping("/login")
public String login(@RequestParam String name, @RequestParam String pwd, Model model) {
if ("root".equals(name)
&& "123456".equals(pwd)) {
model.addAttribute("message", "登录成功");
return "main"; // 登录成功,跳转到 main.jsp
} else {
model.addAttribute("message", "用户名或密码错误");
return "login";
}
}
通过@ModelAttribute接收请求参数
@ModelAttribute 注解用于将多个请求参数封装到一个实体对象中,从而简化数据绑定流程,而且自动暴露为模型数据,在视图页面展示时使用。而“通过实体 Bean 接收请求参数”中只是将多个请求参数封装到一个实体对象,并不能暴露为模型数据
@RequestMapping("/login")
public String login(@ModelAttribute("user") User user, Model model) {
if ("root".equals(name)
&& "123456".equals(pwd)) {
model.addAttribute("message", "登录成功");
return "main"; // 登录成功,跳转到 main.jsp
} else {
model.addAttribute("message", "用户名或密码错误");
return "login";
}
}
传递JSON数据
- 导入依赖包
- 路径参数
- 从requestBody中解析数据
- 接收日期参数解析:@DataTimeFormat(pattern="yyyy-MM-dd")
- 根据类型中自动的开启转换,配置类上
@EnableWebMvc
开启JSON数据返回 @ResponseBody
简化controller层类注解
放行静态资源访问
- 设置过滤类
- 在配置类上扫描过滤类
整合mybatis
- 导坐标、写
jdbc.properties、写SpringConfig.java,激活配置文件注解@propertieSource
- 写jdbcConfig.java
-
写MybatisConfig.java配置类
-
web容器类
-
SpringMvcConfig.java
-
开启事务
- JdbcConfig.java添加平台事务管理器
- 在service层接口上注解事务
MVC搭建
-
新建controller、dao、service、service.impl、model controller:接收前端的数据 dao:持久层的接口 service:业务层的接口 service.impl:业务层的接口实现 model:前端交互的业务数据模型
-
测试
- 返回的消息体
- 定义code码
- controller层返回
异常处理
-
异常在表现层处理
-
spring异常处理器,这个类需要能被扫描到添加到容器中
-
自定义系统异常处理
-
自定义运行时异常处理
-
业务层异常处理
拦截器
-
Spring MVC 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理
-
Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
-
preHandle( ):该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
-
postHandle( ):该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
-
afterCompletion( ):该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
- 定义拦截器
- 有侵入性的拦截器
-
在配置类中注册
-
拦截请求参数
- 拦截器的执行顺序跟配置的顺序有关系,先配置的先执行,退出的时候是后配置的先执行