1. 程式人生 > >前端使用JSTL表示式對資料反序列化

前端使用JSTL表示式對資料反序列化

什麼是序列化和反序列化?

序列化就是把多個物件相關的資料按一定方式組織起來,便於傳輸或儲存,以備後來的資料恢復。
將一個物件序列化之後,得到一個數據序列,將此資料序列通過任何方式傳遞到另一程序,就可以使用反序列化操作重新構建這個物件的拷貝。
任何程序間過程呼叫,都需要將物件資料進行序列化,然後到另一程序空間進行反序列化,所以這是跨程序過程呼叫的重要操作。

為什麼要用序列化與反序列化?

把物件狀態儲存到流中,達到持久化(或遠端呼叫)的作用。
比如你有一個類有100個屬性欄位,如果在其他地方使用這個被例項化的類就必須讀取100次它的屬性以獲取物件的狀態資訊,才能利用這些資訊構建新類。
有了序列化你將類資訊儲存到一個流比如xml中,但要構造新類時候直接反序列化,將所有屬性直接付給新例項。這比你手工寫程式碼讀取屬性方便,還實現了持久化。

而且,假如我們的專案經過審查後,要將一些資料放到外部網站上,總不能再去網站上重新添一次資料吧?

因而,需要我們將這些資料序列化後,通過webService傳過去。

前端使用反序列化的緣由

當一個專案經過層層編碼,最終前、後臺完美對接後,並通過了客戶的審查時:

◑在後臺,我們就需要通過序列化的方式使資料達到持久化;

◑在前端,我們就需要讀取後臺已經序列化的物件,並進行物件內容的反序列化攝取。

前端使用JSTL表示式方式的反序列化

前端使用的反序列化方式有很多種,最常用的方式是使用JSP小指令碼:

<% List list=(List)SerializeUtil.unserialize((byte[])session.getAttribute("import"));
out.print(list);
%>

因此,我們可以使用JSTL的方式進行前端的反序列化操作。但是,往往需要進行反序列化的物件在N多頁面中的數量過多,使用小指令碼的方式過於冗餘,而且會使後期維護變得繁瑣。

如何使用JSTL表示式進行資料的反序列化

◑後臺工程師們會為我們寫好一個序列化、反序列化的project(如果沒有也可以參考我在帖子最後附上的SerializeUtil.java)。

◑我們需要建立一個Java Project

Src->new->class

class1

◑在Tag.java中,寫入想要操作的程式碼。

public class Tag {
/*
* 前端使用jstl方式,對序列化的值(除【基礎型別】以外)進行反序列化處理,並顯示資訊
*/
public static Object unSerializeTag(Object obj){
return  SerializeUtil.unserialize((byte[])obj);
}

}


◑在WEB-INF下,建立TLD配置檔案

class2

◑在配置檔案中鍵入程式碼。

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>my</short-name><!-- 前臺呼叫時prefix的值 -->
<uri>/mytags</uri> <!-- uri的路徑 -->
<function>
<name>unSerializeTag</name> <!-- 需要呼叫的方法名 -->
<function-class> com.tag.Tag</function-class> <!--呼叫的Tag.java的路徑-->
<function-signature>java.util.List
unSerializeTag(java.lang.Object)</function-signature> <!-- 方法返回型別,方法呼叫引數型別的定義 -->
</function>
</taglib>


◑在需要使用反序列化的jsp頁面上,呼叫包。

<%@ taglib uri="/mytags" prefix="my" %>


◑在頁面上,直接進行呼叫。

${my:unSerializeTag(sessionScope.UserName)}


附:SerializeUtil.java

/**
* 序列化        *  反序列化
*
*/
public class SerializeUtil {
public static byte[] serialize(Object object) {
if(object==null){
return null;
}else
{
try {
//序列化
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
//                         oos.close();
//                         baos.close();
return bytes;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
public static Object unserialize(byte[] bytes) {
if(bytes==null){
return null;
}else
{
ByteArrayInputStream bais = null;
try {
//反序列化
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
return null;
}
}

}

}