List 序列化与反序列化到struts2的<s:hidden>变量
实现方法:
1、在Action类添加如下get/set方法,可以不需要属性:
2、把在要序列化的字段添加到form中
hidden标签用来向act
jsp页面要序列化的字段要与Action的get/set方法名称对应。
serversPayExpendList查询出的充值消费新增变量,是要序列化的原变量,页面通过getSerServersPayExpendList()方法序列化serversPayExpendList变量的值,序列后以字符串的形式存储到页面的serServersPayExpendList中,当导出报表时,页面的serServersPayExpendList变量通过setSerServersPayExpendList()方法反序列化后再次存储到serServersPayExpendList变量中,这样查询后的信息可以再次利用,不用再从数据库查询,可以提高查询和导出报表的运行速度。
用另一个变量存储序列化值的原因,strut2不支持同一个页面存在两个相同名称的变量,序列化成字段串也便于传输。
序列化和反序列化的方法如下:
附录:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* 序列化工具类
* @author file
* @version 1.0
* @since 2013-04-11
*/
@SuppressWarnings("restriction")
public final class SerializableUtil {
/**
* base64 加密
*/
private static final BASE64Encoder BASE64_ENCODER = new BASE64Encoder();
/**
* base64 解密
*/
private static final BASE64Decoder BASE64_DECODER = new BASE64Decoder();
/**
* 序列化
* @param obj 对象
* @return 字符串
*/
public static <T> String serialize(T obj) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//序列化
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
return BASE64_ENCODER.encodeBuffer(baos.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(oos!=null)
oos.close();
if(baos!=null)
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 反序列化
* @param str 字符串
* @param clazz 返回的对象类
* @return 对象
*/
public static <T> T unSerialize(String str,Class<T> clazz) {
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
byte[] bytes = BASE64_DECODER.decodeBuffer(str);
bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais);
@SuppressWarnings("unchecked")
T object = (T) ois.readObject();
return object;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try {
if(ois!=null)
ois.close();
if(bais!=null)
bais.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}