SSM 项目实战开发经验总结(Spring & Spring MVC & MyBatis)

SSM总结

开发流程

  1. 创建 maven 工程

  2. 在 pom.xml 文件中引入各种依赖与插件:

    • JUnit5
    • Spring事务
    • MyBatis
    • MyBatis集成Spring
    • 阿里druid数据库连接池
    • j2ee注解
    • AspectJ
    • servlet
    • jsp
    • SpringMVC
    • Jackson
    • JSTL
    • MyBatis Generator
    • PageHelper分页插件
    • JSR303(hibernate-validator)数据校验支持
    • lombok
  3. 引入 bootstrap 前端框架

  4. 架构项目

    1. 创建controller包
    2. 创建dao包
    3. 创建entity包
    4. 创建exception包
    5. 创建handler包
    6. 创建service包及impl子包
    7. 创建util包
    8. 引入各个静态资源
  5. 编写配置文件

    • 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

  6. 使用MyBatis Generator逆向工程生成mapper接口、mapper接口对象的xml,以及各实体类

  7. 测试mapper

  8. 在entity包中创建实体类

    • 添加@Component注解,声明实体类
    • 使用JSR303(hibernate-validator)中的注解对实体类中的各个属性进行后端校验
  9. 在service包中创建service接口,并实现接口

    • 在类上加@Service注解
    • 在内部创建 private final 修饰的dao(mapper)接口对象
    • 使用构造器与@Qualifier注解进行自动注入
    • 调用接口对象进行业务处理
    • 在service包下创建Aspect切面类
      • 在类上加@Aspect注解
      • 使用@Before、@AfterReturning、@Around注解标记切面方法执行的时机
  10. 在 index.jsp 页面编写发起请求的代码

    • 使用 $.each 进行循环处理
    • 使用 empty() 清空元素,防止页面重复添加元素
    • 在每次使用on绑定事件前,都先使用off来解绑事件,防止反复执行
    • 使用 $.ajax 发送请求,url为请求路径,data为请求路径url之后的请求参数(可以省略),type为请求方式,success用于处理 ajax 请求成功后的功能处理
    • 使用 attr 方法来获取自定义属性,使用 prop 方法来获取原生属性
  11. 在controller包中创建Controller控制器对象

    • 在类上声明@Controller注解
    • 在内部创建 private final 修饰的service接口对象
    • 使用构造器与@Qualifier注解进行自动注入
    • 编写控制器方法,在方法中调用service方法,并在方法上按需加注解
      • @Transactional(事务管理)
      • @RequestMapping(请求响应映射)
      • @ResponseBody(请求体)
    • 若请求路径中带有需要使用的参数,可以在方法参数前使用@PathVariable注解自动注入
    • 在exception包中创建异常类
    • 在handler包中创建异常处理类
      • 在类上加@ControllerAdvice注解,在异常处理类上使用时用于增加异常处理功能
      • 在方法上加@ExceptionHandler注解,参数是对应异常的class
  12. 测试控制器类

    • 在类上使用@WebAppConfiguration注解,在类中创建并自动注入WebApplicationContext对象
    • 在类上使用@SpringJUnitWebConfig注解,在其locations参数组中加入配置文件的配置路径
    • 在initMockMvc方法上使用@BeforeEach(JUnit5,在JUnit4中使用@Before)注解,使用 MockMvcBuilders.webAppContextSetup(context).build(); 为MockMvc对象赋值
    • 在测试方法上添加@Test注解
  13. 在handler包中创建Interceptor拦截器类

    • 实现 HandlerInterceptor 接口
      • preHandler方法(预处理方法),主要使用此方法
      • postHandler方法(后处理方法)
      • afterCompletion方法(最后执行的方法)

遇到的问题与注意事项

  1. 使用ModelAndView返回数据与视图,也可以创建一个Msg类,用于控制器对象的方法返回数据;

  2. 在控制器类上使用**@Controller**注解,声明控制器类;

  3. 在控制器类中使用private final修饰service接口对象;

  4. 使用构造器与@Qualifier注解进行自动注入

  5. 在控制器方法上使用**@Transational**注解表示Spring事务;

  6. 使用**@ResponseBody**和Msg类返回service调用dao接口方法后得到的数据;

  7. 使用**@RequestMapping**来指定请求映射与请求方式;

  8. 前后端传值

    • @PathVariable(获取路径参数)和 @RequestParam(获取查询参数)

      • 在控制器类方法参数之前使用**@RequestParam**注解,将请求中的参数注入方法形参(可以设置默认值);
      • 使用**@PathVariable**自动注入请求路径中的参数(使用大括号“{}”包裹要注入的参数值),若请求路径中的参数名与方法参数中的对象类的参数同名,则自动注入并封装;
      image-20200808195048466
    • @RequestBody

      用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用 HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象。

  9. 使用请求转发与重定向:

    modelAndView.setViewName("forward:/WEB-INF/view/show.jsp");
    
    modelAndView.setViewName("redirect:/hello.jsp");
    
  10. 创建service接口解耦合;

  11. 在service包中创建impl子包,创建实现service接口的实现类,并添加@Service注解;

  12. 在控制器类中使用private final修饰service接口对象;

  13. 使用构造器与@Qualifier注解进行自动注入

  14. 使用MyBatis Generator逆向生成SQL mapper,在xml配置文件中指定:本地硬盘上的数据库驱动包,数据库链接URL、用户名、密码,生成模型的包名和位置,生成映射文件的包名和位置,生成mapper的位置,要生成的表;

  15. 在webapp文件夹下创建static包,将jQuery、bootstrap等文件;

  16. 在WEB-INF下创建view文件夹,用于存放视图文件;

  17. 在jsp文件中写入以下内容:

    • <%@page isELIgnored=“false” %>:表示可以使用EL表达式
    • <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>:表示可以使用一些相应的技术
    • 使用 ${pageContext.request.contextPath} 以取出部署的应用程序名或者是当前的项目名称
  18. 在Test类里创建MockMvc类对象,用于虚拟MVC请求,获取到处理结果;

  19. 在Test类上使用@WebAppConfiguration,在Test类中自动注入WebApplicationContext对象,将相应的数据初始化给MockMvc对象;

  20. 在Test类上使用@SpringJUnitWebConfig来指定相应配置文件的位置;

  21. 使用UUID(通用唯一识别码);

    UUID 目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。

    UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。

  22. @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)
  23. 参数校验

    即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 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 包,不需要引用相关依赖。

猜你喜欢

转载自blog.csdn.net/m0_46261993/article/details/127373548