Spring4、SpringMVC4、Jackson2、Hibernate4、Quartz2、Plupload2、Proxool0.9集成

Spring4.1.1_SpringMVC4_Hibernate4.3.6_Proxool0.9.1_Quartz2.2.1_Jackson2.5.0_Plupload2.1.2集成

----------------------------------------------------------------------------------------------------------

2015-01-15更新:

项目中使用SpringMVC,需要做用户不登录就被系统拦截请求的功能,走了不少弯路,现在分享一下:

【拦截请求】

1、如果使用自定义拦截器拦截请求,建议使用.do的后缀,而非/的后缀,因为自定义的拦载器会拦截静态资源,即使写了标签也没有用。。。不知道是不是Spring设计上的错误。。。

2、如果非要使用/的后缀来拦截,可以在web.xml中配置default的资源servlet,具体写法网上很多,但是要注意一点,每个应用服务器的写法不一样,比如tomcat与weblogic就不同。

3、还是那句话,改成.do的后缀吧,这样有两个优点:避免了自定义拦截器拦截静态资源、不用再写标签了。。。哎,打破了我之前写的那些例子,抱歉。

【拦截JSP直接访问】

1、SpringMVC无法直接对JSP进行拦截,除非使用/后缀配置自定义拦截器,但又会造成如上的问题。

2、建议在web.xml文件中使用Filter的方式来对JSP进行拦截,但要注意Filter必须在Spring加载前执行。这里推荐geloin写的博文:http://blog.csdn.net/geloin/article/details/7445441

----------------------------------------------------------------------------------------------------------

2015-01-07更新:

SpringMVC中的StringHttpMessageConverter默认编码是ISO-8859-1,如果在使用@ResponseBody来传递JSON数据时,如果JSON数据是一个String对象,则会出现乱码。。。


针对此问题,网上一大堆解决方法,什么重写方法都没用,最后,给大家带来亲测成功的方法:


   
   
   
           
           

   

   

-----------------------------------------------------------------------------------------------------------


最近正在做一个项目,一个从头做起的项目,项目框架由我自己定。由于以前一直使用Struts2、Spring3、Hibernate3的MVC框架,现在想改改味口,去探索一下未知领域,增强自己的本事,决定学习SpringMVC。


但既然是全新的学习之旅,肯定要用最新的框架资源吧,于是下载了Spring4.1.1和Hibernate4.3.6。。学习了几天,发现新框架网上的资源实在是少得可怜,因此我自己写一篇博客,与广大程序猿交流交流,以下内容有更好的实现方式的话,欢迎大家灌水哦~


不用不知道,一用吓一跳。。。Struts2原来是个非常复杂的玩意,比起SpringMVC,个人感觉易用性上甩了Struts2几条街了,再加上Webwork公司对Struts更新缓慢,估计以后我再也不会去用Struts了。。。SpringMVC与Spring的集成度直接让开发过程变得十分流畅,先粘上相关的XML配置文件:

【web.xml】



	
		index.jsp
	
	
	
	
		spring
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			classpath:spring-servlet.xml
		
		1
	
	
	
		spring
		/
	
	
	
	
		org.springframework.web.context.ContextLoaderListener
	
	
	
	
		contextConfigLocation
		
		classpath:beans.xml
	
	
	
	
		springEncodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
		
			forceEncoding
			true
		
	
	
	
		springEncodingFilter
		/*
	
	
	
	
		openSessionInView
		org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
		
			sessionFactoryBeanName
			sessionFactory
		
		 
            singleSession 
            true            
         
         
	        flushMode 
	   		AUTO         
        
	
	
	
		openSessionInView
		/*
	
	
	



【beans.xml】



           
    
    
    
    
    
    
    	
    
    
    
	
	    
	        classpath:jdbc.properties
	    
	
	
	
	
		mysql
		${driverClassName}
		${url}
		${username}
		${password}
		
		
		20
		
		
		3
		
		
		3
		
		
		true
		
		
		true
		
		
		90000
		
		
		SELECT CURRENT_DATE
		
		
		true
		true
	
    
    
	
		
		
		
		
		
		
			
				com.qianye.terny.springmvc.model
			
		
		
		
		
			
				${hibernateDialect}
				${hibernateShowSQL}
				
				
				
				true
				
				
                auto
			
		
	
    
    
    
    	
    
    
    
 	
		
		
	 
	
   	
   	
   	   	
    
    	
    	
				
     
    
   	
   	
   		
   		
   		
   		
   		
   		
   		
   		
   		
   	
   	
   	
   	
   		
   			
   				
   			
   		
   		
   		
        
        	
        		   
                schedulerContextAsMap 
        		
        	
        
   	
   	
   	
   	   
           
    
    
    	
    		
    		
    		
    	
    
    
    
    
    	
    	
        
	          
    
    
    
    
    
    
   		
   		
   			
   			
【spring-servlet.xml】



    
    
    
    
     
    
    
    
    
    
    
    
    
    
    
    
    	
    	
    
	
	
	 
	 
	    
       		
          		  text/html;charset=UTF-8
       	 	
    	
	
	
	
	
		
		
		
	
    
    


【jdbc.properties】

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/study?characterEncoding=utf8
username=root
password=admin
hibernateDialect=org.hibernate.dialect.MySQL5Dialect
hibernateShowSQL=true
这些配置文件解释我就不说了,全部在注释中,花了我很本心血,查询了很多资料才搞定的,先来说说Hibernate吧。

Hibernate问题汇总

1、本次我不再使用HibernateTemplate来进行数据处理,原因很简单。。。太不原生态了,虽然简化了Hibernate的开发,但是如果想使用NativeSQL或者复杂的HQL查询方式的话,要重写的接口很多,而且MyEclipse还对部分代码搞一堆黄色的下标线,太难看了,推荐使用SessionFactory来获取CurrentSession。

2、使用Proxool来管理连接池,原因就在于如果才时间没有数据请求,MySQL数据库会释放所有链接,就像进行了休眠一样。。。用Proxool可以轻松保持连接。。。当然,使用Quartz也是可以的。Proxool还有很多强大的配置,这些在Hibernate中设置比较麻烦,所以果断Proxool吧。

3、与Hibernate3不同,Hibernate4中主推Annotation注解配置Model层,并且可以设置MySQL5的HQL方言。来看看一个Model层中的Entity吧:

【User.java】

package com.qianye.terny.springmvc.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="t_user")
public class User {
	
	@Id
	@GeneratedValue
	private int id;
	
	@Column
	private String name;
	
	@Column
	private int age;
	
	@Column
	private int display = 1;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getDisplay() {
		return display;
	}
	public void setDisplay(int display) {
		this.display = display;
	}
}

4、可能有些朋友会说,注解应该要加到get方法上,这是以前某老师说的。。但是现在的情况不同,集成SpringMVC后,SpringMVC中的POJO传值方式会使用到Entity中的set/get方法,如果上面有注解,SpringMVC就不认了 。。。这个问题困扰了我好久才解决。。。

Spring问题汇总

1、听说Spring4比起Spring3多了一个REST风格的支持,但是对我来说,风格已经固定,而且从Struts跳到SpringMVC,我已经是风格大变了。。。所以,这个REST以后再研究吧。

2、Spring4对Hibernate4的兼容大大提高,增加了Hibernate4专用的HibernateTemplate,但还是由于原生态问题,不推荐使用。。另外,Hibernate3的HibernateTemplate.find()方法是不需要进行范形转换的,在Spring4中就行不通了,大家要注意。

3、加几张DAO与Service的代码吧:

【UserDAOImpl.java】

package com.qianye.terny.springmvc.dao.impl;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.qianye.terny.springmvc.dao.UserDAO;
import com.qianye.terny.springmvc.model.User;

@Component
public class UserDAOImpl implements UserDAO {
	
	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public void addUser(User u) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().save(u);
		sessionFactory.getCurrentSession().flush();
	}

	@Override
	public User getUserById(int id) {
		// TODO Auto-generated method stub
		return (User) sessionFactory.getCurrentSession().get(User.class, id);
	}

}

【UserServiceImpl.java】

package com.qianye.terny.springmvc.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.qianye.terny.springmvc.dao.UserDAO;
import com.qianye.terny.springmvc.model.User;
import com.qianye.terny.springmvc.service.UserService;

@Component
public class UserServiceImpl implements UserService {
	
	@Autowired
	private UserDAO userDAO;

	@Override
	public void addUser(User u) {
		// TODO Auto-generated method stub
		userDAO.addUser(u);
	}

	@Override
	public User getUserById(int id) {
		// TODO Auto-generated method stub
		return userDAO.getUserById(id);
	}

}
SpringMVC问题汇总

1、我配置的SpringMVC不是那种*.do的,是直接用/来区分每一个URI的,因此对于静态文件(例如JS、CSS文件)它并不会去区分是否为一个RequestMapping,于是就出现了静态文件无法访问的情况。所以配置一下静态资源的访问即可。。详细配置请参考上面的代码,都是有注释的,不必我过多解释了。

2、在通过form表单传数据时存在乱码问题。。GET方法导致的乱码我知道可以在tomcat里面设置,但是在SpringMVC中居然出现了通过POST方法导致的乱码。。。查了很多资料,需要在web.xml中配置一个Filter来过滤强制转码。。。具体代码在上面也有提到。

3、JSON+AJAX的异步传输非常常用,尤其是在使用了Ext等前端框架的项目中更是必不可少。但是,查阅了不少资料,SpringMVC中从前端传送JSON到后端还算容易,但是从后端传到前端就非常麻烦了,不仅要自己拼接JSON自符串,还要对response对象写数据。就算使用了JSONObject来处理,也还是要对Response写对象。。。后来用到了Jackson2.5.0,这玩意才叫爽嘛,直接对方法写个注解@ResponseBody,让SpringMVC认为此方法返回的对象就是JSON,这才叫方便嘛。。。具体Bean配置请参考上面的代码,若需要完整项目源码,请参考页面下方的链接。

粘一张对比代码,大家看看哪个爽

【使用Jackson与不使用的区别】

//此处为使用AJAX+JSON+POJO的方式来处理数据
	@RequestMapping("/ajaxLoadUser")
	public void ajaxLoadUser(User u, HttpServletRequest req, HttpServletResponse res){
		System.out.println(u.getName());
		String json = "{\"name\":\""+u.getName()+"\",\"age\":\""+u.getAge()+"\"}";
		PrintWriter out = null;
		res.setContentType("application/json");
		try {
			out = res.getWriter();
			out.write(json);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//此处为使用AJAX+JSON+POJO+JACKSON的方式来处理数据
	@RequestMapping(value="/ajaxAddUser")
	@ResponseBody
	public Object ajaxAddUser(User u){
		userService.addUser(u);
		Map hm = new HashMap();
		hm.put("user", u);
		hm.put("flag", "OK");
		return hm;
	}
Plupload问题汇总

1、Plupload是前端AJAX上传文件的框架,为什么写在这里,是我觉得这个异步上传框架比其它的框架都强大,而且是非常强大,易用性极强。。。不过这么好的东西在网上的资源非常稀少,并且版本过老,大多是2.0以前的版本。在这里,给大家送上福利,查阅了官方API,我写了一个例子,完整代码请下载我的附件,谢谢!

2、Plupload提供了多种运行环境runtime,建议优先使用sliverlight,因为这个环境可以使文件选择过滤器真正的生效,比如我定义的图片文件:jpg/bmp/gif/png与压缩文件:zip/rar,其它的运行环境我都测试过了,没有sliverlight强大。。。。不过第二优先级建议flash和html5吧,因为这两个太常见了。。

3、推荐使用Plupload2,因为网上文档资源稀少,而官方文档大多是在说Plupload2。。。与时俱进,总不会错的。

【upload.jsp】

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
    
    
    My JSP 'index.jsp' starting page
	
	
	    
	
	
	
	
	
	
  
  
  
  	

普通非AJAX上传文件

选择文件:

AJAX上传文件之Plupload2.1.2 上传实例

你的浏览器不支持上传文件



  


Quartz问题汇总

1、Quartz作为任务调度框架,可以使用项目周期性自动处理各种事务。例如项目每天早上2:00要对数据进行汇总处理。而从Spring3.0以后对Quartz2的支持度会更好。在此我们使用最新的Quartz2.2.1。

2、使用Quartz时,由于加载机制不同,Quartz是不会有WEB request的,导致Quartz中的Service无法让Spring自动装配,在这个问题上我研究了好久,网上一大堆Quartz1的例子在Quart2上都不好使了。最后查阅API,才发现应该使用SchedulerContextAsMap来将Spring管理的Bean放入这个Map中,具体的写法请看上面的配置代码。最后在Job类中去继承QuartzJobBean,从上下文中才能获取Spring管理的Bean。大家一定要注意key是service接口,value-ref是service的实现类。

3、还是由于加载机制不同,Quartz中的Service获取不到Hibernate的currentSession,如果使用openSession,没有问题。。。但是需要手动关闭Session就很让我烦心了,于是使用了Spring中的AOP和事务管理去拦截Service中的方法,让Spring帮Quartz完成对数据库的访问。。。在这点不知道这么做会不会有什么影响,总之现在程序是能跑通的,先这么着吧。。

【Jobs.java】


package com.qianye.terny.springmvc.job;


import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerContext;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.qianye.terny.springmvc.model.User;
import com.qianye.terny.springmvc.service.UserService;

public class Jobs extends QuartzJobBean{
	
	private UserService userService;
	

	//执行调度,由于Spring与Quartz的执行顺序,无法使用自动装配功能,需要自己去调度上下文中找Bean,否则无法与Hibernate交互
	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		// TODO Auto-generated method stub
		try {
			//获取调度上下文
			SchedulerContext sc = context.getScheduler().getContext();
			
			//在上下文中找到Spring已实例化好的Bean
			userService = (UserService) sc.get("userService");
			//doQuartz();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//周期调度方法
	public void doQuartz() throws Exception{
		User u = userService.getUserById(1);
		System.out.println(u.getName());
	}
}

以上的所有程序我都是调试OK了的,也弥补一下网上相关集成文档资源稀缺,以及版本低的问题,欢迎网友批评指正,另外,附下我的整个工程源代码及集成的jar包:


http://download.csdn.net/detail/wltj920/8031971



本文为原创文章,如需转载请注明出处,谢谢!

你可能感兴趣的:(Spring4、SpringMVC4、Jackson2、Hibernate4、Quartz2、Plupload2、Proxool0.9集成)