SSM作为现在最流行的开发框架,很大的提升了开发效率。一些同学在SSM基础上的整合一些更实用的开发基础框架,被用来作为快速开发的基础框架。本次实践主要是以下3个目标:
整合之前,需要对IDEA环境下,maven工程的各种目录有个初步了解,要不然过程中出现各种异常不知如何去找和应对很是头痛,特奉上干货,maven执行命令后对应target目录情况,此外:log.properties 读取时,系统是在项目根目录,不是classpath目录,这点不注意无法处理错误日志,具体见后续贴的配置文件。
整篇内容包含如下部分:
点next 后,输入GroupId,ArtifactId
一路next
点 finish后
由于默认生成的,不带java 和resources 目录,因此先在main上右键创建这两个目录,
然后使用在目录上右键菜单中选择
这里完成后
这两个目录色彩有所变化,如上图
当前的pom.xml如下
4.0.0
SsmBase
SsmBase
1.0-SNAPSHOT
war
SsmBase Maven Webapp
http://www.example.com
UTF-8
1.7
1.7
4.1.0.RELEASE
3.2.8
1.7.7
1.2.17
junit
junit
4.11
test
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.4
javax
javaee-api
7.0
mysql
mysql-connector-java
5.1.6
org.apache.commons
commons-dbcp2
2.1.1
jstl
jstl
1.2
log4j
log4j
${log4j.version}
com.alibaba
fastjson
1.1.41
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.codehaus.jackson
jackson-mapper-asl
1.9.13
com.fasterxml.jackson.core
jackson-core
2.7.0
com.fasterxml.jackson.core
jackson-databind
2.7.0
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
commons-codec
commons-codec
1.9
javax.servlet
javax.servlet-api
3.1.0
SsmBase
src/main/java
**/*.xml
src/main/resources
**/*.xml
**/*.properties
maven-clean-plugin
3.0.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.7.0
maven-surefire-plugin
2.20.1
maven-war-plugin
3.2.0
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
在下一步整合之前,贴一下整合后的目录结构
在resources目录下,建立Spring-mvc.xml,里面内容如下:由于spring版本的变化所以很多网上的例子不能拿来直接用,需要进行修改,以下是修改后的例子
text/html;charset=UTF-8
里面含有了spring的配置内容(没有独立的spring.xml 或者application.xml)
Archetype Created Web Application
contextConfigLocation
classpath*:spring-mybatis.xml
log4jConfigLocation
WEB-INF/classes/log.properties
SsmBase
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring-mvc.xml
1
true
SsmBase
/
EncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
true
encoding
UTF-8
EncodingFilter
/*
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
org.springframework.web.util.Log4jConfigListener
120
/index.jsp
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/devdb?characterEncoding=utf-8
username=dev
password=dev123
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
#日志根目录
log4j.rootLogger=debug,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File=org.apache.log4j.RollingFileAppender
#指定输出目录, 这里指定变量后,不随启动位置变化
log4j.appender.File.File=${catalina.home}/log/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
这些文件建好后,在src/main/java目录下建立如下的java 包
controller ---放置controller
mapper ----放置model对象操作dao类和映射xml
model -----放置模型
service ---- 放接口对象
另外在src 目录下,建立几个辅助目录
db --- 用来存放库表的创建语句
generator ---用来存在mybatis的从库表生成对象工具
好了,这些建好后,进入下一个步骤
这里我们在src/db目录下放置我们要创建的数据库表sql,本例中具体如下:
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(40) NOT NULL,
`password` varchar(255) NOT NULL,
`role` int(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `t_user` VALUES ('1', '测试', '123456', '21');
INSERT INTO `t_user` VALUES ('2', 'admin', '1qaz1qaz', '1');
通过MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件。这样可以省去很多的功夫,将生成的代码copy到项目工程中即可。 在src 下建立目录generator(这步在上面已经做过的可以略过), 这里放入mybatis generator 需要包和配置文件,见下图,可以去网上自行下载。修改xml文件中关于数据库中实体的内容
在本例中的xml 按如下配置:
配置文件中注意一下: targetProject,targetPackage的配置与工程中的目录位置进行对应。
完成后,可以在命令行执行创建命令。IDEA提供了终端窗口,打开窗口后,进入到mybatis-genertor对应的目录,然后手工输入如下指令:
java -jar mybatis-generator-core-1.3.6.jar -configfile generatorConfig.xml –overwrite
如果xml文件配置正确的话,在src/main/java目录下对应的包中就会生成相应的文件
代码都是自动生成的,没有改动
这里有mybatis的xml映射文件,可以就放这里,但是在pom.xml需要注意build节点下的resources如何配置
接口类UserServiceInf如下:
package com.study.service;
import com.study.model.User;
public interface UserServiceInf {
public User getUserById(int userId);
}
接口实现类UserServiceImpl如下:
package com.study.service;
import javax.annotation.Resource;
import com.study.mapper.UserMapper;
import com.study.model.User;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserServiceInf {
@Resource
private UserMapper userDao;
public User getUserById(int userId) {
// TODO Auto-generated method stub
return this.userDao.selectByPrimaryKey(userId);
}
}
package com.study.controller;
import com.study.model.User;
import com.study.service.UserServiceInf;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Map;
@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController2 {
private static Logger log=LoggerFactory.getLogger(UserController2.class);
@Resource
private UserServiceInf userService;
// /user/{id}
@RequestMapping(value="/{id}",method=RequestMethod.GET)
public @ResponseBody User getUserInJson(@PathVariable String id,Map model){
int userId = Integer.parseInt(id);
System.out.println("userId:"+userId);
User user = this.userService.getUserById(userId);
log.info(user.toString());
return user;
}
// /user/{id}
@RequestMapping(value="/jsontype/{id}",method=RequestMethod.GET)
@ResponseBody
public ResponseEntity getUserInJson2(@PathVariable String id,Map model){
int userId = Integer.parseInt(id);
System.out.println("userId:"+userId);
User user = this.userService.getUserById(userId);
log.info(user.toString());
return new ResponseEntity(user,HttpStatus.OK);
}
//文件上传、
@RequestMapping(value="/upload")
public String showUploadPage(){
return "user_admin/file";
}
@RequestMapping(value="/doUpload",method=RequestMethod.POST)
public String doUploadFile(@RequestParam("file")MultipartFile file) throws IOException{
if (!file.isEmpty()) {
log.info("Process file:{}",file.getOriginalFilename());
}
FileUtils.copyInputStreamToFile(file.getInputStream(), new File("E:\\",System.currentTimeMillis()+file.getOriginalFilename()));
return "succes";
}
}
在webapp/WEB-INF/下建立jsp目录,在这个目录下可以存放jsp代码
在WEB-INF下index.jsp是本应用的欢迎页面,目前只是打印一个简单的hello world
Hello World!
在调试之前,首先检查配置情况,包括如下方面:
检查Settings中关于maven的jdk设置
检查project 或者 module中jdk设置和artifacts设置
在run菜单下,检查
在这里面主要是检查tomcat的jdk和部署内容,还有url根设置
通过maven project面板运行maven命令:
第4步完成后,target项目目录下情况如图:
红框内的内容会发布到tomcat
上述操作都正常的情况下,运行tomcat进行调测,在IDEA环境里面右上角,如图:
Tomcat启动后浏览器打开显示如下内容,说明tomcat启动成功,项目首页index.jsp调用成功
检查日志,因为配置了log4j,里面配置的日志目录,所以在日志目录下可以看到日志
我们经常面临的是开发、测试、部署环境下配置文件有不同,因此maven提供了profile来管理这些配置文件
以jdbc.properties 为例,数据库在测试、开发、在线系统上配置是不同的,因此建立不同的文件夹和jdbc.properties
三个文件在本例子中以用户名和密码来区别,不同的环境对应不同的账号和密码
在build节点前,增加profiles的设置
dev
dev
true
test
test
online
online
默认是dev,且activeByDefault 设置为true。
配置完pom.xml后在IDEA环境的maven project 面板多出来一块内容
我们可以测试一下,先将dev 打勾,执行maven resources命令
执行完成后,在classes目录下,jdbc 确实是dev环境。Maven resources是将src目录下的资源拷贝到 target/classes目录下,war命令是将这个目录下的内容生成到项目部署目录。
现在我们在面板上profile中online 打勾,再次执行 maven resources命令
最后执行打包就可以根据不同的配置文件进行打包。