如何在struts2的action返回结果之后再来进行费时的数据库操作呢?
2015-07-16 21:18
627 查看
action里边有些操作执行要花很长时间,这样就会影响服务器与前台的交互速度,所以问题就来了,能不能在action返回一个json结果之后再来进行这些耗时的操作呢?
最初的时候,我是这样想的:
struts2的运行流程是:
客户端发送请求,然后服务器中的某个action的方法被调用,然后返回一个数据给客户端,然后服务器端结束。
因为action一般写成如下,所以我便特别困惑,给出result之后要么是跳到一个jsp页面,要么直接就是跳到一个json数据,还怎么进行操作啊!!头疼呀。
<action name="test" class="action.testAction">
<result name = "success">welcome.jsp</result>
</action>
<action name="testCircles" class="action.UploadAction">
<result type = "json">
<param name="contentType">
text/html
</param>
<param name="root">
map
</param>
</action>
然后百度之,无果~~~~这个时候我就想到了酷壳网的弹窗作环保的程序员,从不用百度开始!
用谷歌挺好的诶,在开源中国社区找到了个思路,接下来会提到。
还能怎么办呢?
都说SSH,我只是在用Struts,好像还没用过Spring诶,于是我开始查看Spring的资料,
嘿,里边还真有个好像似乎有用的idea------后置通知。
按照它的思路,我可以将我的action的execute设置为目标对象,在execute处理完之后,
便可以自动地进行后置通知类中的操作啦,我只需要把数据库操作放在后置通知类里边不就好了嘛!
So,问题来啦,action的类对象和后置通知类的对象创建都是由Spring自动完成的,我不需要操作,那action得到的数据如何传给后置通知类呢?
这个时候我想到可以用一个类专门来存数据,里边的变量都是静态类型,哈哈,这样不就解决了嘛!
说到这里,就必须加个可是了
。正所谓好事多磨啊!
我把action的execute方法和后置通知的after方法连起来了,运行的时候execute运行结束,after方法也成功接力,但是呢,我action的返回结果,怎么变成null了啊!!
我明明设置返回json,明明加了map.put(key,value),可现在什么都没有了!!!
此路不通呀!!!
谷歌为我提供了开源中国的一个链接如下
http://www.oschina.net/question/119742_77918
里边提到线程池,
好高端的样子,是什么东西啊?这个时候多线程出现在了我的脑子里,对哦,可以用多线程嘛,只需要再execute里边启动一个线程专门做数据库操作不就好啦!
哈哈哈哈,问题成功解决,多线程果然厉害!!
整个流程用到的文件如下:
首先是数据库存取的类Circles,之后是它与数据库的映射文件以及数据库的配置文件。
接着是数据库操作类,实现Circles类的存取与更新。
最后则是线程类。
数据库存取事务类CircleDAOImpl.java
最初的时候,我是这样想的:
struts2的运行流程是:
客户端发送请求,然后服务器中的某个action的方法被调用,然后返回一个数据给客户端,然后服务器端结束。
因为action一般写成如下,所以我便特别困惑,给出result之后要么是跳到一个jsp页面,要么直接就是跳到一个json数据,还怎么进行操作啊!!头疼呀。
<action name="test" class="action.testAction">
<result name = "success">welcome.jsp</result>
</action>
<action name="testCircles" class="action.UploadAction">
<result type = "json">
<param name="contentType">
text/html
</param>
<param name="root">
map
</param>
</action>
然后百度之,无果~~~~这个时候我就想到了酷壳网的弹窗作环保的程序员,从不用百度开始!
用谷歌挺好的诶,在开源中国社区找到了个思路,接下来会提到。
还能怎么办呢?
都说SSH,我只是在用Struts,好像还没用过Spring诶,于是我开始查看Spring的资料,
嘿,里边还真有个好像似乎有用的idea------后置通知。
按照它的思路,我可以将我的action的execute设置为目标对象,在execute处理完之后,
便可以自动地进行后置通知类中的操作啦,我只需要把数据库操作放在后置通知类里边不就好了嘛!
So,问题来啦,action的类对象和后置通知类的对象创建都是由Spring自动完成的,我不需要操作,那action得到的数据如何传给后置通知类呢?
这个时候我想到可以用一个类专门来存数据,里边的变量都是静态类型,哈哈,这样不就解决了嘛!
说到这里,就必须加个可是了
。正所谓好事多磨啊!
我把action的execute方法和后置通知的after方法连起来了,运行的时候execute运行结束,after方法也成功接力,但是呢,我action的返回结果,怎么变成null了啊!!
我明明设置返回json,明明加了map.put(key,value),可现在什么都没有了!!!
此路不通呀!!!
谷歌为我提供了开源中国的一个链接如下
http://www.oschina.net/question/119742_77918
里边提到线程池,
好高端的样子,是什么东西啊?这个时候多线程出现在了我的脑子里,对哦,可以用多线程嘛,只需要再execute里边启动一个线程专门做数据库操作不就好啦!
哈哈哈哈,问题成功解决,多线程果然厉害!!
整个流程用到的文件如下:
首先是数据库存取的类Circles,之后是它与数据库的映射文件以及数据库的配置文件。
接着是数据库操作类,实现Circles类的存取与更新。
最后则是线程类。
Circles.java存取的数据库对象
<span style="font-size:14px;">package com.test.bean; import java.util.List; import java.util.ArrayList; public class Circles { private String imageName; private List<String> circles = new ArrayList<String>(); public String toString(){ StringBuffer strBuf = new StringBuffer(); strBuf.append(" imageUrl= " + imageName + "]\n"); for (int i = 0; i < circles.size(); i++){ strBuf.append("The "+ i +" th circle is : " + circles.get(i) + "\n"); } return strBuf.toString(); } public List<String> getCircles() { return circles; } public void setCircles(List<String> circles) { this.circles = circles; } public String getImageName() { return imageName; } public void setImageName(String imageName) { this.imageName = imageName; } }</span>
对象关系映射Circles.hbm.xml
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.yjj"> <class name = "com.test.bean.Circles" table = "circleOfimage"> <id name = "imageName" column = "imageName" type = "string"> <generator class = "assigned"></generator> </id> <list name = "circles" table = "myCircles"> <key> <column name = "imageName"></column> </key> <list-index> <column name="list_order"></column> </list-index> <element type = "java.lang.String"> <column name="circle_info"></column> </element> </list> </class> </hibernate-mapping>
数据库配置文件hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost:3306/mysql</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">false</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping resource = "com/test/bean/Circles.hbm.xml"/> </session-factory> </hibernate-configuration>
数据库存取事务类CircleDAOImpl.java
package com.test.dao.impl; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.test.bean.Circles; import com.test.dao.CirclesDAO; public class CirclesDAOImpl implements CirclesDAO { public void save(Circles circles) { Configuration cfg = new Configuration(); SessionFactory sessionFactory = cfg.configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction ts = session.beginTransaction(); session.save(circles); ts.commit(); session.close(); } @SuppressWarnings("unchecked") public Circles findAllCircles(String imageName) { // TODO Auto-generated method stub Configuration cfg = new Configuration(); SessionFactory sessionFactory = cfg.configure().buildSessionFactory(); Session session = sessionFactory.openSession(); System.out.println("from Circles where imageName=" + "'" + imageName + "'"); List list = session.createQuery("from Circles where imageName=" + "'" + imageName + "'").list(); Circles circlesOfImage = null; if (list.size() > 0){ circlesOfImage = (Circles)list.get(0); System.out.println(circlesOfImage.toString()); } System.out.println("over"+list.size()); session.close(); return circlesOfImage; } public void update(Circles circles) { Configuration cfg = new Configuration(); SessionFactory sessionFactory = cfg.configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction ts = session.beginTransaction(); Circles updatedCircles = (Circles)session.get(Circles.class, circles.getImageName()); updatedCircles.setCircles(circles.getCircles()); session.update(updatedCircles); ts.commit(); session.close(); } }
线程类
package com.test.action; import com.test.bean.Circles; import com.test.dao.impl.CirclesDAOImpl; public class SaveCirclesThread implements Runnable { private CirclesDAOImpl circleDAO; private Circles circle; public SaveCirclesThread(Circles circle){ circleDAO = new CirclesDAOImpl(); this.circle = circle; } public Circles getCircle() { return circle; } public void setCircle(Circles circle) { this.circle = circle; } public void run() { long currentTime1 = System.currentTimeMillis(); System.out.println("start saving……"); circleDAO.save(circle); Data.setData(circle.getImageName(), circle.getCircles()); long currentTime2 = System.currentTimeMillis(); System.out.println("end saving……cost time " + (currentTime2 - currentTime1) + "ms"); } }最后在action中创建线程并启动就好啦
System.out.println("开始线程:存入数据库……"); Thread t = new Thread(new SaveCirclesThread(circle)); t.start(); System.out.println("……");
相关文章推荐
- spring security (-) helloWorld
- Java中判断字符串是否为数字的五种方法
- spring系列文章(一)AOP源码分析
- java时间格式化问题
- eclipse项目里面的类有时候会莫名其妙出现很多错误
- #笔记#圣思园 JavaWeb 第42讲——Listener监听器,观察者模式
- java的重载
- day02--Java中数组工具类:Arrays
- JAVA 对象引用,以及对象赋值
- Java反射机制
- Spring基础---Spring源码解析以及入门
- Netbeans配合xdebug调试
- Java IO中的设计模式--装饰器和适配器模式
- LeetCode201 Bitwise AND of Numbers Range Java 题解
- 使用Java IO 流进行文件的复制,复制成功,却打不开复制的文件
- 算法学习之一java实现冒泡排序
- java的构造器和void方法的区别
- 彻底理解JAVA动态代理
- JAVA经典实例
- java小练习