• 【Java】Maven模块化工程SSM整合


    创建数据库一个演示表User

    CREATE TABLE `user` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(64) DEFAULT NULL,
      `password` varchar(64) DEFAULT NULL,
      `status` int DEFAULT '0',
      `is_del` int DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai

    插入数据:

    insert  into 
        `user`(`id`,`name`,`password`,`status`,`is_del`) 
    values 
    (1,'admin','admin',0,0),
    (2,'user01','123456',0,0),
    (3,'user02','123456',0,0),
    (4,'user03','123456',0,0),
    (5,'user04','123456',0,0),
    (6,'user05','123456',0,0);

    创建新的Maven工程,不点选任何骨架:

    模块化工程,每一个结构层即一个模块,而现在这个工程的SRC可以删除:

    创建最基本的三层结构:

    Dao、Service、Controller

    Dao和Service无骨架创建,但是控制器是视图层了,需要Web骨架搭建

    构建完成发现Controller模块webapp没有被IDEA表示:

    查看控制台发现:

    No archetype found in remote catalog. Defaulting to internal catalog

    远程骨架仓库未找到,调用的本地的

    添加web:

    选择控制器:

    可以发现Maven指定web目录位置不存在,固然没有标记:

    更改目录:

    就有了:

    设置Tomcat:

    修复配置的工程:

    启动测试:


    所有依赖:

      <properties>
            <spring.version>5.2.8.RELEASE</spring.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.12</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
                <scope>test</scope>
            </dependency>
    
            <!-- JDBC & DataSource -->
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.20</version>
            </dependency>
    
            <dependency>
                <groupId>com.zaxxer</groupId>
                <artifactId>HikariCP</artifactId>
                <version>3.4.5</version>
            </dependency>
    
            <!-- log -->
    
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.30</version>
            </dependency>
    
            <!-- JavaWeb -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.taglibs</groupId>
                <artifactId>taglibs-standard-impl</artifactId>
                <version>1.2.5</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.taglibs</groupId>
                <artifactId>taglibs-standard-impl</artifactId>
                <version>1.2.5</version>
            </dependency>
    
            <!-- Mybatis -->
    
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.5</version>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>2.0.5</version>
            </dependency>
    
            <!-- Spring & SpringMVC ... -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.6</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
        </dependencies>

    公共依赖,实际上也可以具体的根绝结构层来区分导入,不过太麻烦,省事就直接丢总工程的POM里面

    Mybatis-Spring整合:

    创建User实体类:

    package cn.echo42.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * @author DaiZhiZhou
     * @file SSM-ModuleVersion-Sample
     * @create 2020-08-08 9:16
     */
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private Integer id;
        private String name;
        private String password;
        private Integer status;
        private Integer is_del;
    }

    创建UserMapper接口

    package cn.echo42.mapper;
    
    import cn.echo42.pojo.User;
    
    import java.util.List;
    
    /**
     * @author DaiZhiZhou
     * @file SSM-ModuleVersion-Sample
     * @create 2020-08-08 9:20
     */
    public interface UserMapper {
        List<User> queryUserList();
    }

    先创建mybatis配置和userMapper映射器配置:

    下面Spring容器XML配置后面在设置,这里还忘了DB连接配置和日志配置

    Mybatis-Configuration.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        <settings>
            <setting name="logImpl" value="LOG4J"/>
        </settings>
    
    </configuration>

    仅留下日志配置选项,其他配置移交到Spring管理:

    UserMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.echo42.mapper.UserMapper">
    
        <select id="queryUserList" resultType="cn.echo42.pojo.User">
            SELECT * FROM user;
        </select>
    
    </mapper>

    补加日志和数据库连接:

    db.properties

    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/sample?serverTimezone=GMT
    jdbc.username=root
    jdbc.password=123456

    log4j.properties

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # MyBatis logging configuration...
    log4j.logger.org.mybatis.example.BlogMapper=TRACE
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    Application-Dao.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"
    
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
    
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
    "
    >
    
        <context:component-scan base-package="cn.echo42.mapper"/> <!-- Spring注册扫描 -->
        
        <context:property-placeholder location="classpath:db.properties"/> <!-- jdbc连接配置读取加载 -->
    
        <!-- Spring 数据源配置 SpringJDBC的数据源 -->
    <!--    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >-->
    <!--        <property name="driverClassName" value="${jdbc.driverClassName}" />-->
    <!--        <property name="url" value="${jdbc.url}" />-->
    <!--        <property name="username" value="${jdbc.username}" />-->
    <!--        <property name="password" value="${jdbc.password}" />-->
    <!--    </bean>-->
        
        <!-- Hikari数据源 -->
        <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close" >
            <property name="driverClassName" value="${jdbc.driverClassName}" />
            <property name="jdbcUrl" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </bean>
        
        <!-- 配置SqlSessionFactory对象 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    
            <!-- 注入数据库连接池 -->
            <property name="dataSource" ref="dataSource"/>
    
            <!--  自动扫描mappers.xml文件  -->
            <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/>
            <property name="configLocation" value="classpath:mybatis/Mybatis-Configuration.xml"/>
        </bean>
    
        <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="cn.echo42.mapper" />
            <!--<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>-->
        </bean>
    
    </beans>

    写一个测试类看看是否正常:

    import cn.echo42.mapper.UserMapper;
    import cn.echo42.pojo.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;
    
    /**
     * @author DaiZhiZhou
     * @file SSM-ModuleVersion-Sample
     * @create 2020-08-08 9:37
     */
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:Application-Dao.xml")
    public class DaoTest {
    
        @Autowired
        UserMapper userMapper;
    
        @Test
        public void testSample() {
            for (User user : userMapper.queryUserList()) {
                System.out.println(user);
            }
        }
    }

    结果:

    log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    User(id=1, name=admin, password=admin, status=0, is_del=0)
    User(id=2, name=user01, password=123456, status=0, is_del=0)
    User(id=3, name=user02, password=123456, status=0, is_del=0)
    User(id=4, name=user03, password=123456, status=0, is_del=0)
    User(id=5, name=user04, password=123456, status=0, is_del=0)
    User(id=6, name=user05, password=123456, status=0, is_del=0)
    
    Process finished with exit code 0

    日志没有配置到?【才发现少写了j...】

    可以了:

    INFO [main] - HikariPool-1 - Starting...
    DEBUG [main] - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@59252cb6
     INFO [main] - HikariPool-1 - Start completed.
    DEBUG [main] - JDBC Connection [HikariProxyConnection@1643141512 wrapping com.mysql.cj.jdbc.ConnectionImpl@59252cb6] will not be managed by Spring
    DEBUG [main] - ==>  Preparing: SELECT * FROM user;
    DEBUG [main] - ==> Parameters: 
    DEBUG [main] - <==      Total: 6
    DEBUG [HikariPool-1 housekeeper] - HikariPool-1 - Pool stats (total=1, active=1, idle=0, waiting=0)
    DEBUG [main] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@194fad1]
    User(id=1, name=admin, password=admin, status=0, is_del=0)
    User(id=2, name=user01, password=123456, status=0, is_del=0)
    User(id=3, name=user02, password=123456, status=0, is_del=0)
    User(id=4, name=user03, password=123456, status=0, is_del=0)
    User(id=5, name=user04, password=123456, status=0, is_del=0)
    User(id=6, name=user05, password=123456, status=0, is_del=0)

    结合Service业务层:

    首先在业务层的Pom.xml中导入Dao层:

    这样来自dao层的userMapper就可以被service层调用

        <dependencies>
            <dependency>
                <groupId>cn.echo42</groupId>
                <artifactId>Application-Dao</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>

    编写接口和实现类:

    UserService接口:

    package cn.echo42.service;
    
    import cn.echo42.pojo.User;
    
    import java.util.List;
    
    /**
     * @author DaiZhiZhou
     * @file SSM
     * @create 2020-08-07 14:21
     */
    public interface UserService {
        List<User> getUserList();
    }

    UserServiceImpl接口实现:

    package cn.echo42.service.impl;
    
    import cn.echo42.mapper.UserMapper;
    import cn.echo42.pojo.User;
    import cn.echo42.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * @author DaiZhiZhou
     * @file SSM-ModuleVersion-Sample
     * @create 2020-08-08 9:51
     */
    
    @Service("userService")
    public class UserServiceImpl implements UserService {
    
        @Autowired
        UserMapper userMapper;
    
        public List<User> getUserList() {
            return userMapper.queryUserList();
        }
    }

    业务层的配置主要是扫描包,和事务配置,这里就不编写事务配置了

    Application-Service.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:aop="http://www.springframework.org/schema/aop"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:c="http://www.springframework.org/schema/c"
    
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
    
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
    
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd
    
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
    "
    >
    
        <context:component-scan base-package="cn.echo42.service" />
    
    </beans>

    业务层测试类

    注意我们的容器配置导入,是两个,一个dao一个Service,或者也可以使用import标签和并

    import cn.echo42.pojo.User;
    import cn.echo42.service.UserService;
    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;
    
    /**
     * @author DaiZhiZhou
     * @file SSM-ModuleVersion-Sample
     * @create 2020-08-08 9:56
     */
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:Application-Dao.xml", "classpath:Application-Service.xml"})
    public class ServiceTest {
    
        @Autowired
        UserService userService;
    
        @Test
        public void testSample() {
            for (User user : userService.getUserList()) System.out.println(user);
        }
    }

    测试结果正常输出:

     INFO [main] - HikariPool-1 - Starting...
    DEBUG [main] - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@753432a2
     INFO [main] - HikariPool-1 - Start completed.
    DEBUG [main] - JDBC Connection [HikariProxyConnection@923083575 wrapping com.mysql.cj.jdbc.ConnectionImpl@753432a2] will not be managed by Spring
    DEBUG [main] - ==>  Preparing: SELECT * FROM user;
    DEBUG [main] - ==> Parameters: 
    DEBUG [main] - <==      Total: 6
    DEBUG [HikariPool-1 housekeeper] - HikariPool-1 - Pool stats (total=1, active=1, idle=0, waiting=0)
    DEBUG [main] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2f953efd]
    User(id=1, name=admin, password=admin, status=0, is_del=0)
    User(id=2, name=user01, password=123456, status=0, is_del=0)
    User(id=3, name=user02, password=123456, status=0, is_del=0)
    User(id=4, name=user03, password=123456, status=0, is_del=0)
    User(id=5, name=user04, password=123456, status=0, is_del=0)
    User(id=6, name=user05, password=123456, status=0, is_del=0)

    SpringMVC整合:

    首先由Maven骨架创建Web工程没有提供源码和资源两个目录:

    我们需要手动创建:

    导入上一级Service业务层:

        <dependencies>
            <dependency>
                <groupId>cn.echo42</groupId>
                <artifactId>Application-Service</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>

    Application-Controller.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
           http://www.springframework.org/schema/beans/spring-beans.xsd
    
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
    
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
    "
    >
    
        <context:component-scan base-package="cn.echo42.controller" /> <!-- 控制器注册扫描 -->
    
        <mvc:default-servlet-handler/> <!-- 静态资源过滤器 -->
    
        <mvc:annotation-driven /> <!-- 注解驱动 -->
    
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 前缀,这里是请求的路径文件 -->
            <property name="prefix" value="/WEB-INF/view/" />
            <!-- 后缀 ,支持.jsp的请求-->
            <property name="suffix" value=".jsp" />
        </bean>
        
        <import resource="Application-Dao.xml"/> <!-- 合并导入前2层的容器XML配置 -->
        <import resource="Application-Service.xml"/>
    
    </beans>

    Web.xml配置

    导入Controller.xml用以加载

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
    
      <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:Application-Controller.xml</param-value>
        </init-param>
      </servlet>
      
      <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
      
    </web-app>

    UserController编写:

    package cn.echo42.controller;
    
    import cn.echo42.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.util.Map;
    
    /**
     * @author DaiZhiZhou
     * @file SSM-ModuleVersion-Sample
     * @create 2020-08-08 10:02
     */
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        UserService userService;
    
        @GetMapping("/list")
        public String toUserListPage(Map<String,Object> map) {
            map.put("message", "Hello SSM module Sample!!!");
            map.put("userList", userService.getUserList());
            return "user/list";
        }
    
    }

    编写页面:

    jsp代码:list.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%--
      Created by IntelliJ IDEA.
      User: User-Dai
      Date: 2020/8/8
      Time: 10:12
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
    <html>
    <head>
        <title>用户列表</title>
    </head>
    <body>
    
    <table width="100%" border="1px">
    
        <caption><h3>${message}</h3></caption>
    
        <thead>
            <tr>
                <th>编号</th>
                <th>名称</th>
                <th>密码</th>
                <th>状态</th>
                <th>标记删除</th>
            </tr>
        </thead>
    
        <tbody>
            <c:forEach items="${userList}" var="user">
                <tr>
                    <td>${user.id}</td>
                    <td>${user.name}</td>
                    <td>${user.password}</td>
                    <td>${user.status}</td>
                    <td>${user.is_del}</td>
                </tr>
            </c:forEach>
        </tbody>
    
    </table>
    
    </body>
    </html>

    访问:

    http://localhost:8080/user/list

  • 相关阅读:
    java 基础
    ruby on rails
    try catch 与 return 和 finally 关系。
    Oracle 左连接,右连接,内链接。【百度知道】
    java单例模式【csdn-炸死特】
    <jsp:include>和<%@include file=""%>有什么区别?
    List list = new ArrayList()和ArrayList list = new ArrayList()的区别?
    面向连接与面向无连接
    单​工​,​半​双​工​,​全​双​工​的​含​义​及​区​别
    对于java中接口的作用与理解
  • 原文地址:https://www.cnblogs.com/mindzone/p/13456288.html
Copyright © 2020-2023  润新知