[整理]Spring+Spring MVC+MyBatis之零配置之路
2016-11-03 13:52
197 查看
随着Servlet 3.0的发布,Java Web 开发零配置文件变成了可能。
工程目录如下图(其中web.xml已删除):
在 package config中创建如下Class使用注解配置Spring MVC:
在package mapper中创建Mapper:
创建工程
创建Maven工程,POM如下<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>ssm</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <groupId>com.youme</groupId> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring.version>4.3.2.RELEASE</spring.version> <logback.version>1.1.7</logback.version> <slf4j.version>1.7.21</slf4j.version> </properties> <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.3</version> </dependency> <!-- mySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!-- Log --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- apache commons --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.6</version> </dependency> <!-- Servlet & JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>ssm</finalName> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <fork>true</fork> <verbose>true</verbose> <encoding>UTF-8</encoding> <compilerArguments> <sourcepath>${project.basedir}/src/main/java</sourcepath> </compilerArguments> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <warSourceDirectory>src/main/webapp</warSourceDirectory> <warName>ssm</warName> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
工程目录如下图(其中web.xml已删除):
代码配置Spring MVC 和 MyBatis
在 source folder src/main/java 下新建 package,如下图:在 package config中创建如下Class使用注解配置Spring MVC:
package com.youme.config; import java.nio.charset.Charset; import java.util.List; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; @EnableWebMvc @EnableAspectJAutoProxy @ComponentScan(basePackages = { "com.youme" }) @MapperScan("com.youme.mapper") public class AppMvcConfig extends WebMvcConfigurerAdapter { /** * Jsp View resolver */ @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setViewClass(JstlView.class); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); return viewResolver; } /** * 限制上传文件的大小 */ @Bean(name = "multipartResolver") public CommonsMultipartResolver commonsMultipartResolver() { CommonsMultipartResolver common = new CommonsMultipartResolver(); common.setMaxUploadSize(10 * 1024 * 1024);// 10M return common; } /** * 字符串消息转换器 */ @Bean public StringHttpMessageConverter stringHttpMessageConverter() { StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(); stringHttpMessageConverter.setDefaultCharset(Charset.forName("UTF-8")); return stringHttpMessageConverter; } /** * JSON 数据处理 */ @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); mappingJackson2HttpMessageConverter.setDefaultCharset(Charset.forName("UTF-8")); return mappingJackson2HttpMessageConverter; } /** * 注册消息转换器 */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(stringHttpMessageConverter()); converters.add(mappingJackson2HttpMessageConverter()); } /** * 默认 */ @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }创建如下Class配置DataSource,Transaction:
package com.youme.config; import javax.sql.DataSource; import org.apache.commons.dbcp2.BasicDataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement public class AppDataAccessConfig { private static final Logger logger = LoggerFactory.getLogger(AppDataAccessConfig.class); private static final String driverClassName = "com.mysql.jdbc.Driver"; private static final String url = "xxx"; private static final String username = "root"; private static final String password = "root"; @Bean(destroyMethod = "close") public DataSource dataSource() { logger.debug("jdbc.url is:" + url); BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setMaxTotal(50); dataSource.setMinIdle(5); dataSource.setMaxIdle(10); return dataSource; } @Bean public DataSourceTransactionManager txManager() { return new DataSourceTransactionManager(dataSource()); } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); return sessionFactory.getObject(); } }新建如下Class作为Web app的入口:
package com.youme.config; import javax.servlet.Filter; import org.springframework.context.annotation.Bean; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; /** * 系统入口 * * @author Youme.Ma * */ public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { AppDataAccessConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] { AppMvcConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } @Bean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return characterEncodingFilter; } @Override protected Filter[] getServletFilters() { return new Filter[] { characterEncodingFilter() }; } }
MVC开发
在package controller中创建Controller:package com.youme.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import com.youme.pojo.UserInfo; import com.youme.service.UserService; @Controller public class AppController { private static Logger logger = LoggerFactory.getLogger(AppController.class); @Autowired private UserService userService; @GetMapping("/") public String index() { return "login"; } @PostMapping("/login") public String login(@RequestParam String account, @RequestParam String password, HttpServletRequest request, HttpSession session) { String message = ""; UserInfo userInfo = userService.login(account, password); if (null == userInfo) { message = "用户名密码不匹配,登录失败!"; } else { session.setAttribute("user", userInfo); message = "登录成功!"; } logger.info("[" + account + "] 登录系统," + message); request.setAttribute("message", message); return "main"; } }在package service中创建Service:
package com.youme.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.youme.mapper.UserMapper; import com.youme.pojo.UserInfo; @Service public class UserService { @Autowired private UserMapper userMapper; public UserInfo login(String account, String password) { return userMapper.login(account, password); } }
在package mapper中创建Mapper:
package com.youme.mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import com.youme.pojo.UserInfo; public interface UserMapper { @Select("SELECT id,account,name FROM user_info WHERE account=#{account} AND password=#{password}") UserInfo login(@Param("account") String account, @Param("password") String password); }
测试运行
源码下载
源码下载相关文章推荐
- 个人整理摘录的SQL2005新增几种常用的T-SQL语句
- 一个项目涉及到的50个Sql语句(整理版)
- cocos2d-x action动作整理集合
- Myeclipse 快捷键整理
- 【整理】vs编译出现的异常处理方案(不停更新中)
- Android 正则表达式开发中常用方法整理
- STL函数整理
- Cache技术整理
- Android动画归纳整理
- 函数sync、fsync与fdatasync的总结整理(必看篇)
- 考研逻辑整理 - 选言判断和选言推理
- 超实用PHP函数总结整理(一)
- pads使用快捷键整理--持续更新中...
- 常见问题及解决办法 整理之8-3(日期的相关操作)
- 【整理】时间的处理--与网络时间同步
- 决策树学习笔记整理
- 【整理向】Symfony2 Jobeet Day 3: The Data Model
- 数据结构之单链表(参考并整理严蔚蓝数据结构)
- Xcode 开发者证书的一些整理