1. JSTL : javaserverpages standard tag library JSP标准标签库 2. 目的:用这些标签取代JSP页面上的JAVA代码 3. 4. 分为五类: 5. JSTL核心库 [基本的I/O, 流程控制, 循环 等功能] 6. 数据库标签库 [基本的数据库操作功能] 7. XML操作标签库 [用来处理XML文档] 8. 国际化和格式标签库 9. 函数标签库 10. 11. 12. 13. 在这里的例子中 14. C开头的是核心库的应用[core]一> c:out 15. ---------- 16. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 17. <c:out value="JSTL标签测试!" /><br> //纯粹进行字符串的输出 18. <c:out value="${10/5}"/><br> //把计算结果输出 19. [即] 对于c:out,只要指定value值即可 20. <c:out value="JSTL标签测试!<br>" escapeXml="true" /> 21. <c:out value="JSTL标签测试!<br>" escapeXml="false" /> 22. [进阶]c:out 里面还有个 escapeXml属性,如果它设置成TRUE,则忽略""里面的 HTML标签,如果设置成 23. FALUSE,则上面第二行中的<BR>会输出一个回车 24. c:out还可以输出EL表达式的值 25. 例如:<c:out value="${header['User-Agent']}"/> 输出的结果是: 26. Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727) 27. 也可以这样用:<title><c:out value="<c:redirect>、<c:param>标签测试"/></title> 28. 29. 二> c:set 30. ---------- 31. [作用] 把变量值设置到JSP内置对象中,或者设置到JAVABEAN属性中 32. 与JSP的动作指令<jsp:setProperty>类似 33. [四种用法] 34. 1> <c:set var="number" value="2" [scope="{page|request|session|application}"]/> 35. ///var是变量名,value是值,scope是使用范围 36. 2> <c:set var="number" [scope="{page|request|session|application}"]>2</c:set> 37. 3> <c:set value="wzk" target="Userbean" propertyName="name"/> 38. ///针对JAVABEAN进行操作,target是对应的JAVABEAN名 39. 4> <c:set target="Userbean" propertyName="name">"wzk"</c:set> 40. [注:] 默认范围都是page 41. 42. 三> c:remove 43. ------------- 44. [作用:] 和c:set正好相反 [注:]必须指定var属性,scope可以不指定 45. 46. 四> c:if 47. --------- 48. [作用:] 与IF一样,用于条件判断 49. <c:set var="number" value="2" scope="request"/> //先设置一个属性及其相应值 50. <c:if test="${number==1}"><c:out value="给定数字的值为1"></c:out></c:if> 51. 52. 五> c:choose, c:when, c:otherwise 53. ---------------------------------- 54. c:choose 没有具体的作用,它只是后面两个的父标签,这里把三者一起介绍 55. <c:set var="IDE" value="Eclipse"/> 56. <c:choose> 57. <c:when test="${IDE=='JBuilder'}"> 58. <c:out value="你使用的开发工具为JBuilder"/> 59. </c:when> 60. <c:when test="${IDE=='Eclipse'}"> 61. <c:out value="你使用的开发工具为Eclipse"/> 62. </c:when> 63. <c:when test="${IDE=='JCreator'}"> 64. <c:out value="你使用的开发工具为JCreator"/> 65. </c:when> 66. <c:otherwise> 67. <c:out value="你是高手!用记事本写代码?"/> 68. </c:otherwise> 69. </c:choose> 70. [即:] 这里就和JAVA中的switch case,case,case,default类似 71. [注:] <c:otherwise>的个数是<=1个 72. 73. 六> c:forEach 74. -------------- 75. [作用:] 遍历一个集合中的内容,可以数组,list,array,listlinkedlist,set vector,map等 76. [两种用法] 77. 1> <c:forEach [var="varname" items="collection" [varStatus="varStatusName"] [begin="beginname"] 78. [end="endname"] [step="step"]> 循环体中要执行的内容</c:forEach> 79. [解释:] items指定要遍历的对象, var是集合中当前的对象,varstatus是遍历的当前状态信息[包 80. 括:index,count,first,last,current,step,begin,end等属性] 81. 82. 2> <c:forEach [var="varname" items="collection" [varStatus="varStatusName"] begin="beginname" 83. end="endname" [step="step"]> 循环体中要执行的内容</c:forEach> 84. [注:]和上面的区别就是fitst和end属性是必须要指定的,即:按指定次数循环集合 85. <% 86. ArrayList list = new ArrayList(); 87. for(int i=0;i<5;i++) 88. { 89. Integer newi=new Integer((i+1)*5); 90. list.add(i,newi); ///因为ADD的参数为(int,object) 91. } 92. request.setAttribute("list",list); ///注意用法 93. %> 94. 95. <c:out value="<c:forEach>标签示例:"/><br> 96. <c:forEach items="${list}" var="current" varStatus="status"> 97. <c:out value="序号:"/> 98. <c:out value="${status.count}"/> ///得到当前对象的序号 99. ///[注:]${status.index}的值是从0开始,而status.count的值从1开始 100. <c:out value="值:"/> 101. <c:out value="${current}"/><br> ///得到当前对象的值 102. </c:forEach> 103. 104. 七> c:forTokens 105. ---------------- 106. [作用:] 对一个字符串进行迭代循环,该字符串是用符号分开的 107. <c:forTokens items="string" delims="selimiters" [var="varname"] [varStatus="varStatusName"] 108. [begin="begin"] [end="end"] "step="step"> 109. 循环中要执行的内容 110. </c:forTokens> 111. [解释:] items指定要处理的字符串, delims指定串中的分割符,var指定当前字符串,其它与上面 类似,不 112. 再解释 113. 114. <% 115. String question = "What*is*your*name*?"; 116. request.setAttribute("question",question); 117. %> 118. <c:out value="<c:forTokens>标签示例"/><br> 119. <c:forTokens items="${question}" var="current" delims="*" varStatus="status"> 120. 第<c:out value="${status.count}"/>次取出的单词为:<c:out value="${current}"/><br> 121. </c:forTokens> 122. 123. 八> c:import 124. ------------- 125. [作用:] 把其它表态或动态页面包含到当前页面,与JSP中<jsp:include>类似,不同之处是:<jsp:include>只是可 126. 以包含当前WEB应用中的页面,而c:import可以包含其它WEB中的应用 127. [两种用法] 128. 1> <c:import url="url" [context="context"] [var="varName"] 129. [scope="{page|request|session|application}"] [charEncoding="charEncoding"]. 130. 可以包含<c:param>标签 131. </c:import> 132. [解释:] url可以是当前WEB下的页面,也可以是通过URL链接到其它网站的文件 133. 2> <c:import url="url" [context="context"] varReader="varReader" [charEncoding="charEncoding"]. 134. 可以包含<c:param>标签 135. </c:import> 136. <c:out value="下面是引入文件的操作:"></c:out><br> 137. <c:import var="include" url="inc/content.txt" charEncoding="gb2312"/> 138. <c:out value="下面显示引入的内容:"/><br> 139. <c:out value="${include}"/> 140. [注:] 这时是把页面里面的内容都显示出来,即使里面有HTML代码也不会执行的 141. 142. 九> c:redirect 143. -------------- 144. [作用:] 把用户的请求从一个页面转向另外一个页面 与JSP中的response内置对象类似 145. [两种用法] 146. 1> <c:redirect url="url" [context="context"]/> 147. [解释:] 这里仅仅是实现页面跳转,没有传递任何参数 148. 2> <c:redirect url="url" [context="context"]> 149. <c:param> 150. </c:rediect> 151. 152. <c:out value="<c:redirect>、<c:param>标签测试"/> 153. <c:redirect url="getParam.jsp"> 154. <c:param name="paramName" value="Hello!"/> 155. </c:redirect> 156. 157. //则:在getParam.jsp中应用下面两行代码 158. <% 159. out.println("传递过来的参数的值为:<br>"); 160. out.println(request.getParameter("paramName")); 161. %> 162. [执行结果为:] 传递过来的参数的值为: 163. Hello! 164. 165. [不理解:] 书上说这个标签应该不会把参数名和值显示在URL上,可是我的却会显示 166. 显示为:http://localhost:8080/JstlDemo/getParam.jsp?paramName=Hello! 167. [难道又不是IE7搞鬼?] 168. 169. 170. 十> c:url 171. --------- 172. [作用:] 用来产生一个URL 173. [两种用法] 174. 1> <c:url value="value" [context="context"] [var="varName"] 175. [scope="{page|request|session|application}"]/> 176. [解释:] 这种用法仅仅是产生一个URL 177. [例如:] <c:url value="www.sina.com"/> 178. 1> <c:url value="value" [context="context"] [var="varName"] 179. [scope="{page|request|session|application}"]> 180. <c:param> 181. </c:url> 182. [解释:] 产生一个带参数的URL 183. [例如:] <c:url value="www.sina.com"/> 184. <c:param name="message" value="hello"/> 185. </c:url> 186. 187. 十一> c:catch 188. -------------- 189. [作用:] 用来捕捉页面产生的错误,和JAVA中的catch功能类似 190. 191. <c:catch var="exception"> 192. <!--下面这里是要捕获异常的代码部分--> 193. <% 194. out.println("10/0的商为:<br>"); 195. out.println(10/0); 196. %> 197. </c:catch> 198. 下面是对异常进行的处理:<br> 199. <c:out value="${exception.message}"/> 200. 201. [执行结果为:] 202. 10/0的商为: 203. 下面是对异常进行的处理: 204. / by zero 205. 206. 207. 208. 第二大类,数据库方面的标签<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> 209. 一> sql:setDateSource 210. --------------------- 211. [作用:] 当然是设置数据源啦 212. [两种用法] 213. 1> 214. <sql:setDataSource driver="driverName" url="URL" [user="userName"] [password="password"] [var="varName"] 215. [scope="{page|request|session|application}"] /> 216. // 下面以连接 SQL SERVER 2000O 为例,使用JDBC驱动器,数据库用户名为:sa, 密码为:123456 则可以用下面的语句 217. <sql:setDataSource var="conn" driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" 218. url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" 219. user="sa" password="1985315"/> 220. [注:]这里是连接SQL SERVER 自带的数据库pubs,取得连接后就可以进行各种数据库操作,在后面会介绍 221. 2> 222. <sql:setDataSource dataSource="dataSource" [var="varName"] [scope="{page|request|session|application}"] /> 223. //这种方法其实就是已经知道一个存在的数据源 224. 225. 二> sql:query 226. -------------- 227. [两种用法] 228. 1> 229. <sql:query var="varName" dataSource="dataSource" [maxRows="max"] [startRow="start"] 230. [scope="{page|request|session|application}"]> 231. SQL语句 232. </sql:query> 233. 2> 234. ///就是简单地把SQL写到里面,只是一句话展现出来,方便 235. <sql:query sql="SQL语句" var="varName" dataSource="dataSource" [maxRows="max"] [startRow="start"] 236. [scope="{page|request|session|application}"] /> 237. <sql:query var="rs" dataSource="${conn }"> 238. select * from stores 239. </sql:query> 240. <c:out value="一共查出${rs.rowCount}记录:"/><br> 241. <c:forEach items="${rs.rows}" var="job" varStatus="status"> 242. <c:out value="第${status.count}条记录:"/> 243. <c:out value="stor_id为${job.stor_id}"/> 244. <c:out value="city为${job.city}"/> 245. <c:out value="state为${job.state}"/> 246. <c:out value="zip为${job.zip}"/> 247. <br> 248. </c:forEach> 249. 250. 251. 三> sql:update 252. --------------- 253. [两种用法] 254. 1> 255. <sql:update dataSource="datasource" [var="varName"] [scope="{page|request|session|application}"] > 256. SQL语句 257. </sql:update> 258. 2> 259. <sql:update sql="SQL语句" dataSource="datasource" [var="varName"] [scope="{page|request|session|application}"] /> 260. 261. 四> sql:param 262. -------------- 263. [作用:] 主要是配合 PrepareStatement使用, 主要功能就是向<sql:query>里面的SQL语句动态地传递参数值 264. <sql:query var="rs" dataSource="datasource" > 265. select * from storee where stor_id=? and stor_name=? 266. <sql:param value="10"> 267. <sql:param value="wzk"> 268. </sql:query> 269. 270. 五> sql:dateParam 271. ------------------ 272. [作用:] 设置日期格式 使用方法和<sql:param>完全相同 273. <sql:dateParam value="value" [type="{timestamp|time|date}" /> 274. ///其中timestamp是日期加时间的完整格式 275. 276. 六> sql:transaction 277. -------------------- 278. [作用:]看到名称就是处理事务的 279. <sql:transaction [isolation="{read_uncommitted|read_committed|repeatable_read|serializable}"] [dataSource="datasource"]> 280. 数据库操作 281. </sql:transaction> 282. 283. <sql:transaction dataSource="${database}"> 284. <sql:update> 285. 更新数据库语句 286. </sql:update> 287. <sql:query> 288. 查询数据库语句 289. </sql:query> 290. </sql:transaction> 291. 292. 293. 294. 295. 296. 第三大类: XML标签库 297. [注:] 对XML的操作有限,可是在简单应用XML时,它的功能足够了,在较复杂应用XML时,就用SAX或者DOM等API接口来操作XML文档 298. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%> 299. 300. 一> x:parse 301. ----------- 302. [作用:]用于解析一个XML文档 303. [两种用法:] 304. 1> 305. <x:parse {doc="xmldoc" | xml="xmldoc"} {var="varName"} [scope="{page|request|session|application}"] | {varDom="varName" | 306. [scope="{page|request|session|application}"] } [systemId="systemId"] [filter="filter"] /> 307. [解释:]doc或xml指明了要处理的XML文档,解析以后的文档放在变量VAR中, 如果是以DOM的方式解析XML文档,则解析后的文档放在变量varDom中 308. 309. 2> 310. <x:parse { var="varName" [scope="{page|request|session|application}"]| 311. varDom="varName"[scope="{page|request|session|application}"] } 312. [systemId="systemId"] [filter="filter"]XML文档内容 313. </x:parse> 314. [区别:]不用指定相应的XML文档,而是直接把XML文档的内容写在中间 315. 它的例子与下面的 x:out 一起介绍 316. 317. 二> x:out 318. -------------- 319. [作用:] XML文档经 x:parse解析后就由 x:out来进行输出各个结点 320. <x:out select="node" [escapeXML="{true|false}"] /> 321. [解释:] 其中node是xml文档定位的表达式,这里使用 XPath的语法[一种定位XML节点的语言] 322. 323. 举例: 假设XML文档的内容如下: 324. <?xml version="1.0" encoding="gb2312"?> 325. <students> 326. <student> 327. <name>Bill</name> 328. <age>23</age> 329. <sex>boy</sex> 330. </student> 331. </students> 332. ---------------------------- 333. <font size="2"> 334. <c:out value="<x:Parse>、<x:out>标签示例"/><br> 335. <c:import var="doc" url="Students.xml" charEncoding="gb2312"/> ///以后就用doc这个变量名代表这个XML文档 336. <x:parse var="studentDoc" doc="${doc}"/> ///通过${doc}来解析该文档,并把解析后的文档放到变量studentDoc中 337. <c:out value="学生姓名:"/> 338. <x:out select="$studentDoc/students/student/name"/><br> ///取某个结点值 [该方法就是所谓的 XPath语法] 339. <c:out value="学生年龄:"/> 340. <x:out select="$studentDoc/students/student/age"/><br> 341. <c:out value="学生性别:"/> 342. <x:out select="$studentDoc/students/student/sex"/><br> 343. </font> 344. 345. 346. 三> x:set 347. ---------- 348. 把XML中某个结点的内容赋值到一个变量中 349. <x:set select ="node" var="varName" [scope="{page|request|session|application}"] /> 350. [解释:] node是其一个结点[这是一个XPath表达式], varName就是用来接受该节点内容的变量 351. [切记:] 若想用x:set这个标签,必须先对XML文档进行解析,不然这里的XPath表达式不能生效 352. 353. 四> x:if 354. --------- 355. 和c:if有相似之处,只是这里的判断条件变成了XPath表达式[即:判断在XML文档中是否有满足该表达式的节点] 356. [两种用法] 357. 1> 358. <x:if select ="node" var="varName" [scope="{page|request|session|application}"] /> 359. [注:] 其中node 就是XPath表达式, 如果文档中存在该结点,则varName的值为true,否则为false 360. 2> 361. <x:if select ="node" var="varName" [scope="{page|request|session|application}"] > 362. 判断条件成立时执行的操作 363. </x:if> 364. [两者区别仅仅是第二个方法可以进行进一步的操作] 365. 366. 五> x:choose, x:when, x:otherwise [三者同时用,与上面的核心库用法完全一样,可是判断条件变成了XPath表达式而以] 367. ----------------------------------- 368. 369. 六> x:forEach 370. -------------- 371. [作用:] 对XML文档进行遍历 372. 例子: 373. <?xml version="1.0" encoding="gb2312"?> 374. <teachers> 375. <teacher> 376. <name>Bill</name> 377. <age>26</age> 378. <sex>boy</sex> 379. </teacher> 380. <teacher> 381. <name>Jack</name> 382. <age>33</age> 383. <sex>girl</sex> 384. </teacher> 385. </teachers> 386. 387. 遍历的方法是: 388. <c:import var="doc" url="Teachers.xml" charEncoding="gb2312"/> 注意这一行代码,和C接合用 389. <x:parse var="teacherDoc" doc="${doc}"/> ///进行解析 390. <x:forEach select="$teacherDoc//teacher" varStatus="status">//开始进行循环 [注意status的巨大作用!!!] 391. //[$teacherDoc//teacher含义:取出所以名为teacher的节点] 392. <c:out value="第${status.count}个老师:"/> 393. <c:out value="姓名 "/> 394. <x:out select="name"/> ///注意: 取出父结点后,可以直接通过名称取出其子结点的内容 395. <c:out value="年龄 "/> 396. <x:out select="age"/> 397. <c:out value="性别 "/> 398. <x:out select="sex"/><br> 399. </x:forEach> 400. 401. 402. 403. 404. 第四大类: 405. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 406. 407. 一> 国际化标签 408. --------------------- 409. 对于数字和货币等的表示,各个国家是有所不同的,在JSTL中提供情报了这样的标签,可以用来处理这些国际化带来的问题 410. 例子: 411. <font size="2"> 412. <fmt:setLocale value="en-US" /> ///在美国 413. 美国:<br> 414. 数字格式:<fmt:formatNumber value="123456789" /><br> 415. 百分数格式:<fmt:formatNumber type="percent">123456789</fmt:formatNumber><br> 416. 货币格式<fmt:formatNumber value="12345.67" type="currency" /><br> //[用中国当地的符号,即在数字前加一个:$] 417. <fmt:setLocale value="zh_CN" /> ///在中国 418. 中国:<br> 419. 数字格式:<fmt:formatNumber value="123456789" /><br> ///默认是number格式,即一般的数字格式 420. 百分数格式:<fmt:formatNumber type="percent">123456789</fmt:formatNumber><br> //表示用百分数 421. 货币格式<fmt:formatNumber value="12345.67" type="currency" /><br> //[用中国当地的符号,即在数字前加一个:¥] 422. </font> 423. [注:] type的值可以为: currency,number,percent 424. 425. 426. 二> 日期格式标签 427. ----------------- 428. 429. 例子: 430. <font size="2"> 431. <c:set var="date" value="<%=new java.util.Date()%>"/> ///得到当前时间 432. <fmt:formatDate value="${date}" pattern="yyyy年MM月dd日" type="date" dateStyle="full"/><br> 433. 取出日期,按相应格式输出 434. <fmt:formatDate value="${date}" pattern="HH:mm:ss" type="time" timeStyle="full"/><br> 435. <fmt:formatDate value="${date}" pattern="yyyy年MM月dd日 HH:mm:ss" type="both" dateStyle="full" timeStyle="full"/><br> 436. <fmt:formatDate value="${date}" type="both" timeStyle="full" var="formatted"/> 437. <fmt:parseDate value="${formatted}" type="both" timeStyle="full" timeZone="GMT" var="parsed"/> 438. ///上面这行代码,把formatted变量的值转化成一个日期型号的变量 ,把解析的结果放在parsed变量中 439. <c:out value="${parsed}"/><br> 440. </font> 441. 442. [执行结果:] 443. 2008年04月28日 444. 23:14:18 445. 2008年04月28日 23:14:18 446. Mon Apr 28 23:14:18 CST 2008 447. 448. 449. 三> 至于函数标签库里面的那些函数个人觉得没有必要看了,用JAVA代码可以容易写出,懒的记啦,呵呵 450. 最后再说一下自定义标签时的步骤[简单的那种,嘿嘿,没办法人比较懒] 451. 1>写功能类 452. 2>写出描述文件TLD,并把它放在 WEB-INFO/目录下 453. 这样以后就可以在页面上调自己的标签啦 454. 455. 下面以一简单例子为例 [功能极其简单[输出当前的系统时间],只是学习一下自快建标签的过程] 456. 457. 458. 1>功能类///-----------DateTag.java 459. package taglibs; 460. 461. import javax.servlet.jsp.tagext.BodyTagSupport; 462. import javax.servlet.jsp.JspWriter; 463. import java.io.IOException; 464. import java.text.SimpleDateFormat; 465. import java.util.Date; 466. 467. import javax.servlet.jsp.JspException; 468. import javax.servlet.jsp.PageContext; 469. import javax.servlet.jsp.tagext.Tag; 470. 471. public class DateTag implements Tag { 472. private PageContext pageContext; 473. private Tag tag; 474. 475. public int doEndTag() throws JspException { 476. try { 477. Date date = new Date(); 478. SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy年MM月dd日"); 479. pageContext.getOut().print(dateFormater.format(date)); 480. } catch (IOException e) { 481. e.printStackTrace(); 482. } 483. return Tag.EVAL_PAGE; 484. } 485. 486. public int doStartTag() throws JspException { 487. return Tag.SKIP_BODY; 488. } 489. 490. public Tag getParent() { 491. return null; 492. } 493. 494. public void release() { 495. } 496. 497. public void setPageContext(PageContext pageContext) { 498. this.pageContext = pageContext; 499. } 500. 501. public void setParent(Tag parent) { 502. this.tag = parent; 503. } 504. } 505. 2> //-----------datetag.tld 506. <?xml version="1.0" encoding="UTF-8"?> 507. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 508. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 509. 正文开始 510. <taglib> 511. <tlib-version>1.0</tlib-version> 512. <jsp-version>1.2</jsp-version> 513. 上面两行说明版本问题,第二句说明该标签库要求的JSP版本为 1.2 514. <short-name>dateTagExample</short-name> 515. <uri>/mytags</uri> 516. 517. 真正开始 518. <tag> 519. <name>date</name> //标签名 [也即在JSP页面上访问的名称为:date] 520. <tag-class>taglibs.DateTag</tag-class> ///这里指明了该标签的处理功能类 521. <body-content>empty</body-content> 522. </tag> 523. </taglib> 524. 525. [注意:] 每个标签库可以包含一组标签,也可以只描述一个标签,一般情况下,把一组功能类似的标签旋转在一个标签库中... 526. [若有多个标签时,只要多加几<tag>节点即可] 527. 528. 529. JSP页面上应用刚才那个标签 530. <%@ taglib uri="/WEB-INF/datetag.tld" prefix="mytags" %> 531. 应用: 下面是使用自定义标签输出的内容:<br> <mytags:date/>