前端使用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
◑在Tag.java中,寫入想要操作的程式碼。
public class Tag { /* * 前端使用jstl方式,對序列化的值(除【基礎型別】以外)進行反序列化處理,並顯示資訊 */ public static Object unSerializeTag(Object obj){ return SerializeUtil.unserialize((byte[])obj); } }
◑在WEB-INF下,建立TLD配置檔案
◑在配置檔案中鍵入程式碼。
<?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;
}
}
}
}