ssm(springMVC+spring+mybatis)框架--网络电影投票系统

       这次刚刚好基于自己的一个小项目使用Maven重新搭建了一次。以前解决问题的过程和方法并没有及时记录,以后在自己的小项目中遇到我再整理分享一下。这次先说说三大框架整合过程。个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助。

1、基本概念


1.1、Spring

        Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。


1.2、SpringMVC

        Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。作用类似于struct2,接受请求。


1.3、MyBatis

       MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis MyBatis是一个基于Java持久层框架。iBATIS提供的持久层框架包括SQL MapsData Access ObjectsDAOMyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java POJOsPlain Old Java Objects,普通的 Java对象)映射成数据库中的记录。


2、开发环境

JDK1.7 + Tomcat7 + Maven3.3.9

3、项目框架提供8个接口,全部返回JSON数据


ssm(springMVC+spring+mybatis)框架--网络电影投票系统_第1张图片

4、SSM整合


4.1、Maven引入需要的JAR包

pom.xml

    
      junit
      junit
      3.8.1
      test
    
    
  		org.springframework
  		spring-webmvc
  		3.2.8.RELEASE
  	
  	
  		org.mybatis
  		mybatis
  		3.3.0
  	
  	
  		commons-dbcp
  		commons-dbcp
  		1.4
  	
  	
  		mysql
  		mysql-connector-java
  		5.1.37
  	
  	
  	
  		org.mybatis
  		mybatis-spring
  		1.2.3
  	
  	
  		com.fasterxml.jackson.core
  		jackson-annotations
  		2.2.3
  	
  	
  		com.fasterxml.jackson.core
  		jackson-core
  		2.2.3
  	
  	
  		com.fasterxml.jackson.core
  		jackson-databind
  		2.2.3
  	
  	
  		org.springframework
  		spring-jdbc
  		3.2.8.RELEASE
  	
  	
  		commons-codec
  		commons-codec
  		1.10
  	
  	
  		aspectj
  		aspectjweaver
  		1.5.4
  	
  	
        javax.servlet
        javax.servlet-api
        3.0.1
        provided
 	
  

4.2、配置文件

首先web.xml
   
        characterEncodingFilter  
        org.springframework.web.filter.CharacterEncodingFilter  
          
            encoding  
            UTF-8  
          
          
            forceEncoding  
            true  
          
      
      
        characterEncodingFilter  
        /*  
     
  
	
	  	springmvc
	  	
			org.springframework.web.servlet.DispatcherServlet
		
	  	
	    	contextConfigLocation
	    	classpath:conf/spring-*.xml
	  	
	  	1
	
	
	  	springmvc
	  	*.do
	


 
     
 
     
 
    

s pring-mvc: 扫描bean和设置请求路径

	

   spring-mybatis:加载数据库信息和连接池并创建myBatis session

		
		
		
		
		   
		
		
		
	
	
	
	
		
		
		
		
	

	
		
		
	
    spring-transaction:事务处理

	 

		

5、代码分析

5.1、controller、service、dao层

     ssm(springMVC+spring+mybatis)框架--网络电影投票系统_第2张图片       ssm(springMVC+spring+mybatis)框架--网络电影投票系统_第3张图片 ssm(springMVC+spring+mybatis)框架--网络电影投票系统_第4张图片


5.2、实体类:类的具体就不粘出来了,用时大概说一下

ssm(springMVC+spring+mybatis)框架--网络电影投票系统_第5张图片


5.3、8个接口中只分析取电影接口和投票接口

5.3.1 取电影信息接口:

控制层:返回值包含状态和具体数据,状态小于0表示异常
@Controller
@RequestMapping(value="/cine")
public class CineController {
	
	@Autowired
	private CineService cineService;
	
	@RequestMapping(value="/news",method=RequestMethod.GET)
	@ResponseBody
	public ResultCine execute() {
		return cineService.find();
	}
	
}
服务层

/**
 * 查询电影业务逻辑层
 * 事务为只读
 * @author Spirit
 *
 */
@Service
@Transactional
public class CineService {
	
	@Autowired
	private CineMapper mapper;
	
	@Transactional(readOnly=true)
	public ResultCine find() {
		ResultCine rc = new ResultCine();
		List l = mapper.find();
		if(l != null) {
			List list = new ArrayList();
			for(Cines ci:l) {
				Cine c = new Cine();
				c.setCineId(ci.getCineId());
				c.setCineName(ci.getCineName());
				c.setTicket(ci.getTicket());
				c.setUrl(ci.getUrl());
				c.setPublishTime(ci.getPublishTime());
				c.setDes(ci.getDes());
				c.setType(ci.getType().split(","));
                                //因为数据库中电影类型用的是字符串,接口提供数组形式,此时转化一下
				list.add(c);
			}
			rc.setStatus(list.size());
			rc.setList(list);
		} else {
			rc.setStatus(-100);
		}
		return rc;
	}
}
dao层对应的Mapper.xml文件


5.3.2  投票接口:


控制层:返回电影ID和状态,状态小于0表示投票失败
@Controller
@RequestMapping(value="/user")
public class PollController {
	
	@Autowired
	private PollService pollService;
	
	@RequestMapping(value="/poll",method=RequestMethod.POST)
	@ResponseBody
	public Result execute(Log log) {
		return pollService.poll(log);
	}
}

服务层:
/**
 * 投票业务逻辑层
 * 事务串行化
 * @author Spirit
 *
 */
@Service
@Transactional(isolation=Isolation.SERIALIZABLE)
public class PollService {
	
	@Autowired
	private PollMapper mapper;
	
	@Transactional
	public Result poll(Log log) {
		Result result = new Result();
		//检查传入的值是否为空
		if(log.getUserIP() != null && log.getToken() != null 
				&& !"".equals(log.getUserIP()) && !"".equals(log.getToken())) {
			if(log.getToken().equals(VoteUtil.MD5(log.getUserIP()))) {   //用户IP和一个特有数据连接MD5加密后比较
				//开始投票
				if(mapper.findInfo(log.getUserIP()) == null) {
					mapper.insertInfo(log);
					mapper.updateInfo(log.getCineId());
					result.setTime(mapper.findDate(log.getCineId()));
					result.setState(mapper.findTicket(log.getCineId()));
					result.setCineId(log.getCineId());
				}else{
					result.setState(-1);
					result.setCineId(log.getCineId());
				}
			}else {
				result.setState(-2);
				result.setCineId(log.getCineId());
			}
		}else {
			result.setState(-2);
			result.setCineId(log.getCineId());
		}
		return result;
	}
}

dao层对于的Mapper.xml

	

	insert into log(userIP,token,cineId,voteTime,province) values(#{userIP},#{token},#{cineId},now(),#{province})

	

	update cine set ticket=ticket+1 where cineId=#{id}

	

	


剩下的6个接口是:一个小时内投票数量接口、一个小时内投票信息接口、删除电影信息接口、获取月或日电影投票数接口、插入电影信息接口

源码下载地址:http://download.csdn.net/detail/forever_cvank/9734896










你可能感兴趣的:(JAVA)