# SpringMvc
**Repository Path**: pengfeilu/springmvc
## Basic Information
- **Project Name**: SpringMvc
- **Description**: SpringMvc+MyBatis+MySQL+Maven+Redis搭建一个常规的web项目
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 1
- **Created**: 2017-07-03
- **Last Updated**: 2023-09-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[toc]
###**前言**
近来由于公司项目的需要,暂时放下了前端android的开发,慢慢投入到后台接口系统搭建,在经过与众兄弟的讨论下,决定就使用最常规的框架去搭建一个后台接口系统,这样一方面大家都比较的熟悉,另一方面对于新人和后期的维护都会相对比较容易一些,因此,针对这一系列框架最基础的搭建,在此做一个简单的总结,希望能对这一块儿还相对陌生的猿猿能有所帮助
###**软件安装及资源配置**
####**JDK安装**
- **jdk下载**
[jdk1.8下载](http://pan.baidu.com/s/1mimgmoS)之后,安装;
- **环境变量配置**
- “我的电脑”-->右键-->属性-->高级系统设置-->环境变量-->系统变量-->新建-->添加一项“JAVA_HOME”路径为jdk的安装路径,如下图:

- 然后path中添加 **%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;**,如下图:

- 测试
cmd下输入:java -version 如下图效果说明安装成功

---
####**MyEclipse10安装及破解**
- **资源下载**
[MyEclipse10及破解工具下载入口](http://pan.baidu.com/s/1jIzb4VG)
- **安装及破解**
MyEclipse的安装就是next next...finish即可;其中破解工具打开软件日志栏中写有相应的教程,请参考教程步骤;一步步破解,这是我目前发现最好用的一个破解工具。
---
####**Maven安装及配置**
(根据个人需要;可用可不用)
- **资源下载**
[maven-3.2.1版本下载](http://pan.baidu.com/s/1slHKgaD)
- **解压压缩包**
如下图:

- **配置环境变量**
- 如第一步中配置jdk一样,进入到环境变量配置页面
- 添加“MAVEN_HOME”配置解压后maven的路径
如下图:

- 将maven路径指定到path下
如下图:

- **测试**
打开cmd (如果还是之前测试jdk的cmd窗口,请关闭了重新打开)输入:mvn -v 如果出现以下效果,说明已经安装成功:

- **调整maven的配置文件**
- 找到解压路径下的conf文件,进去找到setting.xml配置文件
- 将该配置文件拷贝至“C:\Users\Administrator\.m2”路径下
配置到这里的目的是为了以后我们更新了maven的版本之后,不需要出现配置setting文件,至需要更换一下环境变量即可,如下图:

- 打开setting文件,找到“localRepository”配置自己本机maven仓库的路径(根据个人习惯配置),如果不配置这个路径,默认会在将以下路径“C:\Users\Administrator\.m2\repository“作为Maven仓库

- **Myeclipse配置Maven**
打开MyEclipse,选择**Window-->Preferences-->Maven4MyEclipse-->User Settings**,配置上一步中修改的settings.xml文件,如下图:

---
####**MySQL下载及安装**
- **资源下载**
[MySQL安装版、免安装版及Navicat破解版下载](http://pan.baidu.com/s/1miwV8e8)
- **安装**
- **MySQL安装版安装**
以上链接中下载MySQL安装版,解压,安装,然后next next ...finish即可
- **免安装版安装**
请参考之前的博客[MySQL安装及可视化工具使用](http://blog.csdn.net/lupengfei1009/article/details/52625439)
- **Navicat(MySQL)可视化工具安装及破解**
下载以上链接中Navicat工具,根据个人电脑的情况选择32位或者64位的安装;安装完之后运行"patchNavicat.exe"即可完成工具破解
---
####**Tomcat下载及安装**
- **资源下载**
[Tomcat 7.0资源下载](http://pan.baidu.com/s/1pLK5YGV);rar和exe文件为安装版tomcat,zip包为免安装版tomcat;根据需要下载相应的文件;演示选择的exe安装版。
- **Tomcat安装**
老规矩,next next.. finish即可;安装路径最好不要出现空格在里面;隐隐约约记得好像Tomcat的全路径中有空格在什么地方是会有问题;具体什么问题也记不清了;也可能是我记错了;唠叨一句,选择一个不含空格的路径安装;以防万一。
- **MyEclipse配置Tomcat**
打开MyEclipse,选择Window-->Preferences-->MyEclipse-->service-->Tomcat 7.x;按如下图配置上面步骤中安装的路径;

注:记得要勾选上“Enable”选项,否则这个配置将不会生效;
- **测试Tomcat**
- **启动服务**
按下图步骤启动服务,见日志栏中出现下图中的日志,说明服务启动成功;

- **浏览器测试**
浏览器中输入:localhost:8080;如出现如下效果,说明tomcat配置成功;

---
####**Redis下载及安装**
(根据个人需要,redis可用可不用)
可参考资料[Redis安装](http://www.runoob.com/redis/redis-install.html)
- **资源下载**
[Redis-x64-3.2.100](http://pan.baidu.com/s/1i4XtlHF)下载,并解压安装包
- **启动服务**
cmd下进入解压目录,输入:redis-server.exe redis.windows.conf;见到如下图效果,说明服务已经启动成功了。

- **redis客户端测试**
新起一个cmd窗口(注意上面的服务cmd窗口不要关闭了);输入:redis-cli.exe -h 127.0.0.1 -p 6379 链接到本地redis的服务;通过set、get指令测试存取值正常;如下图:

###项目搭建
####项目创建
- 创建maven项目
- 项目搭建
右键-->New-->Web Project;输入项目名,**选择j2ee 6.0,勾选上Add Maven support**,点击finish,如下图

- 创建成功之后为如下结构:

- 项目结构调整
- 创建基础的资源配置、测试代码、测试资源配置文件夹
右键-->build Path-->New Source Folder

或者右键-->New-->Source Folder

然后分别创建**“src/main/resources”、"src/test/java"、"src/test/resources"** 如下图:

- 整理代码及资源配置文件结构

按以上结构分别创建文件夹即可
####数据库基础数据准备
- 创建一个简单的用户表,用户测试即可,如下图:

创建脚本如下
```
Date: 2017-07-02 19:20:45
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for userinfo
-- ----------------------------
DROP TABLE IF EXISTS `userinfo`;
CREATE TABLE `userinfo` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) NOT NULL,
`AGE` int(5) DEFAULT NULL,
`SEX` int(1) DEFAULT NULL,
`ADD` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of userinfo
-- ----------------------------
INSERT INTO `userinfo` VALUES ('1', '张三', '10', '0', '北京');
INSERT INTO `userinfo` VALUES ('2', '李四', '20', '1', '上海');
INSERT INTO `userinfo` VALUES ('3', '赵五', '23', '1', '广州');
INSERT INTO `userinfo` VALUES ('4', '钱六', '50', '0', '台湾');
```
####**插件配置**
- **Maven的pom.xml配置**
```
UTF-8
3.2.8.RELEASE
1.6.6
1.2.12
4.10
3.2.1
org.springframework
spring-core
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-web
${spring.version}
junit
junit
${junit.version}
test
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.springframework
spring-test
${spring.version}
test
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.0
mysql
mysql-connector-java
5.1.29
javax
javaee-api
6.0
provided
javax
javaee-web-api
6.0
provided
com.fasterxml.jackson.core
jackson-databind
2.7.4
com.fasterxml.jackson.core
jackson-core
2.7.4
com.fasterxml.jackson.core
jackson-annotations
2.7.4
com.alibaba
fastjson
1.2.32
org.springframework.data
spring-data-redis
1.3.0.RELEASE
redis.clients
jedis
2.6.2
```
添加成功保存,Maven会自动下载相应的对应版本的包到本地仓库;由于部分资源包在不同的网络环境下下载会比较慢,如果Maven下载不下来,我在百度云盘共享了一份上面各个版本对应的包,可以下载下来解压到本地的仓库即可使用;[点击下载](http://pan.baidu.com/s/1miaBt7i)
- **MyBatis配置**
- jdbc属性配置文件
在properties文件夹下创建jdbc.properties,并配置以下参数:
```
jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://127.0.0.1:3306/springmvcdb
jdbc_username=lpf
jdbc_password=123456
```
- mybatis配置
这里直接配置在application.xml;请参考后续的applocation配置
- **redis配置**
- redis参数配置文件
在redis文件夹下创建redis.properties,添加如下参数:
```
redis.pool.maxTotal=105
redis.pool.maxIdle=10
redis.pool.maxWaitMillis=5000
redis.pool.testOnBorrow=true
redis.host=127.0.0.1
redis.port=6379
redis.password=
redis.db.index=0
```
- redis基础配置
在redis下创建redis-config.xml文件,并添加一下配置文件:
```
```
- redis dao层相关配置
- 接口定义
在Dao文件加下创建一个用于获取redis下数据的接口(以获取一个文本型的数据为例)
```
package com.lpf.springmvc.dao;
import org.springframework.stereotype.Repository;
@Repository
public interface RedisDao
{
String get(String key);
}
```
- 创建Jedis帮助对象
一个公共的帮助类,代码太长,放到网盘了,下载下来即可:[JedisUtil](http://pan.baidu.com/s/1dF1nRYL)
- 创建dao的具体实现
在dao文件下创建RedisDaoImpl,实现RedisDao接口,代码如下:
```
package com.lpf.springmvc.dao;
import javax.annotation.Resource;
import com.lpf.springmvc.utils.JedisUtil;
import redis.clients.jedis.JedisPool;
public class RedisDaoImpl implements RedisDao
{
@Resource
JedisPool jedisPool;
public String get(String key)
{
// TODO Auto-generated method stub
JedisUtil jedisUtil = new JedisUtil(jedisPool);
JedisUtil.Strings strings = jedisUtil.new Strings();
System.out.println("cache: " + strings.get(key));
return strings.get(key);
}
}
```
配置完成之后,为如下效果:

- **SpringMvc相关配置**
- springmvc基础配置
在springmvc文件夹下创建spring-mvc.xml,并配置以下代码
```
NON_NULL
```
- **application.xml配置**
在配置文件根目录下创建一个application.xml配置文件,并添加如下的配置代码:
```
classpath:properties/jdbc.properties
classpath:redis/redis.properties
${jdbc_driverClassName}
${jdbc_url}
${jdbc_username}
${jdbc_password}
```
- **项目web.xml配置**
打开src-->main-->webapp-->WEB-INF-->web.xml,配置如下代码:
```
index.jsp
contextConfigLocation
classpath:application.xml
webAppRootKey
springmvc.root
SpringEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
SpringEncodingFilter
/*
log4jConfigLocation
classpath:log4j.properties
log4jRefreshInterval
6000
org.springframework.web.util.Log4jConfigListener
org.springframework.web.context.ContextLoaderListener
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc/spring-mvc.xml
1
dispatcherServlet
/
404
/WEB-INF/errorpage/404.jsp
405
/WEB-INF/errorpage/405.jsp
500
/WEB-INF/errorpage/500.jsp
```
- 配置简单测试
- 将项目发布到tomcat


- 页面测试
打开浏览器,输入http://localhost:8080/SpringMvc;出现以下效果,说明基本的配置未编译出错

####**代码编写**
主要用于梳理从前端-->controller-->service-->dao 处理完数据再回去的这么一个过程
- dao层相关代码编写
- 用户 信息dao层接口定义
定义2个方法,分别用于获取所有用户信息和根据id获取指定用户信息,代码如下
```
package com.lpf.springmvc.dao;
import java.util.List;
import com.lpf.springmvc.model.UserInfo;
/**
* 操作用户消息的dao
* @author lupf
*
*/
public interface UserInfoDao {
/**
* 获取所有的用户
* @return
*/
public List getUserInfos();
/**
* 根據用戶id获取用户消息
* @param id
* @return
*/
public UserInfo getUserInfoByID(int id);
}
```
- MyBatis mapper配置文件
添加用户信息相关的mapper配置文件,在mapper文件夹下创建user-info-mapper.xml,并添加以下代码:
```
```
- 用户service配置
- 定义service接口
用于获取用户信息的service,根本用来根据id获取和获取所以,service基本和到差不对匹配,但是不是绝对匹配
```
package com.lpf.springmvc.service;
import java.util.List;
import com.lpf.springmvc.model.UserInfo;
/**
* 操作用户消息的service
*
* @author lupf
*
*/
public interface UserInfoService {
/**
* 获取所有的用户
*
* @return
*/
public List getUserInfos();
/**
* 根據用戶id获取用户消息
*
* @param id
* @return
*/
public UserInfo getUserInfoByID(int id);
/**
* 根据redis的key获取redis的一个文本型value
* @param key
* @return
*/
public String getValueByRedisKey(String key);
}
```
- 用户信息service的具体实现
```
package com.lpf.springmvc.service;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.lpf.springmvc.dao.RedisDao;
import com.lpf.springmvc.dao.UserInfoDao;
import com.lpf.springmvc.model.UserInfo;
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Resource
UserInfoDao userInfoDao;
@Resource
RedisDao redisDao;
@Override
public List getUserInfos() {
// TODO Auto-generated method stub
return userInfoDao.getUserInfos();
}
@Override
public UserInfo getUserInfoByID(int id) {
// TODO Auto-generated method stub
return userInfoDao.getUserInfoByID(id);
}
@Override
public String getValueByRedisKey(String key) {
// TODO Auto-generated method stub
return redisDao.get(key);
}
}
```
记住,需要在类上添加@Service的注解,service才会被自动注入进来;在service中引入dao,即可操作数据;
- 用户信息controller
- view层代码编写
在WEB-INF下的view文件夹(该文件的路径在spring-mvc.xml中配置了)下添加一个用于获取了一个用户之后,绑定用户信息的user.jsp页面,代码如下:
```
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Hello World!
编号:${user.id}
姓名:${user.name}
年龄:${user.age}
性别:${user.sex==0?"女":"男"}
地址:${user.add}
```
- controller代码编写
主要用户和前段交互的入口,代码如下:
```
package com.lpf.springmvc.controller;
import java.util.List;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import com.lpf.springmvc.model.UserInfo;
import com.lpf.springmvc.service.UserInfoService;
@Controller
public class UserInfoController {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Resource
UserInfoService userInfoService;
@RequestMapping("/userInfo")
public ModelAndView getUserInfoByID(int id) {
// 指定view层的页面,参数user即为对应的jsp的名称
ModelAndView mav = new ModelAndView("user");
if (id <= 0)
id = 1;
// 获取数据
UserInfo userInfo = userInfoService.getUserInfoByID(id);
// 将获取到的对象添加到ModelAndView对象中
mav.addObject("user", userInfo);
return mav;
}
@RequestMapping("/getUserInfos")
@ResponseBody
public List getUserInfos() {
List users = userInfoService.getUserInfos();
logger.info(""+JSON.toJSONString(users));
return users;
}
}
```
RequestMapping指明了前端请求该方法的路径。如getUserInfoByID方法配置了userInfo这个注解,那么前段请求时候的路径即为:http://localhost:8080/SpringMvc/userInfo
- getUserInfoByID方法解析
该方法主要用于前段jsp界面的请求;实例化的ModelAndView指明了绑定的view界面,上面方法中添加了 ;获取到数据添加到ModelAndView中即可自动绑定到相应的位置。
前端测试地址为:http://localhost:8080/SpringMvc/userInfo?id=1;界面显示效果如下:


- getUserInfos方法解析
该接口主要用于给前端提供api接口时使用,添加了@ResponseBody即可,因为RequestMapping注解为getUserInfos;前端请求即以getUserInfos作为该方法的请求路径。
前端测试地址为:http://localhost:8080/SpringMvc/getUserInfos;前端显示效果如下:

####**单元测试**
针对上面service的具体实现,我们通过Junit进行一下单元测试;在没有前端的情况下即可完成接口的调试。
- 代码编写
在src/test/java目录下编写但愿测试代码
- 创建测试代码的基类,代码如下:
```
package com.lpf.springmvc.test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//指定bean注入的配置文件
@ContextConfiguration(locations = { "classpath:application.xml" })
// 使用标准的JUnit @RunWith注释来告诉JUnit使用Spring TestRunner
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class SpringTestCase extends AbstractJUnit4SpringContextTests {
protected Logger logger = LoggerFactory.getLogger(getClass());
}
```
- 编写service测试代码
```
package com.lpf.springmvc.test;
import java.util.List;
import javax.annotation.Resource;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
import com.lpf.springmvc.model.UserInfo;
import com.lpf.springmvc.service.UserInfoService;
public class UserInfoTest extends SpringTestCase {
@Resource
UserInfoService usersInfoService;
@Test
public void selectUserByIdTest() {
UserInfo user = usersInfoService.getUserInfoByID(1);
logger.debug("查找结果" + user);
}
@Test
public void selectUserInfosTest() {
List users = usersInfoService.getUserInfos();
logger.debug("查找结果" + JSON.toJSONString(users));
}
@Test
public void getValueByRedisKey(){
String va =usersInfoService.getValueByRedisKey("name");
logger.debug("key为name的redis数据:"+va);
}
}
```
写好上面的测试代码,选择方法名,右键-->Run as -->JUnit test运行,如下图:

运行出现下图效果,说明接口已经正常了:

另外两个接口的测试效果分别如下:



###总结
到这里,一个基于SpringMvc+MyBatis+MySQL+Maven+Redis搭建一个常规的web项目就已经完成了,虽然没有写什么很牛的技术点;但是涵盖的每个技术所需要用到的东西;后续会对MyBatis和redis进行更详细的,便于更好的在项目中运用,提高项目的性能。