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的后缀,而非/的后缀,因为自定义的拦载器会拦截静态资源,即使写了
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
【spring-servlet.xml】
text/html;charset=UTF-8
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;
}
}
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);
}
}
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());
}
}
http://download.csdn.net/detail/wltj920/8031971
本文为原创文章,如需转载请注明出处,谢谢!