SpringMVC高级

SpringMVC高级

1.SSM整合(重点)

1.1 SSM

SSM(Spring + SpringMVC + MyBatis)

  • Spring
    • 框架基础
  • MyBatis
    • mysql+druid+pagehelper
  • Spring整合MyBatis
    • junit测试业务层接口
  • SpringMVC
    • rest风格(postman测试请求结果)
    • 数据封装json(jackson)
  • Spring整合SpringMVC
    • Controller调用Service
  • 其他
    • 表现层数据封装
    • 自定义异常

1.2 SSM整合案例

用户表

image-20210503132037356

学生表

image-20210503132105486

1.3 Part0:项目基础结构搭建

  • 创建项目,组织项目结构,创建包

    image-20210503132605406
  • 创建表与实体类

    CREATE TABLE `user` (
      `uuid` int(10) NOT NULL AUTO_INCREMENT,
      `usrName` varchar(100) DEFAULT NULL,
      `password` varchar(100) DEFAULT NULL,
      `realName` varchar(100) DEFAULT NULL,
      `gender` int(1) DEFAULT NULL,
      `birthday` date DEFAULT NULL,
      PRIMARY KEY (`uuid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    package com.itheima.domain;
    
    import java.io.Serializable;
    import java.util.Date;
    
    public class User implements Serializable {
        private Integer uuid;
        private String usrName;
        private String password;
        private String realName;
        private Integer gender;
        private Date birthday;
    
        public Integer getUuid() {
            return uuid;
        }
    
        public void setUuid(Integer uuid) {
            this.uuid = uuid;
        }
    
        public String getUsrName() {
            return usrName;
        }
    
        public void setUsrName(String usrName) {
            this.usrName = usrName;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getRealName() {
            return realName;
        }
    
        public void setRealName(String realName) {
            this.realName = realName;
        }
    
        public Integer getGender() {
            return gender;
        }
    
        public void setGender(Integer gender) {
            this.gender = gender;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "uuid=" + uuid +
                    ", usrName='" + usrName + '\'' +
                    ", password='" + password + '\'' +
                    ", realName='" + realName + '\'' +
                    ", gender=" + gender +
                    ", birthday=" + birthday +
                    '}';
        }
    }
    
  • 创建三层架构对应的模块、接口与实体类,建立关联关系

    • 数据层接口(代理自动创建实现类)

      package com.itheima.dao;
      
      import com.itheima.domain.User;
      import java.util.List;
      
      public interface UserDao {
          /**
           * 添加用户
           * @param user
           * @return
           */
          public boolean save(User user);
      
          /**
           * 修改用户
           * @param user
           * @return
           */
          public boolean update(User user);
      
          /**
           * 删除用户信息
           * @param uuid
           * @return
           */
          public boolean delete(Integer uuid);
      
          /**
           * 查询单个用户信息
           * @param uuid
           * @return
           */
          public User get(Integer uuid);
      
          /**
           * 查询全部用户信息
           * @return
           */
          public List<User> getAll();
      
          /**
           * 根据用户名密码查询用户信息
           * @param userName 用户名
           * @param password 密码信息
           * @return
           */
          //注意:数据层操作不要和业务层操作的名称混淆,通常数据层仅反应与数据库间的信息交互,不体现业务逻辑
          public User getByUserNameAndPassword(String userName,String password);
      }
      
    • 业务层接口+业务层实现类

      package com.itheima.service;
      
      import com.itheima.domain.User;
      import java.util.List;
      
      public interface UserService {
          /**
           * 添加用户
           * @param user
           * @return
           */
          public boolean save(User user);
      
          /**
           * 修改用户
           * @param user
           * @return
           */
          public boolean update(User user);
      
          /**
           * 删除用户信息
           * @param uuid
           * @return
           */
          public boolean delete(Integer uuid);
      
          /**
           * 查询单个用户信息
           * @param uuid
           * @return
           */
          public User get(Integer uuid);
      
          /**
           * 查询全部用户信息
           * @return
           */
          public List<User> getAll();
      
          /**
           * 根据用户名密码登录
           * @param userName
           * @param password
           * @return
           */
          public User login(String userName,String password);
      }
      
      package com.itheima.service.impl;
      
      import com.itheima.domain.User;
      import com.itheima.service.UserService;
      import java.util.List;
      
      public class UserServiceImpl implements UserService {
          @Override
          public boolean save(User user) {
              return false;
          }
      
          @Override
          public boolean update(User user) {
              return false;
          }
      
          @Override
          public boolean delete(Integer uuid) {
              return false;
          }
      
          @Override
          public User get(Integer uuid) {
              return null;
          }
      
          @Override
          public List<User> getAll() {
              return null;
          }
      
          @Override
          public User login(String userName, String password) {
              return null;
          }
      }
      
    • 表现层

      package com.itheima.controller;
      
      public class UserController {
      }
      

1.4 Part1+Part2:SSM整合

  • 导入坐标

      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
        </dependency>
    
        <!--spring坐标-->
    <!--
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
    -->
    
        <!--mybatis坐标-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.3</version>
        </dependency>
    
        <!--mysql坐标-->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.47</version>
        </dependency>
    
        <!--spring整合jdbc-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
    
        <!--spring整合mybatis-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>2.0.3</version>
        </dependency>
    
        <!--druid连接池-->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.16</version>
        </dependency>
    
        <!--分页插件坐标-->
        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>5.1.2</version>
        </dependency>
    
        <!--springmvc坐标-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
    
        <!--spring web坐标-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
    
        <!--servlet3.1规范坐标-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
    
        <!--json相关坐标3个-->
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.0</version>
        </dependency>
    <!--
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.9.0</version>
        </dependency>
    
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.9.0</version>
        </dependency>
    -->
      </dependencies>
    
  • 创建MyBatis映射文件

    <?xml version="1.0" encoding="utf-8" ?>
    <!--Mybatis的DTD的约束-->
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dta/mybatis-3-mapper.dtd">
    <mapper namespace="com.itheima.dao.UserDao">
        <!--添加-->
        <insert id="save" parameterType="user">
            insert into user(userName,password,realName,gender,birthday) values(#{userName},#{password},#{realName},#{gender},#{birthday})
        </insert>
    
        <!--删除-->
        <delete id="delete" parameterType="int">
            delete from user where uuid = #{uuid}
        </delete>
    
        <!--修改-->
        <update id="update" parameterType="user">
            update user set userName=#{userName},password=#{password},realName=#{realName},gender=#{gender},birthday=#{birthday} where uuid=#{uuid}
        </update>
    
        <!--查询全部(分页查询)-->
        <select id="getAll" resultType="user">
            select * from user
        </select>
    
        <!--查询单个-->
        <select id="get" resultType="user" parameterType="int">
            select * from account where uuid = #{uuid}
        </select>
    
        <!--登录-->
        <select id="getByUserNameAndPassword" resultType="user">
            select * from user where userName=#{userName} and password=#{password}
        </select>
    </mapper>
    
        public User getByUserNameAndPassword(@Param("userName") String userName,@Param("password") String password);
    
    
  • 创建Spring配置文件

    • 组件扫描
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="com.itheima"/>
    </beans>
    
    @Service
    public class UserServiceImpl implements UserService {
    }
    
  • 整合MyBatis到Spring环境中

    • SqlSessionFactoryBean

      <!--整合mybatis到spring中-->
      <bean class="org.apache.ibatis.session.SqlSessionFactoryBuilder">
          <property name="dataSource" ref="dataSource"/>
          <property name="typeAliasesPackage" value="com.itheima.domain"/>
      </bean>
      
    • 数据源(druid+jdbc.properties)

      <!--加载properties配置文件-->
      <context:property-placeholder location="classpath*:jdbc.properties"/>
      
      <!--数据源-->
      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
          <property name="driverClassName" value="${jdbc.driver}"/>
          <property name="url" value="${jdbc.url}"/>
          <property name="username" value="${jdbc.username}"/>
          <property name="password" value="${jdbc.password}"/>
      </bean>
      
    • 映射扫描

      <!--映射扫描-->
      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
          <property name="basePackage" value="com.itheima.dao"/>
      </bean>
      
    • 注解事务

      <tx:annotation-driven transaction-manager="txManager"/>
      
      <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="dataSource"/>
      </bean>
      
      @Transactional(readOnly = true)
      public interface UserService {
          @Transactional(readOnly = false)
          public boolean save(User user);
          @Transactional(readOnly = false)
          public boolean update(User user);
          @Transactional(readOnly = false)
          public boolean delete(Integer uuid);
      
          public User get(Integer uuid);
          public PageInfo<User> getAll(int page, int size);
          public User login(String userName,String password);
      }
      
    • 分页插件

      <!--整合mybatis到spring中-->
      <bean class="org.apache.ibatis.session.SqlSessionFactoryBuilder">
          <property name="dataSource" ref="dataSource"/>
          <property name="typeAliasesPackage" value="com.itheima.domain"/>
          <!--分页插件-->
          <property name="plugings">
              <array>
                  <bean class="com.github.pagehelper.PageInterceptor">
                      <property name="properties">
                          <props>
                              <prop key="helperDialect">mysql</prop>
                              <prop key="reasonable">true</prop>
                          </props>
                      </property>
                  </bean>
              </array>
          </property>
      </bean>
      
      @Override
      public PageInfo<User> getAll(int page,int size) {
          PageHelper.startPage(page,size);
          List<User> all = userDao.getAll();
          return new PageInfo<User>(all);
      }
      
  • 创建单元测试

    package com.itheima.service;
    
    import com.github.pagehelper.PageInfo;
    import com.itheima.domain.User;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import java.util.Date;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContext.xml")
    public class UserServiceTest {
    
        @Autowired
        private UserService userService;
    
        @Test
        public void testSave() {
            User user = new User();
            user.setUserName("风花雪月");
            user.setPassword("root");
            user.setRealName("王二哈");
            user.setGender(1);
            user.setBirthday(new Date(8745701897123L));
    
            userService.save(user);
        }
    
        @Test
        public void testDelete() {
            userService.delete(2);
        }
    
        @Test
        public void testUpdate() {
            User user = new User();
            user.setUuid(3);
            user.setUserName("青丝如梦");
            user.setPassword("root");
            user.setRealName("小尹");
            user.setGender(0);
            user.setBirthday(new Date(87401289723L));
    
            userService.update(user);
        }
    
        @Test
        public void testGet() {
            User user = userService.get(3);
            System.out.println(user);
        }
    
        @Test
        public void testGetAll() {
            PageInfo<User> all = userService.getAll(2,2);
            System.out.println(all);
            System.out.println(all.getList().get(0));
            System.out.println(all.getList().get(1));
        }
    
        @Test
        public void testLogin() {
            User user = userService.login("风过无痕", "root");
            System.out.println(user);
        }
    }
    

1.5 Part3:SpringMVC

  • web.xml加载SpringMVC

    web.xml配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
      <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    
      <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <servlet-name>DispatcherServlet</servlet-name>
      </filter-mapping>
    
      <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath*:spring-mvc.xml</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>
    

    spring-mvc.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc
            https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.itheima.controller"/>
        <mvc:annotation-driven/>
    </beans>
    

    applicationContext.xml配置文件

    <context:component-scan base-package="com.itheima">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
  • rest风格

    package com.itheima.controller;
    
    import com.itheima.domain.User;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @PostMapping()
        public boolean save(User user) {
            System.out.println("save..." + user);
            return true;
        }
    
        @PutMapping()
        public boolean update(User user) {
            System.out.println("update..." + user);
            return true;
        }
    
        @DeleteMapping("/{uuid}")
        public boolean delete(@PathVariable Integer uuid) {
            System.out.println("delete..." + uuid);
            return true;
        }
    
        @GetMapping("/{uuid}")
        public User get(@PathVariable Integer uuid) {
            System.out.println("get..." + uuid);
            return null;
        }
    
        @GetMapping("/{page}/{size}")
        public User getAll(@PathVariable Integer page,@PathVariable Integer size) {
            System.out.println("getAll..." + page+ "," +size);
            return null;
        }
    
        @PostMapping("/login")
        public User login(String userName,String password) {
            System.out.println("login..." + userName+","+password);
            return null;
        }
    }
    
  • 数据封装为json数据

1.6 Part:Spring整合SpringMVC

  • web.xml加载Spring环境

  • Controller调用Sersvice

  • web环境加载Spring上下文

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext.xml</param-value>
      </context-param>
      <!--启动服务器时,通过监听器加载spring运行环境-->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!--省略前面编写的过滤器等-->  
    </web-app>
    
  • 表现层调用业务层bean

    package com.itheima.controller;
    
    import com.github.pagehelper.PageInfo;
    import com.itheima.domain.User;
    import com.itheima.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @PostMapping()
        public boolean save(User user) {
            return userService.save(user);
        }
    
        @PutMapping()
        public boolean update(User user) {
            return userService.update(user);
        }
    
        @DeleteMapping("/{uuid}")
        public boolean delete(@PathVariable Integer uuid) {
            return userService.delete(uuid);
        }
    
        @GetMapping("/{uuid}")
        public User get(@PathVariable Integer uuid) {
            return userService.get(uuid);
        }
    
        @GetMapping("/{page}/{size}")
        public PageInfo<User> getAll(@PathVariable Integer page, @PathVariable Integer size) {
            return userService.getAll(page,size);
        }
    
        @PostMapping("/login")
        public User login(String userName,String password) {
            return userService.login(userName,password);
        }
    }
    

1.7 Part5-1:表现层数据封装

  • 前端接收表现层返回的数据种类

    • 操作是否成功 true/false 格式A
    • 单个数据 11000,true 格式B
    • 对象数据 json对象 格式C
    • 集合数据 json数组 格式D
  • 统一格式

  • 返回数据格式设计

    • 状态
    • 数据
    • 消息
  • 返回数据状态设计

    • 根据业务不同设计不同的状态码
      • 404
      • 500
      • 200
  • 设计包装类,用于将返回数据格式统一

    package com.itheima.controller.results;
    
    public class Result {
        //操作结果编码
        private Integer code;
        //操作数据结果
        private Object data;
        //消息
        private String message;
    
        public Result() {
        }
    
        public Result(Integer code) {
            this.code = code;
        }
    
        public Result(Integer code, Object data) {
            this.code = code;
            this.data = data;
        }
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
        public Object getData() {
            return data;
        }
    
        public void setData(Object data) {
            this.data = data;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        @Override
        public String toString() {
            return "Result{" +
                    "code=" + code +
                    ", data=" + data +
                    ", message='" + message + '\'' +
                    '}';
        }
    }
    

    再创建一个类,用于设计状态编码

    package com.itheima.controller.results;
    
    public class Code {
        //操作结果编码
        public static final Integer SAVE_OK = 20011;
        public static final Integer UPDATE_OK = 20021;
        public static final Integer DELETE_OK = 20031;
        public static final Integer GET_OK = 20041;
    
        public static final Integer SAVE_ERR = 20010;
        public static final Integer UPDATE_ERR = 20020;
        public static final Integer DELETE_ERR = 20030;
        public static final Integer GET_ERR = 20040;
        //系统错误编码
        //操作权限编码
        //校验结果编码
    }
    

1.8 Part5-2:自定义异常

  • 设定自定义异常,封装程序执行过程中出现的问题,便于表现层进行统一的异常拦截并进行处理

    • BusinessException
    • SystemException
  • 自定义异常消息返回时需要与业务正常执行的消息按照统一的格式进行处理

  • 返回消息兼容异常信息

    创建异常类:

    package com.itheima.system.exception;
    
    public class BusinessException extends RuntimeException{
        //自定义异常中封装对应的错误编码,用于异常处理时获取对应的操作编码
        private Integer code;
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
        public BusinessException(Integer code) {
            super();
            this.code = code;
        }
    
        public BusinessException(String message,Integer code) {
            super(message);
            this.code = code;
        }
    
        public BusinessException(String message, Throwable cause,Integer code) {
            super(message, cause);
            this.code = code;
        }
    
        public BusinessException(Throwable cause,Integer code) {
            super(cause);
            this.code = code;
        }
    
        protected BusinessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace,Integer code) {
            super(message, cause, enableSuppression, writableStackTrace);
            this.code = code;
        }
    }
    

    异常增强类:

    @Component
    @ControllerAdvice
    public class ProjectExceptionAdvice {
    
        @ExceptionHandler(BusinessException.class)
        @ResponseBody
        //对出现的异常情况进行拦截,并将其处理成统一的页面数据结果格式
        public Result doBusinessException(BusinessException e) {
            return new Result(e.getCode(),e.getMessage());
        }
    }
    

    控制器类:

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @PostMapping()
        public Result save(User user) {
            boolean flag = userService.save(user);
            return new Result(flag? Code.SAVE_OK:Code.SAVE_ERR);
        }
    
        @PutMapping()
        public Result update(User user) {
            boolean flag = userService.update(user);
            return new Result(flag? Code.UPDATE_OK:Code.UPDATE_ERR);
        }
    
        @DeleteMapping("/{uuid}")
        public Result delete(@PathVariable Integer uuid) {
            boolean flag = userService.delete(uuid);
            return new Result(flag? Code.DELETE_OK:Code.DELETE_ERR);
        }
    
        @GetMapping("/{uuid}")
        public Result get(@PathVariable Integer uuid) {
            User user = userService.get(uuid);
    
            //设置查询uuid=10的数据时抛出异常
            if (uuid == 10)throw new BusinessException("查询出错了,请重试!!!",Code.GET_ERR);
    
            return new Result(user != null? Code.GET_OK:Code.GET_ERR,user);
        }
    
        @GetMapping("/{page}/{size}")
        public Result getAll(@PathVariable Integer page, @PathVariable Integer size) {
            PageInfo<User> all = userService.getAll(page, size);
            return new Result(all != null? Code.GET_OK:Code.GET_ERR,all);
        }
    
        @PostMapping("/login")
        public Result login(String userName,String password) {
            User user = userService.login(userName,password);
            return new Result(user != null? Code.GET_OK:Code.GET_ERR,user);
        }
    }
    

2.注解版SSM整合

2.1 纯注解驱动SSM整合

  • web.xml
  • applicationContext.xml
  • spring-mvc.xml
  • UserDao.xml
  • jdbc.properties(保留)

2.2 web.xml

同前期设置,添加加载spring核心配置文件,生成spring核心容器(主容器/父容器/根容器)

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMVCConfig.class);
        return ctx;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("contextConfigLocation","<NONE>");
        super.onStartup(servletContext);

        CharacterEncodingFilter cef = new CharacterEncodingFilter();
        cef.setEncoding("utf-8");
        FilterRegistration.Dynamic registration = servletContext.addFilter("characterEncodingFilter",cef);
        registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE),false,"/*");
    }
}

父容器:spring环境加载后形成的容器,包含spring环境下所有的bean

子容器:当前springmvc环境加载后形成的容器,不包含spring环境下的bean

子容器可以访问父容器中的资源,父容器不可以访问子容器中的资源

2.3 applicationContext.xml

  • 同前期设置,添加事务注解驱动

    @Configuration
    @ComponentScan(value = "com.itheima",excludeFilters =
        @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = {Controller.class}
        )
    )
    @PropertySource("classpath:jdbc.properties")
    @EnableTransactionManagement
    @Import({JdbcConfig.class,MyBatisConfig.class})
    public class SpringConfig {
    
        @Bean("transactionManager")
        public DataSourceTransactionManager getTxManager(@Autowired DataSource dataSource) {
            DataSourceTransactionManager dstm = new DataSourceTransactionManager();
            dstm.setDataSource(dataSource);
            return dstm;
        }
    }
    
  • jdbc配置

    @Configuration
    public class JdbcConfig {
        @Value("${jdbc.driver}")
        private String driver;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String username;
        @Value("${jdbc.password}")
        private String password;
    
        @Bean("dataSource")
        public DataSource getDataSource() {
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName(driver);
            ds.setUrl(url);
            ds.setUsername(username);
            ds.setPassword(password);
    
            return ds;
        }
    }
    
  • mybatis配置

    @Configuration
    public class MyBatisConfig {
        @Bean
        public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource,@Autowired Interceptor interceptor) {
            SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
            ssfb.setDataSource(dataSource);
            ssfb.setTypeAliasesPackage("com.itheima.domain");
            ssfb.setPlugins(interceptor);
            return ssfb;
        }
    
        @Bean
        public MapperScannerConfigurer getMapperScannerConfigurer() {
            MapperScannerConfigurer msc = new MapperScannerConfigurer();
            msc.setBasePackage("com.itheima.dao");
            return msc;
        }
    
        @Bean("pageInterceptor")
        public Interceptor getPageInterceptor() {
    
            Interceptor interceptor = new PageInterceptor();
            Properties properties = new Properties();
            properties.setProperty("helperDialect","mysql");
            properties.setProperty("reasonable","true");
            interceptor.setProperties(properties);
            return interceptor;
        }
    }
    

2.4 spring-mvc.xml

  • 同前期设置,添加@EnableWebMvc注解

    @Configuration
    @ComponentScan("com.itheima.controller")
    @EnableWebMvc
    public class SpringMVCConfig {
    }
    
  • @EnableWebMvc

    • 支持ConversionService的配置,可以方便配置自定义类型转换器
    • 支持@NumberFormat注解格式数字类型
    • 支持@DateTimeFormat注解格式化日期数据,日期包括Date,Calendar,JodaTime(JodaTime要导包)
    • 支持@Valid的参数校验(需要导入JSR-303规范)
    • 配合第三方jar包和springmvc提供的注解读写xml和json格式数据

上一篇:SpringMVC进阶

相关文章:SpringMVC基础SpringMVC进阶SpringMVC高级

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值