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类的存取与更新。
最后则是线程类。
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("……");