?????上篇文章我們介紹struts2標(biāo)簽庫中的控制標(biāo)簽的基本使用和部分原理胶果,本篇文章接著了解下標(biāo)簽庫中有關(guān)數(shù)據(jù)標(biāo)簽的使用和原理。主要涉及以下數(shù)據(jù)標(biāo)簽:
- action標(biāo)簽:用于在視圖頁面跳轉(zhuǎn)到一個Action
- bean標(biāo)簽:用于創(chuàng)建一個Javabean實例讶迁,按需保存到context中
- date標(biāo)簽:用于格式化輸出一個日期
- debug標(biāo)簽:用于調(diào)試查看ognl上下文中內(nèi)容
- include標(biāo)簽:用于包含其他的jsp或者servlet頁面資源
- param標(biāo)簽:主要配合別的標(biāo)簽作為子標(biāo)簽使用
- push標(biāo)簽:用于將某個值放入到root棧頂
- set標(biāo)簽:設(shè)置一個新變量,放入指定范圍
- url標(biāo)簽:用于生成一個URL地址
數(shù)據(jù)標(biāo)簽主要是用于提供各種數(shù)據(jù)訪問相關(guān)的功能分井,生成輸出國際化信息等糖驴。上述所列舉的主要是一些常用的,給我們提供較大方便的標(biāo)簽跨琳,具體的每個標(biāo)簽的使用和簡單的原理會在下文介紹自点。
一桐罕、action標(biāo)簽
?????該標(biāo)簽用于向指定的action發(fā)出請求脉让,拉取該action對應(yīng)的視圖頁面資源。它主要有以下幾個屬性:
- var:該屬性指定放入當(dāng)前action到context中的名稱功炮,如果沒有指定該屬性則不會保存該action到context中
- name:該屬性指定了需要調(diào)用的action的名稱
- namespace:該屬性指定該action的命名空間
- executeResult:該屬性指定了該action最后的視圖頁面是否要被包含到本頁面
- ignoreContextParams:它指定了本頁面的請求參數(shù)是否要轉(zhuǎn)發(fā)到該action頁面
下面通過幾個示例了解下具體的使用情況:
//定義一個將要被轉(zhuǎn)向的action
public class MyAction implements Action {
public String execute() throws Exception{
return ERROR;
}
}
<body>
<h1>this is the index page</h1>
<s:action name="my" executeResult="true"/>
<br/>
<s:debug/>
</body>
上面的action標(biāo)簽向名稱為my的action轉(zhuǎn)發(fā)請求并指定需要將該action加載的視圖資源返回溅潜,運行截圖如下:
下面我們修改MyAction:
public class MyAction implements Action {
private String username;
public void setUsername(String name){
this.username = name;
}
public String getUsername(){
return this.username;
}
public String execute() throws Exception{
ActionContext.getContext().put("hello",username);
return ERROR;
}
}
<body>
<h1>this is the index page</h1>
<s:action name="my" executeResult="true" ignoreContextParams="false"/>
<br/>
<s:debug/>
</body>
如上述代碼所示,我們在myAction中定義了一個username屬性薪伏,然后直接將它put到context中滚澜,最后在error頁面獲取該值并打印。結(jié)果如下:
首先我們是在login.jsp頁面(該頁面未給出嫁怀,只有簡單的一個文本框)提交了一個請求參數(shù)到我們的index頁面设捐,在index頁面中借浊,我們使用action標(biāo)簽轉(zhuǎn)發(fā)請求,其中指定該action標(biāo)簽中ignoreContextParams為false表示在被請求的action中會傳入當(dāng)前index頁面的請求參數(shù)萝招。最后我們在MyAction中自動獲取到了該參數(shù)然后交給error頁面輸出蚂斤。該例主要演示ignoreContextParams屬性可以控制是否轉(zhuǎn)發(fā)請求參數(shù)的作用。
二槐沼、bean標(biāo)簽
?????bean標(biāo)簽主要用來創(chuàng)建一個Javabean的實例曙蒸,其中又可以使用param標(biāo)簽為該Javabean實例傳遞屬性值。該標(biāo)簽主要有以下兩個屬性:
- name:該屬性指定了將要被創(chuàng)建實例的Javabean的類名
- var:指定了該屬性將會把該實例保存到context中和pageScope中
我們看一個例子:
//定義一個Javabean
public class Walker {
private String username;
private int age;
public void setUsername(String name){
this.username =name;
}
public String getUsername(){
return this.username;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
}
<body>
<h1>this is the index page</h1>
<s:bean name="MyPackage.Walker" var="walker">
<s:param name="username" value="'walker'"/>
<s:param name="age" value="22"/>
</s:bean>
<s:property value="#walker.username"/>
<br/>
<s:property value="#walker.age"/>
<s:debug/>
</body>
輸出結(jié)果如下:
上述代碼實例化了一個Javabean實例岗钩,并將它保存到context中纽窟,接著我們輸出該內(nèi)容,需要注意的是param元素中value屬性依然是ognl表達(dá)式兼吓,想要賦值字符串需要單引號臂港。
三、date標(biāo)簽
?????date標(biāo)簽用于格式化輸出一個日期视搏,或者輸出當(dāng)前時刻與指定時間之間的時間差趋艘。該標(biāo)簽主要有以下幾個屬性:
- format:該屬性的值為一個格式字符串,它用于為指定日期提供輸出格式
- nice:該屬性用于指定是否需要輸出當(dāng)前時刻與指定時刻之間的時間差
- name:該屬性接受的是一個具體的時間
- var:指定了該屬性會將該日期保存到context和pageScope中
需要注意的是凶朗,該標(biāo)簽要么輸出的是指定了格式的日期瓷胧,要么輸出的是具體的時間差。也就是如果指定nice屬性為true棚愤,則不應(yīng)該指定format屬性搓萧,因為nice屬性已經(jīng)指定了該標(biāo)簽將輸出一個時間差格式,如果強行指定format屬性宛畦,該屬性的值將會無效瘸洛。下面我們看幾個例子:
<body>
<h1>this is the index page</h1>
<s:bean name="java.util.Date" var="date"/><br/>
<s:date name="#date"/><br/>
<s:date name="#date" format="dd/MM/yyyy"/><br/>
<%
Date date = new Date(123123);
request.setAttribute("date",date);
%>
<s:date name="#request.date" nice="true"/>
<br/>
<s:debug/>
</body>
運行結(jié)果如下:
第一種情況,如果既沒有指定format屬性次和,也沒有指定nice值反肋,那么會使用默認(rèn)的format格式輸出。第二種情況按照指定的格式輸出踏施。第三種情況輸出為指定時間距離當(dāng)前時間的時間差石蔗。
四、debug標(biāo)簽
?????該標(biāo)簽主要用于調(diào)試畅形,查看ValueStack中的各個參數(shù)的實際值的情況养距。
五、include標(biāo)簽
?????include標(biāo)簽主要用于將一個jsp頁面或者servlet頁面包含到本頁面來日熬。該標(biāo)簽只有一個屬性value棍厌,該屬性指定了需要包含的資源位置。我們看幾個例子:
<body>
<h1>this is the index page</h1>
<s:include value="error.jsp"/>
<br/>
<s:debug/>
</body>
結(jié)果如下:
我們查看源碼:
該標(biāo)簽很是類似于jsp的編譯指令include。當(dāng)然我們也可以通過param標(biāo)簽傳入?yún)?shù)到被包含的頁面中耘纱。例如:
<s:include value="error.jsp">
<s:param name="a" value="'walker'"/>
<s:param name="b" value="'yam'"/>
<s:param name="c" value="'cyy'"/>
</s:include>
六敬肚、push標(biāo)簽
?????push用于將某個值放到root棧頂,其中有個屬性value表示即將被放入棧頂?shù)脑厥觥O旅婵磦€例子:
<body>
<h1>this is the index page</h1>
<s:bean name="MyPackage.Walker" var="w">
<s:param name="username" value="'walker'"/>
<s:param name="age" value="23"/>
</s:bean>
<s:push value="#w">
<s:property value="username"/><br/>
<s:property value="age"/>
</s:push>
<p>離開push標(biāo)簽之后</p>
<s:property value="username"/>
<br/>
<s:debug/>
</body>
首先我們實例化一個walker類實例并保存到context中帘皿,接著我們在push標(biāo)簽中直接訪問棧頂元素獲取該實例的屬性值。但是我們離開push標(biāo)簽之后就不能獲取該實例的屬性值了畸陡,因為push標(biāo)簽結(jié)束之后會將剛剛放入root棧中的元素移除鹰溜。也就是說我們?nèi)绻胍岩粋€元素送入root棧來方便訪問,那么就必須在push標(biāo)簽內(nèi)部完成訪問操作丁恭。下面是上述代碼的結(jié)果截圖:
七曹动、set標(biāo)簽
?????set標(biāo)簽用于將某個值放入到指定的范圍內(nèi),可以理解為定義一個新變量并將它放入到指定范圍內(nèi)牲览。該標(biāo)簽主要有以下幾個屬性:
- scope:指定該變量將會被存放到的范圍墓陈,可以是application,session第献,request贡必,page,action這5個值庸毫。
- name:該屬性指定了該元素保存的指定范圍內(nèi)的key值
- value:該屬性指定了將要被存放的實例的值
- var:該屬性指定了將要存放到context中的元素名稱
下面通過幾個實例了解下基本的使用情況:
<body>
<h1>this is the index page</h1>
<s:bean name="MyPackage.Walker" var="w">
<s:param name="username" value="'walker'"/>
<s:param name="age" value="23"/>
</s:bean>
<s:set value="#w" name="a" scope="request"/>
<s:property value="#request.a.username"/>
<br/>
<s:debug/>
</body>
首先我們實例化了一個walker對象仔拟,然后我們將該實例保存到request范圍內(nèi),最后通過property標(biāo)簽取出該數(shù)據(jù)內(nèi)容飒赃。運行截圖如下:
上述代碼演示的是通過set標(biāo)簽將元素保存到request范圍內(nèi)利花,至于其他范圍內(nèi)的數(shù)據(jù)保存情況類似,此處不再贅述载佳。需要注意一點的是:如果指定將元素保存到action范圍的話炒事,那么該元素不僅會被保存到request中,還會保存到context中蔫慧。
八挠乳、url標(biāo)簽
?????url標(biāo)簽用于生成一個URL地址,該標(biāo)簽主要有以下幾個屬性值:
- action:指定生成的URL地址為某個action
- anchor:指定了URL的錨點
- encode:指定了是否需要對參數(shù)進(jìn)行編碼
- includeContext:指定是否需要將當(dāng)前上下文包含到該URL中
- includeParams:該屬性用于指定是否包含請求參數(shù)在URL中姑躲,該屬性的值有以下幾個睡扬,none,all肋联,get威蕉。
- method:該屬性指定了調(diào)用目的action的某個方法
- namespace:指定了action的命名空間
- portletMode:指定結(jié)果頁面的portlet模式
- scheme:用于設(shè)置scheme屬性
- value:用于指定生成的URL的值,和action是差不多的橄仍,只是action指定的是action的URL
- var:指定該屬性會將該URL保存到context中
- windowState:指定結(jié)果頁面的portlet窗口狀態(tài)
上面簡單介紹各個屬性的作用,單總結(jié)的很是粗暴。下面通過具體的實例來深刻理解下它們各自的作用侮繁。
<body>
<h1>this is the index page</h1>
<s:url value="my" var="u" escapeAmp="false">
<s:param name="id" value="01"/>
<s:param name="age" value="22"/>
</s:url>
<s:property value="#u"/>
<br/>
<s:debug/>
</body>
生成URL:my?id=1&age=22
如上所示虑粥,我們指定escapeAmp為false表示用于連接多個參數(shù)的&符號不會被編碼,我們通過param子標(biāo)簽傳入?yún)?shù)作為URL的參數(shù)宪哩,最后生成完整URL娩贷。至于一些其他的屬性值,只有在具體項目使用中才能有更加深刻的體會锁孟,此處沒有比較好的例子彬祖,就不贅述了。
有關(guān)于struts2標(biāo)簽庫的數(shù)據(jù)標(biāo)簽已經(jīng)簡單介紹完了品抽,由于沒有結(jié)合具體的項目储笑,所以介紹的很淺顯,不當(dāng)之處圆恤,望指出突倍!