Struts 1 之html标签库
<html:html>標(biāo)簽
?<html:html>標(biāo)簽用于在網(wǎng)頁(yè)開頭生成HTML的<html>元素,它只有一個(gè)用于顯示用戶語(yǔ)言的lang屬性: <html:html lang="true">
有時(shí)候由于tld文件的版本問(wèn)題(新的版本將locale改為lang),導(dǎo)致在訪問(wèn)該頁(yè)面時(shí)會(huì)報(bào)如下錯(cuò)誤:
Unable to findsetter method for attribute: lang
即沒有找到這個(gè)<html:html ?lang="true">標(biāo)簽的lang屬性
解決方案:
將
<html:html lang="true" >改為
<html:html locale="true">或刪除(依據(jù)情況)
<html:html locale="true"><head><title>Welcome</title></head><body>Hello World!</body> </html:html>生成
<html lang="en"><head><title>Welcome</title></head><body>Hello World!</body> </html>注意,<html:html locale=“true”>中的locale屬性在生成的HTML頁(yè)面中被轉(zhuǎn)換成了lang=“en”。生成的結(jié)果取決于Struts應(yīng)用程序所位于的服務(wù)器的locale。如果你將應(yīng)用程序部署到一個(gè)不同locale的服務(wù)器,你不需要改變代碼。Locale會(huì)自動(dòng)調(diào)整
<html:base>標(biāo)簽
?<html:base>標(biāo)簽在網(wǎng)頁(yè)的<head>部分生成HTML<base>元素。HTML<base>元素用于生成當(dāng)前網(wǎng)頁(yè)的絕對(duì)URL路徑。
如果在網(wǎng)頁(yè)中使用了<html:base>標(biāo)簽,當(dāng)該網(wǎng)頁(yè)引用同一個(gè)應(yīng)用的其他網(wǎng)頁(yè)時(shí),只需給出相對(duì)于當(dāng)前網(wǎng)頁(yè)的相對(duì)URL路徑即可。
<html:link>和<html:rewrite>標(biāo)簽
<html:link>標(biāo)簽用于生成HTML <a> 元素。<html:link> 在創(chuàng)建超鏈接時(shí),有兩個(gè)優(yōu)點(diǎn):
(1) 允許在URL 中以多種方式包含請(qǐng)求參數(shù)。
(2) 當(dāng)用戶瀏覽器關(guān)閉Cookie時(shí),會(huì)自動(dòng)重寫URL,把SessionID 作為請(qǐng)求參數(shù)包含在URL 中,用于跟蹤用戶的Session 狀態(tài)。
?
<html:link>標(biāo)簽有以下重要屬性:
(1) forward:指定全局轉(zhuǎn)發(fā)鏈接。
(2) href:指定完整的URL 鍵接。
(3) page:指定相對(duì)于當(dāng)前網(wǎng)頁(yè)的URL。
?
<html:rewrite>用于輸出超鏈接中的URI部分,但它并不生成HTML<a> 元素。URI指的是URL 中協(xié)議、主機(jī)和端口以后的內(nèi)容。URI 用于指定具體的請(qǐng)求資源。例如,對(duì)于URL:HTTP://localhost:8080/HtmlBasic.do,它的URI為/HtmlBasic.do
html:rewriter避免了硬編碼,即便是把web.xml中的action映射路徑*.do改為其他的,用了這個(gè)標(biāo)簽可以自動(dòng)生產(chǎn)正確路徑這個(gè)是其他JSTL標(biāo)簽所做不到的,常用在form表單的action屬性里,如
<form action="<html:rewriter action="/register"/>“ method="post">
?
示例:
1、創(chuàng)建全局轉(zhuǎn)發(fā)鏈接
??? 首先,在Struts-config.xml中<global-forwards> 元素中定義一個(gè)<forward>元素:
<global-forwards><forward name = "index"path="/index.jsp"/></global-forwards>??? 接著,在JSP 文件中創(chuàng)建<html:link>標(biāo)簽:
? ??
<html:link forward="index">Link to Global ActionForward </html:link>??? <html:link> 標(biāo)簽的forward 屬性和<global-forwards>元素中的<forward> 子元素匹配。以上代碼生成如下HTML 內(nèi)容:
? ??
<a href="/index.jsp">Linkto Global ActionFoward</a>??? 值得注意的是,<html:link>的forward 屬性只引用Struts-config.xml 配置文件中<global-forwards>內(nèi)的<forward> 子元素,如果引用<action>內(nèi)的<forward> 子元素,在運(yùn)行時(shí)將會(huì)拋出異常:
??? Cannot create rewrite URL:Java.Net.MalfomedURlException: Cannot retrieve ActionForward
2、創(chuàng)建具有完整URL 的鏈接
??? 如果Web 應(yīng)用需要鏈接到其他站點(diǎn),應(yīng)該給出其他站點(diǎn)完整URL,例如:
? ??
<html:link href="http://jakarta.apache.org/struts/index.html">Generate an "href" directly </html:link>??? 生成HTML 代碼如下:
? ??
<a href="http://jakarta.apache.org/struts/index.html">Generate an"href" directly</a>??? 值得注意的是,如果指定了<html:link>標(biāo)簽的href 屬性,即使用戶瀏覽器的Cookie 關(guān)閉,<html:link> 標(biāo)簽也不會(huì)把用戶SessionID 作為請(qǐng)求參數(shù)加和到URL 中。
?
3、從當(dāng)前網(wǎng)頁(yè)中創(chuàng)建相對(duì)URL
??? 如果從一個(gè)網(wǎng)頁(yè)鏈接到同一個(gè)應(yīng)用中的另一網(wǎng)頁(yè),可以采用以下方式:
? ??
<html:link page="/HtmlBasic.do">A relative link from this page </html:link>??? <html:link> 標(biāo)簽的 page 屬性用于指定相對(duì)于當(dāng)前應(yīng)用的URI。以上代碼生成如下HTML 內(nèi)容:
? ?
<a href="/lib/HtmlBasic.do">......</a>?4、在URL 或 URI 中包含請(qǐng)求參數(shù)
??? 如果要在URL或URI 中包含請(qǐng)求參數(shù),只要把請(qǐng)求參數(shù)加在URL 或 URI的末尾就可以了。例如:
? ??
<html:link page="/HtmlBasic.do?prop1=abc&prop2=123">Hard-code the url parameters</html:link><!-- or --><html:rewrite page="/HtmlBasic.do?prop1=abc&prop2=123"/>??? 以上代碼生成如下HTML 內(nèi)容:(如果不帶“/”,則不會(huì)附帶上contextPath)
? ??
<a href=/lib/HtmlBasic.do?prop1=abc&prop2=123">......</a>??? rewrite: /HtmlBasic.do?prop1=abc&prop2=123
?
??? 提示:在HTML 中& 代表特殊字符"&"
?
5、在URL 或 URI 中包含單個(gè)請(qǐng)求變量
?????????????????
如果要在URL 中包含一個(gè)請(qǐng)求參數(shù),而這人參數(shù)的值存在于當(dāng)前網(wǎng)頁(yè)可訪問(wèn)的一個(gè)變量中,可以按以下方法來(lái)實(shí)現(xiàn)。
為了演示這一功能,首先創(chuàng)建一個(gè)當(dāng)前網(wǎng)頁(yè)可訪問(wèn)的變量。例如,本例中創(chuàng)建了兩個(gè)變量,一個(gè)是字符類型,一個(gè)是CustomerBean ,它們存存于一個(gè) page 范圍內(nèi):
? ??
<%/** Create a string object to store as abean in* the page content and embed in thislink*/String stringBean = "Value to Passont URL";pageContext.setAttribute("stringBean", stringBean);%><jsp:useBean id ="customerBean" scope="page"class="htmltaglibs.beans.CurstomerBean"/><jsp:setProperty name="customerBean" property="name"value="weiqin"/>??????? 接著,把這兩個(gè)變量作為請(qǐng)求參數(shù),加入到URL或URI 中:
? ?
<html:link page="/HtmlBasic.do"paramId="urlParamName"paramName="stringBean">URL encode a parameter based on astring bean value</html:link><html:link page="/HtmlBasic.do"paramId="urlParamName"paramName="customerBean"paramProperty="name">URL encode a parameter based on acustomer bean value</html:link>rewrite: <html:rewrite page="/HtmlBasic.do" paramId="urlParamName" paramName="stringBean"/>rewrite: <html:rewrite page="/HtmlBasic.do" paramId="urlParamName" paramName="customerBean" paramProperty="name"/>?
??? <html:link> 標(biāo)簽的 paramId 屬性指定請(qǐng)求參數(shù)名,paramName屬性指定變量的名字。如果變量為JavaBean ,用paramProperty 屬性指定JavaBean 的屬性。
??? 對(duì)于本例的stringBean,請(qǐng)求參數(shù)值為stringBean的字符串值。對(duì)于customerBean,指定了paramProperty 屬性,請(qǐng)求參數(shù)值為customerBean 的 name 屬性值。
??? 以上代碼生成如下HTML 內(nèi)容:
? ??
<a href="/HtmlBasic.do?urlParamName=Value to Pass on Url">Url encode a paramter based on a stringbean value</a><a href="/HtmlBasic.do?urlParamName=weiqin">url encode a parameter based on acustomer bean value</a>rewrite: /HtmlBasic.do?urlParamName=Value toPass on Urlrewrite: /HtmlBasic.do?urlParamName=weiqin6、在URL 或 URI 中包含多個(gè)請(qǐng)求變量
??? 如果在URL 或 URI 中包含多個(gè)請(qǐng)求參數(shù),而這些參數(shù)的值來(lái)自多個(gè)變量,需要先定義一個(gè)Map類型的java 類,如java.util.HashMap,用它來(lái)存放請(qǐng)求變量。例如:
? ??
<%/** Strore values int a Map(HashMap inthis case)* and construct the URL based on theMap* /java.util.HashMap myMap = newjava.util.HashMap();myMap.put("myString", newString("myStringValue"));myMap.put("myArray" , newString[]{"str1","str2","str3"} );pageContext.setAttribute("map", myMap);%>??? 在以上代碼的HaspMap 中存放了兩個(gè)對(duì)象,其中第二個(gè)對(duì)象是個(gè)字符串?dāng)?shù)組。HashMap 被存放在PageContext 中。接下來(lái)就可以把這個(gè)HashMap 作為請(qǐng)求參數(shù),加入到URL 或 URI 中:
? ??
<%-- For this version of the<html:link> tag: --%><%-- map = a map with name/value pairs topass on the url --%><html:link page="/HtmlBasic.do" name="map">URL encode a parameter based on valuein a Map</html:link><%-- Create the same rewrite string forthe above link. --%>rewrite:<html:rewrite page="/HtmlBasic.do" name="map"/>?
??? <html:link> 標(biāo)簽的name 屬性指定包含請(qǐng)求變量的HashMap對(duì)象。HashMap 對(duì)象中的每一對(duì)"key/value" 代表一對(duì)或多對(duì)"請(qǐng)求參數(shù)名/請(qǐng)求參數(shù)值"。以上代碼生成如下的Html 內(nèi)容:
? ??
<a href="/HtmlBasic.do?myString=myStringValue&myArray=str1&myArray=str2&myArray=str3">URL encode a parameter based on valuein a Map</a>rewrite:/HtmlBasic.do?myString=myStringValue&myArray=str1&myArray=str2&myArray=str3<html:img>標(biāo)簽
生成基本的HTML<img>元素
<html:img page="/struts-power.gif"/>生成 html代碼如下:
<img src="/htmltaglibs/struts-power.gif">?<html:form>標(biāo)簽
<html:form action="FormBasic.do">??????? 生成html代碼:
<form name="FormBasicAction" mothod="post"action="/htmltaglibs/FormBasic.do/">Struts將參照Struts配置文件來(lái)查找相應(yīng)的Action組件,在struts-config.xml文件中,與"FormBasic.do"對(duì)應(yīng)的代碼為:
<action path="/FormBasic"type="htmltaglibs.actions.FormBasicAction"name="FormBacsicForm"scope="session"input="/FormBasic.jsp"validate="false"><foreard name="success"path="/FormBasic.jsp"> </action><html:text>、<html:textarea>、<html:password>標(biāo)簽
在表單上創(chuàng)建HTML文本框字段。如下:
<html:text property="userName">因?yàn)橹付艘粋€(gè)userName的屬性名,它應(yīng)該匹配ActionForm中的一個(gè)屬性,所一在FormBasicForm 中也必須有uerName這個(gè)屬性和相應(yīng)的getter(),setter()方法。當(dāng)表單提交時(shí),struts框架會(huì)把userName字段的內(nèi)容賦給form的userName屬性。
<html:textarea>、<html:password>標(biāo)簽與之類似
<html:cancel>標(biāo)簽
<html:cancel>標(biāo)簽在表單中生成取消按鈕,當(dāng)用戶按下取消按鈕使,將產(chǎn)生一個(gè)取消事件,這個(gè)事件由Action類來(lái)捕獲,至于如何處理這個(gè)事件,可以在Action類的execute()方法中編程來(lái)完成。
<html:submit>、<html:button>、<html:reset>標(biāo)簽
<html:submit>Submit</html:submit>其余類似
<html: hidden>標(biāo)簽
?在表單上生成隱藏字段,存放用戶不希望看到和不允許修改的信息:如下兩種方式:
<html:hidden property="userName">生成Html:
<input type="hidden" name="userName"value="propValue"><html:checkbox>標(biāo)簽
<html:checkbox>標(biāo)簽在表單上生成標(biāo)準(zhǔn)的HTML檢查框,例如ActionFormBean 中的某個(gè)屬性只有兩種可選值(如true和false),就可以在表單中用<html:checkbox>標(biāo)簽來(lái)表示。<html:checkbox>的使用方法為:
<html:checkbox property="ch1"/>生成HTML代碼:
<input type="checkbox"name="cb1" value="true"><html:checkbox>有一個(gè)value屬性,用來(lái)設(shè)置用戶選中檢查框時(shí)的值,value的默認(rèn)值為true,可以用以下方式改變value屬性:
<html:checkbox property="ch1" value="true"/>以上代碼說(shuō)明當(dāng)用戶選擇了這個(gè)檢查框,就把相應(yīng)Bean中的ch1屬性設(shè)置為true.
其實(shí)這樣也會(huì)容易讓人搞混,例如當(dāng)value="false"時(shí),如果用戶沒有選擇這個(gè)檢查框,就把Bean中對(duì)應(yīng)的屬性設(shè)置為true.
為了檢查框能正常工作,必須在Bean的reset()方法中對(duì)其進(jìn)行復(fù)位,當(dāng)<html:checkbox>的 value屬性為true時(shí),必須在reset()方法中把對(duì)應(yīng)的屬性設(shè)置為false.當(dāng)<html:checkbox>的 value屬性為false時(shí),必須在reset()方法中把對(duì)應(yīng)的屬性設(shè)置為true.
<html:multibox>標(biāo)簽
<html:multibox>標(biāo)簽和<html:checkbox>一樣,可以提供html<inputtype="ch1">元素,區(qū)別在于<html:multibox>可以生成復(fù)選框,它和Form 的關(guān)聯(lián)方式不一樣。
如果應(yīng)用中有多個(gè)CheckBox,并且希望在Form中用單個(gè)數(shù)組來(lái)表示它們,就可以采用<html:multibox>.<html:multibox>的使用方法如下:
1、在Form中定義一個(gè)數(shù)組,來(lái)存放所有的 CheckBox的值:
private String strArray[]=new String[0]; public String[] getStrArray(){return (this.strArray);} public void setStrArray(String strArray[]){this.strArray=strArray;}2、其次在表單中加入<html:multibox>元素,通過(guò)設(shè)置property="strArray"來(lái)把它和Form中的數(shù)組關(guān)聯(lián)。
3、對(duì)于每個(gè)<html:multibox>元素,設(shè)置它的初始值,有以下兩種方式:
?
<html:multibox property="strArray" value="Value1"/>或
?
<html:multibox property="strArray">Value2</html:multibox>當(dāng)用戶提交表單時(shí),所有被選中的復(fù)選框的值都會(huì)被存放在Form中的相應(yīng)數(shù)組中。如果某個(gè)復(fù)選框沒有被選中,那么數(shù)組就不會(huì)包含它的值,例如,如果用戶選擇了上例的兩個(gè)復(fù)選框,那么數(shù)組的內(nèi)容為{"Value1","Value2"}.
<html:radio>標(biāo)簽
<html:radio>標(biāo)簽提供HTML<inputtype="radio">元素,表示單選按鈕,多個(gè)<html:radio>標(biāo)簽可以成組使用,如下:
? ? ?
<html:radio property="r1"value="v1"/> <html:radio property="r1"value="v2"/>以上標(biāo)簽的property屬性相同,而僅僅是value不同,它們都和Form中的V1屬性對(duì)應(yīng),生成的HTML如下:
? ? ?
<input type="radio"name="r1" value="v1"> <input type="radio"name="r1" value="v2">?<html:select>標(biāo)簽
?<html:select>標(biāo)簽生成HTML<select>元素。它可以在表單上創(chuàng)建下拉列表或多選列表。在<html:select>標(biāo)簽中可以包含多個(gè)<html:option>,<html:options>和<html:optionCollection>標(biāo)簽。<html:select>標(biāo)簽的基本形式為:
??
<html:select property="name" multiple="true" size="6">[one or more<html:option/>,<html:options/>,<html:optionsCollection/>tags]</html:select>
<html:select>標(biāo)簽有以下重要屬性:
size屬性:指每次在網(wǎng)頁(yè)上顯示的可選項(xiàng)的數(shù)目。
multiple屬性:指定是否支持多項(xiàng)選擇,如果設(shè)置為true,就表示多選列表,支持多項(xiàng)選擇;否則表示下拉列表,只支持單項(xiàng)選擇,默認(rèn)為false.
property屬性:與ActionFormBean中的對(duì)應(yīng)屬性對(duì)應(yīng),這個(gè)屬性用來(lái)存放用戶在列表上選中選項(xiàng)的值,在單選的情況下,Bean中的對(duì)應(yīng)屬性應(yīng)該定義為簡(jiǎn)單類型(不能為數(shù)組)。在多項(xiàng)選擇的情況下,Bean中的對(duì)應(yīng)屬性應(yīng)該定義為數(shù)組類型,以便存放用戶選擇的多個(gè)選項(xiàng)。
value屬性:select的默認(rèn)選中屬性。動(dòng)態(tài)的多用EI表達(dá)式生成
?
例如:在 cust.jsp中的客戶列表為下拉列表,顏色列表為多選列表:
? ? ?
<html:select property="custId" /> <html:select property="colors" multiple="true" size="6"/>對(duì)應(yīng)的Bean為:
? ? ?
private int custId;private String colors[];public String[] getColors() {return colors;}public void setColors(String[] colors) {this.colors = colors;}public int getCustId() {return custId;}public void setCustId(int custId) {this.custId = custId;}<html:option>標(biāo)簽
<html:option>標(biāo)簽生成HTML<option>元素,這個(gè)標(biāo)簽被嵌套在<html:select>標(biāo)簽中,代表列表的一個(gè)可選項(xiàng),它的label有兩個(gè)來(lái)源:
??? 在<html:option>和</html:option>之間的文本內(nèi)容。
??? 由<html:option>標(biāo)簽的key,locale和bundle屬性指定的ResourceBundle中的內(nèi)容。
1、在<html:option>和</html:option>之間的文本內(nèi)容
? ? ? ??
<html:option value="a.orange">Orange</html:option> <html:option value="a.purple">Purple</html:option>2、由<html:option>標(biāo)簽的key,locale和bundle屬性指定的ResourceBundle中的內(nèi)容
ApplicationResources.properties資源文件中存在如下鍵值對(duì):a1=happySelect
?
標(biāo)簽中通過(guò)key關(guān)聯(lián)到資源文件,指定要顯示內(nèi)容。
<html:option value="1" key="a1" /> 這樣在頁(yè)面上顯示出happySelect
?
通過(guò)key,bundle同時(shí)指定要顯示的內(nèi)容
?
bundle與Struts配置文件中<message-resources>元素配置的ResourceBundle的資源文件key匹配
?
<message-resources parameter="com.struts.happy" key="happyhtml"/><html:option value="1" bundle="happyhtml" key="a1" />
這樣在頁(yè)面上顯示出happySelect
把列表的可選項(xiàng)的顯示文本存放在ResourceBundle中,而不是直接在JSP文件中指定,有利于實(shí)現(xiàn)國(guó)際化。
<html:options>、<html:optionCollection>標(biāo)簽
<html:options>標(biāo)簽提供一組HTML<option>元素。在<html:select>中可以包含多個(gè)<html:options>元素,如下:
使用coolection屬性指定存在某個(gè)范圍中的集合來(lái)生成列表項(xiàng),注意coolection屬性指定的集合,該對(duì)象的每一個(gè)元素為一個(gè)Bean
例如有如下實(shí)體類
將實(shí)體類實(shí)例放入ArrayList列表然后放入reqeust范圍內(nèi)
?
Users u1=new Users("1","高中");Users u2=new Users("2","本科");Users u3=new Users("3","碩士");Users u4=new Users("4","博士");ArrayList array=new ArrayList();array.add(u1);array.add(u2);array.add(u3);array.add(u4);request.setAttribute("xueli",array);?
使用
<html:options>標(biāo)簽生成可選項(xiàng)
<html:select property="xueli" multiple="true" size="3"> <html:optionscollection="xueli"property="userName"labelProperty="userValue"/> </html:select>等價(jià)于 <html:optionsCollectionname="xueli"value="userName"label="userValue"/> </html:select>
collection指定存放在request范圍內(nèi)的集合?
property指定<html:option>實(shí)際值
labelProperty指定<html:option>顯示到頁(yè)面上的文本。
當(dāng)使用property屬性和labelProperty屬性時(shí),會(huì)根據(jù)屬性指定的名稱調(diào)用相應(yīng)Bean中的getXXX方法來(lái)獲得屬性值。
生成HTML效果如下
?
<option value="1">高中</option> <option value="2">本科</option> <option value="3">碩士</option> <option value="4">博士</option>
利用name屬性指定存放在某個(gè)范圍中的對(duì)象,并有property屬性指定該對(duì)象的某個(gè)屬性來(lái)生成列表項(xiàng)。
例如
?
Object[] obj=new Object[]{"高中","本科","碩士","博士"};request.setAttribute("xueli",array);? <html:options name="xueli"/>生成HTML效果如下:?
<option value="高中">高中</option> <option value="本科">本科</option> <option value="碩士">碩士</option> <option value="博士">博士</option>?如果
<html:options name="xueli" property="userName" labelProperty="userValue"/>?將報(bào)如下異常
javax.servlet.jsp.JspException:No getter method available for property userName for bean under name xueli
<html:file>標(biāo)簽
<html:file property="file"/>
當(dāng)然了在做的同時(shí)還要注意以下幾點(diǎn),否則就會(huì)出問(wèn)題:
?1.<html:file>標(biāo)簽必須嵌套在<html:form>標(biāo)簽中。
?2.<html:from>標(biāo)簽的method屬性必須設(shè)置為"POST".
?3.<html:from>標(biāo)簽的編碼類型enctype屬性必須為"multipart/form-data".
?4.<html:file>標(biāo)簽必須設(shè)置為property屬性,這個(gè)屬性和Bean中FormFile類型的屬性對(duì)應(yīng)。
?
總結(jié)
以上是生活随笔為你收集整理的Struts 1 之html标签库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 高级Web前端必会面试题知识点,大厂面试
- 下一篇: java中getAttribute和ge