SpringMVC高级
1.SSM整合(重点)
1.1 SSM
SSM(Spring + SpringMVC + MyBatis)
- Spring
- 框架基础
- MyBatis
- mysql+druid+pagehelper
- Spring整合MyBatis
- junit测试业务层接口
- SpringMVC
- rest风格(postman测试请求结果)
- 数据封装json(jackson)
- Spring整合SpringMVC
- Controller调用Service
- 其他
- 表现层数据封装
- 自定义异常
1.2 SSM整合案例
用户表
![image-20210503132037356](https://gitee.com/dark-moon-night/cloudimages/raw/master/img/image-20210503132037356.png)
学生表
![image-20210503132105486](https://gitee.com/dark-moon-night/cloudimages/raw/master/img/image-20210503132105486.png)
1.3 Part0:项目基础结构搭建
-
创建项目,组织项目结构,创建包
-
创建表与实体类
CREATE TABLE `user` ( `uuid` int(10) NOT NULL AUTO_INCREMENT, `usrName` varchar(100) DEFAULT NULL, `password` varchar(100) DEFAULT NULL, `realName` varchar(100) DEFAULT NULL, `gender` int(1) DEFAULT NULL, `birthday` date DEFAULT NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
package com.itheima.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer uuid; private String usrName; private String password; private String realName; private Integer gender; private Date birthday; public Integer getUuid() { return uuid; } public void setUuid(Integer uuid) { this.uuid = uuid; } public String getUsrName() { return usrName; } public void setUsrName(String usrName) { this.usrName = usrName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "User{" + "uuid=" + uuid + ", usrName='" + usrName + '\'' + ", password='" + password + '\'' + ", realName='" + realName + '\'' + ", gender=" + gender + ", birthday=" + birthday + '}'; } }
-
创建三层架构对应的模块、接口与实体类,建立关联关系
-
数据层接口(代理自动创建实现类)
package com.itheima.dao; import com.itheima.domain.User; import java.util.List; public interface UserDao { /** * 添加用户 * @param user * @return */ public boolean save(User user); /** * 修改用户 * @param user * @return */ public boolean update(User user); /** * 删除用户信息 * @param uuid * @return */ public boolean delete(Integer uuid); /** * 查询单个用户信息 * @param uuid * @return */ public User get(Integer uuid); /** * 查询全部用户信息 * @return */ public List<User> getAll(); /** * 根据用户名密码查询用户信息 * @param userName 用户名 * @param password 密码信息 * @return */ //注意:数据层操作不要和业务层操作的名称混淆,通常数据层仅反应与数据库间的信息交互,不体现业务逻辑 public User getByUserNameAndPassword(String userName,String password); }
-
业务层接口+业务层实现类
package com.itheima.service; import com.itheima.domain.User; import java.util.List; public interface UserService { /** * 添加用户 * @param user * @return */ public boolean save(User user); /** * 修改用户 * @param user * @return */ public boolean update(User user); /** * 删除用户信息 * @param uuid * @return */ public boolean delete(Integer uuid); /** * 查询单个用户信息 * @param uuid * @return */ public User get(Integer uuid); /** * 查询全部用户信息 * @return */ public List<User> getAll(); /** * 根据用户名密码登录 * @param userName * @param password * @return */ public User login(String userName,String password); }
package com.itheima.service.impl; import com.itheima.domain.User; import com.itheima.service.UserService; import java.util.List; public class UserServiceImpl implements UserService { @Override public boolean save(User user) { return false; } @Override public boolean update(User user) { return false; } @Override public boolean delete(Integer uuid) { return false; } @Override public User get(Integer uuid) { return null; } @Override public List<User> getAll() { return null; } @Override public User login(String userName, String password) { return null; } }
-
表现层
package com.itheima.controller; public class UserController { }
-
1.4 Part1+Part2:SSM整合
-
导入坐标
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!--spring坐标--> <!-- <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</version> </dependency> --> <!--mybatis坐标--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <!--mysql坐标--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--spring整合jdbc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!--spring整合mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.3</version> </dependency> <!--druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <!--分页插件坐标--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency> <!--springmvc坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!--spring web坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!--servlet3.1规范坐标--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--json相关坐标3个--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <!-- <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency> --> </dependencies>
-
创建MyBatis映射文件
<?xml version="1.0" encoding="utf-8" ?> <!--Mybatis的DTD的约束--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dta/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.dao.UserDao"> <!--添加--> <insert id="save" parameterType="user"> insert into user(userName,password,realName,gender,birthday) values(#{userName},#{password},#{realName},#{gender},#{birthday}) </insert> <!--删除--> <delete id="delete" parameterType="int"> delete from user where uuid = #{uuid} </delete> <!--修改--> <update id="update" parameterType="user"> update user set userName=#{userName},password=#{password},realName=#{realName},gender=#{gender},birthday=#{birthday} where uuid=#{uuid} </update> <!--查询全部(分页查询)--> <select id="getAll" resultType="user"> select * from user </select> <!--查询单个--> <select id="get" resultType="user" parameterType="int"> select * from account where uuid = #{uuid} </select> <!--登录--> <select id="getByUserNameAndPassword" resultType="user"> select * from user where userName=#{userName} and password=#{password} </select> </mapper>
public User getByUserNameAndPassword(@Param("userName") String userName,@Param("password") String password);
-
创建Spring配置文件
- 组件扫描
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.itheima"/> </beans>
@Service public class UserServiceImpl implements UserService { }
-
整合MyBatis到Spring环境中
-
SqlSessionFactoryBean
<!--整合mybatis到spring中--> <bean class="org.apache.ibatis.session.SqlSessionFactoryBuilder"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.itheima.domain"/> </bean>
-
数据源(druid+jdbc.properties)
<!--加载properties配置文件--> <context:property-placeholder location="classpath*:jdbc.properties"/> <!--数据源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>
-
映射扫描
<!--映射扫描--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.itheima.dao"/> </bean>
-
注解事务
<tx:annotation-driven transaction-manager="txManager"/> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
@Transactional(readOnly = true) public interface UserService { @Transactional(readOnly = false) public boolean save(User user); @Transactional(readOnly = false) public boolean update(User user); @Transactional(readOnly = false) public boolean delete(Integer uuid); public User get(Integer uuid); public PageInfo<User> getAll(int page, int size); public User login(String userName,String password); }
-
分页插件
<!--整合mybatis到spring中--> <bean class="org.apache.ibatis.session.SqlSessionFactoryBuilder"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.itheima.domain"/> <!--分页插件--> <property name="plugings"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <props> <prop key="helperDialect">mysql</prop> <prop key="reasonable">true</prop> </props> </property> </bean> </array> </property> </bean>
@Override public PageInfo<User> getAll(int page,int size) { PageHelper.startPage(page,size); List<User> all = userDao.getAll(); return new PageInfo<User>(all); }
-
-
创建单元测试
package com.itheima.service; import com.github.pagehelper.PageInfo; import com.itheima.domain.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; import java.util.Date; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class UserServiceTest { @Autowired private UserService userService; @Test public void testSave() { User user = new User(); user.setUserName("风花雪月"); user.setPassword("root"); user.setRealName("王二哈"); user.setGender(1); user.setBirthday(new Date(8745701897123L)); userService.save(user); } @Test public void testDelete() { userService.delete(2); } @Test public void testUpdate() { User user = new User(); user.setUuid(3); user.setUserName("青丝如梦"); user.setPassword("root"); user.setRealName("小尹"); user.setGender(0); user.setBirthday(new Date(87401289723L)); userService.update(user); } @Test public void testGet() { User user = userService.get(3); System.out.println(user); } @Test public void testGetAll() { PageInfo<User> all = userService.getAll(2,2); System.out.println(all); System.out.println(all.getList().get(0)); System.out.println(all.getList().get(1)); } @Test public void testLogin() { User user = userService.login("风过无痕", "root"); System.out.println(user); } }
1.5 Part3:SpringMVC
-
web.xml加载SpringMVC
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"> <filter> <filter-name>CharacterEncodingFilter</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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <servlet-name>DispatcherServlet</servlet-name> </filter-mapping> <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*:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
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 https://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"> <context:component-scan base-package="com.itheima.controller"/> <mvc:annotation-driven/> </beans>
applicationContext.xml配置文件
<context:component-scan base-package="com.itheima"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
-
rest风格
package com.itheima.controller; import com.itheima.domain.User; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/user") public class UserController { @PostMapping() public boolean save(User user) { System.out.println("save..." + user); return true; } @PutMapping() public boolean update(User user) { System.out.println("update..." + user); return true; } @DeleteMapping("/{uuid}") public boolean delete(@PathVariable Integer uuid) { System.out.println("delete..." + uuid); return true; } @GetMapping("/{uuid}") public User get(@PathVariable Integer uuid) { System.out.println("get..." + uuid); return null; } @GetMapping("/{page}/{size}") public User getAll(@PathVariable Integer page,@PathVariable Integer size) { System.out.println("getAll..." + page+ "," +size); return null; } @PostMapping("/login") public User login(String userName,String password) { System.out.println("login..." + userName+","+password); return null; } }
-
数据封装为json数据
1.6 Part:Spring整合SpringMVC
-
web.xml加载Spring环境
-
Controller调用Sersvice
-
web环境加载Spring上下文
<?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"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml</param-value> </context-param> <!--启动服务器时,通过监听器加载spring运行环境--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--省略前面编写的过滤器等--> </web-app>
-
表现层调用业务层bean
package com.itheima.controller; import com.github.pagehelper.PageInfo; import com.itheima.domain.User; import com.itheima.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @PostMapping() public boolean save(User user) { return userService.save(user); } @PutMapping() public boolean update(User user) { return userService.update(user); } @DeleteMapping("/{uuid}") public boolean delete(@PathVariable Integer uuid) { return userService.delete(uuid); } @GetMapping("/{uuid}") public User get(@PathVariable Integer uuid) { return userService.get(uuid); } @GetMapping("/{page}/{size}") public PageInfo<User> getAll(@PathVariable Integer page, @PathVariable Integer size) { return userService.getAll(page,size); } @PostMapping("/login") public User login(String userName,String password) { return userService.login(userName,password); } }
1.7 Part5-1:表现层数据封装
-
前端接收表现层返回的数据种类
- 操作是否成功 true/false 格式A
- 单个数据 11000,true 格式B
- 对象数据 json对象 格式C
- 集合数据 json数组 格式D
-
统一格式
-
返回数据格式设计
- 状态
- 数据
- 消息
-
返回数据状态设计
- 根据业务不同设计不同的状态码
- 404
- 500
- 200
- …
- 根据业务不同设计不同的状态码
-
设计包装类,用于将返回数据格式统一
package com.itheima.controller.results; public class Result { //操作结果编码 private Integer code; //操作数据结果 private Object data; //消息 private String message; public Result() { } public Result(Integer code) { this.code = code; } public Result(Integer code, Object data) { this.code = code; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override public String toString() { return "Result{" + "code=" + code + ", data=" + data + ", message='" + message + '\'' + '}'; } }
再创建一个类,用于设计状态编码
package com.itheima.controller.results; public class Code { //操作结果编码 public static final Integer SAVE_OK = 20011; public static final Integer UPDATE_OK = 20021; public static final Integer DELETE_OK = 20031; public static final Integer GET_OK = 20041; public static final Integer SAVE_ERR = 20010; public static final Integer UPDATE_ERR = 20020; public static final Integer DELETE_ERR = 20030; public static final Integer GET_ERR = 20040; //系统错误编码 //操作权限编码 //校验结果编码 }
1.8 Part5-2:自定义异常
-
设定自定义异常,封装程序执行过程中出现的问题,便于表现层进行统一的异常拦截并进行处理
- BusinessException
- SystemException
-
自定义异常消息返回时需要与业务正常执行的消息按照统一的格式进行处理
-
返回消息兼容异常信息
创建异常类:
package com.itheima.system.exception; public class BusinessException extends RuntimeException{ //自定义异常中封装对应的错误编码,用于异常处理时获取对应的操作编码 private Integer code; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public BusinessException(Integer code) { super(); this.code = code; } public BusinessException(String message,Integer code) { super(message); this.code = code; } public BusinessException(String message, Throwable cause,Integer code) { super(message, cause); this.code = code; } public BusinessException(Throwable cause,Integer code) { super(cause); this.code = code; } protected BusinessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace,Integer code) { super(message, cause, enableSuppression, writableStackTrace); this.code = code; } }
异常增强类:
@Component @ControllerAdvice public class ProjectExceptionAdvice { @ExceptionHandler(BusinessException.class) @ResponseBody //对出现的异常情况进行拦截,并将其处理成统一的页面数据结果格式 public Result doBusinessException(BusinessException e) { return new Result(e.getCode(),e.getMessage()); } }
控制器类:
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @PostMapping() public Result save(User user) { boolean flag = userService.save(user); return new Result(flag? Code.SAVE_OK:Code.SAVE_ERR); } @PutMapping() public Result update(User user) { boolean flag = userService.update(user); return new Result(flag? Code.UPDATE_OK:Code.UPDATE_ERR); } @DeleteMapping("/{uuid}") public Result delete(@PathVariable Integer uuid) { boolean flag = userService.delete(uuid); return new Result(flag? Code.DELETE_OK:Code.DELETE_ERR); } @GetMapping("/{uuid}") public Result get(@PathVariable Integer uuid) { User user = userService.get(uuid); //设置查询uuid=10的数据时抛出异常 if (uuid == 10)throw new BusinessException("查询出错了,请重试!!!",Code.GET_ERR); return new Result(user != null? Code.GET_OK:Code.GET_ERR,user); } @GetMapping("/{page}/{size}") public Result getAll(@PathVariable Integer page, @PathVariable Integer size) { PageInfo<User> all = userService.getAll(page, size); return new Result(all != null? Code.GET_OK:Code.GET_ERR,all); } @PostMapping("/login") public Result login(String userName,String password) { User user = userService.login(userName,password); return new Result(user != null? Code.GET_OK:Code.GET_ERR,user); } }
2.注解版SSM整合
2.1 纯注解驱动SSM整合
- web.xml
- applicationContext.xml
- spring-mvc.xml
- UserDao.xml
- jdbc.properties(保留)
2.2 web.xml
同前期设置,添加加载spring核心配置文件,生成spring核心容器(主容器/父容器/根容器)
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMVCConfig.class);
return ctx;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter("contextConfigLocation","<NONE>");
super.onStartup(servletContext);
CharacterEncodingFilter cef = new CharacterEncodingFilter();
cef.setEncoding("utf-8");
FilterRegistration.Dynamic registration = servletContext.addFilter("characterEncodingFilter",cef);
registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE),false,"/*");
}
}
父容器:spring环境加载后形成的容器,包含spring环境下所有的bean
子容器:当前springmvc环境加载后形成的容器,不包含spring环境下的bean
子容器可以访问父容器中的资源,父容器不可以访问子容器中的资源
2.3 applicationContext.xml
-
同前期设置,添加事务注解驱动
@Configuration @ComponentScan(value = "com.itheima",excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = {Controller.class} ) ) @PropertySource("classpath:jdbc.properties") @EnableTransactionManagement @Import({JdbcConfig.class,MyBatisConfig.class}) public class SpringConfig { @Bean("transactionManager") public DataSourceTransactionManager getTxManager(@Autowired DataSource dataSource) { DataSourceTransactionManager dstm = new DataSourceTransactionManager(); dstm.setDataSource(dataSource); return dstm; } }
-
jdbc配置
@Configuration public class JdbcConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Bean("dataSource") public DataSource getDataSource() { DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(username); ds.setPassword(password); return ds; } }
-
mybatis配置
@Configuration public class MyBatisConfig { @Bean public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource,@Autowired Interceptor interceptor) { SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); ssfb.setDataSource(dataSource); ssfb.setTypeAliasesPackage("com.itheima.domain"); ssfb.setPlugins(interceptor); return ssfb; } @Bean public MapperScannerConfigurer getMapperScannerConfigurer() { MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.itheima.dao"); return msc; } @Bean("pageInterceptor") public Interceptor getPageInterceptor() { Interceptor interceptor = new PageInterceptor(); Properties properties = new Properties(); properties.setProperty("helperDialect","mysql"); properties.setProperty("reasonable","true"); interceptor.setProperties(properties); return interceptor; } }
2.4 spring-mvc.xml
-
同前期设置,添加@EnableWebMvc注解
@Configuration @ComponentScan("com.itheima.controller") @EnableWebMvc public class SpringMVCConfig { }
-
@EnableWebMvc
- 支持ConversionService的配置,可以方便配置自定义类型转换器
- 支持@NumberFormat注解格式数字类型
- 支持@DateTimeFormat注解格式化日期数据,日期包括Date,Calendar,JodaTime(JodaTime要导包)
- 支持@Valid的参数校验(需要导入JSR-303规范)
- 配合第三方jar包和springmvc提供的注解读写xml和json格式数据
上一篇:SpringMVC进阶