1、Eclipse新建Dynamic Web Project项目:
(1) 将下载好的spring mybatis 及其整合包拷贝到WebContent----------WEB-INF---------lib目录下面,如下图所示:
jar下载地址:http://download.csdn.net/download/fengchengwu2012/10262888
(2)在上图的src文件上创建配置文件
创建spring的配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 扫描cn.fcw包下的所有class文件,配置注解的类全都装入容器中进行管理 -->
<context:component-scan base-package="cn.fcw" />
<context:annotation-config />
<!-- 添加注解驱动 导入处理器适配器 和映射器 -->
<mvc:annotation-driven conversion-service="conversionService"
validator="validator" />
<!--静态资源解析 -->
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/img/" mapping="/img/**" />
<!-- 配置自定义参数绑定 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 配置转换器 -->
<property name="converters">
<list> <!-- 字符串转换为日期类型转换器(该位置可以配置多个转换器) -->
<bean class="cn.fcw.controller.converter.CustomDateConverter" />
<bean class="cn.fcw.controller.converter.SpringMVCFileConverter"/>
</list>
</property>
</bean>
<!--配置校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<property name="validationMessageSource" ref="messageSource" />
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:CustomValidationMessages" />
<property name="fileEncodings" value="utf-8"></property>
<property name="cacheSeconds" value="120"></property>
</bean>
<!-- 拦截器 多个拦截器 -->
<mvc:interceptors>
<bean class="cn.fcw.interceptor.GoodsInterceptor"></bean>
</mvc:interceptors>
<!--springmvc视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
<!-- 配置数据源 dbcp连接池 配置参数来自db.properties文件 -->
<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="20" />
<property name="maxIdle" value="5" />
</bean>
<!--sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- mapper扫描器 相当于dao 通过mapper代理接口生成mapper的接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描多个包的时候 用,中间使用逗号隔开 -->
<property name="basePackage" value="cn.fcw.mapper"></property>
<!--将sqlSessionFactory注入到mapper代理生成的实现类中,在service层调用mapper代理接口即可,用自动装配直接就生成其实现类的对象 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<!-- <property name="sqlSessionFactory" ref="sqlsfb"></property> -->
</bean>
<!--配置事务 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.fcw.service.*.*(..))" />
</aop:config>
</beans>
创建mybatis的核心配置文件SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置别名 typeAliases和environments是平等级别的标签 type是实体类的完整类名 alias是类的别名 -->
<typeAliases>
<!-- <package name="cn.fcw.pojo"/> -->
<typeAlias type="cn.fcw.pojo.GoodsCustom" alias="goodsCustom"/>
</typeAliases>
<!-- 全部交给spring管理 <properties resource="db.properties">
</properties>
<typeAliases>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments> -->
<!--
<mappers>
<mapper resource="cn/fcw/mapper/GoodsMapper.xml"/>
</mappers> -->
</configuration>
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>SpringMvcDemo</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 注册监听 项目一启动就加载配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>SpringMvcDemo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvcDemo</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern><!-- 对所有文件过滤 -->
</filter-mapping>
</web-app>
创建键值对存储文件db.propeties,其中数据库的名称和密码换成需要连接的数据库
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/ssh_db
jdbc.username=root
jdbc.password=999999
创建log4j的配置文件log4j.properties
### \u8BBE\u7F6E###
log4j.rootLogger = info,stdout
### \u8F93\u51FA\u4FE1\u606F\u5230\u63A7\u5236\u62AC ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
#log4j.appender.my = MyAppender
#log4j.appender.my.account = cosco
log4j.appender.info = org.apache.log4j.FileAppender
log4j.appender.info.File = e:/logs/log.log
log4j.appender.info.Append = true
log4j.appender.info.Threshold = ERROR
log4j.appender.info.layout = org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### \u8F93\u51FADEBUG \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = e:/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### \u8F93\u51FAERROR \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =e\:/logs/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 =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
创建pojo实体类,并在mapper文件下写实体类所对应的mybatis映射文件
实体类:
package cn.fcw.pojo;
import java.io.Serializable;
import javax.validation.constraints.Size;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.springframework.lang.NonNull;
import com.sun.istack.internal.NotNull;
public class GoodsBean implements Serializable {
private int gid;
private String goods_img;
@Size(min=2,max=4,message="{goods.goods_name.length}")
private String goods_name;
private String goods_desc;
private double goods_price;
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGoods_img() {
return goods_img;
}
public void setGoods_img(String goods_img) {
this.goods_img = goods_img;
}
public String getGoods_name() {
return goods_name;
}
public void setGoods_name(String goods_name) {
this.goods_name = goods_name;
}
public String getGoods_desc() {
return goods_desc;
}
public void setGoods_desc(String goods_desc) {
this.goods_desc = goods_desc;
}
public double getGoods_price() {
return goods_price;
}
public void setGoods_price(double goods_price) {
this.goods_price = goods_price;
}
@Override
public String toString() {
return "GoodsBean [gid=" + gid + ", goods_img=" + goods_img + ", goods_name=" + goods_name + ", goods_desc="
+ goods_desc + ", goods_price=" + goods_price + "]";
}
}
GoodMpper.java
public interface GoodsMapper {
public List<GoodsBean> findAllGoods() throws Exception;
public List<GoodsBean> findGoodsByOrderNo(String no) throws Exception;
public GoodsBean findGoodsById(int goods_id) throws Exception;
public void updateGoodsByPojo(GoodsCustom goodsCustom) throws Exception;
}
GoodsMapper.xml 映射文件中的sql便签的id必须和GoodsMpper.java里面的方法名一致
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.fcw.mapper.GoodsMapper">
<!--select t_goods_order.g_id,t_goods.* from t_goods_order inner join t_goods on t_goods_order.g_id=t_goods.gid and t_goods.order_no= 1509764797136; -->
<select id="findAllGoods" resultType="cn.fcw.pojo.GoodsBean">
select * from t_goods
</select>
<select id="findGoodsByOrderNo" parameterType="java.lang.String" resultType="cn.fcw.pojo.GoodsBean">
select t_goods_order.g_id,t_goods.* from t_goods_order inner join t_goods on t_goods_order.g_id=t_goods.gid and t_goods_order.order_no= #{value}
</select>
<select id="findGoodsById" parameterType="java.lang.Integer" resultType="cn.fcw.pojo.GoodsBean">
select * from t_goods where gid= #{value}
</select>
<update id="updateGoodsByPojo" parameterType="goodsCustom">
update t_goods gd set gd.goods_name=#{goods_name},gd.goods_img=#{goods_img},gd.goods_price=#{goods_price},gd.goods_desc=#{goods_desc} where gd.gid=#{gid}
</update>
</mapper>
(3)创建service和controller
service层:
GoodsListService.java
public interface GoodsListService {
public List<GoodsBean> findAllGoods() throws Exception;
public List<GoodsBean> findGoodsByOrderNo(String vo) throws Exception;
public GoodsCustom findGoodsById(Integer goods_id) throws Exception;
public void updateGoodsById(int goods_id,GoodsCustom goodsCustom) throws Exception;
}
GoodsListServiceImpl.java
@Service("goodsListService")
@Transactional
public class GoodsListServiceImpl implements GoodsListService{
@Autowired
@Qualifier("goodsMapper")
private GoodsMapper goodsMapper;
@Override
public List<GoodsBean> findGoodsByOrderNo(String vo) throws Exception {
return goodsMapper.findGoodsByOrderNo(vo);
}
@Override
public GoodsCustom findGoodsById(Integer goods_id) throws Exception {
GoodsBean goodsBean = goodsMapper.findGoodsById(goods_id);
GoodsCustom goodsCustom=new GoodsCustom();
BeanUtils.copyProperties(goodsBean, goodsCustom);
return goodsCustom;
}
@Override
public void updateGoodsById(int goods_id, GoodsCustom goodsCustom) throws Exception {
goodsCustom.setGid(goods_id);
goodsMapper.updateGoodsByPojo(goodsCustom);
}
@Override
public List<GoodsBean> findAllGoods() throws Exception {
return goodsMapper.findAllGoods();
}
}
controller层:
@Controller
@RequestMapping("/goods")
public class GetGoodsController {
@Autowired
private GoodsListService goodsListService;
@RequestMapping(value="/getAllGoods",method={RequestMethod.GET})
public String findAllGoods(Model model) {
List<GoodsBean> goods=null;
try {
goods=goodsListService.findAllGoods();
model.addAttribute("list",goods);
} catch (Exception e) {
e.printStackTrace();
}
return "allGoodsList";
}
@RequestMapping(value="/getAllGoodsList",method={RequestMethod.GET})
@ResponseBody
public String findAllGoodsList() {
List<GoodsBean> goods=null;
Map<String, Object> map=new HashMap<String, Object>();
ObjectMapper mapper = new ObjectMapper();
String res=null;
try {
goods=goodsListService.findAllGoods();
map.put("code",200 );
map.put("data", goods);
map.put("msg", "success");
JsonData jsonData=new JsonData();
jsonData.setCode(200);
jsonData.setData(goods);
jsonData.setMsg("success");
res= mapper.writeValueAsString(jsonData);
System.out.println("*******************android客户端是否请求了服务器***************"+res);
} catch (Exception e) {
System.out.println(e.toString()+"****************************服务器抛出的异常");
e.printStackTrace();
}
return res;
}
@RequestMapping("/getGoodsList")
public ModelAndView getList() {
List<GoodsBean> goods=null;
try {
goods = goodsListService.findGoodsByOrderNo("1509765066423");
} catch (Exception e) {
e.printStackTrace();
}
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("list", goods);
modelAndView.setViewName("goodsList");
return modelAndView;
}
@RequestMapping(value="/jumpDetail")
public String jumpGoodDetail() {
return "redirect:getGoodsDetail.action";
}
/**
* 通过method 限定请求方式 method
* @param (Model model,@RequestParam (value="id",required=true) Integer goods_id)
* @return
*/
@RequestMapping(value="/getGoodsDetail",method={RequestMethod.POST,RequestMethod.GET})
public String getGoodsDetail(Model model,@RequestParam (value="id",required=true) Integer id) {
GoodsBean goods = null;
try {
goods = goodsListService.findGoodsById(id);
} catch (Exception e) {
e.printStackTrace();
}
model.addAttribute("goods", goods);
return "editGoods"; //跳转到editGoods.jsp
}
/**
*
* @ModelAttribute()设置回显
*
* @Validated 有效性校验
* @param model
* @param gid
* @param goodsCustom
* @param bindingResult
* ,@RequestParam 针对基本数据类型
* @return
*/
@RequestMapping(value="/editGoodsInfo",method={RequestMethod.POST})
public String editGoodsInfo(Model model,@RequestParam("gid") Integer gid,@ModelAttribute("goods") @Validated GoodsCustom goodsCustom,
BindingResult bindingResult,MultipartFile uploadFile) {
if(bindingResult.hasErrors()){
List<ObjectError> allErrors = bindingResult.getAllErrors();
for(ObjectError er:allErrors){
System.out.println(er.getDefaultMessage()+"**********");
}
model.addAttribute("allErrors", allErrors);
return "editGoods";
}else{
//上传图片
if(uploadFile!=null){
String pic_path="E:/Eclipse/tomcat/temp/upload/";
String originalFilename =uploadFile.getOriginalFilename();
String newFilePath=System.currentTimeMillis()+originalFilename.substring(originalFilename.lastIndexOf("."));
File file=new File(pic_path+newFilePath);
try {
uploadFile.transferTo(file);
goodsCustom.setGoods_img(newFilePath);
} catch (Exception e) {
e.printStackTrace();
}
}
try {
goodsListService.updateGoodsById(gid, goodsCustom);
} catch (Exception e) {
e.printStackTrace();
}
return "redirect:getAllGoods.action";
}
}
@RequestMapping(value="/uploadFiles",method={RequestMethod.POST})
public String uploadFile(Model model,HttpSession session,MultipartFile[] files)
{
// String realPath = session.getServletContext().getRealPath("/pic");
System.out.println("************************"+session.getServletContext().getRealPath("/pic")+"********************************");
String realPath="E:/Eclipse/tomcat/temp/upload/";
if(files!=null){
for(int i=0;i<files.length;i++)
{
if(files[i]!=null)
{
String originalFilename = files[i].getOriginalFilename();
String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFileName=System.currentTimeMillis()+ fileType;
File file=new File(realPath,newFileName);
try {
files[i].transferTo(file);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
}
}
model.addAttribute("success", "文件上传成功");
return "success";
}else{
model.addAttribute("error", "选择要上传的文件");
return "error";
}
}
@RequestMapping(value="/downloadFile")
public ResponseEntity<byte[]> download(HttpServletRequest request) throws IOException {
File file = new File("C:/Users/Administrator/Desktop/activity_shop_info.xml");
byte[] body = null;
InputStream is = new FileInputStream(file);
body = new byte[is.available()];
is.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attchement;filename=" + file.getName());
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
return entity;
}
}
jsp文件goodslist.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>
<script type="text/javascript" src="../js/jquery-3.2.1.js"></script>
<script type="text/javascript" src="../js/jquery.easyui.min.js"></script>
<style type="text/css">
table{
border-right: 1px solid gray;
border-bottom: 1px solid gray;
}
td{
border-left:1px solid gray;
border-top:1px solid gray;
text-align: center;
color: red;
}
img{
width: 100px;
height: 50px;
}
.update{
color: blue;
text-align: center;
}
</style>
<script type="text/javascript">
$(function() {
});
</script>
<title>商品列表</title>
</head>
<body>
<div>
<table class="b">
<tr>
<td>名称</td>
<td>价格</td>
<td>图片</td>
<td>描述</td>
<td></td>
</tr>
<c:forEach items="${list}" var="item">
<tr>
<td>${item.goods_name}</td>
<td>${item.goods_price}</td>
<td><img src="/pic/${item.goods_img}" alt="#"></td>
<td>${item.goods_desc}</td>
<td class="update"><a href="${pageContext.request.contextPath}/goods/getGoodsDetail.action?id=${item.gid}">修改</a></td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
(4)配置web程序入口web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>SpringMvcDemo</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 注册监听 项目一启动就加载配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>SpringMvcDemo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvcDemo</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern><!-- 对所有文件过滤 -->
</filter-mapping>
</web-app>
(5)SpringMvcDemo工程下载地址
http://download.csdn.net/download/fengchengwu2012/10263030