JSP Struts
之
HTML
標簽庫詳解
Struts
提供了五個標簽庫,即:
HTML
、
Bean
、
Logic
、
Template
和
Nested
。
?標簽庫
|
?說明
|
?HTML
標簽
|
?用來創建能夠和Struts 框架和其他相應的HTML 標簽交互的HTML 輸入表單
|
?Bean
標簽
|
?在訪問JavaBeans 及其屬性,以及定義一個新的bean 時使用
|
?Logic
標簽
|
?管理條件產生的輸出和對象集產生的循環
|
?Template
標簽
|
?隨著Tiles框架包的出現,此標記已開始減少使用
|
?Nested
標簽
|
?增強對其他的Struts 標簽的嵌套使用的能力
|
?
標簽的公共特征
?
使用固定屬性名稱的
Struts
標簽:
?屬性
|
?說明
|
?id
|
?命名自定義標簽創建時的腳本變量名。
|
?name
|
?指出關鍵字值,在該關鍵字下可以找到一個存在的bean 。如果給出了scope屬性,則僅僅在scope中查找。否則,根據標準的順序在各種scope中查找:(page, request, session, or application)。
|
?property
|
?指出bean 中的某個屬性,可以在其中檢索值。如果沒有標明,則使用對象本身的值。
|
?scope
|
?定義了Bean在哪個范圍(page, request, session, or application)中被查找。如果沒有標明按順序查找。腳本變量(見id)將在相同的范圍中創建。
|
?
Struts
標簽也支持嵌套引用,例如:
Property="foo.bar.baz"
這相當于進行下面的調用:
getFoo().getBar().getBaz()
;
或者做為
setter
:
getFoo().getBar().setBaz(value)
;
|
?
雖然
Struts
標簽的設計原意是為了避免使用
scriptlet
,
scriptlet
的表達式還能夠提供給所有的
Struts
標簽使用。但請確保使用完整的表達式
:
?錯誤: ?<html:link href="'<%= "/" + name %>/index.jsp>'> ? ?正確: ?<html:link href="'<%= "/" + name + "/index.jsp" %>'>??? // 表達式必須提供整個屬性值
|
?
?
Html
標簽庫
1.???????
<html>
標簽
它有兩個屬性:
locale
和
xhtml
,兩者都不是必需的。
?<html:html?locale=\"true\">
?
此行代碼解析后:
?<html?lang=\"en\">
|
2.???????
說明:生成的結果取決于
Struts
應用程序所位于的服務器的
locale
。如果你將應用程序部署到一個不同
locale
的服務器,你不需要改變代碼,
Locale
會自動調整。
3.???????
<base>
標簽:表示所包含頁面的絕對位置。這個標簽只有內嵌在
head
標簽中才有效。
?<html:base/>
?
此行代碼解析后:
?<base?href=\"http://www.mymain.com/myStrutsApp/testing.jsp\">
|
4.???????
<img>
標簽
最重要的屬性
page
:圖象文件的路徑,前面必須帶有一個斜線。
其它屬性:
heignt
、
width
、
alt
。
??<html:img?page=\"/logo.gif\"?height=\"50\"? width=\"200\"?alt=\"Web?Logo\"/>
|
5.???????
<link>
標簽
?<html:link?page=\"/index.html\">Click?demo</html:link>
?
此行代碼解析后:
??<a?href=\"/index.html\">Click?demo</a>
|
6.???????
<errors>
標簽:通過一個簡單的
<html:errors/>
標簽,你就可以在一個
JSP
頁面上顯示完全自定義的錯誤信息。功能超強大!!
說明:這個標簽在
Request
對象的屬性集合中查找
reserved?key
。如果它找到一個
reserved?key
,它就假設這個
key
是一個
String
、或是一個
String
數組
??
????? ?
(它包含在模塊的
MessageResources
中查找的
message?keys
)、或是類型為
org.apache.struts.action.ActionErrors
的一個對象。
???????? ?
如果在應用程序資源中存在相應的信息,那么就可以用下面這些可選的
message?keys
:
??
??????? ?·?errors.header??or? errors.prefix
:相應的信息在錯誤信息的單獨列表前顯示。
?
??????? ?·?errors.footer or? errors.suffix
:相應的信息在錯誤信息的單獨列表后顯示。
7.???????
<form>
標簽系列
使用
<form>
標簽時必須遵循一些規則:
1.??????
標簽中必須包含一個
action
屬性,它是這個標簽中唯一必需的屬性。如果不具備該屬性則
JSP
頁面會拋出一個異常。之后你必須給這個
action
屬性指定一個有效值。一個有效值是指應用程序的
Struts
配置文件中元素里的任何一個子元素的訪問路徑。而且相應的元素中必須有一個
name
屬性,它的值是
form?bean
的名稱。
?<html:form?action=\"/login\"?>?
?
如果你有上述一個標簽?,那么你的Struts配置文件的元素中必須有一個如下顯示為粗體的元素:? <action-mappings>? ?????<action?path=\"/login\"? ??????type=\"com.javapro.struts.LoginAction\"?? ??????name=\"loginForm\" ??????scope=\"request\" ??????input=\"/login.jsp\"> ??????<forward?name=\"success\"?path=\"/mainMenu.jsp\"/> ????</action> ????. ????. ????. </action-mappings>? // 這就是說一個form標簽是和form?bean相關聯的。
|
2.?????? ?
3.??????
任何包含在
<form>
中用來接收用戶輸入的標簽(
<text>
、
<password>
、
<hidden>
、
<textarea>
、
<radio>
、
<checkbox>
、
<select>
)必須在相關的
form?bean
中有一個指定的屬性值。比如,如果你有一個屬性值被指定為
“username”
的
<text>
標簽,那么相關的
form?bean
中也必須有一個名為
“username”
的屬性。輸入
<text>
標簽中的值會被用于生成
form?bean
的
userName
屬性。
<form>
標簽還有一些不是必須但很有用的
“
次要
”
屬性。
比如,你可以用
focus
屬性來生成
JavaScript
,它會
“
定焦
”
(
focus
)到該
form
所包含的一個元素上。使用
focus
屬性時你需要給它指定元素的名稱。
?<body> ?<html:form?action=\"/login\"?focus=\"password\"> ?User?Name:?<html:text?property=\"userName\"/> ?<br>Password:?<html:text?property=\"password\"/> ?<br><html:submit/> ?</html:form> ?</body>
?
代碼解析后:
?<body> ?<form?name=\"loginForm\"?method=\"post\"? action=\"/myStrutsApp/login.do\"> ?User?Name:?<input?type=\"text\"?name=\"userName\"? value=\"\"> ?<br>Password:?<input?type=\"text\"? name=\"password\"?value=\"\"> ?<br><input?type=\"submit\"? ?value=\"Submit\"> ?</form> ?<script?language=\"JavaScript\"? type=\"text/javascript\"> ??<!-- ? if?(document.forms[\"loginForm\"].elements[\"password\"].type?!=?\"hidden\")? ?????? document.forms[\"loginForm\"].elements[\"password\"].focus() ??//?--> ?</script>
?</body>
|
有沒有看到這個標簽庫是如何建立
JavaScript
來定焦到
password
元素上的
??
這也是該庫讓人著迷的地方之一。你不用擔心如何在客戶端進行編程,它會幫你自動生成。
還可以看到,
<form>
標簽中
method
屬性的缺省值是
POST
。
<text>
標簽、
<hidden>
標簽、
<textarea>
標簽、
<radio>
標簽、
<checkbox>
標簽、
<submit>
標簽、
<reset>
標簽:
都有一個
property
屬性,最后會被轉換成
HTML
中的
name
屬性,當然還有
name
和
value
屬性。
<password>
標簽
??<html:password?property=\"password\"??redisplay=\"false\"/>
|
該標簽中的一個很重要的屬性是
"redisplay"
,它用于重新顯示以前輸入到這個區域中的值。該屬性的缺省值為
true
。然而,為了使
password
不能被重新顯示,你或許希望將該屬性的值設為
false
。
<select>
標簽和
<option>
標簽:
?
?<html:select?property=\"color\"?size=\"3\"> ??<html:option?value=\"r\">red</html:option> ??<html:option?value=?\"g\">green</html:option> ??<html:option?value=?\"b\">blue</html:option> ?</html:select>
|
遺補
:
1.)<html:link>
標簽
forward
屬性:鏈接到一個
global forward
上;
action
屬性:鏈接到一個
action mapping
上;
href
屬性:這個鏈接會轉發給控制器,由控制器做決定;
page
屬性:一個相對的鏈接。
用
page
屬性鏈接到
action
上:
??<html:link page="/html-link.do"> ?? Linking with the page attribute. ?</html:link>
|
注意,上面的代碼中你不必指定
web
的關聯。相反的,如果你使用
href
屬性,你就必須像下面所示指出
web
的關聯
(
這里的關聯就是
struts-exercise)
:
?<html:link href="/struts-exercise-taglib/html-link.do"> ?? Using Href ?</html:link>
|
很明顯,當你在相同的
web
應用程序中做鏈接是,它比
page
屬性更加好。你也能用
href
在不同的服務器上創建鏈接:
另一種鏈接到
html-link.do
的方法是用
action
屬性:
?<html:link action="/html-link"> ? Using Action attribute ?</html:link>
|
你也可以以硬編碼的方式使用參數:
?<html:link page="/htmllink.do?doubleProp=3.3&longProp=32"> ?? Double and long via hard coded changes ?</html:link>
|
或者使用
paramId, paramName, and paramProperty
屬性:
?<html:link page="/html-link.do" paramId="booleanProperty" paramName="testbean" ?? paramProperty="nested.booleanProperty"> ?? Boolean via paramId, paramName, and paramValue </html:link>
|
解析后的代碼:
?<a href="/struts-exercise-taglib/html-link.do?booleanProperty=false"> ??? Boolean via paramId, paramName, and paramValue ?</a>
|
另外,還能使用帶
name
屬性的
Map
來實現傳遞多個參數:
?<% java.util.HashMap newValues = new java.util.HashMap(); newValues.put("floatProperty", new Float(444.0)); newValues.put("intProperty", new Integer(555)); newValues.put("stringArray", new String[] { "Value 1", "Value 2", "Value 3" }); pageContext.setAttribute("newValues", newValues); %> ... ?<html:link action="/html-link" name="newValues"> ??? Float, int, and stringArray via name (Map) ?</html:link>
|
你也能夠鏈接到
Map
類型的
action
上,上面的代碼解析后的結果:
?<html:messages property="property2" message="true" id="msg" header="messages.header" footer="messages.footer"> ?<tr><td><%= pageContext.getAttribute("msg") %></td></tr> ?</html:messages>
|
2.) select
和
option
標簽
<html:select>
的屬性:
property
-與
ActionForm
中的某個屬性對應;
size
-顯示
option
的數目;
multiple
-默認為
fales
,表示不能多選,當設定為
true
時,
property
對應的
ActionForm
的屬性必須為數組。
<html:select property="name" size=6 multiple="true">
<html:option>
的屬性:
key
、
local
、
bundle
-指定
Resource Bundle
中的內容。
例如
<html:option value="color1">Orange</html:option>
<html:option value="color1" bundle="htmlselect.Colors" key="htmlselect.red"/>
它和配置文件中的
<message-resources>
元素的
key
屬性匹配
--> <message-resource parmeter="HtmlSelectColors" key="htmlselect.Colors"/>
<message-resource>
中配置的資源文件為
HtmlSelectColors.properties
,相關內容為
htmlselect.red=RED
<html:options>
標簽,提供了一組
<option>
元素,在
<html:select>
元素中可以包含多個
<html:options>
元素。非常靈活,可以取得集合或數組中的值。
例
1 <html:options collection="coll" property="value" labelProperty="label" />
這指在
coll
的集合中存放了
options
,
value
指實際能被提交的值,
label
是顯示給用戶的值。
例
2 <html:options property="value" labelProperty="label" /> collection
屬性不被指定時,將使用表單相關的
form bean
,
form bean
中
value
屬性存放
option value
,
label
屬性值顯示給用戶。
例
3 <html:options name="valueBean" property="values" labelName="labelsBean" labelProperty="labels" />
這個意思是
value
值存放在名為
valueBean
的
bean
的
vlaues
屬性中,它是一個
collection
;
label
值也是同樣的意思。
<html:optionsCollection>
標簽,和
<html:options>
的用法很相似。
例如
<html:select property="custId"><html:optionsCollection property="customers" label="name" value="custId" /></html:select>
這個標簽和
org.apache.structs.util.LabelValueBean
結合的很好,如果把
label
和
value
都放到這個對象中,可以很簡單的這樣應用:
<html:select property="custId"><html:optionsCollection property="customers" /></html:select>
?
?
JSP Struts
之
Bean
標簽庫詳解
Bean
標簽庫
???????
此標簽庫和
Java Bean
有很強的關聯性,設計的本意是要在
JSP
和
JavaBean
之間提供一個接口。
Struts
提供了一套小巧有用的標簽庫來操縱
JavaBean
和相關的對象:
cookie
、
?header
、
?parameter
、
?define
、
write
、
message
、
?include
、
page
、
resource
、
size
、
struts
。
1.???????
bean:cookie
、
bean:header
、
bean:parameter
這三個標簽用來重新得到
cookie, request header
和
request parameter
。
bean:header
和
bean:parameter
標簽定義了一個字符串;
bean:cookie
標簽定義了一個
Cookie
對象。你可以使用
value
屬性做為默認值。如果找不到指定的值,且默認值沒有設定的話,會拋出一個
request time
異常。如果你期望返回多個值的話,可把
multiple
屬性設為
true
。
?<bean:cookie id="sessionID" name="JSESSIONID" value="JSESSIONID-ISUNDEFINED"/> ?//
這段代碼定義了一個名為
sessionID
的腳本變量,如果找不到一個名為
JSESSIONID
的
cookie
,那
sessionID ?//
的值就被設置為
JSESSIONID-ISUNDEFINED
。
|
2.???????
下面代碼會輸出一些
Cookie
對象的一些屬性:
?<jsp:getProperty name="sessionID " property="comment"/> … ?<jsp:getProperty name="sessionID" property="domain"/> … ?<jsp:getProperty name="sessionID" property="maxAge"/> … ?<jsp:getProperty name="sessionID" property="path"/> … ?<jsp:getProperty name="sessionID" property="value"/> … ?<jsp:getProperty name="sessionID" property="version"/> …
|
3.???????
下面是在
request
中輸出所有
header
的例子:?
?<% ??????? java.util.Enumeration names =((HttpServletRequest) request).getHeaderNames(); %> … <% ??????? while (names.hasMoreElements()) { ??????? String name = (String) names.nextElement(); %> <bean:header id="head" name="<%= name %>"/> … <%= name %> … <%= head %> … <% ??????? } %>
|
4.???????
下面是
parameter
的例子:
?<bean:parameter id="param1" name="param1"/> ?<bean:parameter id="param2" name="param2" multiple="true"/>? //
此處定義了一個
param2[]
。
?<bean:parameter id="param3" name="param3" value="UNKNOWN VALUE"/>
|
5.???????
于其它標簽結合使用:
?<bean:header id="browser" name="User-Agent"/> <P>You are viewing this page with: <bean:write name="browser"/></P> ---------------------------------------------------------------------------------------------------------------------------------- <bean:cookie id="username" name="UserName" scope="session" value="New User" /> <P>Welcome <bean:write name="username" property="value"/!</P>? ? //
根據
cookie
創建一個新的
Bean
,如果用戶名稱已經存儲在
cookie
中,它就不顯示為一個新用戶。?
|
6.??????? ?
7.???????
bean:define
:有三個用途。
一是定義新字符串常量:
?<bean:define id="foo" value="This is a new String"/> ?<bean:define id="bar" value='<%= "Hello, " + user.getName() %>'/> ?<bean:define id="last" scope="session" value='<%= request.getRequestURI() %>'/>
|
8.???????
二是復制一個現有的
bean
給新的
bean
:
?<bean:define id="foo" name="bar"/>??? ?<bean:define id="baz" name="bop" type="com.mycompany.MyClass"/>? //定義腳本變量的類型,默認為Object
|
9.???????
三是復制一個現有的
bean
的屬性給新的
bean
:
?<bean:define id="bop" name="user" property="role[3].name"/> ??<bean:define id="foo" name="bar" property="baz" scope="request"? toScope="session"/>? ??//toScope
屬性指新
bean
的
scope
,默認為
page???
|
10.????
上段代碼的意思是把名為
bar
的
bean
的
baz
屬性賦值給
foo
,
foo
的類型為
String(
默認
)
。
11.????
bean:include
這個標簽和
bean:include
標簽和相似,不同點就是它定義了一個可以復用的腳本變量。用
id
屬性命名一個新的腳本變量,還支持
forward
、
href
、
page
和
transaction.
屬性,和
html:link
中的屬性意義一樣。
?<bean:include id="footerSpacer"? page="/long/path/footerSpacer.jsp"/>? ?
然后你能夠在多個地方
(scope
為
page)
調用:
?<bean:write name="footerSpacer" />
|
12.???? ?
13.????
bean:message
用來實現對國際化的支持的一個標簽,配合
java.util
數據包中定義的
Locale
和
ResourceBundle
類來完成這個任務,用
java.text.MessageFormat
類配置消息的格式。
???
首先要指定資源文件的名稱。這個文件會包含用默認語言編寫的在程序中會出現的所有消息,這些消息以
“
關鍵字
-
值
”
的形式存儲。文件需要存儲在類路徑下,路徑要作為初始化參數傳送給
ActionServlet
。
???
實現國際化的規定:所有的資源文件必須都存儲在基本資源文件所在的目錄中。基本資源文件包含的是用默認地區語言
-
本地語言編寫的消息。如果基本資源文件的名稱是
ApplicationResources.properties
,那么用其他特定語言編寫的資源文件的名稱就應該是
ApplicationResources_xx.properties(xx
為
ISO
編碼,如英語是
en)
。因此這些文件應包含相同的關鍵字,但關鍵字的值是用特定語言編寫的。
???
然后,
ActionServlet
的區域初始化參數必須與一個
true
值一起傳送,這樣
ActionServlet
就會在用戶會話中的
Action.LOCALE_KEY
關鍵字下存儲一個特定用戶計算機的區域對象。現在可以運行一個國際化的
web
站點,它可以根據用戶計算機上的設置的區域自動以相應的語言顯示。
使用特定的字符串來替換部分消息:
?在資源文件中的定義:info.myKey = The numbers entered are {0},{1},{2},{3} ?標記的使用:<bean:message key="info.myKey" arg0="5" arg1="6" arg2="7" arg3="8"/> ?Jsp頁面的顯示:The numbers entered are 5,6,7,8? // 最多支持4個參數
|
14.???? ?
15.????
bean:page
:把
Jsp
中的內部對象做為腳本變量。
<bean:page id="requestObj" property="request"/>?
|
16.???? ?
17.????
bean:resource
:獲得應用程序的資源,這個資源可以是一個
String
或從
java.io.InputStream
中讀入。使用
ServletContext.getResource()ServletContext.getResourceAsStream()
方法檢索
web
應用中的資源,如果在檢索資源時發生問題,就會產生一個
ruquest time
異常。?
?<bean:resource id="webxml" name="/WEB-INF/web.xml"/>
|
18.????
使用
input
屬性時,資源會做為一個
InputStream
,如果不指定就被當成一個
String
。
19.????
bean:size
:得到存儲在
array
、
collection
或
map
中的數目,類型為
java.lang.Integer
。
?<bean:size id="count" name="employees" />
|
20.???? ?
21.????
bean:struts
:復制
Struct
對象
(
三種類型
)
給新的
bean
,
scope
為
page
。
?<bean:struts id="form" formBean="CustomerForm"/>??? ?<bean:struts id="fwd" forward="success"/> ?<bean:struts id="map" mapping="/saveCustomer"/>
|
22.???? ?
23.????
bean:write
:以字符串形式輸出
bean
的屬性值。
filter
屬性:設為
true
時,將
HTML
保留字轉換為實體
("<"
轉換為
<);
ignore
屬性:如果對象不存在,不會拋出異常。
?<bean:write name="userRegistration" property="email" scope="request"/>
|
posted on 2007-03-22 22:34
飛鳥 閱讀(590)
評論(0) 編輯 收藏 所屬分類:
Struts