SSM整合之SpringMVC(四)

本文详细介绍了Spring MVC的配置过程,包括在`dispatcher-servlet.xml`和`web.xml`中的配置,以及如何处理多个XML配置文件。通过示例展示了如何配置数据源、MyBatis、事务管理器和分页插件。此外,还提供了从DAO到Controller的完整代码示例,涵盖了实体类、Mapper、Service、Controller等层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在dispatcher-servlet.xml中配置

<!-- 扫描包 -->
<context:component-scan base-package="edu.nf.ch04"/>

<!-- 启用mvc注解驱动 -->
<mvc:annotation-driven/>

<!-- 开启默认静态资源处理器 -->
<mvc:default-servlet-handler/>

在web.xml中配置

开启我们的springmvc

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <!-- 指定mvc的配置文件-->
        <param-value>classpath:dispatcher-servlet.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

处理多个xml配置文件

二种方式选一种即可  

 方式一: 

在dispatcher-servlet中配置

<!-- 方式一:导入合并其他的配置文件 -->
<import resource="xxxx.xml"/>

方式二:

在applicationContext.xml中配置

在applicationContext中只扫描除@controller的注解

<!-- 启用包扫描,排除带有@Controller注解类,控制层的类交给子容器去扫描 -->
<context:component-scan base-package="edu.nf.ch04">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

在dispatcher-Servlet中配置扫描@controller注解

<!-- 子容器扫描controller -->
<context:component-scan base-package="edu.nf.ch04.controller"/>



案例:

配置xml文件

applicationContext.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:mybatis="http://mybatis.org/schema/mybatis-spring" 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://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 启用包扫描,排除带有@Controller注解类,控制层的类交给子容器去扫描 -->
    <context:component-scan base-package="edu.nf.ch04">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 1. 整合druid连接池,其实也就是将druid的数据源纳入spring的ioc容器中,
         init-method指定数据源的初始化方法,destroy-method指定数据源的close方法-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 注入数据库连接属性 -->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/city?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
        <!-- 注入连接池配置属性-->
        <!-- 最大连接池数量-->
        <property name="maxActive" value="20"/>
        <!-- 初始化连接池时创建的连接个数-->
        <property name="initialSize" value="5"/>
        <!-- 最小连接池数量,建议和初始化大小一致-->
        <property name="minIdle" value="5"/>
        <!-- 获取连接最大等待时间,超时则抛异常。单位:毫秒 -->
        <property name="maxWait" value="2000"/>
        <!-- 连接保持空闲而不被驱逐出连接池的最小时间,单位毫秒-->
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <!-- 销毁连接的线程检测的间隔时间,单位:毫秒-->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <!-- 检测连接是否有效-->
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="true"/>
        <!-- 归还连接时检测连接是否有效-->
        <property name="testOnReturn" value="true"/>
        <!-- 是否缓存PreparedStatement,mysql建议关闭 -->
        <property name="poolPreparedStatements" value="false"/>
        <!-- 定义一条伪sql,用于检查连接的可用性 -->
        <property name="validationQuery" value="select 1"/>
    </bean>

    <!-- 2. 整合mybatis, 其核心就是将SqlSessionFactory纳入spring的IOC容器 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据源, 引用上面配置数据源的bean的id -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 指定实体的别名-->
        <property name="typeAliasesPackage" value="edu.nf.ch04.entity"/>
        <!-- 指定mapper映射文件的目录-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <!-- 配置文件插件-->
        <property name="plugins">
            <!-- 装配分页的拦截器 -->
            <bean class="com.github.pagehelper.PageInterceptor">
                <!-- 注入分页属性 -->
                <property name="properties">
                    <props>
                        <!-- 数据库方言 -->
                        <prop key="helperDialect">mysql</prop>
                        <!-- 启用分页注解支持-->
                        <prop key="supportMethodsArguments">true</prop>
                        <!-- 分页合理化-->
                        <prop key="reasonable">true</prop>
                    </props>
                </property>
            </bean>
        </property>
    </bean>

    <!-- 3. 扫描dao的接口包。这样会利用动态代理的机制在运行时创建所有dao接口的代理实现-->
    <mybatis:scan base-package="edu.nf.ch04.dao"/>

    <!-- 装配JDBC事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据源 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 启用事务注解处理器 -->
    <tx:annotation-driven/>
</beans>

dispatcher-servlet.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">

    <!-- 子容器扫描controller -->
    <!--<context:component-scan base-package="edu.nf.ch04.controller"/>-->

    <context:component-scan base-package="edu.nf.ch04"/>

    <!-- 启用mvc注解驱动 -->
    <mvc:annotation-driven/>

    <mvc:default-servlet-handler/>

    <!-- 方式一:导入合并其他的配置文件 -->
    <import resource="applicationContext.xml"/>
</beans>

配置web层中的xml文件

<?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_4_0.xsd"
         version="4.0">
    <!-- 方式二:配置spring的上下文监听器,在容器启动的时候会最先去加载和初始化applicationContext.xml配置文件,
         注意:监听器先初始化后创建的IOC容器为父容器,随后DispatcherServlet初始化创建的ioc容器是子
         容器。
    -->
    <!--<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>-->
    <!-- 监听器默认会从WEB-INF目录下查找名为applicationContext.xml的配置文件,如果配置文件放在了其他地方
         那么就需要通过<context-param>来指定 -->
    <!--<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>-->

    <!-- 配置核心控制器 -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- 指定mvc的配置文件-->
            <param-value>classpath:dispatcher-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

entity层

@Data
public class City {
    private Integer cityId;
    private String cityName;
    private String cityCode;
    private String province;
}

dao层

public interface CityDao {

    /**
     * 查询城市信息
     * @param cityName
     * @return
     */
    City getCityByName(String cityName);

    /**
     * 查询城市列表
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<City> listCity(@Param("pageNum") int pageNum,
                        @Param("pageSize") int pageSize);
}

resource中的mapper

<?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="edu.nf.ch04.dao.CityDao">

    <resultMap id="cityMap" type="city">
        <id property="cityId" column="city_id"/>
        <result property="cityName" column="city_name"/>
        <result property="cityCode" column="city_code"/>
        <result property="province" column="province"/>
    </resultMap>

    <select id="getCityByName" parameterType="string" resultMap="cityMap">
        select city_id, city_name, city_code, province from city_info
        where city_name = #{name}
    </select>

    <select id="listCity" resultMap="cityMap">
        select city_id, city_name, city_code, province from city_info
    </select>
</mapper>

service层中的接口

public interface CityService {

    /**
     * 查询城市信息
     * @param name
     * @return
     */
    City getCityByName(String name);

    /**
     * 查询城市列表
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageInfo<City> listCity(int pageNum, int pageSize);
}

impl

@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = RuntimeException.class)
public class CityServiceImpl implements CityService {

    private final CityDao cityDao;

    @Override
    public City getCityByName(String name) {
        return cityDao.getCityByName(name);
    }

    @Override
    public PageInfo<City> listCity(int pageNum, int pageSize) {
        List<City> list = cityDao.listCity(pageNum, pageSize);
        PageInfo<City> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }
}

vo

@Data
public class ResultVO<T> {
    private Integer code;
    private String message;
    private T data;
}

controller层中的

public class BaseController {

    public <T> ResultVO<T> success(T data) {
        ResultVO vo = new ResultVO();
        vo.setCode(HttpStatus.OK.value());
        vo.setData(data);
        return vo;
    }
}

@RestController
@RequiredArgsConstructor
public class CityController extends BaseController{

    private final CityService service;

    @GetMapping("/city/list")
    public ResultVO<List<City>> listCity(int pageNum, int pageSize) {
        PageInfo<City> pageInfo = service.listCity(pageNum, pageSize);
        return success(pageInfo.getList());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值