[Практика проекта] Изучите интеграцию SSM, прежде чем изучать SpringBoot

Spring

Проектное обучение для проверки истинных знаний практикой

предисловие

Сейчас стек технологий, используемый при разработке бэкэнда на Java, в основном унифицирован: Spring + SpringMVC + Mybatis, который часто называют SSM. Хотя в настоящее время популярной практикой является использование SpringBoot для быстрой сборки и настройки проектов SSM, все же необходимо знать, как объединить все три без SpringBoot, потому что SpringBoot только помогает нам выполнять большую настройку, а не отказываться от этих конфигураций, поэтому знание того, как встроенный SSM интегрирован, может помочь нам лучше понять SSM и лучше понять преимущества SpringBoot! Более того, некоторые старые проекты не используют SpringBoot, и если вы ничего не знаете о нативной интеграции и настройке SSM, поддерживать старые проекты будет крайне неудобно.

По сравнению с быстрой сборкой SpringBoot интеграция SSM, естественно, громоздка, но не волнуйтесь, в этой статье шаг за шагом будет продемонстрировано, как интегрировать эти три компонента, и объяснено значение каждой конфигурации. Старая рутина, в конце статьи также помещалась карта разума и адрес проекта на Github,Вы можете запустить его сразу после того, как клонируете его.Если вы хотите сделать полноценный проект SSM самостоятельно, использовать этот набор полок для разработки совершенно не проблема!

Интегрировать

Строительство проекта

Создать проект

Здесь idea используется для создания проекта, а maven — для управления пакетами зависимостей. Сначала создаем новый проект на идее, выбираем Maven, а затем выбираем веб-приложение:

Нажмите «Далее», введите GroupId и ArtifactId и нажмите «Далее», пока не закончите. После создания проекта вся структура проекта выглядит следующим образом:

Настроить веб-проект

Не беспокойтесь о настройке SSM сейчас, мы должны сначала настроить веб-проект в соответствии с этой идеей. Также видно, что после установки проекта в файле web.xml прописана версия 2.3. Эта версия слишком старая для работы.

мы держимcatl + shift + alt + SОткройте структуру проекта идеи, затем нажмите «Модули» слева, затем нажмите «Веб», затем нажмите кнопку «Удалить» справа, «ОК» и, наконец, нажмите «ПРИМЕНИТЬ», чтобы сначала удалить это значение по умолчанию:

На этом этапе мы обнаружим, что файл web.xml по умолчанию был удален. Затем мы нажимаем кнопку «Добавить» справа и нажимаем web.xml, чтобы добавить:

Здесь мы выбираем версию 3.1, После выбора нажмите OK во всплывающем окне, а затем нажмите OK ниже, чтобы завершить создание:

После создания вы обнаружите, что наш контент web.xml стал 3.1.

Установить структуру проекта

Пока не спешите настраивать SSM. У нас нет даже базовой структуры для нашего текущего проекта. Где написаны ваши основные коды, где вы тестируете и где ваши ресурсы? Мы собираемся их построить.

Сначала мы создаем новую тестовую папку по пути src, а затем создаем новую папку java и ресурсов по пути src/main. После создания папки щелкните папку правой кнопкой мыши, перетащите ее вниз, выберите «Отметить каталог как», а затем выберите соответствующую структуру каталогов.

Папка java соответствует SourcesRoot, которая представляет собой путь, отмеченный как исходный код проекта, и код написан здесь.

Папка ресурсов соответствует ResourcesRoot, который помечен как путь к ресурсам, и все ресурсы, такие как файлы конфигурации, помещаются сюда.

Папка с тестом соответствует TestSourcesRoot, который отмечен как путь к тесту, и код теста будет размещен здесь.

После того, как папка указана, нам нужно создать нашу структуру пакета кода в папке java. Пакет разделен на самый простой контроллер, сервис, маппер, сущность. После сборки пакета структура каталогов выглядит следующим образом:

Импорт необходимых зависимостей

После того, как основная структура проекта будет определена, мы приступим к интеграции SSM. Первое, что вы должны сделать, это импортировать необходимые пакеты зависимостей в файл pom.xml, просто скопируйте и вставьте его напрямую и сделайте пометки в разных местах:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <!--统一配置jar包的版本-->
    <mysql.version>5.1.48</mysql.version>
    <spring.version>5.2.0.RELEASE</spring.version>
    <jackson.version>2.10.0</jackson.version>
</properties>

<dependencies>
    <!--单元测试,注意哦要4.12版本以上。scope为test代表只用来做测试,并不随版本打包发布此依赖包-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!--日志我们使用logback-->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>

    <!-- 简化Getter、Setter的工具lombok。非必需
    注意:使用lombok还要在idea上下载对应的插件-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>


    <!-- ***************数据库相关配置****************** -->
    <!-- mysql驱动依赖包,连接mysql必备-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>

    <!-- 数据源依赖包,能大幅提升性和便利性。这里我们用阿里的德鲁伊数据源-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.12</version>
    </dependency>

    <!-- Mybatis必备依赖包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>

    <!-- ***************web相关配置****************** -->
    <!--配置JavaEE依赖包,包含了Servlet、Validation等功能-->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>8.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- JSTL依赖包,如果用将jstl标签用在jsp中就要此依赖包。非必需的 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- jackson依赖包,用来将java对象转换JSON格式,SpringMVC要用的 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version}</version>
    </dependency>

    <!-- ***************Spring相关配置****************** -->
    <!--配置Spring JDBC容器所需的jar包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!--配置Spring IOC容器所需的jar包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!--Spring mvc-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- AspectJ所需的jar包-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>

    <!--Spring测试依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>

    <!--配置Spring整合mybatis的jar包-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.2</version>
    </dependency>
</dependencies>

Интеграция Spring и Mybatis

Конфигурация базы данных

Перед интеграцией давайте подготовим базу данных, чтобы мы могли провести полную демонстрацию. Здесь я использую MySQL 5.7.25 Давайте создадим базу данных с именем ssm_demo, выполним оператор для создания пользовательской таблицы и вставим два тестовых данных:

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '账户名',
  `password` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '账户密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

INSERT INTO `user` VALUES (1, 'admin', '123456');
INSERT INTO `user` VALUES (2, 'rudecrab', '654321');

Затем мы создаем класс сущностей User, соответствующий таблице базы данных в пакете сущностей:

@Data // lombok注解,自动生成Getter、Setter、toString方法
public class User implements Serializable {
    private Long id;

    private String name;

    private String password;
}

Затем мы создаем его в папке ресурсовdatabase.propertiesфайл, чтобы настроить соответствующую информацию о соединении с базой данных (здесь настраивается в соответствии с вашей собственной информацией о базе данных), дождитесь интеграции Mybatis для использования:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm_demo?characterEncoding=utf-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=UTC
jdbc.username=root
jdbc.password=root

конфигурация журнала обратной связи

В реальных проектах вообще необходимо наблюдать за выводом лога, настроим лог. Создайте новый в каталоге ресурсовlogback.xmlдокумент.Обратите внимание, что вам нужно указать пакет в конце, который устанавливается в соответствии с вашим собственным именем пакета структуры проекта.:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!--定义日志文件输出地址-->
    <property name="LOG_ERROR_HOME" value="error"/>
    <property name="LOG_INFO_HOME" value="info"/>

    <!--通过appender标签指定日志的收集策略,我们会定义三个收集策略:控制台输出、普通信息文件输出、错误信息文件输出-->
    <!--name属性指定appender命名-->
    <!--class属性指定输出策略,通常有两种,控制台输出和文件输出,文件输出就是将日志进行一个持久化-->

    <!--控制台输出-->
    <appender name="CONSOLE_LOG" class="ch.qos.logback.core.ConsoleAppender">
        <!--使用该标签下的标签指定日志输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--
            %p:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
            %r:输出自应用启动到输出该日志讯息所耗费的毫秒数
            %t:输出产生该日志事件的线程名
            %f:输出日志讯息所属的类别的类别名
            %c:输出日志讯息所属的类的全名
            %d:输出日志时间点的日期或时间,指定格式的方式: %d{yyyy-MM-dd HH:mm:ss}
            %l:输出日志事件的发生位置,即输出日志讯息的语句在他所在类别的第几行。
            %m:输出代码中指定的讯息,如log(message)中的message
            %n:输出一个换行符号
            -->
            <pattern>%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %yellow([%-5p]) %highlight([%t]) %boldMagenta([%C]) %green([%L]) %m%n</pattern>
        </encoder>
    </appender>

    <!--普通信息文件输出-->
    <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--通过使用该标签指定过滤策略-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--标签指定过滤的类型-->
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>

        <encoder>
            <!--标签指定日志输出格式-->
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </encoder>

        <!--标签指定收集策略,比如基于时间进行收集-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--标签指定生成日志保存地址,通过这样配置已经实现了分类分天收集日志的目标了-->
            <fileNamePattern>${LOG_INFO_HOME}//%d.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!--错误信息文件输出-->
    <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!--用来设置某一个包或具体的某一个类的日志打印级别-->
    <logger name="com.rudecrab.ssm.mapper" level="DEBUG"/>

    <!--必填标签,用来指定最基础的日志输出级别-->
    <root level="info">
        <!--添加append-->
        <appender-ref ref="CONSOLE_LOG"/>
        <appender-ref ref="INFO_LOG"/>
        <appender-ref ref="ERROR_LOG"/>
    </root>
</configuration>

Глобальные настройки Mybatis

Теперь мы наконец можем интегрировать Spring и Mybatis. Сначала мы создаем новый в папке ресурсовmybatis-config.xmlфайл для глобальной настройки Mybatis, здесь я привык настраивать их, просто делайте это в соответствии со своими потребностями:

<?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="SLF4J"/>

        <!--启用主键生成策略-->
        <setting name="useGeneratedKeys" value="true"/>

        <!--配置启用下划线转驼峰的映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <!--启用二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

Конфигурация интеграции Spring-Myabtis

Создать новыйspring-mybatis.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:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://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/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--属性文件的读取,这里读取刚才我们的数据库连接相关配置-->
    <context:property-placeholder location="classpath:database.properties" file-encoding="UTF-8"/>

    <!--配置自动扫描,如果不配置这个那么就无法使用@Autowired加载bean-->
    <context:component-scan base-package="com.rudecrab.ssm" use-default-filters="true">
        <!--这里要排除掉Controller的注解,Controller专门交给MVC去扫描,这样会就不会冲突-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!--配置JDBC基础属性,即数据库连接相关配置-->
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!--配置连接池的设置,这个是要根据真实项目情况来配置的,随着项目的发展会不断修改-->
        <property name="initialSize" value="10"/>
        <property name="maxActive" value="100"/>
    </bean>

    <!--
    重点来了,这里配置是MyBatis的SqlSessionFactory,就是这一块配置将Spring和Mybatis整合到了一起
    如果不配置这里,你的mapper接口只能通过SqlSession来获取,十分麻烦。这里配置好后就可以通过Spring IoC来获取mapper接口了
    -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <!--指定数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--加载mybatis全局设置,classpath即我们的资源路径resources-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--配置Mybatis的映射xml文件路径-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!--指定Mybatis的mapper接口扫描包-->
    <!--注意!!!如果用的是tk.mybatis自动生成的mapper接口,一定要将org.mybatis.改成tk.mybatis-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定刚才我们配置好的sqlSessionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--指定mapper接口扫描包-->
        <property name="basePackage" value="com.rudecrab.ssm.mapper"/>
    </bean>

    <!--配置事务管理器,如果不配置这个,不启动事务扫描的话,那么发生了异常也不会触发回滚-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--还得指定数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--启动事务的扫描-->
    <tx:annotation-driven/>
</beans>

JUnit-тесты

До сих пор Spring и Myabtis были интегрированы и настроены, и нет причин говорить об этом, нам еще нужно протестировать его, чтобы увидеть эффект. Перед тестированием мы должны создать файл интерфейса картографа, xml-файл сопоставления myabtis, интерфейс службы и класс реализации:

Интерфейс UserMapper специально используется для объявления различных методов работы с базой данных.@RepositoryАннотация определяет его как компонент, управляемый Spring:

@Repository
public interface UserMapper {
    /**
     * 从数据库中查询出所有的User对象
     * @return User对象集合
     */
    List<User> selectAll();
}

Файл сопоставления UserMapper.xml используется для записи метода, соответствующего выполняемому оператору SQL:

<?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="com.rudecrab.ssm.mapper.UserMapper">
    <!--开启缓存-->
    <cache/>

    <!--从数据库中查询出所有的User对象-->
    <select id="selectAll" resultType="com.rudecrab.ssm.entity.User">
        select * from user
    </select>

</mapper>

Интерфейс UserService используется для объявления бизнес-методов о пользователе:

public interface UserService {
    /**
     * 从数据库中查询出所有的User对象
     * @return User对象集合
     */
    List<User> getAll();
}

Класс сущности UserServiceImpl используется для реализации бизнес-логики о пользователе,@Serviceаннотации и@RepositoryАннотация используется та же, она определяется как Bean.@TransactionalАннотация является декларативной транзакцией, и если в методе бизнес-уровня возникнет исключение, транзакция будет откатана. затем используйте@AutowiredАннотация находится в частном свойстве, а bean-компонент загружается автоматически, поэтому нам не нужно вручную создавать UserMapper:

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> getAll() {
        return userMapper.selectAll();
    }
}

Все связанные классы и файлы созданы, теперь мы создаем тестовый класс UserServiceTest в тестовой папке,Обязательно добавьте эти две аннотации в тестовый класс., иначе функции, связанные с Spring, нельзя будет использовать нормально:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void getAll() {
        System.out.println(userService.getAll());
        System.out.println(userService.getAll());
    }
}

После запуска мы можем увидеть результат работы:

Вы можете видеть, что результаты отображаются нормально, и журналы также печатаются в консоли.Это означает, что мы завершили интеграцию Spring и Mybatis!

идеи

SpringMVC

spring-mvc.xml

Затем мы настраиваем SpringMVC и создаем новый в каталоге ресурсов.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
       http://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">

    <!--配置视图解析器,这样控制器里就直接返回文件名就好了-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置静态资源过滤,不然静态资源比如css是访问不到的-->
    <mvc:default-servlet-handler/>

    <!--配置扫描的包-->
    <context:component-scan base-package="com.rudecrab.ssm.controller" use-default-filters="false">
        <!--只扫描controller,实际开发中最好用这种方式来写,这边MVC就只扫描controller,就不会IOC那边冲突,否则事务会被覆盖,IOC那边就要排除这个controller-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--启用MVC的注解-->
    <mvc:annotation-driven/>
</beans>

web.xml

Последняя конфигурация естественным образом интегрирована в web.xml, существует три основных конфигурации:

  1. Настройте контейнер Spring IOC для подготовки к mybatis.
  2. Настройте передний контроллер SpringMVC
  3. Настройка фильтров кодировки символов
<?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_3_1.xsd"
         version="3.1">

    <!--1.配置Spring IOC容器的创建,如果不配置这个,Mybatis就在web应用里无法使用-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!--spring和mybatis整合配置文件路径-->
        <param-value>classpath:spring-mybatis.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--2.配置SpringMVC的前端控制器-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--SpringMVC整合配置文件路径-->
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--3.配置字符编码过滤器-->
    <filter>
        <filter-name>encodingFilter</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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

финальный тест

Выше все настройки сделаны, теперь давайте запустим простейший веб-проект, чтобы убедиться, что интеграция прошла успешно! помнишь, мы былиspring-mvc.xmlПрефикс разрешения представления, настроенный в файле, мы создаем новый файл index.jsp в папке **/WEB-INF/views/**:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页-RudeCrab</title>
</head>
<body>
<%--循环提取userList中的元素--%>
<c:forEach var="user" items="${userList}">
    <ul>
        <li>${user}</li>
    </ul>
</c:forEach>
</body>
</html>

Затем создайте новый класс контроллера в пакете контроллера, чтобы определить интерфейс доступа:

@Controller
@RequestMapping(value = "user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/getList")
    public String getList(Model model) {
        // 将数据存到model对象里,这样jsp就能访问数据
        model.addAttribute("userList", userService.getAll());
        // 返回jsp文件名
        return "index";
    }

    @GetMapping("/getJson")
    @ResponseBody
    public List<User> getList() {
        // 如果想做前后端分离的话可以加上@ResponseBody注解,直接返回数据对象,这样前端就可以通过获取json来渲染数据了
        return userService.getAll();
    }
}

Затем мы запускаем Tomcat и получаем доступ к интерфейсу в браузере:

Видно, что мы успешно получили доступ к данным, и пока SSM полностью интегрирован!

Суммировать

карта разума

Общие идеи интеграции и конфигурации были нарисованы на карте ума, а подробные примечания написаны на каждом узле, которые можно загрузить и просмотреть. Файл размещен по адресу github в конце:

гитхаб-адрес

GitHub.com/Ru краб/as...

Вышеупомянутый содержит весь проект, клонируйте его и откройте с идеей для запуска! Также поместите файл карты разума. Если это будет вам полезно, нажмите звездочку, в проекте есть и другие [проектные практики], и я продолжу обновлять больше проектных практик в будущем!

Блог, Github, публичный аккаунт WeChat — все: RudeCrab, добро пожаловать на внимание! Если это полезно для вас, вы можете добавить в закладки, лайкнуть, пометить, посмотреть и поделиться ~~ Ваша поддержка - самая большая мотивация для меня, чтобы писать статьи.

Для перепечатки на WeChat, пожалуйста, обратитесь в официальный аккаунт, чтобы открыть белый список.Для перепечатки в других местах, пожалуйста, укажите оригинальный адрес и оригинального автора!