①JSTL (jsp Standard Tag Library ,JSP標準標簽庫)
JSTL標簽庫分為5類:JSTL核心標簽庫、JSTL函數標簽庫、數據庫標簽庫、I18N格式化標簽庫、xml標簽庫。
JSTL的核心標簽庫主要包括:表達式操作、流程控制、迭代操作和URL操作。以下是JSTL常用標簽的用法總結:
一、表達式操作(有out、set、remove、catch,常用out、set)
1、<c:out>
作用:用于顯示數據的內容。語法1:沒有本體內容<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />語法2:有本體內容<c:out value="value" [escapeXml="{true|false}"]> default value</c:out>屬性說明:value:需要顯示出來的值。default:如果value的值為null時,則顯示default指定的值。escapeXml:是否轉換特殊字符,默認為true。即默認會將<、>、’、” 和 & 轉換為 <、>、'、"和&。如果設為false,則不進行轉換。
2、<c:set>作用:用于將變量的值存儲在JSP范圍中或javaBean的屬性中。語法1:將value的值存儲在范圍為scope的varName變量中<c:set value="value" var="varName" [scope="{page|request|session|application}"] />語法2:將本體內容的數據存儲在范圍為scope的varName變量中<c:set var="varName" [scope="{page|request|session|application}"] >...本體內容</c:set>語法3:將value的值存儲在target對象的PRoperty屬性中<c:set value="value" target="target" property="propertyName" />語法4:將本體內容的數據存儲在target對象的property屬性中<c:set target="target" property="propertyName">...本體內容</c:set>屬性說明:value:要被存儲的值。var:欲存入的變量名稱。scope:var變量的JSP范圍。默認為page范圍。target:為一JavaBean或Map對象。
二、控制流程
<c:if>作用:類似if判斷語句,用于表達式判斷。語法1:沒有本體內容<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"] />語法2:有本體內容<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"] />...本體內容</c:if>屬性說明:test:當該屬性中的表達式運算結果為true,則會執行本體內容,為false則不執行,該標簽必須要有test屬性。var:存儲test的運算結果,為true或false。scope:var變量的JSP范圍。
三、迭代操作
<c:forEach>作用:為循環控制,它可以將集合(Collection)中的成員循序瀏覽一遍。運作方式為當條件符合時,就會持續重復執行<c:forEach>的本體內容。語法1:迭代一個集合對象中的所有成員<c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"] />...本體內容</c:forEach>語法2:迭代指定次數<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>...本體內容</c:forEach> 屬性說明:items:被迭代的集合對象。var:存放當前指到的集合對象中的成員。varStatus:存放當前指到的成員的相關信息。(index:當前指到的成員的索引;count:當前總共指到成員的總數;first:當前指到的成員 是否為第一個成員;last:當前指到的成員是否為最后一個成員)。begin:迭代開始的位置,默認為0。end:迭代結束的位置,默認為最后。step:每次迭代的間隔數,默認為1。范例:<% int atts[] = {1,2,3,4,5,6,7,8,9,10}; request.setAttribute("atts", atts); %> <c:forEach items="${atts}" var="item" begin="0" end="9" step="1" > ${item}</br> </c:forEach> 此標簽也可以用于普通的循環控制,與for循環一樣。如:<c:forEach begin="1" end="10" var="item" > ${item}</br> </c:forEach>
四、URL操作
五、l18N格式化標簽庫
②EL表達式
單純在jsp頁面中出現,是在四個作用域中取值,page,request,session,application.如果在struts環境中,它除了有在上面的四個作用域的取值功能外,還能從值棧(valuestack)中取值.
簡單記憶EL表達式的格式為${student.name}
JSTL和EL在JSP中的共同應用如下:
5.<html> 6.<body> 7. <% 8. Map<User,String[]> map = new HashMap<User,String[]>(); 9. String temp[] = new String[2]; 10. User user1 = new User(); 11. user1.setName("zhangsan"); 12. user1.setAge(20); 13. temp[0] = "1"; 14. temp[1] = "111111"; 15. map.put(user1, temp); 16. 17. User user2 = new User(); 18. user2.setName("lisi"); 19. user2.setAge(22); 20. temp = new String[2]; 21. temp[0] = "2"; 22. temp[1] = "2222222"; 23. map.put(user2, temp); 24. request.setAttribute("m",map); 25. %> 26. <c:forEach items="${m}" var="user"> 27. <tr> 28. <td>${user.key.name}</td> 29. <td>${user.key.age}</td> 30. <td>${user.value[0]}</td> 31. <td>${user.value[1]}</td> 32. </tr> 33. <br> 34. </c:forEach> 35.</body> 36.</html>
③Strust2標簽
(1)property標簽 用于輸出指定的值: <s:property value="%{@cn.csdn.hr.domain.User@Name}"/><br/> <s:property value="@cn.csdn.hr.domain.User@Name"/><Br/><!-- 以上兩種方法都可以 --> <s:property value="%{@cn.csdn.hr.domain.User@study()}"/> 以上可以訪問某一個包的類的屬性的集中方式,study()是訪問方法的方法,并輸出。 以下用java代碼代替的,訪問某一個范圍內的屬性 <% //采用pageContext對象往page范圍內存入值來 驗證#attr搜索順序是從page開始的 ,搜索的順序為:page,reques,session,application。 set存值的時候存到的是request中,在jsp頁面中訪問的時候不用加任何的標識符,即可直接訪問,如果不同的作用域不一樣了, pageContext.setAttribute("name", "laoowang", PageContext.PAGE_SCOPE); %> <s:property value="#attr.name" /> 假設在action中設置了不同作用域的類 不同的作用域的標簽的訪問: <h3>獲取的是requet中的對象值</h3> 第一種方式:<s:property value="#request.user1.realName"/> <br/> 第二種方式:<s:property value="#request.user1['realName']"/> <br/> 第三種方式:<s:property value="#user1.realName"/> <br/> 第四種方式:<s:property value="#user1['realName']"/> <br/> 第五種方式:${requestScope.user1.realName } || ${requestScope.user1['realName'] } 第六種:<s:property value="#attr.user1.realName"/> attr對象按page==> request sessionapplictio找的 <h3>獲取session中的值</h3> 第一種方式:<s:property value="#session.user1.realName"/> <br/> 第二種方式:<s:property value="#session.user1['realName']"/> 第五種方式:${sessionScope.user1.realName } || ${sessionScope.user1['realName'] } <h3>獲取application中的對象的值</h3> 第一種方式:<s:property value="#application.user1.realName"/> <br/> 第二種方式:<s:property value="#application.user1['realName']"/> 第五種方式:${applicationScope.user1.realName } || ${applicationScope.user1['realName'] } (2)iterator標簽的使用 第一種:list集合 <!-- 設置set集合 value--> <!-- status 可選屬性,該屬性指定迭代時的IteratorStatus實例 --> <!-- value="#attr.list" list存放到了request中 可以value="#request.list" statu.odd返回當前被迭代元素的索引是否是奇數 --> <s:set name="list" value="{'a','b','c','d'}"></s:set> <s:iterator var="ent" value="#request.list" status="statu"> <s:if test="%{#statu.odd}"> <font color="red"><s:property value="#ent" /> </font> </s:if> <s:else> <s:property value="#ent" /> </s:else> </s:iterator> 第二種:map集合中的使用 <h3>Map集合</h3> <!-- map集合的特點: 語法格式:# {key:value,key1:value1,key2:value2,.....} 以上的語法中就直接生成了一個Map類型的集合,該Map對象中的每個key-value對象之間用英文的冒號隔開 ,多個元素之間用逗號分隔。 --> </div> <s:set var="map" value="#{'1':'laowang','2':'老王','3':'猩猩'}"></s:set> 遍歷Map: <br /> <s:iterator value="#map"> <s:property value="key" />:::<s:property value="value" /> <Br /> </s:iterator>/ 第三種:集合的變量 <h3>遍歷集合:::</h3> <div> <!-- 遍歷出價格大于3000的 --> <s:iterator var="user" value="#session['users']"> <s:if test="%{#user['price']>3000}"> <s:property value="#user['price']"/> </s:if> </s:iterator> <hr color="blue"/><!-- $是取出價格 大于3000的最后一個值 --> <s:iterator var="u" value="#session.users.{$(#this['price']>3000)}"> <s:property value="price"/> </s:iterator> </div> 注:users是User的對象,price是User中的一個屬性 簡述一下iterator的介紹: iterator標簽用于對集合進行迭代,這里的集合包含List、Set和數組。 <s:set name="list" value="{'zhangming','xiaoi','liming'}" /> <s:iterator value="#list" status="st"> <font color=<s:if test="#st.odd">red</s:if><s:else>blue</s:else>> <s:property /></font><br> </s:iterator> value:可選屬性,指定被迭代的集合,如果沒有設置該屬性,則使用ValueStack棧頂的集合。 id:可選屬性,指定集合里元素的id。 status:可選屬性,該屬性指定迭代時的IteratorStatus實例。該實例包含如下幾個方法: int getCount(),返回當前迭代了幾個元素。 int getIndex(),返回當前迭代元素的索引。 boolean isEven(),返回當前被迭代元素的索引是否是偶數 boolean isOdd(),返回當前被迭代元素的索引是否是奇數 boolean isFirst(),返回當前被迭代元素是否是第一個元素。 boolean isLast(),返回當前被迭代元素是否是最后一個元素。 (3)if else語句的使用 <s:set name="age" value="21" /> <s:if test="#age==23"> 23 </s:if> <s:elseif test="#age==21"> 21 </s:elseif> <s:else> 都不等 </s:else> (4)URL標簽 <!-- 聲明一個URL地址 --> <s:url action="test" namespace="/tag" var="add"> <s:param name="username">laowangang</s:param> <s:param name="id">12</s:param> </s:url> <s:a href="%{add}">測試URL</s:a> <s:a action="test" namespace="/tag"></s:a> 以上的兩個<s:a>標簽的作用是一樣的。 (5)data標簽 <% pageContext.setAttribute("birth",new Date(200,03,10),PageContext.REQUEST_SCOPE); %> <s:date name="#request.birth" format="yyyy年MM月dd日"/> <s:date name="#request.birth" nice="true"/> 這個標簽是按照format的格式去輸出的。 (6)表單 <h1>from表單</h1> <s:form action="test" namespace="/tag"> <s:textfield label="用戶名" name="uname" tooltip="你的名字" JavascriptTooltip="false"></s:textfield> <s:textarea name="rmake" cols="40" rows="20" tooltipDelay="300" tooltip="hi" label="備注" javascriptTooltip="true"></s:textarea> <s:passWord label="密碼" name="upass"></s:password> <s:file name="file" label="上傳文件"></s:file> <s:hidden name="id" value="1"></s:hidden> <!-- <select name="edu"> <option value="listKey">listValue</option> --> <s:select list="#{'1':'博士','2':'碩士'}" name="edu" label="學歷" listKey="key" listValue="value"></s:select> <s:select list="{'java','.net'}" value="java"></s:select><!-- value是選中的 --> <!-- 必須有name --> <s:checkbox label="愛好 " fieldValue="true" name="checkboxFiled1"></s:checkbox> <!-- 多個checkbox --> <s:checkboxlist list="{'java','CSS','html','struts2'}" label="喜歡的編程語言" name="box" value="{'css','struts2'}"></s:checkboxlist> <!-- map集合前要加# --> <s:checkboxlist list="#{1:'java',2:'css',3:'html',4:'struts2',5:'spring'}" label="喜歡的編程語言" name="boxs" value="{1,2}"></s:checkboxlist> <!-- listKey listValue <input type="text" name="boxs" value="listKey">顯示值listValue --> <!-- radio --> <% //從服務器傳過來值 pageContext.setAttribute("sex","男",PageContext.REQUEST_SCOPE); pageContext.setAttribute("sex1","男",PageContext.REQUEST_SCOPE); %> <s:radio list="{'男','女'}" name="sex" value="#request.sex"></s:radio> <s:radio list="#{1:'男',2:'女'}" name="sex1" listKey="key" listValue="value" value="#request.sex1"></s:radio> <!-- 防止表單提交的方式 --> <s:token></s:token> <s:submit value="提交"></s:submit> </s:form>
④ognl表達式
OGNL是Struts 2默認的表達式語言。是Object Graphic Navigation Language(對象圖導航語言)的縮寫,它是一個開源項目。
1.#符號的用途一般有三種。 1)訪問非根對象屬性,例如示例中的#session.msg表達式,由于Struts 2中值棧被視為根對象,所以訪問其他非根對象時,需要加#前綴。實際上,#相當于ActionContext.getContext();;#session.msg表達式相當于ActionContext.getContext().getSession(). getAttribute(”msg”) 。 2)用于過濾和投影(projecting)集合,如示例中的persons.{?#this.age>20}。
3)用來構造Map,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}。
2.%符號 %符號的用途是在標志的屬性為字符串類型時,計算OGNL表達式的值。如下面的代碼所示: 構造Map
[html] view plaincopy<s:setname=”foobar”value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}”/> <p>The value of key “foo1″ is <s:propertyvalue=”#foobar['foo1']”/></p> <p>不使用%:<s:urlvalue=”#foobar['foo1']”/></p> <p>使用%:<s:urlvalue=”%{#foobar['foo1']}”/></p> [html] view plaincopy<s:setname=”foobar”value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}”/> <p>The value of key “foo1″ is <s:propertyvalue=”#foobar['foo1']”/></p> <p>不使用%:<s:urlvalue=”#foobar['foo1']”/></p> <p>使用%:<s:urlvalue=”%{#foobar['foo1']}”/></p>3.$符號
$符號主要有兩個方面的用途。 在國際化資源文件中,引用OGNL表達式,例如國際化資源文件中的代碼:reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間。 在Struts 2框架的配置文件中引用OGNL表達式,例如下面的代碼片斷所示:
[html] view plaincopy<validators> <fieldname=”intb”> <field-validatortype=”int”> <paramname=”min”>10</param> <paramname=”max”>100</param> <message>BAction-test校驗:數字必須為${min}為${max}之間!</message> </field-validator> </field> </validators> [html] view plaincopy<validators> <fieldname=”intb”> <field-validatortype=”int”> <paramname=”min”>10</param> <paramname=”max”>100</param> <message>BAction-test校驗:數字必須為${min}為${max}之間!</message> </field-validator> </field> </validators>
PS:1.四者都是在JSP上,用于取值、設參等功能,jstl標簽是以<c:>開頭,strust2標簽是以<s:>開頭,EL表達式是${XXX.XXX},ognl表達式是#、%、$XXX。
2.ognl表達式和EL表達式的區別:ognl是通常要結合Struts 2的標志一起使用,如<s:property value="#xx" /> struts頁面中不能單獨使用。而EL可以單獨使用${sessionScope.username},也可以結合JSL使用,如<c:forEach item="${stuent}" var="user">
3.ognl是struts2特有的表達式,使用ognl ,struts2就無需將對象手動放值進request等范圍,頁面直接取值。jstl是標簽庫,比如c標簽,用來前臺頁面的變量的定義呀、作用域里的變量對象的取值呀等。。el是和jstl聯用,jstl用來取值,而el用來展示。el也可直接取值展示作用域里對象變量。
簡單記憶:JSTL(標簽)——EL(表達式) Strust2(標簽)——ognl(標簽)
新聞熱點
疑難解答