3.5-Spring-MVC

优质
小牛编辑
128浏览
2023-12-01
  • 新建 MVN 项目:[File]-[New]-[Project]-[Maven]
  • 新建 Web 模块:[右键项目]-[New]-[Module]-[勾选 Web Application]
  • 添加依赖
  • 配置,参考章节 2.1。
  • 新建 Controller 类,参考章节 3。

2. Spring MVC 的基本概念

MVC 架构图

  • DispatcherServelt(前端控制器):捕获 Http 请求,根据 servlet.xml 中配置调用 HandlerMapping 根据请求 URL 寻找合适的 Handler。
  • Controller(Handler):调用业务逻辑产生合适的 Model 数据,将数据传给视图层呈现或调用其他的 Controller 。
  • HandlerAdapter:适配器模式,将不同类型的 Hander 适配成 DispatcherServlet 可以使用的 Handler。
  • HandlerInterceptor:实现该接口,并重写 afterCompletion()、postHandler(ModelAndView model)或preHandler(HttpServletRequest request,HttpServletResponse response,Object handler,Exeception ex) 方法,并使用 Configuration 注解注册拦截器。
  • HandlerMapping:帮助 DispatcherServelt 找到合适的 Handler(Controller),工作完成之后返回给 DispatcherServelt 一个 HandlerAdapter,包括某个具体的 Controller 示例,和 Controller 需要被包裹的 HandlerInterceptor。
  • HandlerExecutionChain:依次执行 preHandler()、Controller method、postHandler()、afterCompletion() 方法。
  • ModelAndView: Controller 返回值类型为 ModelAndView 或 String(View 的路径)。
  • ViewResoler(视图解析器):告诉 DispatcherServelt 需要用哪个视图进行呈现。
组件功能
Controller使用VO,组合ServiceImpl返回的List,组合成Json,返回给前端。
ServiveImpl调用Reposity,实现Service接口中的方法,返回结构给 controller。
Service定义有哪些方法。
Repository继承JpaRepository,返回List。
Entity属性名和数据表中的属性名映射,实体类中属性名采用驼峰式命名,数据库表中采用采用下划线式。
DTO数据传输对象。
VO展示对象。

2. Spring 的上下文层级

Spring MVC 的上下文层级

2.1 web.xml 中需配置内容

  • 上下文
  • 多个 DispatcherServelt
  • web.xml

    2.2 应用上下文配置文件

  • Spring 上下文处理 Service、Dao。
  • applicationContext.xml

    2.3 DispatcherServelt 配置文件

  • 配置 Controller
  • 配置 ViewResoler
  • mvc-dispatcherd-servlet.xml

    3. Controller

    ```

      //本方法将处理 /courses/view?courseId=123 形式的URL
      @RequestMapping("/view2/{courseId}")
    

    public String viewCourse2(@PathVariable("courseId") Integer courseId,

          Map<String, Object> model) {
    
      log.debug("In viewCourse2, courseId = {}", courseId);
      Course course = courseService.getCoursebyId(courseId);
      model.put("course",course);
      return "course_overview";
    

    }

      //本方法将处理 /courses/view2/123 形式的URL
    

    @RequestMapping("/view2/{courseId}") public String viewCourse2(@PathVariable("courseId") Integer courseId,

          Map<String, Object> model) {
    
      log.debug("In viewCourse2, courseId = {}", courseId);
      Course course = courseService.getCoursebyId(courseId);
      model.put("course",course);
      return "course_overview";
    

    }

    //本方法将处理 /courses/view3?courseId=123 形式的URL @RequestMapping("/view3") public String viewCourse3(HttpServletRequest request) {

      Integer courseId = Integer.valueOf(request.getParameter("courseId"));        
      Course course = courseService.getCoursebyId(courseId);
      request.setAttribute("course",course);
    
      return "course_overview";
    

    }

      @RequestMapping(value="/{courseId}",method=RequestMethod.GET)
    

    public @ResponseBody Course getCourseInJson(@PathVariable Integer courseId){

      return  courseService.getCoursebyId(courseId);
    

    }

@RequestMapping(value="/jsontype/{courseId}",method=RequestMethod.GET)
public  ResponseEntity<Course> getCourseInJson2(@PathVariable Integer courseId){
    Course course =   courseService.getCoursebyId(courseId);        
    return new ResponseEntity<Course>(course, HttpStatus.OK);
## 4. 注解
|注解|功能|
|------|------|
|ResponseBody|将返回值封装成 Json。|
|RequestBody|将请求体中的JSON字符串绑定到同名的入参或入参的成员变量上。|
# 5. 集成持久化层框架
## 5.1 JPA
* 添加依赖。
[jpa-spring-pom.xml](http://127.0.0.1/Jerrydremakergithubio/jpa-spring-pom.xml)
* 添加 db.properties 文件。
[mysql-db.properties](http://127.0.0.1/Jerrydremakergithubio/mysql-db.properties)
* 在 applicationContext.xml 中配置数据源、EntityManagerFactory、JPA 的注解和基于注解的事务操作、加入 SpringData。
[jpa-spring-test-config.xml](http://127.0.0.1/Jerrydremakergithubio/jpa-spring-test-config.xml)
* 添加实体类。
* 创建 XXXRepository 接口, JpaRepository 接口。
* Controller 类中注入调用 Service 类中的方法,Service 类中注入调用 XXXRepository 接口中的方法。
## 5.2 Hibernate
* 添加依赖,同章节 5.1。
* 添加 db.properties 文件,同章节 5.1。
* 在 applicationContext.xml 中配置数据源、session 工厂和事务管理器。
[hibernate-spring-test-config.xml](http://127.0.0.1/Jerrydremakergithubio/hibernate-spring-test-config.xml)
* 添加实体类。
* 创建 Repository 接口。 
* Controller 类中注入调用 Service 类中的方法,Service 类中注入调用 Repository 类中的方法。
## 5.3 Mybaties
### 5.3.1 使用步骤
* 添加依赖。
[test-mybatis-spring-pom.xml ](http://127.0.0.1/Jerrydremakergithubio/test-mybatis-spring-pom.xml)
* 添加 db.properties 文件,同 5.1。
* 在 applicationContext.xml 中配置数据源、session 工厂、 mapper 组件。
[test-mybatis-spring-config.xml](http://127.0.0.1/Jerrydremakergithubio/test-mybatis-spring-config.xml)
* 创建实体类。
* 创建 XXXMapper 接口,
* 创建 XXXMapper.xml 文件。
* Controller 类中注入调用 Service 类中的方法,Service 类中注入调用 Dao 类中的方法。
* 在数据库中创建表。

CREATE TABLE IF NOT EXISTS girl( id INT UNSIGNED AUTO_INCREMENT, cupSize VARCHAR(10) NOT NULL, age INT NOT NULL, PRIMARY KEY ( id ) ); 注:列名和属性名保持一致,若不一致,需要在 parameterMap 或 resultMap 中指定。

### 5.3.2 XXXMapper.xml 文件语法
* 支持 insert、delete、update、selete。
* 只有 selete 支持 resultType 或 resultMap。
* 如果 parameterType 是基础类型,引用时使用 #{参数名};如果 parameterType 是引用类型,引用时使用 #{成员变量名称}。
* 如果列名和属性名不一致,则 需要在 resultMap 中指定。
* 关联查询。
# 6. 集成第三方工具
## 6.1 集成 Log4j
### 6.1.1 添加依赖
#### 6.1.1.1 Log4j 方式
log4j log4j 1.2.17 ``` #### 6.1.1.2 slf4j 方式 ``` org.slf4j slf4j-api 1.7.13

org.slf4j slf4j-log4j12 1.7.25

### 6.1.2 在 resource 目录下添加 log4j.properties 配置文件

log4j.rootLogger=INFO,stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.target = System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [ ```

6.2 集成 Lombok

6.2.1 安装插件

6.2.2 添加依赖

6.2.3 添加注解

注:日志打印功能在非 Spring Boot 项目中未实现。

参考资料