上一次复习搭建了SpringMVC+Mybatis,这次搭建一下SpringMVC,采用的是SpringJDBC,没有采用任何其他的ORM框架,SpringMVC提供了一整套的WEB框架,所以如果想搭建纯的SpringMVC的话,而且不必映入别的任何框架,SpringMVC都给我们提供了,下面试Spring + SpringMVC的详细搭建过程。
项目包含:数据库mysql(其实那个数据库都无所谓),连接池采用的是c3p0。
数据表很简单,user_info
Maven项目搭建一笔带过(前面有介绍),其搭建后的webapp结构项目如下:
导入所需的spring,以及数据源,spring-mvc,json等依赖。
pom.xml
4.0.0
org.andy.springmvc
springmvc_demo
war
0.0.1-SNAPSHOT
springmvc_demo Maven Webapp
http://maven.apache.org
UTF-8
4.1.4.RELEASE
2.5.0
junit
junit
4.12
test
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-test
${spring.version}
test
log4j
log4j
1.2.17
mysql
mysql-connector-java
5.1.34
com.mchange
c3p0
0.9.5-pre10
com.alibaba
fastjson
1.2.3
com.fasterxml.jackson.core
jackson-annotations
${jackson.version}
com.fasterxml.jackson.core
jackson-core
${jackson.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
javax.servlet
servlet-api
3.0-alpha-1
provided
javax.servlet
jstl
1.2
commons-io
commons-io
2.4
commons-fileupload
commons-fileupload
1.2.2
springmvc_demo
org.apache.maven.plugins
maven-surefire-plugin
2.4.2
true
org.apache.maven.plugins
maven-war-plugin
2.3
src/main/webapp/WEB-INF/web.xml
org.apache.maven.plugins
maven-javadoc-plugin
2.9.1
target/javadoc
target/javadoc
UTF-8
UTF-8
UTF-8
private
org.codehaus.cargo
cargo-maven2-plugin
1.0
tomcat6x
D:\WebServer\apache-tomcat-6.0.39
existing
D:\WebServer\apache-tomcat-6.0.39
src/main/resources/applicationConfig.xml
#application all config
#jdbc c3p0
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8
jdbc.username = root
jdbc.password = 12345
src/main/resources/applicationContext.xml
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_SUPPORTS,readOnly
PROPAGATION_SUPPORTS,readOnly
PROPAGATION_REQUIRED
*Service
transactionInterceptor
上面配置的详细功能已写出。
src/main/resources/log4j.properties
### set log levels ###
log4j.rootLogger = INFO , C , D , E
### console ###
log4j.appender.C = org.apache.log4j.ConsoleAppender
log4j.appender.C.Target = System.out
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = [springmvc_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
### log file ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ../logs/springmvc-mybatis-demo.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = [springmvc_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
### exception ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = ../logs/springmvc-mybatis-demo_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = [springmvc_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
创建如下包:
org.andy.shop.entity中添加
package org.andy.shop.entity;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import org.springframework.jdbc.core.RowMapper;
/**
* 实现数据表与字段的映射
*
* @author andy
*
*/
public class UserInfo implements RowMapper, Serializable {
/**
*
*/
private static final long serialVersionUID = -8823504831198719837L;
private Integer id;
private String uname;
private Integer unumber;
private Date uRegisterTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname == null ? null : uname.trim();
}
public Integer getUnumber() {
return unumber;
}
public void setUnumber(Integer unumber) {
this.unumber = unumber;
}
public Date getuRegisterTime() {
return uRegisterTime;
}
public void setuRegisterTime(Date uRegisterTime) {
this.uRegisterTime = uRegisterTime;
}
@Override
public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
UserInfo userInfo = new UserInfo();
userInfo.setId(rs.getInt("id"));
userInfo.setUname(rs.getString("uname"));
userInfo.setUnumber(rs.getInt("unumber"));
userInfo.setuRegisterTime(rs.getDate("uregister_time"));
return userInfo;
}
}
org.andy.shop.dao添加通用Dao接口
GenericDao.java:
package org.andy.shop.dao;
import java.io.Serializable;
import java.util.List;
/**
* 创建时间:2015-1-30 上午10:11:59
*
* @author andy
* @version 2.2
*
* Dao通用接口
*/
interface GenericDao {
T getById(PK id);
List findAll();
PK save(T entity);
}
package org.andy.shop.dao;
import org.andy.shop.entity.UserInfo;
/**
* 创建时间:2015-1-30 上午11:22:37
*
* @author andy
* @version 2.2
*
* UserInfoDao
*/
public interface UserInfoDao extends GenericDao {
}
UserInfoDaoImpl.java
package org.andy.shop.dao.Impl;
import java.util.List;
import org.andy.shop.dao.UserInfoDao;
import org.andy.shop.entity.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;
/**
* 创建时间:2015-1-30 上午11:25:30
*
* @author andy
* @version 2.2
*
* UserInfoDao实现类
*/
@Repository("userInfoDao")
public class UserInfoDaoImpl implements UserInfoDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Override
public UserInfo getById(Integer id) {
String sql = "SELECT * FROM user_info WHERE id = ?";
UserInfo userInfo = jdbcTemplate.queryForObject(sql, new UserInfo(),
new Object[] { id });
return userInfo;
}
@Override
public List findAll() {
String sql = "SELECT * FROM user_info";
List userInfos = jdbcTemplate.query(sql, new UserInfo());
return userInfos;
}
@Override
public Integer save(UserInfo entity) {
String sql = "INSERT INTO user_info(uname, unumber, uregister_time) VALUES(:uname, :unumber, :uregister_time)";
MapSqlParameterSource paramSource = new MapSqlParameterSource();
paramSource.addValue("uname", entity.getUname());
paramSource.addValue("unumber", entity.getUnumber());
paramSource.addValue("uregister_time", entity.getuRegisterTime());
int result = namedParameterJdbcTemplate.update(sql, paramSource);
return result;
}
}
org.andy.shop.dao.service添加UserInfoService接口
UserInfoService.java
package org.andy.shop.service;
import java.util.List;
import org.andy.shop.entity.UserInfo;
/**
* 创建时间:2015-1-30 上午11:31:34
*
* @author andy
* @version 2.2
*
* UserInfoService 接口
*/
public interface UserInfoService {
// 通过Id查询UserInfo
UserInfo getById(Integer id);
// 查询全部的UserInfo
List findAll();
// 添加UserInfo
Integer save(UserInfo userInfo);
}
package org.andy.shop.service.Impl;
import java.util.List;
import org.andy.shop.dao.UserInfoDao;
import org.andy.shop.entity.UserInfo;
import org.andy.shop.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 创建时间:2015-1-30 上午11:40:19
*
* @author andy
* @version 2.2 实现接口
*/
@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoDao userInfoDao;
@Override
public UserInfo getById(Integer id) {
return userInfoDao.getById(id);
}
@Override
public List findAll() {
return userInfoDao.findAll();
}
@Override
public Integer save(UserInfo userInfo) {
return userInfoDao.save(userInfo);
}
}
单元测试Service中的方法,如果全部成功,Spring和数据连接池搭建完成。
package org.andy.shop.test.service;
import java.util.Date;
import java.util.List;
import org.andy.shop.entity.UserInfo;
import org.andy.shop.service.UserInfoService;
import org.apache.log4j.Logger;
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 com.alibaba.fastjson.JSON;
/**
* 创建时间:2015-1-30 下午12:01:47
*
* @author andy
* @version 2.2
*/
// 引入Spring环境测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class TestUserInfoService {
private static final Logger LOGGER = Logger
.getLogger(TestUserInfoService.class);
@Autowired
private UserInfoService userInfoService;
@Test
public void testGetById() {
//测试查询对应的用户
UserInfo userInfo = userInfoService.getById(1);
LOGGER.info(JSON.toJSONStringWithDateFormat(userInfo,
"yyyy-MM-dd HH:mm:ss"));
}
@Test
public void testFindAll() {
//测试查询全部用户
List userInfos = userInfoService.findAll();
for (UserInfo userInfo : userInfos) {
LOGGER.info(JSON.toJSONStringWithDateFormat(userInfo,
"yyyy-MM-dd HH:mm:ss"));
}
}
@Test
public void testSave() {
//测试保存用户数据
UserInfo userInfo = new UserInfo();
userInfo.setUname("xiaohonghong");
userInfo.setUnumber(5);
userInfo.setuRegisterTime(new Date());
int result = userInfoService.save(userInfo);
LOGGER.info("result = " + result);
}
}
src/main/resources/springMVC.xml
text/html;charset=UTF-8
application/json;charset=UTF-8
UTF-8
32505856
4096
添加UserInfoController控制层
package org.andy.shop.controller;
import java.util.List;
import org.andy.shop.entity.UserInfo;
import org.andy.shop.service.UserInfoService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 创建时间:2015-2-1 下午9:40:03
*
* @author andy
* @version 2.2
*
* userInfo的控制层
*/
@Controller
@RequestMapping("/user")
public class UserInfoController {
private static final Logger LOGGER = Logger
.getLogger(UserInfoController.class);
@Autowired
private UserInfoService userInfoService;
@RequestMapping("/showInfo/{userId}")
public String showUserInfo(ModelMap modelMap, @PathVariable int userId) {
LOGGER.info("查看用户:" + userId);
UserInfo userInfo = userInfoService.getById(1);
modelMap.addAttribute("userInfo", userInfo);
return "/user/showInfo";
}
@RequestMapping("/showInfos")
public @ResponseBody List showUserInfos() {
LOGGER.info("json返回全部用户的信息");
List userInfos = userInfoService.findAll();
return userInfos;
}
}
在webapp/WEB-INF/views/user中创建showInfo.jsp文件。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
userInfo
姓名: ${userInfo.uname}
ajax显示全部用户信息:
springmvc_demo
contextConfigLocation
classpath*:/applicationContext.xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceEncoding
true
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
spring mvc servlet
rest
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:/springMVC.xml
1
rest
*.htmls
30
/index.jsp
maven编译打包部署到tomcat,测试:http://localhost:8080/springmvc_demo/user/showInfo/1.htmls分别测试添加的两个请求地址。
至此,SpringMVC搭建完毕。
博客来源:http://blog.csdn.net/fengshizty
项目源码: http://download.csdn.net/detail/fengshizty/8416837