【spring(五)】SpringMvc总结 SSM整合流程
作者:mmseoamin日期:2023-12-11

目录

一、SpringMVC简介:

二、SpringMVC快速入门:

三、SpringMVC bean的管理:⭐

        ①配置bean

        ②扫描bean

四、SpringMVC配置类:⭐

五、SpringMVC 请求与响应

六、SpringMVC REST风格

七、SSM整合 异常处理:

八、SSM整合流程:⭐

九、SpringMVC 拦截器:


一、SpringMVC简介:

1.SpringMVC是一种表现层框架技术

2.SpringMVC用于进行表现层功能开发

【spring(五)】SpringMvc总结 SSM整合流程,第1张

与原始Servlet对比:

【spring(五)】SpringMvc总结 SSM整合流程,第2张

二、SpringMVC快速入门:

①:使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标


  javax.servlet
  javax.servlet-api
  3.1.0provided


  org.springframework
  spring-webmvc
  5.2.10.RELEASE

②:创建SpringMVC控制器类(等同于Servlet功能)

@RestController
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        return null;
    }
}

③:初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean

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

三、SpringMVC bean的管理:⭐

        ①配置bean

                ①三层架构中的bean

                        控制层controller:@restcontroller = @controller + @responsebody

                        业务层service:@service

                        持久层dao:@reposity

                ②其他bean(第三方,自己写的……)

                        加入@bean注解

        ②扫描bean

                在springconfig配置文件上加入@ComponentScan({"包名1", "包名2",……})

总结:

SpringMVC入门程序开发总结(1+N)

        一次性工作

                创建工程,设置服务器,加载工程

                导入坐标

                创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径

                SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean

        多次工作

                定义处理请求的控制器类

                定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)

四、SpringMVC配置类:⭐

SpringMVC等同于Web容器,Spring是Spring-web的子容器,所以同时加载Spring和SpringMVC会有bean加载冲突问题

解决办法:ServletConfig配置类

加载SpringMVC配置

【spring(五)】SpringMvc总结 SSM整合流程,第3张

加载Spring配置

【spring(五)】SpringMvc总结 SSM整合流程,第4张

设定SpringMVC拦截请求路径

【spring(五)】SpringMvc总结 SSM整合流程,第5张

五、SpringMVC 请求与响应

见文章:http://t.csdnimg.cn/puThL

获取请求参数:http://t.csdnimg.cn/pu0KD

六、SpringMVC REST风格

与原始风格做对比

优点:

        隐藏业务行为,无法通过地址得知对资源的何种操作

        简化书写

【spring(五)】SpringMvc总结 SSM整合流程,第6张

通过请求类型区分业务操作

【spring(五)】SpringMvc总结 SSM整合流程,第7张

七、SSM整合 异常处理:

程序遇到异常会抛给他的调用者,就这样一层一层往上抛,如果不处理,最后会抛给jvm

步骤分析:

  • 判定异常分类:
    • 业务异常(用户请求有误)
    • 运行异常(代码有BUG)
    • 其他异常(不确定异常,例如系统崩了,服务器坏了等等)
  • 创建异常类:
  • 在可能出现异常的地方抛出异常,统一处理:
  • 定义异常处理类:

    模拟实现:

            AOP思想

    //@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
    @RestControllerAdvice
    public class ProjectExceptionAdvice {
        //@ExceptionHandler用于设置当前处理器类对应的异常类型
        @ExceptionHandler(SystemException.class)
        public Result doSystemException(SystemException ex){
            //记录日志
            //发送消息给运维
            //发送邮件给开发人员,ex对象发送给开发人员
            return new Result(ex.getCode(),null,ex.getMessage());
        }
        @ExceptionHandler(BusinessException.class)
        public Result doBusinessException(BusinessException ex){
            return new Result(ex.getCode(),null,ex.getMessage());
        }
        //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
        @ExceptionHandler(Exception.class)
        public Result doOtherException(Exception ex){
            //记录日志
            //发送消息给运维
            //发送邮件给开发人员,ex对象发送给开发人员
            return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
        }
    }
    

    模拟异常:

    public Book getById(Integer id) {
            //模拟业务异常,包装成自定义异常
            if(id == 1){
                throw new BusinessException(Code.BUSINESS_ERR,"请不要使用你的技术挑战我的耐性!");
            }
            //模拟系统异常,将可能出现的异常进行包装,转换成自定义异常
            try{
                int i = 1/0;
            }catch (Exception e){
                throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服务器访问超时,请重试!",e);
            }
            return bookDao.getById(id);
        }

    八、SSM整合流程:⭐

    前面已经学了 Mybatis 、 Spring 和 SpringMVC 三个框架,现在要整合这三个框架,完成业务功能的简单开发。

    【spring(五)】SpringMvc总结 SSM整合流程,第8张

    SpringConfig配置类:

    @Configuration
    @ComponentScan({"com.itpan.service"}) // 组件扫描 为防止spring和springMVC重复扫描只扫描到service
    @PropertySource({"classpath:jdbc.properties"}) // 加载数据库配置文件
    @Import({JdbcConfig.class, MybatisConfig.class}) // 导入配置文件
    public class SpringConfig {
    }

    jdbcConfig配置类:

    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,供spring使用
        @Bean
        public DataSource dataSource(){
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(driver);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    }
    

    jdbc.properties:略

    jdbc.driver=com.itpan.jdbc.Driver
    jdbc.url=jdbc:mysql//localhost:3306/ssm_db
    jdbc.username=root
    jdbc.password=root

    MybatisConfig配置类:

    public class MybatisConfig {
        // 配置数据库连接池的bean,方法的参数也是bean的自动装配
        @Bean
        public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(dataSource);
            factoryBean.setTypeAliasesPackage("com.itpan.domain");
            return factoryBean;
        }
        // 配置扫描Dao包下的bean
        @Bean
        public MapperScannerConfigurer mapperScannerConfigurer(){
            MapperScannerConfigurer msc = new MapperScannerConfigurer();
            msc.setBasePackage("com.itpan.dao");
            return msc;
        }
    }

    ServletConfig配置类:

    public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
        @Override
        protected Class[] getRootConfigClasses() {
            return new Class[]{SpringConfig.class};
        }
        @Override
        protected Class[] getServletConfigClasses() {
            return new Class[]{SpringMVCConfig.class};
        }
        // 拦截路径
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    }
    

    SpringMVC配置类:

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

    【spring(五)】SpringMvc总结 SSM整合流程,第9张

    九、SpringMVC 拦截器:

    见文章:http://t.csdnimg.cn/JqJ6b