在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&useUnicode=true&characterEncoding=utf-8&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()); } }