日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Struts2标签

發(fā)布時(shí)間:2024/1/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Struts2标签 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Struts2提供了大量標(biāo)簽幫助開發(fā)表現(xiàn)層頁面,Struts2標(biāo)簽庫與Struts1相比,不依賴于任何表現(xiàn)層技術(shù),大部分可以在各種表現(xiàn)層技術(shù)中使用,包括最常用的jsp頁面,也可以在Velocity和FreeMarker等模板技術(shù)中使用。
注:極小部分在某些表現(xiàn)層中受到限制

還記得如何開發(fā)自定義標(biāo)簽以及使用嗎?

JSP2自定義標(biāo)簽

使用Struts2標(biāo)簽

Struts2標(biāo)簽庫分為UI標(biāo)簽和非UI標(biāo)簽,UI標(biāo)簽庫又分為表單標(biāo)簽庫和非表單標(biāo)簽,非UI標(biāo)簽又分為控制標(biāo)簽和數(shù)據(jù)訪問標(biāo)簽
Struts2框架已經(jīng)完成了開發(fā)自定義標(biāo)簽的步驟,即提供了標(biāo)簽處理類,也提供了標(biāo)簽庫定義文件。
使用WinRAR解壓struts2-core-2.5.20.jar文件,\struts2-core-2.5.20\META-INF找到struts-tags.tld,這就是Struts2的標(biāo)簽庫定義文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"><display-name>Struts Tags</display-name><tlib-version>2.3</tlib-version>,<short-name>s</short-name><uri>/struts-tags</uri>········<tag> </tag>········</taglib>

Struts2的OGNL表達(dá)式語言

Struts內(nèi)建的表達(dá)式語言,大大增強(qiáng)了Struts的數(shù)據(jù)訪問功能,XWork在原有的OGNL的基礎(chǔ)上,增加了對(duì)ValueStack的支持。
OGNL并不是真正的編程語言,而是一門數(shù)據(jù)訪問語言
傳統(tǒng)的OGNL表達(dá)式求值中,系統(tǒng)會(huì)假設(shè)只有一個(gè)根對(duì)象
如果系統(tǒng)的Stack Context中包含兩個(gè)對(duì)象:foo對(duì)象、bar對(duì)象,并將foo設(shè)置稱根對(duì)象。
如下所例:

#foo.blah //返回的是foo.getBlah()方法的返回值 #bar.blah //返回的是bar.getBlah()方法的返回值 blah //在foo是根對(duì)象,即返回foo.getBlah().的返回值 #bar.foo.blah //返回bar.getFoo().getBlah()方法的返回值

Struts2可以直接從對(duì)象中獲取屬性,Struts2提供了一個(gè)特殊的OGNL PropertyAccessor(屬性訪問器),它可以自動(dòng)搜尋Stack Context的所有的實(shí)例。
例如:Stack Context中包含了兩個(gè)根實(shí)例
1、animal:擁有屬性name,species
2、person:擁有屬性name,salary
棧中分布:animal實(shí)例在person實(shí)例的上面

species //返回animal.getSpecies()方法 salary //返回person.getSalary()方法 name //返回animal.getName()方法,Struts先找到animal實(shí)例

如果要取得person的name

#person.name

還可以通過索引訪問Stack Context中的對(duì)象

[0].name //返回animal.getName()方法 [1].name //返回person.getName()方法

Struts2內(nèi)置了一些命名對(duì)象
parameters:用于訪問HTTP請(qǐng)求參數(shù)。#parameters.foo,用于返回HttpServletRequest的getParameter(“foo”)方法返回值
request:用于訪問HttpServletRequest的屬性
session:用于訪問Session的屬性
application:用于訪問ServletContext的屬性
attr:該對(duì)象將依次搜索如下對(duì)象:PageContext、HttpServletRequest、HttpSession、ServletContext中的屬性
注:當(dāng)系統(tǒng)創(chuàng)建Action實(shí)例后,該Action實(shí)例已經(jīng)保存在ValueStack中,無需寫#即可訪問Action屬性
擴(kuò)充:
對(duì)于Stack Context 和ValueStack概念的認(rèn)識(shí)
Stack Context:是整個(gè)OGNL計(jì)算求值的Context,Stack Context對(duì)象就是一個(gè)Map類型的實(shí)例,它有一個(gè)根對(duì)象ValueStack(一般保存action實(shí)例),除此之外,還包含以上內(nèi)置的命名對(duì)象。

  • 訪問Stack Context里的命名對(duì)象需要在對(duì)象名前加#
  • 訪問Stack Context根對(duì)象里的屬性,可以省略對(duì)象名

可以將Stack Context中的對(duì)象放入ValueStack棧頂

OGNL集合操作

1、直接創(chuàng)建List類型的集合
{e1,e2,e3····}
2、直接生成Map類型的集合
#{key1:value1,key2:value2····}
對(duì)于集合,提供了兩個(gè)運(yùn)算符
1、in:判斷某個(gè)元素是否在指定集合中
2、not in:判斷某個(gè)元素是否不在指定集合中
通過某個(gè)規(guī)則可以取得集合的子集
1、?:取出所有符合選擇邏輯的元素
2、^:取出符合選擇邏輯的最后一個(gè)元素
3、$:取出符合選擇邏輯的第一個(gè)元素

訪問靜態(tài)成員

Struts默認(rèn)關(guān)閉了訪問靜態(tài)方法,只能通過OGNL表達(dá)式訪問靜態(tài)域,,為了讓OGNL表達(dá)式訪問靜態(tài)域,需要在Struts.xml中設(shè)置如下代碼片段

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

OGNL表達(dá)式可以通過以下語法訪問靜態(tài)成員

@className@staticField @className@siaticMethod(val····)

例如如下jsp片段

<!--生成一個(gè)偽隨機(jī)數(shù)--> <s:property value="@java.lang.Math@random()"/> <!--圓周率的值--> <s:property value="@java.lang.Math@PI"/>

支持Lambda表達(dá)式(java8新特性,好好學(xué)學(xué))

將函數(shù)作為方法的參數(shù)
假設(shè)有如下斐波那契數(shù)列:

if n==0 return 0; else if n==1 return 1; else return fun(n)+fun(n-1);

用OGNL表達(dá)式輸出第10個(gè)數(shù)

<s:property value="#fun=:[#this==0?0:#this==1?1:#fun(#this-2)+#fun(#this-1)],#fun(10)">

非UI標(biāo)簽

控制標(biāo)簽

主要用于流程控制,如分支、循環(huán)等,也可完成對(duì)集合的合并,排序等操作以及操作Struts2的valueStack
控制標(biāo)簽 如以下9個(gè):
1、if
2、elseif
3、else
<s:if···>可以直接單獨(dú)用,其他兩個(gè)必須跟著<s:if···>一起用
test屬性進(jìn)行條件判斷的邏輯表達(dá)式
比如:

<s:if test="#age>60"> 老年人 </s:if> <s:elseif test="#age>35"> 中年人 </s:elseif> <s:elseif test="#age>15"> 青年人 </s:elseif> <s:else> 少年 <s:else>

4、iterator標(biāo)簽
主要對(duì)集合進(jìn)行迭代輸出
有以下三個(gè)屬性:
1、value:用于指定被迭代的集合,沒有指定該屬性,則使用ValueStack棧頂?shù)募稀?br /> 2、var:指定了集合元素的ID
3、status:指定迭代時(shí)IteratorStatus實(shí)例,通過該實(shí)例可以判斷當(dāng)前元素的屬性,比如當(dāng)前迭代元素的索引
IteratorStatus實(shí)例包含了以下幾個(gè)方法:
1、int getCount():返回當(dāng)前迭代了幾個(gè)元素
2、int getIndex():返回當(dāng)前迭代元素的索引
3、boolean isEven():判斷當(dāng)前被迭代的元素索引是否為偶數(shù)
4、boolean isOdd():判斷當(dāng)前被迭代的元素索引是否為奇數(shù)
5、boolean isFirst()
6、boolean isLast()

<table border="1" width="100"> <s:iterator var="name" status="st" value="{e1,e2,e3}"> <tr <s:if test="#st.odd">style="background:#bbbbbb"</s:if>> <td><s:property value="name"/></td> </tr> </s:iterator> </table>

5、append標(biāo)簽
將多個(gè)集合對(duì)象連接起來
var:拼接生成新集合的名字
可以接收<s:param···/>子標(biāo)簽,每一子標(biāo)簽代表一個(gè)集合

<s:append var="newList"> <s:param value="{e1,e2,e3}"/> <s:param value="{a1,a2,a3}"/> </s:append> <table border="1" width="100"> <s:iterator value="#newList" var="name" status="st"> <tr> <td><s:property value="#st.count"></td> <td><s:property value="name"></td> </tr> </iterator> </table>

注:<s:append···> 可以將Map集合和List集合連接在一起
6、generator標(biāo)簽
可以將指定字符串按指定分隔符分成多個(gè)子串,臨時(shí)生成的多個(gè)字串可以用Iterator標(biāo)簽迭代輸出
有這樣的一種說法:運(yùn)用此標(biāo)簽首先將整個(gè)字符串轉(zhuǎn)化成yi
個(gè)集合,整個(gè)生成的集合將位于ValueStack棧頂,標(biāo)簽使用結(jié)束,該集合將被移出ValueStack
generator標(biāo)簽有以下幾個(gè)屬性
count;指定集合中元素的個(gè)數(shù)
separator:指定解析字符串的分隔符
val:指定被解析的字符串
converter:指定一個(gè)轉(zhuǎn)換器,負(fù)責(zé)將集合中的每一個(gè)字符串轉(zhuǎn)換為對(duì)象
var:指定該屬性,生成的集合對(duì)象會(huì)放在Stack Context中以及requestScope
7、merge標(biāo)簽
將多個(gè)集合拼接成一個(gè)集合,與append標(biāo)簽的區(qū)別在于:
假設(shè)有三個(gè)集合,每個(gè)集合中有兩個(gè)元素
append標(biāo)簽新集合的順序:
第一集合第一元素
第一集合第二元素
第二集合第一元素
第二集合第二元素
第三集合第一元素
第三集合第二元素
merge標(biāo)簽新集合的順序:
第一集合第一元素
第二集合第一元素
第三集合第一元素
第一集合第二元素
第二集合第二元素
第三集合第二元素
8、subset標(biāo)簽
用于取得集合的子集
可指定以下幾個(gè)屬性
count:指定子集中元素的個(gè)數(shù),不指定此屬性則默認(rèn)源集合全部元素
source:指定源集合
start:指定子集從原集合第幾個(gè)元素開始截取,默認(rèn)值0
var:與 generator一樣,會(huì)生成臨時(shí)集合對(duì)象放入ValueStack中,標(biāo)簽執(zhí)行結(jié)束,則一處ValueStack。如果指定了該屬性, 生成該集合的Iterator對(duì)象設(shè)置成page范圍內(nèi)的屬性值,屬性名即var=“屬性名”
decider:是否選定該元素 ,指定一個(gè)Decider對(duì)象
Struts2允許開發(fā)者決定截取標(biāo)準(zhǔn),需要實(shí)現(xiàn)一個(gè)Decider類,該類又要實(shí)現(xiàn)SubIteratorFilter.Decider接口,重寫boolean decide(Object ele)方法

public class myDecider implements SubsetIteratorFilter.Decider { public boolean decide(Object element)throws Exception { String str=(String)element; //判斷字符串中是否包含1 boolean boo=str.indexOf("1")>0; return boo; } }

jsp頁面中使用

<!--使用自定義的Decider實(shí)例截取目標(biāo)集合--> <!--使用var屬性,將生成的Iterator對(duì)象放入pageScope--> <s:subset source="{"245s","51c5d","dcse","cde1dcsd","ecw"}" decider="#myDecider" var="newList"/> ${pageScope.newList} <table border="1" width="100"> <s:iterator status="st" value="#attr.newList"> <tr <s:if test="#st.odd">style="background-color:"#bbbbbb"</s:if>> <td><s:property/></td> </tr> </table>

9、sort標(biāo)簽
對(duì)指定集合元素進(jìn)行排序,必須提供自己的排序規(guī)則,即自定義java類實(shí)現(xiàn)java.util.Comparator接口
sort標(biāo)簽可指定以下屬性:
comparator:該屬性指定排序的Comparator實(shí)例
source:指定被排序的集合,不指定該屬性,則選取ValueStack棧頂集合
var:指定該屬性,則將生成集合的Iterator對(duì)象設(shè)置成page范圍內(nèi)的屬性
排序后的新集合放入pageScope范圍內(nèi)
事例:
src/myComparator.java

public class myComparator implements Comparator { public int compare(Object element1,Object element2) { //根據(jù)字符串長度決定大小 return element1.toString().length()-element2.toString().length(); } }

jsp

<s:sort source="{"deffc","deswff","dewfweff","dwfqefrewgfwe"}" var="sortedList" comparator="#myComparator"/> ${pageScope.sortedList} <table border="1" width="100"> <s:iterator status="st" value="#attr.sortedList"> <tr <s:if test="#st.odd">style="background-color:"#bbbbbb"</s:if>> <td><s:property/></td> </tr> </table>

數(shù)據(jù)標(biāo)簽

提供各種數(shù)據(jù)訪問相關(guān)的功能
主要標(biāo)簽如下幾個(gè):
1、action標(biāo)簽
允許在jsp界面中直接調(diào)用Action
有以下幾個(gè)屬性
1、var:如果設(shè)置了該屬性,該Action將被放入Stack Context中
2、name:指定調(diào)用哪個(gè)Action
3、namespace:指定調(diào)用的Action所在的namespace
4、executeResult:是否將Action處理結(jié)果頁面保存到本頁面
5、ignoreContextParams:該頁面的請(qǐng)求參數(shù)是否傳入調(diào)用的Action中

/src/tagAction.java

public class tagAction extends ActonSupport { String user; String pass; //省略getter和setter方法 ····· public String execute()throws IOException,JspException { return "done"; } public String login()throws Exception { ActionContext.getContext().put("user",getuser()); return "done";ccc } }

在Struts.xml文件中將Action類映射成兩個(gè)邏輯action

<action name="tag2" class="tagAction"> <result name="done">/WEB-INF/content/succ.jsp</result> </action> <action name="tag1" class="tagAction" method="login"> <result name="done">/WEB-INF/content/success.jsp</result> </action>

jsp頁面中使用<s:action>標(biāo)簽調(diào)用兩個(gè)Action代碼邏輯片段

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><%@ taglib uri="/struts-tags" prefix="ss" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> <ss:action name="tag1" executeResult="true"/><hr/> <ss:action name="tag1" executeResult="false"/>不包含結(jié)果 <ss:property value="user"/><hr/> <ss:action name="tag1" executeResult="true" ignoreContextParams="true"/><hr/> </body> </html>


2、bean標(biāo)簽
用于創(chuàng)建一個(gè)javaBean實(shí)例,可以在該標(biāo)簽體內(nèi)使用<param…/>為javaBean實(shí)例傳入屬性,javaBean類應(yīng)提供對(duì)應(yīng)的setter方法,如果訪問javaBean某個(gè)屬性,還應(yīng)該提供getter方法
此標(biāo)簽有以下屬性
1、name:指定要實(shí)例化javaBean的實(shí)現(xiàn)類
2、var:如果指定了該屬性,則將javabean實(shí)例放入Stack Context 中,并放入requestScope中
在使用bean標(biāo)簽時(shí),會(huì)創(chuàng)建一個(gè)javabean對(duì)象,并臨時(shí)放入ValueStack頂端,該標(biāo)簽執(zhí)行結(jié)束,則將其從ValueStack中移出
一個(gè)簡單的例子
/src/webapp/Person.java

public class Person { private String name; private String age; //省略setter和getter方法 ······ }

JSP頁面

<!--未指定var屬性,只能在標(biāo)簽內(nèi)部訪問javabean實(shí)例--> <s:bean name="webapp.Person"> <s:param name="name" value="binfeng"/> <s:param name="age" value="21"/> </s:bean>

3、date標(biāo)簽
用于格式化輸出一個(gè)日期,還可以計(jì)算指定日期和當(dāng)前時(shí)刻的時(shí)間差
可以有如下幾個(gè)屬性:
1、format:如果指定了該屬性,則使用指定格式輸出時(shí)間
2、nice:是否輸出指定日期和當(dāng)前日期的時(shí)間差,默認(rèn)false,與format一般不同時(shí)使用,如果兩者都指定,忽略format,如果兩者都沒有的話,系統(tǒng)會(huì)取國際化資源尋找key為struts.date.format,如果無法找到,則默認(rèn)采用DateFormat.MEDIUM格式輸出
3、name:指定格式化的日期值
4、var:如果指定了該屬性,格式化的字符串將放入Stack Context中,并放入requestScope范圍內(nèi)

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> <s:bean name="java.util.Date" var="now"/> <s:date name="#now" format="dd/MM/yyyy" nice="false"/><hr/> <s:date name="#now" format="dd/MM/yyyy" nice="true"/><hr/> <s:date name="#now" nice="true"/><hr/> <s:date name="#now" nice="false"/><hr/> <s:date name="#now" nice="false" var="abc"/><hr/> ${requestScope.abc} <hr/><s:property value="#abc"/> </body> </html>


4、debug標(biāo)簽
用于輔助調(diào)試,會(huì)在頁面上生成一個(gè)超級(jí)鏈接,通過該鏈接可以查到Stack Context和ValueStack中所有值信息
5、include標(biāo)簽
用于將一個(gè)jsp頁面或者servlet包含到本頁面中
value:指定被包含的jsp頁面或者servlet
6、param標(biāo)簽
為其他標(biāo)簽提供參數(shù)
name:參數(shù)名
value:參數(shù)值
7、push
將某個(gè)值放入ValueStack棧頂
value:指定放入棧頂?shù)闹?br /> 8、set標(biāo)簽
用于將某個(gè)值放入指定范圍,
可以理解為設(shè)置新的變量,將已有的值(對(duì)象)賦給新的變量,并將新的變量放入指定的范圍內(nèi)
擁有以下屬性:
scope:指定新值防放置的范圍,該屬性可以接受application、session、request、page或action,默認(rèn)值是action,action范圍指的是存入request范圍,并被放入OGNL的StackContext中
value:賦給變量的值,如果沒有指定此屬性,則取ValueStack棧頂?shù)闹?br /> var:指定了該屬性,則將該值放入到ValueStack中
9、url標(biāo)簽
生成一個(gè)url地址,可以指定子標(biāo)簽<s:param···>,向指定url發(fā)送請(qǐng)求參數(shù)
可以指定以下屬性
1、action:指定生成的url地址為哪個(gè)action,如果沒有指定值,則使用value的地址值
2、anchor:指定url的錨點(diǎn)
3、encode:指定是否對(duì)參數(shù)進(jìn)行編碼,默認(rèn)true
4、escapeAmp:是否需要對(duì)&符號(hào)進(jìn)行編碼,默認(rèn)true
5、forceAddSchemeHostAndPort:是否需要在url對(duì)應(yīng)的地址里強(qiáng)制添加scheme、主機(jī)和端口
6、includeContext:是否將當(dāng)前上下文包含到url中
7、includeParams:是否包含請(qǐng)求參數(shù),屬性值取none、get、all
8、method:指定Action的方法
9、namespace:指定命名空間
10、portletMode:指定結(jié)果頁面的portlet模式
11、scheme:設(shè)置scheme屬性
12、value:生成url地址值,和action都沒指定,則以當(dāng)前頁面作為url地址值
13、var:指定該屬性,將會(huì)把鏈接值放入ValueStack中
14、windowState:指定結(jié)果頁面的portlet窗口狀態(tài)
10、property標(biāo)簽
輸出指定值
value:指定輸出屬性值,沒有指定,則輸出ValueStack棧頂?shù)闹?br /> default:如果需要輸出的屬性值為null,則顯示default屬性給的值
escape:指定是否escape HTML代碼,默認(rèn)為true

UI標(biāo)簽

主題和模板

Struts中的UI標(biāo)簽都是基于主題和模板的,
模板:是一個(gè)UI標(biāo)簽外在表現(xiàn)形式
主題:所有的UI標(biāo)簽都提供了對(duì)應(yīng)的模板,這一系列模板就會(huì)形成一個(gè)主題
設(shè)置主題的方法有以下幾種:
1、設(shè)定特定UI標(biāo)簽上的theme屬性來指定主題
2、通過UI標(biāo)簽外圍的<s:form…/>的theme屬性指定主題
3、獲取page會(huì)話范圍內(nèi)的theme的屬性來確定主題
4、獲取request會(huì)話范圍內(nèi)的theme的屬性來確定主題
5、獲取session會(huì)話范圍內(nèi)的theme的屬性來確定主題
6、獲取application會(huì)話范圍內(nèi)的theme的屬性來確定主題
7、通過設(shè)置名struts.ui.theme的常量(默認(rèn)值xhtml)來確定主題,該常量可以在struts.properties文件或者struts.xml中設(shè)置
排在前面的優(yōu)先級(jí)會(huì)覆蓋后面的
Struts加載模板是通過主題和模板目錄來實(shí)現(xiàn)的
模板目錄包含好幾個(gè)主題,每個(gè)主題又包含好幾個(gè)模板文件
Struts2的模板目錄是通過struts.ui.templateDir常量指定的,該常量的默認(rèn)值是template.加載模板文件的順序:
1、搜索web應(yīng)用中/template/主題/模板
2、搜索classpath路徑上的/template/主題/模板
模板默認(rèn)的文件是*.ftl文件,*.ftl文件是FreeMarker模板文件,也可以修改自己的模板技術(shù),通過修改struts.ui.templateSuffix常量的值,該常量接受以下幾個(gè)值:
1、ftl
2、vm: 基于Velocity的模板技術(shù)
3、jsp:基于jsp的模板技術(shù)
struts提供了三個(gè)默認(rèn)的主題:simple,xhtml,css_xhtml
simple:最簡單的主題,最底層的基礎(chǔ)
xhtml:Struts2默認(rèn)的主題,對(duì)simple主題進(jìn)行了擴(kuò)展和包裝,在simlp主題上加了如下附加的特性:
1、針對(duì)HTML標(biāo)簽使用標(biāo)準(zhǔn)的兩列表格布局
2、每個(gè)HTML標(biāo)簽增加了配套的label,可以通過labelposition屬性設(shè)置位置
3、自動(dòng)輸出檢驗(yàn)錯(cuò)誤提示
4、輸出js的客戶端檢驗(yàn)
css_xhtml主題對(duì)原有的xhtml主題進(jìn)行擴(kuò)展,在基礎(chǔ)上加了css樣式控制

自定義主題

創(chuàng)建自定義主題有以下三種方式
1、開發(fā)者完全實(shí)現(xiàn)一個(gè)全新的主題
2、包裝一個(gè)現(xiàn)有的主題
3、擴(kuò)展一個(gè)現(xiàn)有的主題
1、開發(fā)一個(gè)全新的太過麻煩
2、包裝一個(gè)現(xiàn)有的,xhtml主題就大量使用了包裝技術(shù),如

<!--包含xhtml主題下的controlheader.ftl模板--> <#include ''/${parameters.templateDir}/xhtml/controlheader.ftl''/> <!--包含simple主題下的xxx.ftl模板--> <#include ''/${parameters.templateDir}/simple/xxx.ftl''/>

3、對(duì)現(xiàn)有主題進(jìn)行擴(kuò)展,開發(fā)者只需要自己寫一份自定義的模板文件,并將該文件放在對(duì)應(yīng)的主題目錄下,還需要在主題目錄下加一個(gè)theme.property文件,該文件指定自定義模板是以哪個(gè)模板為基礎(chǔ)進(jìn)行擴(kuò)展的,比如:

#指定該主題以xhtml主題進(jìn)行擴(kuò)展 parent=xhtml

表單標(biāo)簽

所有表單標(biāo)簽處理類都繼承UIBean類,UIBean包含了一些以下通用屬性
1、特殊的
form:可以實(shí)現(xiàn)表單元素與表單的交互
2、與模板相關(guān)的通用屬性
templateDir:指定該表單所用的模板文件目錄
theme:指定該表單所用的主題
3、JavaScript相關(guān)的通用屬性
onclick:指定鼠標(biāo)在該標(biāo)簽生成的表單元素上單擊時(shí)觸發(fā)的js函數(shù)
ondbclick:指定鼠標(biāo)在該標(biāo)簽生成的表單元素上雙擊時(shí)觸發(fā)的js函數(shù)
onmousedown:指定鼠標(biāo)在該標(biāo)簽生成的表單元素上按下時(shí)觸發(fā)的js函數(shù)
onmouseup:指定鼠標(biāo)在該標(biāo)簽生成的表單元素上松開時(shí)觸發(fā)的js函數(shù)
onmouseover:指定鼠標(biāo)在該標(biāo)簽生成的表單元素上懸停時(shí)觸發(fā)的js函數(shù)
onmouseout:指定鼠標(biāo)移出該標(biāo)簽生成的表單元素上時(shí)觸發(fā)的js函數(shù)
onfocus:指定該標(biāo)簽生成的表單元素得到焦點(diǎn)時(shí)觸發(fā)的函數(shù)
onblur:指定該標(biāo)簽生成的表單元素失去焦點(diǎn)時(shí)觸發(fā)的函數(shù)
onkeydown:按下鍵盤上某個(gè)鍵觸發(fā)的函數(shù)
onselect:對(duì)下拉列表項(xiàng)選擇類型的表單元素,選擇該元素時(shí)觸發(fā)js函數(shù)
onchange:對(duì)文本框等可以接受輸入的表單元素,指定當(dāng)值改變時(shí)觸發(fā)的js函數(shù)
4、當(dāng)鼠標(biāo)在表單元素上懸停時(shí),系統(tǒng)會(huì)出現(xiàn)提示,這種特性叫做tooltip
與tooltip相關(guān)的屬性
tooltip:設(shè)置此組件的tooltip
tooltipIcon:tooltip圖標(biāo)的URL路徑
tooltipAboveMousePoint:是否在光標(biāo)位置上顯示tooltip
tooltipBgColor:設(shè)置tooltip的背景色
tooltipBgImg:設(shè)置tooltip的背景圖片
tooltipBorderWidth:設(shè)置tooltip邊框的寬度
tooltipBorderColor:設(shè)置tooltip邊框的顏色
tooltipDelay:設(shè)置顯示tooltip延遲時(shí)間(毫秒)
tooltipFixCoordinateX:設(shè)置固定tooltip在指定的x坐標(biāo)
tooltipFixCoordinateY:設(shè)置固定tooltip在指定的y坐標(biāo)
tooltipFontColor:設(shè)置tooltip字體顏色
tooltipFontFace:設(shè)置tooltip字體
tooltipFontSize:設(shè)置tooltip字體大小
tooltipFontWeight:設(shè)置tooltip是否使用粗體,normal或者bold兩個(gè)值
tooltipLeftOfMousePoint:是否在光標(biāo)左側(cè)顯示tooltip,默認(rèn)在右側(cè)
tooltipOffsetX:設(shè)置tooltip相對(duì)光標(biāo)位置的水平位移
tooltipOffsetY:設(shè)置tooltip相對(duì)光標(biāo)位置的垂直位移
tooltipOpacity:設(shè)置tooltip的透明度,0-100
tooltioPadding:內(nèi)部間隔
tooltipShaowColor:指定顏色創(chuàng)建陰影
tooltipShaowWidth:指定寬度創(chuàng)建陰影
tooltipStatic:tooltip是否隨著光標(biāo)移動(dòng)而移動(dòng)
tooltipSticky:tooltip是否一直停留在它初始位置,直到另一個(gè)tooltip出現(xiàn),或者點(diǎn)擊了html頁面
tooltipStayAppearTIME:消失的時(shí)間間隔
tooltipTextAlign:標(biāo)題與內(nèi)容的對(duì)齊方式
tooltipTitle:tooltip標(biāo)題文字
tooltipTitleColor:tooltip標(biāo)題文字顏色
tooltipWidth:tooltip寬度
5、設(shè)置表單元素的css樣式
cssClass:設(shè)置表單元素的class屬性
cssStyle:設(shè)置表單元素的style屬性
title:設(shè)置表單元素的title屬性
disabled:設(shè)置表單元素的disabled屬性
label:設(shè)置表單元素的label屬性
labelPosition:設(shè)置表單元素的label位置
requiredPosition:設(shè)置必填標(biāo)記位于label的位置
name:表單元素的name屬性
required:定義是否在表單元素的label上添加必填標(biāo)記
tabIndex:定義表單元素的tabIndex屬性
value:定義value屬性

表單標(biāo)簽的name和value屬性

每個(gè)表單元素被映射成一個(gè)Action屬性,當(dāng)表單被提交,所對(duì)應(yīng)的action被實(shí)例化,如果該屬性有值,對(duì)應(yīng)得表單元素會(huì)顯示該屬性的值,這個(gè)值作為value屬性的值
name設(shè)置表單元素的名字,該屬性指定綁定值得表達(dá)式
如:

<!--文本框的值綁定到action的person屬性的firstname屬性--> <s:textfield name="person.firstname"/>

特殊的表單標(biāo)簽

2、checkboxlist標(biāo)簽
一次可以創(chuàng)建多個(gè)復(fù)選框,同時(shí)生成多個(gè)<input type=“checkbox”…/>的html標(biāo)簽
包含以下屬性:
1、list:指定的集合生成多個(gè)復(fù)選框
2、listKey:指定集合元素中的某個(gè)屬性作為復(fù)選框的value
3、listValue:指定集合元素中的某個(gè)屬性作為復(fù)選框的標(biāo)簽
設(shè)置表單元素的 name 屬性,與 Action 中的屬性名對(duì)應(yīng)
使用簡單標(biāo)簽生成多個(gè)復(fù)選框

<s:form> <s:checkboxlist name="a" label="你喜歡什么?" labelposition="top" list="{'籃球','乒乓球','羽毛球’}"/> </s:form>


使用簡單的map對(duì)象生成多個(gè)復(fù)選框

<s:checkboxlist name="b" label="你最喜歡什么動(dòng)物?" labelposition="top" list="#{'鳥類':'鳳凰','野獸':'老虎'}" listKey="key" listValue="value"/>


使用集合中放多個(gè)javabean實(shí)例生成多個(gè)復(fù)選框
該javabean的類代碼

public class bookService {public Book[] getBooks(){return new Book[]{new Book("book1","a"),new Book("book2","b"),new Book("book3","c"),};} } public class Book { private String name; private String author; public String getName() {return name; } public void setName(String name) {this.name = name; } public String getAuthor() {return author; } public void setAuthor(String author) {this.author = author; } public Book(String name,String author) {this.name=name;this.author=author; } } <s:bean name="org.crazyit.app.action.bookService" var="bs"/> <s:checkboxlist name="b" label="你最喜歡什么書?" labelposition="top" list="#bs.books" listKey="author" listValue="name"/>


3、radio標(biāo)簽
與checkboxlist不同的是radio生成的是多個(gè)單選按鈕
4、select標(biāo)簽
該標(biāo)簽會(huì)生成一個(gè)下拉列表,以下屬性
list:指定下拉列表框的選項(xiàng)
listKey
listValue
multiple:是否允許多選
5、optgroup標(biāo)簽
生成一個(gè)下拉列表框的選項(xiàng)組,該標(biāo)簽必須放在<s:select…>標(biāo)簽下使用

<s:select name="b" label="你最喜歡什么書?" labelposition="top" list="#bs.books" listKey="author" listValue="name"> <s:optgroup label="IT" list="#{'book4':'d','book5':'e'}" listKey="value" listValue="key"/> <s:optgroup label="life" list="#{'book6':'df'}" listKey="value" listValue="key"/> </s:select>


6、head標(biāo)簽
該標(biāo)簽用于生成對(duì)這些css和javascript代碼的引用
7、updownselect標(biāo)簽
與select的區(qū)別是該標(biāo)簽生成的額列表框可以上下移動(dòng)選項(xiàng),除了可以指定listKey和listValue屬性外,還有以下幾個(gè)屬性
1、allowMoveUp:是否顯示上移按鈕,默認(rèn)為true
2、allowMoveDown:是否顯示下移按鈕,默認(rèn)為true
3、allowSelectAll:是否顯示全選按鈕,默認(rèn)為true
4、moveUpLabel:設(shè)置上移按鈕上的文本,默認(rèn)為^
5、moveDownLabel:設(shè)置下移按鈕上的文本,默認(rèn)為v
6、selectAllLabel:設(shè)置全選按鈕上的文本,默認(rèn)為*
8、doubleselect標(biāo)簽
生成一個(gè)級(jí)聯(lián)列表框(生成兩個(gè)下拉列表框),當(dāng)選擇第一個(gè)下拉列表框時(shí),第二個(gè)內(nèi)容也會(huì)隨著而動(dòng)
需要指定兩個(gè)下拉列表框的選項(xiàng)
以下屬性:
list:指定輸出第一個(gè)下拉列表框的選項(xiàng)的集合
listKey
listValue
doubleList:指定輸出第二個(gè)下拉列表框選項(xiàng)的集合
doubleListKey
doubleListValue
doubleName

<s:form action="check"> <s:doubleselect name="ab" label="你喜歡的圖書" list="{'李剛','david'}" doubleName="ba" doubleList="top=='李剛'?{'輕量級(jí)java','瘋狂ios講義','瘋狂java講義'}:{'javascript'}"/> </s:form>


9、optiontransferselect標(biāo)簽
生成兩個(gè)列表選擇框,并生成系列的按鈕用于控制各選項(xiàng)在兩個(gè)下拉列表之間的移動(dòng)、升降。當(dāng)提交該表單時(shí),兩個(gè)列表選擇對(duì)應(yīng)的請(qǐng)求參數(shù)將被提交
常用屬性
1、addAllToLeftLabel:設(shè)置全部移動(dòng)到左邊按鈕上的文本
2、addAllToRightLabel:設(shè)置全部移動(dòng)到右邊按鈕上的文本
3、addToLeftLabel:設(shè)置向左移動(dòng)按鈕上的文本
4、addToRight:設(shè)置向右移動(dòng)按鈕上的文本
5、allowAddAllToLeft:設(shè)置是否出現(xiàn)全部移動(dòng)到左邊的按鈕
6、allowAddAllToRight:設(shè)置是否出現(xiàn)全部移動(dòng)到右邊的按鈕
7、allowAddToLeft:設(shè)置是否出現(xiàn)移動(dòng)到左邊的按鈕
8、allowAddToRight:設(shè)置是否出現(xiàn)移動(dòng)到右邊的按鈕
9、leftTitle:設(shè)置左邊列表框的標(biāo)題
10、rightTitle:設(shè)置右邊列表框的標(biāo)題
11、allowSelectAll:是否出現(xiàn)選擇全部按鈕
12、selectAllLabel:全部選擇按鈕上的文本
13、doubleList:第二個(gè)下拉選項(xiàng)框的集合
14、doubleListKey:第二個(gè)下拉選項(xiàng)框的選項(xiàng)的value值
15、doubleListLabel:第二個(gè)下拉選項(xiàng)框選項(xiàng)的lable屬性
16、doubleName:第二個(gè)下拉選項(xiàng)框的name屬性
17、doubleValue:第二個(gè)下拉選項(xiàng)框的value屬性
18、doubleMultiple:第二個(gè)下拉選項(xiàng)框是否允許多選
19、list
20、listKey
21、listValue
22、name
23、value
24、multiple

<s:optiontransferselect name="cnbook" label="請(qǐng)選擇你喜歡的圖書" leftTitle="中文圖書" rightTitle="中文圖書" list="{'瘋狂的講義','輕量級(jí)javaee'}" multiple="true" headerKey="cnKey" headerValue="選擇中文圖書" emptyOption="true" doubleList="{'abc'}" doubleName="enBook" doubleHeaderKey="enKey" doubleHeaderValue="選擇外文圖書" doubleMultiple="true" />


10、token標(biāo)簽
用于防止重復(fù)提交表單的標(biāo)簽,(避免刷新頁面重復(fù)提交)
要使該標(biāo)簽起作用,在struts.xml文件中啟用TokenInterceptor攔截器或者TokenSeesionStoreInterceptor攔截器
實(shí)現(xiàn)原理是在表單中增加一個(gè)隱藏域,每次加載頁面時(shí),該隱藏域的值都不相同,如果兩次請(qǐng)求時(shí)對(duì)應(yīng)的隱藏域相同,則阻止表單提交(前一次值會(huì)保存在session中)
注:生成的隱藏域默認(rèn)name是struts.token。
使用分成兩步:在jsp中加入<s:token />
配置action啟用攔截器,(并為invalid.token指定物理視圖資源)
注:使用token攔截器,必須顯示配置使用defaultStack攔截器,否則不會(huì)默認(rèn)生效。

非表單標(biāo)簽

主要用于在頁面中顯示action封裝的信息
1、actionerror:action實(shí)例getActionError()不返回null,該標(biāo)簽輸出系列錯(cuò)誤
2、actionmessage:實(shí)例getActionMessage()不返回null,該標(biāo)簽輸出系列信息
3、component:用于創(chuàng)建自定義視圖
4、fielderror:輸出表單域的類型轉(zhuǎn)換錯(cuò)誤、檢驗(yàn)錯(cuò)誤提示

總結(jié)

以上是生活随笔為你收集整理的使用Struts2标签的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。