SSM总结
开发流程
-
创建 maven 工程
-
在 pom.xml 文件中引入各种依赖与插件:
- JUnit5
- Spring事务
- MyBatis
- MyBatis集成Spring
- 阿里druid数据库连接池
- j2ee注解
- AspectJ
- servlet
- jsp
- SpringMVC
- Jackson
- JSTL
- MyBatis Generator
- PageHelper分页插件
- JSR303(hibernate-validator)数据校验支持
- lombok
-
引入 bootstrap 前端框架
-
架构项目
- 创建controller包
- 创建dao包
- 创建entity包
- 创建exception包
- 创建handler包
- 创建service包及impl子包
- 创建util包
- 引入各个静态资源
-
编写配置文件
-
web.xml
- Spring的监听器
- 字符集过滤器
- 使用Rest风格URI的过滤器
- 自动封装前台传递的PUT/DELETE请求参数的过滤器
- 注册中央调度器
-
dispatcherServlet.xml
- 注册controller组件扫描器
- 注册handler组件扫描器
- 注册视图解析器
- 声明注解驱动
- 处理静态资源访问的映射
- 声明拦截器(按需)
-
applicationContext.xml
- 声明 jdbc.properties 文件
- 声明数据源,使用阿里druid数据库连接池,连接数据库
- 声明MyBatis中提供的SqlSessionFactoryBean类,其内部创建SqlSessionFactory
- 将数据库连接池赋给dataSource属性
- 声明MyBatis主配置文件的位置
- 声明MapperScannerConfiguration对象,生成每个dao接口的代理对象
- 配置一个可以执行批量操作的SqlSession
- 声明@Service注解所在的包名
- 声明实体类所在的包名
- 声明工具类所在的包名
- 声明Spring的事务管理器
- 开启注解驱动
-
mybatis.xml
- 日志(按需)
- 设置别名(按需)
- 注册PageHelper插件
- 声明Sql mapper(SQL映射文件)的位置
-
jdbc.properties
-
generatorConfig.xml
-
-
使用MyBatis Generator逆向工程生成mapper接口、mapper接口对象的xml,以及各实体类
-
测试mapper
-
在entity包中创建实体类
- 添加@Component注解,声明实体类
- 使用JSR303(hibernate-validator)中的注解对实体类中的各个属性进行后端校验
-
在service包中创建service接口,并实现接口
- 在类上加@Service注解
- 在内部创建 private final 修饰的dao(mapper)接口对象
- 使用构造器与@Qualifier注解进行自动注入
- 调用接口对象进行业务处理
- 在service包下创建Aspect切面类
- 在类上加@Aspect注解
- 使用@Before、@AfterReturning、@Around注解标记切面方法执行的时机
-
在 index.jsp 页面编写发起请求的代码
- 使用 $.each 进行循环处理
- 使用 empty() 清空元素,防止页面重复添加元素
- 在每次使用on绑定事件前,都先使用off来解绑事件,防止反复执行
- 使用 $.ajax 发送请求,url为请求路径,data为请求路径url之后的请求参数(可以省略),type为请求方式,success用于处理 ajax 请求成功后的功能处理
- 使用 attr 方法来获取自定义属性,使用 prop 方法来获取原生属性
-
在controller包中创建Controller控制器对象
- 在类上声明@Controller注解
- 在内部创建 private final 修饰的service接口对象
- 使用构造器与@Qualifier注解进行自动注入
- 编写控制器方法,在方法中调用service方法,并在方法上按需加注解
- @Transactional(事务管理)
- @RequestMapping(请求响应映射)
- @ResponseBody(请求体)
- 若请求路径中带有需要使用的参数,可以在方法参数前使用@PathVariable注解自动注入
- 在exception包中创建异常类
- 在handler包中创建异常处理类
- 在类上加@ControllerAdvice注解,在异常处理类上使用时用于增加异常处理功能
- 在方法上加@ExceptionHandler注解,参数是对应异常的class
-
测试控制器类
- 在类上使用@WebAppConfiguration注解,在类中创建并自动注入WebApplicationContext对象
- 在类上使用@SpringJUnitWebConfig注解,在其locations参数组中加入配置文件的配置路径
- 在initMockMvc方法上使用@BeforeEach(JUnit5,在JUnit4中使用@Before)注解,使用 MockMvcBuilders.webAppContextSetup(context).build(); 为MockMvc对象赋值
- 在测试方法上添加@Test注解
-
在handler包中创建Interceptor拦截器类
- 实现 HandlerInterceptor 接口
- preHandler方法(预处理方法),主要使用此方法
- postHandler方法(后处理方法)
- afterCompletion方法(最后执行的方法)
- 实现 HandlerInterceptor 接口
遇到的问题与注意事项
-
使用ModelAndView返回数据与视图,也可以创建一个Msg类,用于控制器对象的方法返回数据;
-
在控制器类上使用**@Controller**注解,声明控制器类;
-
在控制器类中使用private final修饰service接口对象;
-
使用构造器与@Qualifier注解进行自动注入;
-
在控制器方法上使用**@Transational**注解表示Spring事务;
-
使用**@ResponseBody**和Msg类返回service调用dao接口方法后得到的数据;
-
使用**@RequestMapping**来指定请求映射与请求方式;
-
前后端传值
-
@PathVariable(获取路径参数)和 @RequestParam(获取查询参数)
- 在控制器类方法参数之前使用**@RequestParam**注解,将请求中的参数注入方法形参(可以设置默认值);
- 使用**@PathVariable**自动注入请求路径中的参数(使用大括号“{}”包裹要注入的参数值),若请求路径中的参数名与方法参数中的对象类的参数同名,则自动注入并封装;
-
@RequestBody
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用 HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象。
-
-
使用请求转发与重定向:
modelAndView.setViewName("forward:/WEB-INF/view/show.jsp");
modelAndView.setViewName("redirect:/hello.jsp");
-
创建service接口解耦合;
-
在service包中创建impl子包,创建实现service接口的实现类,并添加@Service注解;
-
在控制器类中使用private final修饰service接口对象;
-
使用构造器与@Qualifier注解进行自动注入;
-
使用MyBatis Generator逆向生成SQL mapper,在xml配置文件中指定:本地硬盘上的数据库驱动包,数据库链接URL、用户名、密码,生成模型的包名和位置,生成映射文件的包名和位置,生成mapper的位置,要生成的表;
-
在webapp文件夹下创建static包,将jQuery、bootstrap等文件;
-
在WEB-INF下创建view文件夹,用于存放视图文件;
-
在jsp文件中写入以下内容:
- <%@page isELIgnored=“false” %>:表示可以使用EL表达式
- <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>:表示可以使用一些相应的技术
- 使用 ${pageContext.request.contextPath} 以取出部署的应用程序名或者是当前的项目名称
-
在Test类里创建MockMvc类对象,用于虚拟MVC请求,获取到处理结果;
-
在Test类上使用@WebAppConfiguration,在Test类中自动注入WebApplicationContext对象,将相应的数据初始化给MockMvc对象;
-
在Test类上使用@SpringJUnitWebConfig来指定相应配置文件的位置;
-
使用UUID(通用唯一识别码);
UUID 目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
-
@RequestMapping的扩展使用
- @GetMapping(“users”) 等价于 @RequestMapping(value=“/users”, method=RequestMethod.GET)
- @PostMapping(“users”) 等价于 @RequestMapping(value=“/users”, method=RequestMethod.POST)
- @PutMapping(“/users/{userId}”) 等价于 @RequestMapping(value=“/users/{userId}”, method=RequestMethod.PUT)
- @DeleteMapping(“/users/{userId}”) 等价于 @RequestMapping(value=“/users/{userId}”, method=RequestMethod.DELETE)
-
参数校验
即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。
JSR(Java Specification Requests) 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,这样就可以在需要校验的时候进行校验了,非常方便!
校验的时候我们实际用的是 Hibernate Validator 框架。Hibernate Validator 是 Hibernate 团队最初的数据校验框架,Hibernate Validator 4.x 是 Bean Validation 1.0(JSR 303)的参考实现,Hibernate Validator 5.x 是 Bean Validation 1.1(JSR 349)的参考实现,目前最新版的 Hibernate Validator 6.x 是 Bean Validation 2.0(JSR 380)的参考实现。
SpringBoot 项目的 spring-boot-starter-web 依赖中已经有 hibernate-validator 包,不需要引用相关依赖。