• IDEA搭建SSM框架【配置类、新手向】


    以下操作基于2020.3企业版

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pEgiWHwX-1669548886653)(assets/image-20221109105330-heilasm.png)]

    1.创建Java Enterprise项目

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lii6FyNy-1669548886654)(assets/image-20221109105434-y39cakk.png)]

    直接默认即可

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y35MWx5Y-1669548886654)(assets/image-20221109105622-fcd9xfy.png)]

    输入项目相关信息

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H5JGlWUW-1669548886655)(assets/image-20221109105713-igwb7w3.png)]

    点击完成后,得到以下目录结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l4reuygh-1669548886655)(assets/image-20221109105757-r4cn7bg.png)]

    2.搭建项目目录结构

    java目录下

    • controller:实现控制转发,基本参数校验,不复杂的简单业务处理

    • config:配置类存放的地方

    • service:业务逻辑层

      • impl(实现层)
    • dao:数据持久层

    • entitry:实体类

    • resources

      • mappers(存放sql语句)
    • webapp

      • WEB-INF

        • views(视图的JSP文件)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dw9KBSKj-1669548886655)(assets/image-20221116105439-d9bmup8.png)]

    3.导入依赖

    pom.xml文件中导入SSM框架相关依赖

    	<!-- spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.3.23</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>5.3.23</version>
            </dependency>
    	<dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.3.23</version>
                <scope>test</scope>
            </dependency>
    
    	<!-- spring mvc -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.3.23</version>
            </dependency>
    
    
            <!-- jstl -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>jstl-api</artifactId>
                <version>1.2</version>
            </dependency>
    
            <!-- JDBC -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.30</version>
            </dependency>
    
            <!-- mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.11</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>2.0.7</version>
            </dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    导入完成后,点击右上角的更新

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WVSPDK7-1669548886655)(assets/image-20221109113134-v5rg43v.png)]

    如果没有出现Spring Config,则检查一下是否正确安装了依赖了

    4.通过类配置项目

    创建类App

    config目录下创建类App

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7mDx5B8v-1669548886656)(assets/image-20221116103236-ee5zteu.png)]

    • 添加注解@Configuration——表示为配置类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MQz0ylJl-1669548886656)(assets/image-20221116103406-j9ofhna.png)]

    • 添加注解ComponentScan——扫描service
    @ComponentScan(basePackages = "com.leo.SSM.service")
    
    
    • 1
    • 2

    注意:

    • basePackages 配置:查看下图位置
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZRm3YXt-1669548886656)(assets/image-20221116103959-o9vgusq.png)]
    • 这里扫描的包对应位置也需要添加注解

      例如这里,我扫描了service,那与之对应的就需要在service的各个类中添加注解@Service

    为防止后面忘记,先在service目录下创建一个service接口

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPnsGNDR-1669548886656)(assets/image-20221116105603-c5nohb4.png)]

    service->impl下创建对应的实现类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bf5QETjB-1669548886657)(assets/image-20221116111944-erw6ogu.png)]

    实现类中添加@Service注解

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VE2eecME-1669548886657)(assets/image-20221116112009-ew2qlnc.png)]

    实现接口

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gU8skaxY-1669548886657)(assets/image-20221127115912-1bh4wjr.png)]

    • 添加注解@MapperScan——扫描dao
    @MapperScan(basePackages = "com.leo.SSM.dao")
    
    • 1

    创建UserDao接口

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dsc9LnT-1669548886657)(assets/image-20221012115126-rd0ld4f.png)]

    添加注解@Mapper

    package com.leo.SSM.dao;
    
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public class UserDao {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 添加注解——添加配置源(配置jdbc)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvSUgtBS-1669548886658)(assets/image-20221116105945-36gqupw.png)]

    直接直接复制下列代码进入项目即可

    @PropertySource("classpath:jdbc.properties")
    
    • 1
    创建jdbc配置文件

    resources下创建jdbc.properties

    选择Resource Bundle

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zw5gzdFY-1669548886658)(assets/image-20221116110150-t8atbxh.png)]

    仅输入名称即可

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YBnSqObt-1669548886658)(assets/image-20221116110226-v8001zd.png)]

    创建完成

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwvCLEiz-1669548886658)(assets/image-20221116110240-8mktok3.png)]

    进行配置

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql:///studb?useSSL=false
    jdbc.username=SQL的用户名
    jdbc.password=SQL的密码
    
    • 1
    • 2
    • 3
    • 4
    • 开启事务管理

    在App类中继续添加@EnableTransactionManagement注解,表示开启事务

    配置类App

    创建于jdbc对应的属性

        private String driver;
        private String url;
        private String userName;
        private String password;
    
    • 1
    • 2
    • 3
    • 4
    • 添加注解,设置值
    @Value("${jdbc.driver}")
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-he7WJPUf-1669548886658)(assets/image-20221116110655-wlypjiq.png)]

    属性的最终配置

    @Value("${jdbc.driver}")
        private String driver;
      
        @Value("${jdbc.url}")
        private String url;
      
        @Value("${jdbc.username}")
        private String userName;
      
        @Value("${jdbc.password}")
        private String password;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    配置数据源
    • 创建方法,并添加@Bean注解——往IOC容器中放东西
    @Bean
        public DataSource dataSource(){
        
        }
    
    • 1
    • 2
    • 3
    • 4
    • 创建一个dataSource并返回
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(driver);
            dataSource.setUrl(url);
            dataSource.setUsername(userName);
            dataSource.setPassword(password);
            return dataSource;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    配置mybatis中的SqlSessionFacotry
    • 创建方法,添加注解
    @Bean
        public SqlSessionFactory sqlSessionFactory(){
        
        }
    
    • 1
    • 2
    • 3
    • 4
    • 配置mybatis相关属性

      • 数据源
      • 映射包名
      • 对应sql存放位置
      • 映射关系(下划线改为小驼峰)
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource());
    //        映射包名
            sqlSessionFactoryBean.setTypeAliasesPackage("com.leo.SSM.entity");
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            sqlSessionFactoryBean.setMapperLocations(
                    resolver.getResources("classpath*:mappers/*.xml")
            );
    	org.apache.ibatis.session.Configuration configuration = Objects.requireNonNull(sqlSessionFactoryBean.getObject()).getConfiguration();
            configuration.setMapUnderscoreToCamelCase(true);
            return sqlSessionFactoryBean.getObject();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    配置事务
    @Bean
        public PlatformTransactionManager transactionManager(){
            DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
            transactionManager.setDataSource(dataSource());
            return transactionManager;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    配置Web-MVC

    在config文件夹下创建类WebMvcConfig

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQ60y3Lh-1669548886659)(assets/image-20221116114030-qjbnc65.png)]

    • 添加注解@Configuration,声明配置类
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    
    • 1
    • 2
    • 3
    • 添加注解@EnableWebMvc——启动webMvc
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    
    
    @EnableWebMvc
    
    • 1
    • 2
    • 3
    • 4
    • 扫包与controller对应
    import org.springframework.context.annotation.ComponentScan;
    
    
    @ComponentScan(basePack
    ages = "com.leo.SSM.controller")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实现WebMvcConfigurer

    public class WebMvcConfig implements WebMvcConfigurer {
    
    }
    
    • 1
    • 2
    • 3

    选择重写方法

    ctrl+o选择以下方法进行重写

    • addViewControllers
    • configureViewResolvers

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FjVchqPS-1669548886659)(assets/image-20221116115146-61ipcs8.png)]

    添加视图解析器

    • 设置视图对应文件位置
    • 设置视图文件后缀
    • 设置视图解析器,支持JSTL
    private ViewResolver viewResolver(){
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix("/WEB-INF/views/");
            viewResolver.setSuffix(".jsp");
            viewResolver.setViewClass(JstlView.class);
            return viewResolver;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注册视图解析器

    configureViewResolvers方法中,进行视图解析器的注册

    @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
    //        注册视图解析器
            registry.viewResolver(viewResolver());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    添加view的控制

    在spring中,很可能出现很多仅需要页面跳转而没有具体业务逻辑的代码比如

    @GetMapping('/login')
        public String login(){
            return "login";
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样长久以往就会生成很多这样的空方法,因此我们需要通过SprIngMVC中的addViewControllers简化实现上述逻辑

    • 设置/对应的页面为login
    @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("login");
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    创建Controller

    controller目录下创建UserController类,添加注解@Controller

    package com.leo.SSM.controller;
    
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class UserController {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    配置整体servlet

    创建类AppInit

    在config目录下创建AppInit类,并继承AbstractAnnotationConfigDispatcherServletInitializer

    继承的类用于DispatcherServlet 初始化

    DispatcherServlet:Spring MVC的核心组件,它是request首先到达的地方,负责在各个组件间传递加工

    • 完成servlet容器功能
    • 完成配置MVC基础功能
    • 完成配置DispatcherServletContextLoaderListener

    ContextLoaderListener——Spring实现了Tomcat提供的ServletContextListener接口,写了一个监听器来监听项目启动。一旦项目启动,会触发ContextLoaderListener中的特定方法

    实现其方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UDA4UB8k-1669548886659)(assets/image-20221126230419-xfoxiwo.png)]

    修改各方法逻辑

    getRootConfigClasses——配置root上下文(数据源等)

    这里直接从我们的APP中获取即可

    @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[]{App.class};
        }
    
    • 1
    • 2
    • 3
    • 4

    getServletConfigClasses—— 配置dispatcher servlet(视图解析器)

    这里从WebMvcConfig中获取

    @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebMvcConfig.class};
        }
    
    • 1
    • 2
    • 3
    • 4

    getServletMappings——指定开始被servlet处理的url(默认设置为 /

    @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    
    • 1
    • 2
    • 3
    • 4

    5.实现login页面

    WebMvcConfig.java文件配置下的prefix目录下(/WEB-INF/views/)创建文件,名称为login.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Leo
      Date: 2022/11/6
      Time: 15:37
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <form action="login" method="post">
        <label>
            用户名:
            <input name="userName" />
            <span  style="color: red">
                ${msg}
            </span>
        </label>
        <br />
    
        <label>&nbsp 码:
            <input name="passwd" type="password" />
        </label>
    
        <br/>
    
        <input type="submit" value="登录">
    </form>
    
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    6.创建userController

    UserController 添加方法

    @PostMapping("/login")
        public String login(){
            return "index";
        }
    
    • 1
    • 2
    • 3
    • 4

    因为在form表单中

    • action = login ----> (“/login”)
    • method=“post” —>@PostMapping

    我们运行测试一下

    请添加图片描述

    当我们点击登录时,返回的页面就是index.jsp

    当然,现在没有进行逻辑判断,但是实际上对于webmvc的配置已经成功

    7.创建实体类

    entity文件目录下创建与数据库对应的类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FZqxqhbH-1669548886659)(assets/image-20221127114905-gkmig8l.png)]

    8.实现UserDao

    定义接口

    首先我们需要实现登录接口,因此在UserDao中定义获取用户信息的接口

        UserInfo getUserInfo(@Param("userNumber") String userNumber , @Param("passwd") String passwd);
    
    
    • 1
    • 2

    实现SQL

    resources->mappers创建UserMapper.xml文件

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.leo.SSM.dao.UserDao">
        <select
                id="getUserInfo"
                resultType="com.leo.SSM.entity.UserInfo"
        >
            select
                   pk_user_id,
                   u_number,
                   u_name,
                   u_passwd
            from user_info
            where u_number = #{userNumber} and u_passwd = #{passwd}
        select>
    
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    9.实现UserService

    UserService接口出定义方法

    • 返回类型——boolean
    • 传递参数
    • 方法名——login
    package com.leo.SSM.service;
    
    import javax.servlet.http.HttpSession;
    import java.util.List;
    
    public interface UserService {
        Boolean login(String userNumber , String passwd, HttpSession session, Model model);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    定义属性

    使用注解@Resource将userDAO交给Spring进行管理

    @Resource
        private UserDAO userDAO;
    
    • 1
    • 2

    实现方法

    @Override
        public Boolean login(String userNumber, String passwd, HttpSession session) {
            UserInfo userInfo = null;
            userInfo = userDAO.getUserInfo(userNumber , passwd);
            if(null != userInfo){
                session.setAttribute("user",userInfo);
                return true;
            }else{
                model.addAttribute("msg","用户名或密码错误");
    	    return false;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    10.实现UserController逻辑

    添加属性——UserService

        @Resource
        private UserService userService;
    
    • 1
    • 2

    修改函数参数

    与login.jsp中的name对应

    login(String userName , String password , HttpSession session)
    
    • 1

    修改逻辑

    直接调用UserService,判断返回值

    • true——进入index.jsp页面
    • false——停留在login.jsp页面
    boolean isSuccess = userService.login(userName , password,session);
            if(isSuccess){
                return "index";
            }else{
                return "login";
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实现logout

    • 使session失效
    • 设置提示信息
    • 跳转login页面
    @PostMapping("/logout")
        public String logout(HttpSession session, Model model){
            session.invalidate();
            model.addAttribute("msg","退出成功");
            return "login";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    typescript82-react函数组件的类型(组件和属性类型)
    Object.values()以及Object.keys()的用法。
    Mysql查询——根据字段值自定义排序
    Webpack
    官网电子安全证书端口即将到期!新型诈骗短信!
    APP备案避坑指南,值得收藏
    内存取证
    ADO.NET+kafka实现发布订阅保存到数据库
    mysql数据库常见问题及解决办法
    next.js app目录 i18n国际化简单实现
  • 原文地址:https://blog.csdn.net/qq_22841387/article/details/128068527