菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
287
0

javaConfig配置SSM

原创
05/13 14:22
阅读数 74684

笔记

脱离xml,用java类配置ssm

整合Spring+SpringMVC+MyBatis-plus

用mybatis的童鞋可参考

https://gitee.com/chimenga/ssm_configured_by_javaconfig

 

1.创建项目导入依赖

<dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-test</artifactId>
                </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.5</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>5.1.9.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
View Code

 

2.项目目录总览

 

 

3.在config包下创建三个配置类SpringConfig,SpringMvcConfig,Webconfig

 

4.编写WebConfig类,继承AbstractAnnotationConfigDispatcherServletInitializer

/**
 *
 *
 * Servlet容器启动会扫描,当前应用里面每一个jar包的
 *
 *  ServletContainerInitializer实现类
 *
 *  必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer
 *  文件的内容就是ServletContainer Initializer实现类的全类名:
 *
 *  总结:容器在启动应用的时候,会扫描当前应用每一个jar包里面
 *
 *  指定的实现类,启动并运行这个实现类的方法;
 *
 *  容器启动的时候会将@HandlesTypes指定的这个类型下面的子类(实现类,子接口等)传递过来;
 */

public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    
    //获取根容器的配置类; (Spring的配置文件) 父容器;
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
    
    //获取web容器的配置类(SpringMVC配置文件)子 容器:
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
    
    //获取DispatcherServlet的映射信息
    // : 拦截所有请求 (包括静态资源(xx.js,xx.png) ),但是不包括* .jsp;
    // : 拦截所有请求;连* .jsp页面都拦截; jsp页面是tomcat的jsp引擎解析的;
    
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    
    /**
     *
     * 如果我们的Filter是映射到DispatcherServlet上,还有一种方法来注册它到Servlet容器中。重
     * 载AbstractAnnotationConfigDispatcherServletInitializer的getServlet-Filters()方法
     *
     *  在这里没有必要声明它的映射路径,getServletFilters()方法返回的所有Filter都会映射到DispatcherServlet上
     *
     * @return
     */
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("utf-8");
        encodingFilter.setForceEncoding(true);
        // 将页面普通的post请求转为指定的delete或者put请求
        // FormContentFilter formContentFilter = new FormContentFilter();
        return new Filter[]{ encodingFilter };
    }
    
    
}

 

5.配置数数据库连接池

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost/db01?useSSL=false&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
user=root
password=
spring.typeAliasesPackage=com.gg.pojo
#spring.mapperLocations=classpath:mapper/*.xml

 

 

6.编写SpringConfig类

@Configuration
@ComponentScan(basePackages = "com.gg")
@PropertySource("classpath:db.properties")
@EnableTransactionManagement(proxyTargetClass = true)  //声明式事务
@MapperScan(basePackages = "com.gg.mapper")
public class SpringConfig {
    /**
     * 数据源
     *关于spring配置文件中读取${username}为系统当前用户名的问题
     * 在spring的配置文件中,加载数据库的properties文件,利用${username} 获取数据库用户名时,会得到系统当前的用户名;
     *
     * 这是因为 spring默认会优先加载系统环境变量,此时获取到的username的值实际上指的是当前计算机的用户名。而不是properties配置文件中指定的username的值。
     *
     * 解决方法:
     *
     * 1.修改配置文件中key的值,避免与系统当前用户的username冲突;
     */

    @Value("${url}")
    private String url;

    @Value("${user}")
    private String username;

    @Value("${password}")
    private String password;

    @Value("${driver}")
    private String driver;

    @Value("${spring.typeAliasesPackage}")
    private String typeAliasesPackage;

//    @Value("${spring.mapperLocations}")
//    private String mapperLocations;

    @Bean
    public DataSource dataSource() {
        DruidDataSource source = new DruidDataSource();
        source.setUsername(username);
        source.setPassword(password);
        source.setUrl(url);
        source.setDriverClassName(driver);
        return source;
    }

    /**
     * SqlSessionFactoryBean
     * @auther
     * @return
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        MybatisSqlSessionFactoryBean bean=new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource());
        bean.setTypeAliasesPackage(typeAliasesPackage);
//        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//        bean.setMapperLocations(resolver.getResources(mapperLocations));

        //全局设置
        MybatisConfiguration config = new MybatisConfiguration();
        //org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();
        /*开启二级缓存*/
//        config.setCacheEnabled(true);
        /*下划线转驼峰*/
        config.setMapUnderscoreToCamelCase(true);
        /*打印sql语句*/
        config.setLogImpl(StdOutImpl.class);
        bean.setConfiguration(config);
        return bean.getObject();
    }

//    /**
//     * MapperScannerConfigurer
//     */
//    @Bean
//    public MapperScannerConfigurer mapperScannerConfigurer() {
//        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
//        mapperScannerConfigurer.setBasePackage("com.lw.mapper");
//        return mapperScannerConfigurer;
//    }

    /**
     * Cannot enhance @Configuration bean definition 'xxx' since its singleton instance has been created too early.
     * 报错的原因是因为MapperScannerConfigurer是BeanFactoryPostProcessor的一个实现导致的,最简单的解决方式是使用@MapperScan注解代替MapperScannerConfigurer的bean配置。
     * @return
     */

    // 事务管理器 对mybatis操作数据库事务控制,spring使用jdbc的事务控制类
    @Bean(name = "transactionManager")
    public DataSourceTransactionManager dataSourceTransactionManager() {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource());
        return dataSourceTransactionManager;
    }

    /**
     *
     * @return
     */
    @Bean(name = "transactionInterceptor")
    public TransactionInterceptor interceptor() {
        TransactionInterceptor interceptor = new TransactionInterceptor();
        interceptor.setTransactionManager(dataSourceTransactionManager());
        Properties transactionAttributes = new Properties();
        transactionAttributes.setProperty("save*", "PROPAGATION_REQUIRED");
        transactionAttributes.setProperty("del*", "PROPAGATION_REQUIRED");
        transactionAttributes.setProperty("update*", "PROPAGATION_REQUIRED");
        transactionAttributes.setProperty("get*", "PROPAGATION_REQUIRED,readOnly");
        transactionAttributes.setProperty("find*", "PROPAGATION_REQUIRED,readOnly");
        transactionAttributes.setProperty("*", "PROPAGATION_REQUIRED");
        interceptor.setTransactionAttributes(transactionAttributes);
        return interceptor;
    }

    /**
     * 文件上传下载
     *  设置这个必须要先导入 commons-fileupload
     */
    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(10485760000L);  // 最大上传
        multipartResolver.setDefaultEncoding("utf-8");     // 默认编码
        multipartResolver.setMaxInMemorySize(40960);       // 缓存
        return multipartResolver;
    }


}

 

7.编写SpringMvcConfig类继承WebMvcConfigurer

@Configuration
@EnableWebMvc // 开启springmvc定制功能 相当于    <mvc:annotation-driven/>
@ComponentScan(basePackages = "com.gg")
public class SpringMvcConfig implements WebMvcConfigurer {

    /**
     * 视图解析器
     * @param registry
     */
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }

    /**
     * 静态资源
     *  相当于 <mvc:default-servlet-handler/>  将SpringMVC处理不了的请求交给tomcat;静态资源
     * @param configurer
     */
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    /**
     * 拦截器
     * @param registry
     */
    public void addInterceptors(InterceptorRegistry registry) {

    }


}

 

环境配置好了配置tomcat测试一下

访问:http://localhost:8080/

 

 

环境配置成功

继续干

 

8.编写实体类(使用插件lombok)

@Data
@ToString
public class Dept{
    @TableId(type = IdType.AUTO)
    private Long deptno;
    @TableField(value = "dname")
    private String dname;
    @TableField(value = "db_source")
    private String dbSource;

}

 

9.使用mybatis-plus配置dao层

@Mapper
public interface DeptMapper extends BaseMapper<Dept> {

}

 

10.最后是controller层

@Controller
public class DeptController {

    @Autowired
    private DeptMapper deptMapper;

    @GetMapping("/test")
    public String hello(Model model) {
        model.addAttribute("user","测试");
//        return "success";
    // 视图跳转
return "test"; } @GetMapping("/toTest") public String toTest(){
    // 重定向
return "redirect:/test"; } @GetMapping("/dept/{deptno}") public String getDeptByID(@PathVariable("deptno") Long deptno,Model model) { Dept dept = deptMapper.selectById(deptno); model.addAttribute("dept",dept); return "deptView"
; } }

 

11.deptView.jsp部分内容

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>dept</title>
</head>
<body>
<h2 align="center">
${dept.getDeptno()}<br/>
${dept.getDname()}<br/>
${dept.getDbSource()}
</h2>
</body>
</html>

 

12.访问接口地址:http://localhost:8080/dept/2

 

发表评论

0/200
287 点赞
0 评论
收藏