1. JSTL : javaserverpages standard tag library JSP标准标签库
  2. 目的:用这些标签取代JSP页面上的JAVA代码

  3. 分为五类:
  4. JSTL核心库 [基本的I/O, 流程控制, 循环 等功能]
  5. 数据库标签库 [基本的数据库操作功能]
  6. XML操作标签库 [用来处理XML文档]
  7. 国际化和格式标签库
  8. 函数标签库



  9. 在这里的例子中
  10. C开头的是核心库的应用[core]一> c:out
  11. ----------
  12. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  13. <c:out value="JSTL标签测试!" /><br> //纯粹进行字符串的输出
  14. <c:out value="${10/5}"/><br> //把计算结果输出
  15. [即] 对于c:out,只要指定value值即可
  16. <c:out value="JSTL标签测试!<br>" escapeXml="true"
  17. <c:out value="JSTL标签测试!<br>" escapeXml="false"
  18. [进阶]c:out 里面还有个 escapeXml属性,如果它设置成TRUE,则忽略""里面的 HTML标签,如果设置成
  19. FALUSE,则上面第二行中的<BR>会输出一个回车
  20. c:out还可以输出EL表达式的值
  21. 例如:<c:out value="${header['User-Agent']}"/> 输出的结果是:
  22. Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
  23. 也可以这样用:<title><c:out value="<c:redirect>、<c:param>标签测试"/></title>

  24. 二> c:set
  25. ----------
  26. [作用] 把变量值设置到JSP内置对象中,或者设置到JAVABEAN属性中
  27. 与JSP的动作指令<jsp:setProperty>类似
  28. [四种用法]
  29. 1> <c:set var="number" value="2" [scope="{page|request|session|application}"]/>
  30. ///var是变量名,value是值,scope是使用范围
  31. 2> <c:set var="number" [scope="{page|request|session|application}"]>2</c:set>
  32. 3> <c:set value="wzk" target="Userbean" propertyName="name"/>
  33. ///针对JAVABEAN进行操作,target是对应的JAVABEAN名
  34. 4> <c:set target="Userbean" propertyName="name">"wzk"</c:set>
  35. [注:] 默认范围都是page

  36. 三> c:remove
  37. -------------
  38. [作用:] 和c:set正好相反 [注:]必须指定var属性,scope可以不指定

  39. 四> c:if
  40. ---------
  41. [作用:] 与IF一样,用于条件判断
  42. <c:set var="number" value="2" scope="request"/> //先设置一个属性及其相应值
  43. <c:if test="${number==1}"><c:out value="给定数字的值为1"></c:out></c:if>

  44. 五> c:choose, c:when, c:otherwise
  45. ----------------------------------
  46. c:choose 没有具体的作用,它只是后面两个的父标签,这里把三者一起介绍
  47. <c:set var="IDE" value="Eclipse"/>
  48. <c:choose>
  49. <c:when test="${IDE=='JBuilder'}">
  50. <c:out value="你使用的开发工具为JBuilder"/>
  51. </c:when>
  52. <c:when test="${IDE=='Eclipse'}">
  53. <c:out value="你使用的开发工具为Eclipse"/>
  54. </c:when>
  55. <c:when test="${IDE=='JCreator'}">
  56. <c:out value="你使用的开发工具为JCreator"/>
  57. </c:when>
  58. <c:otherwise>
  59. <c:out value="你是高手!用记事本写代码?"/>
  60. </c:otherwise>
  61. </c:choose>
  62. [即:] 这里就和JAVA中的switch case,case,case,default类似
  63. [注:] <c:otherwise>的个数是<=1个

  64. 六> c:forEach
  65. --------------
  66. [作用:] 遍历一个集合中的内容,可以数组,list,array,listlinkedlist,set
  67. [两种用法]
  68. 1> <c:forEach [var="varname" items="collection" [varStatus="varStatusName"] [begin="beginname"]
  69. [end="endname"] [step="step"]> 循环体中要执行的内容</c:forEach>
  70. [解释:] items指定要遍历的对象, var是集合中当前的对象,varstatus是遍历的当前状态信息[包
  71. 括:index,count,first,last,current,step,begin,end等属性]

  72. 2> <c:forEach [var="varname" items="collection" [varStatus="varStatusName"] begin="beginname"
  73. end="endname" [step="step"]> 循环体中要执行的内容</c:forEach>
  74. [注:]和上面的区别就是fitst和end属性是必须要指定的,即:按指定次数循环集合
  75. <%
  76. ArrayList list = new
  77. for(int
  78. {
  79. Integer newi=new
  80. list.add(i,newi); ///因为ADD的参数为(int,object)
  81. }
  82. request.setAttribute("list",list); ///注意用法
  83. %>

  84. <c:out value="<c:forEach>标签示例:"/><br>
  85. <c:forEach items="${list}" var="current" varStatus="status">
  86. <c:out value="序号:"/>
  87. <c:out value="${status.count}"/> ///得到当前对象的序号
  88. ///[注:]${status.index}的值是从0开始,而status.count的值从1开始
  89. <c:out value="值:"/>
  90. <c:out value="${current}"/><br> ///得到当前对象的值
  91. </c:forEach>

  92. 七> c:forTokens
  93. ----------------
  94. [作用:] 对一个字符串进行迭代循环,该字符串是用符号分开的
  95. <c:forTokens items="string" delims="selimiters" [var="varname"] [varStatus="varStatusName"]
  96. [begin="begin"] [end="end"] "step="step">
  97. 循环中要执行的内容
  98. </c:forTokens>
  99. [解释:] items指定要处理的字符串, delims指定串中的分割符,var指定当前字符串,其它与上面 类似,不
  100. 再解释

  101. <%
  102. String question = "What*is*your*name*?";
  103. request.setAttribute("question",question);
  104. %>
  105. <c:out value="<c:forTokens>标签示例"/><br>
  106. <c:forTokens items="${question}" var="current" delims="*" varStatus="status">
  107. 第<c:out value="${status.count}"/>次取出的单词为:<c:out value="${current}"/><br>
  108. </c:forTokens>

  109. 八> c:import
  110. -------------
  111. [作用:] 把其它表态或动态页面包含到当前页面,与JSP中<jsp:include>类似,不同之处是:<jsp:include>只是可
  112. 以包含当前WEB应用中的页面,而c:import可以包含其它WEB中的应用
  113. [两种用法]
  114. 1> <c:import url="url" [context="context"] [var="varName"]
  115. [scope="{page|request|session|application}"] [charEncoding="charEncoding"].
  116. 可以包含<c:param>标签
  117. </c:import>
  118. [解释:] url可以是当前WEB下的页面,也可以是通过URL链接到其它网站的文件
  119. 2> <c:import url="url" [context="context"] varReader="varReader" [charEncoding="charEncoding"].
  120. 可以包含<c:param>标签
  121. </c:import>
  122. <c:out value="下面是引入文件的操作:"></c:out><br>
  123. <c:import var="include" url="inc/content.txt" charEncoding="gb2312"/>
  124. <c:out value="下面显示引入的内容:"/><br>
  125. <c:out value="${include}"/>
  126. [注:] 这时是把页面里面的内容都显示出来,即使里面有HTML代码也不会执行的

  127. 九> c:redirect
  128. --------------
  129. [作用:] 把用户的请求从一个页面转向另外一个页面 与JSP中的response内置对象类似
  130. [两种用法]
  131. 1> <c:redirect url="url" [context="context"]/>
  132. [解释:] 这里仅仅是实现页面跳转,没有传递任何参数
  133. 2> <c:redirect url="url" [context="context"]>
  134. <c:param>
  135. </c:rediect>

  136. <c:out value="<c:redirect>、<c:param>标签测试"/>
  137. <c:redirect url="getParam.jsp">
  138. <c:param name="paramName" value="Hello!"/>
  139. </c:redirect>

  140. //则:在getParam.jsp中应用下面两行代码
  141. <%
  142. out.println("传递过来的参数的值为:<br>");
  143. out.println(request.getParameter("paramName"));
  144. %>
  145. [执行结果为:] 传递过来的参数的值为:
  146. Hello!

  147. [不理解:] 书上说这个标签应该不会把参数名和值显示在URL上,可是我的却会显示
  148. 显示为:http://localhost:8080/JstlDemo/getParam.jsp?paramName=Hello!
  149. [难道又不是IE7搞鬼?]


  150. 十> c:url
  151. ---------
  152. [作用:] 用来产生一个URL
  153. [两种用法]
  154. 1> <c:url value="value" [context="context"] [var="varName"]
  155. [scope="{page|request|session|application}"]/>
  156. [解释:] 这种用法仅仅是产生一个URL
  157. [例如:] <c:url value="www.sina.com"/>
  158. 1> <c:url value="value" [context="context"] [var="varName"]
  159. [scope="{page|request|session|application}"]>
  160. <c:param>
  161. </c:url>
  162. [解释:] 产生一个带参数的URL
  163. [例如:] <c:url value="www.sina.com"/>
  164. <c:param name="message" value="hello"/>
  165. </c:url>

  166. 十一> c:catch
  167. --------------
  168. [作用:] 用来捕捉页面产生的错误,和JAVA中的catch功能类似

  169. <c:catch var="exception">
  170. <!--下面这里是要捕获异常的代码部分-->
  171. <%
  172. out.println("10/0的商为:<br>");
  173. out.println(10/0);
  174. %>
  175. </c:catch>
  176. 下面是对异常进行的处理:<br>
  177. <c:out value="${exception.message}"/>

  178. [执行结果为:]
  179. 10/0的商为:
  180. 下面是对异常进行的处理:
  181. / by zero



  182. 第二大类,数据库方面的标签<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
  183. 一> sql:setDateSource
  184. ---------------------
  185. [作用:] 当然是设置数据源啦
  186. [两种用法]
  187. 1>
  188. <sql:setDataSource driver="driverName" url="URL" [user="userName"] [password="password"] [var="varName"]
  189. [scope="{page|request|session|application}"] />
  190. // 下面以连接 SQL SERVER 2000O 为例,使用JDBC驱动器,数据库用户名为:sa, 密码为:123456 则可以用下面的语句
  191. <sql:setDataSource var="conn" driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
  192. url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
  193. user="sa" password="1985315"/>
  194. [注:]这里是连接SQL SERVER 自带的数据库pubs,取得连接后就可以进行各种数据库操作,在后面会介绍
  195. 2>
  196. <sql:setDataSource dataSource="dataSource" [var="varName"] [scope="{page|request|session|application}"] />
  197. //这种方法其实就是已经知道一个存在的数据源

  198. 二> sql:query
  199. --------------
  200. [两种用法]
  201. 1>
  202. <sql:query var="varName" dataSource="dataSource" [maxRows="max"] [startRow="start"]
  203. [scope="{page|request|session|application}"]>
  204. SQL语句
  205. </sql:query>
  206. 2>
  207. ///就是简单地把SQL写到里面,只是一句话展现出来,方便
  208. <sql:query sql="SQL语句" var="varName" dataSource="dataSource" [maxRows="max"] [startRow="start"]
  209. [scope="{page|request|session|application}"] />
  210. <sql:query var="rs" dataSource="${conn }">
  211. select * from stores
  212. </sql:query>
  213. <c:out value="一共查出${rs.rowCount}记录:"/><br>
  214. <c:forEach items="${rs.rows}" var="job" varStatus="status">
  215. <c:out value="第${status.count}条记录:"/>
  216. <c:out value="stor_id为${job.stor_id}"/>
  217. <c:out value="city为${job.city}"/>
  218. <c:out value="state为${job.state}"/>
  219. <c:out value="zip为${job.zip}"/>
  220. <br>
  221. </c:forEach>


  222. 三> sql:update
  223. ---------------
  224. [两种用法]
  225. 1>
  226. <sql:update dataSource="datasource" [var="varName"] [scope="{page|request|session|application}"] >
  227. SQL语句
  228. </sql:update>
  229. 2>
  230. <sql:update sql="SQL语句" dataSource="datasource" [var="varName"] [scope="{page|request|session|application}"] />

  231. 四> sql:param
  232. --------------
  233. [作用:] 主要是配合 PrepareStatement使用, 主要功能就是向<sql:query>里面的SQL语句动态地传递参数值
  234. <sql:query var="rs" dataSource="datasource"
  235. select * from storee where stor_id=? and stor_name=?
  236. <sql:param value="10">
  237. <sql:param value="wzk">
  238. </sql:query>

  239. 五> sql:dateParam
  240. ------------------
  241. [作用:] 设置日期格式 使用方法和<sql:param>完全相同
  242. <sql:dateParam value="value" [type="{timestamp|time|date}"
  243. ///其中timestamp是日期加时间的完整格式

  244. 六> sql:transaction
  245. --------------------
  246. [作用:]看到名称就是处理事务的
  247. <sql:transaction [isolation="{read_uncommitted|read_committed|repeatable_read|serializable}"] [dataSource="datasource"]>
  248. 数据库操作
  249. </sql:transaction>

  250. <sql:transaction dataSource="${database}">
  251. <sql:update>
  252. 更新数据库语句
  253. </sql:update>
  254. <sql:query>
  255. 查询数据库语句
  256. </sql:query>
  257. </sql:transaction>





  258. 第三大类: XML标签库
  259. [注:] 对XML的操作有限,可是在简单应用XML时,它的功能足够了,在较复杂应用XML时,就用SAX或者DOM等API接口来操作XML文档
  260. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>

  261. 一> x:parse
  262. -----------
  263. [作用:]用于解析一个XML文档
  264. [两种用法:]
  265. 1>
  266. <x:parse {doc="xmldoc" | xml="xmldoc"} {var="varName"} [scope="{page|request|session|application}"] | {varDom="varName"
  267. [scope="{page|request|session|application}"] } [systemId="systemId"] [filter="filter"] />
  268. [解释:]doc或xml指明了要处理的XML文档,解析以后的文档放在变量VAR中, 如果是以DOM的方式解析XML文档,则解析后的文档放在变量varDom中

  269. 2>
  270. <x:parse { var="varName" [scope="{page|request|session|application}"]|
  271. varDom="varName"[scope="{page|request|session|application}"] }
  272. [systemId="systemId"] [filter="filter"]XML文档内容
  273. </x:parse>
  274. [区别:]不用指定相应的XML文档,而是直接把XML文档的内容写在中间
  275. 它的例子与下面的 x:out

  276. 二> x:out
  277. --------------
  278. [作用:] XML文档经 x:parse解析后就由 x:out来进行输出各个结点
  279. <x:out select="node" [escapeXML="{true|false}"] />
  280. [解释:] 其中node是xml文档定位的表达式,这里使用 XPath的语法[一种定位XML节点的语言]

  281. 举例: 假设XML文档的内容如下:
  282. <?xml version="1.0" encoding="gb2312"?>
  283. <students>
  284. <student>
  285. <name>Bill</name>
  286. <age>23</age>
  287. <sex>boy</sex>
  288. </student>
  289. </students>
  290. ----------------------------
  291. <font size="2">
  292. <c:out value="<x:Parse>、<x:out>标签示例"/><br>
  293. <c:import var="doc" url="Students.xml" charEncoding="gb2312"/> ///以后就用doc这个变量名代表这个XML文档
  294. <x:parse var="studentDoc" doc="${doc}"/> ///通过${doc}来解析该文档,并把解析后的文档放到变量studentDoc中
  295. <c:out value="学生姓名:"/>
  296. <x:out select="$studentDoc/students/student/name"/><br> ///取某个结点值 [该方法就是所谓的 XPath语法]
  297. <c:out value="学生年龄:"/>
  298. <x:out select="$studentDoc/students/student/age"/><br>
  299. <c:out value="学生性别:"/>
  300. <x:out select="$studentDoc/students/student/sex"/><br>
  301. </font>


  302. 三> x:set
  303. ----------
  304. 把XML中某个结点的内容赋值到一个变量中
  305. <x:set select ="node" var="varName" [scope="{page|request|session|application}"] />
  306. [解释:] node是其一个结点[这是一个XPath表达式], varName就是用来接受该节点内容的变量
  307. [切记:] 若想用x:set这个标签,必须先对XML文档进行解析,不然这里的XPath表达式不能生效

  308. 四> x:if
  309. ---------
  310. 和c:if有相似之处,只是这里的判断条件变成了XPath表达式[即:判断在XML文档中是否有满足该表达式的节点]
  311. [两种用法]
  312. 1>
  313. <x:if select ="node" var="varName" [scope="{page|request|session|application}"] />
  314. [注:] 其中node 就是XPath表达式, 如果文档中存在该结点,则varName的值为true,否则为false
  315. 2>
  316. <x:if select ="node" var="varName" [scope="{page|request|session|application}"] >
  317. 判断条件成立时执行的操作
  318. </x:if>
  319. [两者区别仅仅是第二个方法可以进行进一步的操作]

  320. 五> x:choose, x:when, x:otherwise [三者同时用,与上面的核心库用法完全一样,可是判断条件变成了XPath表达式而以]
  321. -----------------------------------

  322. 六> x:forEach
  323. --------------
  324. [作用:] 对XML文档进行遍历
  325. 例子:
  326. <?xml version="1.0" encoding="gb2312"?>
  327. <teachers>
  328. <teacher>
  329. <name>Bill</name>
  330. <age>26</age>
  331. <sex>boy</sex>
  332. </teacher>
  333. <teacher>
  334. <name>Jack</name>
  335. <age>33</age>
  336. <sex>girl</sex>
  337. </teacher>
  338. </teachers>

  339. 遍历的方法是:
  340. <c:import var="doc" url="Teachers.xml" charEncoding="gb2312"/> 注意这一行代码,和C接合用
  341. <x:parse var="teacherDoc" doc="${doc}"/> ///进行解析
  342. <x:forEach select="$teacherDoc//teacher" varStatus="status">//开始进行循环 [注意status的巨大作用!!!]
  343. //[$teacherDoc//teacher含义:取出所以名为teacher的节点]
  344. <c:out value="第${status.count}个老师:"/>
  345. <c:out value="姓名 "/>
  346. <x:out select="name"/> ///注意: 取出父结点后,可以直接通过名称取出其子结点的内容
  347. <c:out value="年龄 "/>
  348. <x:out select="age"/>
  349. <c:out value="性别 "/>
  350. <x:out select="sex"/><br>
  351. </x:forEach>




  352. 第四大类:
  353. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"

  354. 一> 国际化标签
  355. ---------------------
  356. 对于数字和货币等的表示,各个国家是有所不同的,在JSTL中提供情报了这样的标签,可以用来处理这些国际化带来的问题
  357. 例子:
  358. <font size="2">
  359. <fmt:setLocale value="en-US" /> ///在美国
  360. 美国:<br>
  361. 数字格式:<fmt:formatNumber value="123456789"
  362. 百分数格式:<fmt:formatNumber type="percent">123456789</fmt:formatNumber><br>
  363. 货币格式<fmt:formatNumber value="12345.67" type="currency" /><br> //[用中国当地的符号,即在数字前加一个:$]
  364. <fmt:setLocale value="zh_CN" /> ///在中国
  365. 中国:<br>
  366. 数字格式:<fmt:formatNumber value="123456789" /><br> ///默认是number格式,即一般的数字格式
  367. 百分数格式:<fmt:formatNumber type="percent">123456789</fmt:formatNumber><br> //表示用百分数
  368. 货币格式<fmt:formatNumber value="12345.67" type="currency" /><br> //[用中国当地的符号,即在数字前加一个:¥]
  369. </font>
  370. [注:] type的值可以为: currency,number,percent


  371. 二> 日期格式标签
  372. -----------------

  373. 例子:
  374. <font size="2">
  375. <c:set var="date" value="<%=new java.util.Date()%>"/> ///得到当前时间
  376. <fmt:formatDate value="${date}" pattern="yyyy年MM月dd日" type="date" dateStyle="full"/><br>
  377. 取出日期,按相应格式输出
  378. <fmt:formatDate value="${date}" pattern="HH:mm:ss" type="time" timeStyle="full"/><br>
  379. <fmt:formatDate value="${date}" pattern="yyyy年MM月dd日 HH:mm:ss" type="both" dateStyle="full" timeStyle="full"/><br>
  380. <fmt:formatDate value="${date}" type="both" timeStyle="full" var="formatted"/>
  381. <fmt:parseDate value="${formatted}" type="both" timeStyle="full" timeZone="GMT" var="parsed"/>
  382. ///上面这行代码,把formatted变量的值转化成一个日期型号的变量 ,把解析的结果放在parsed变量中
  383. <c:out value="${parsed}"/><br>
  384. </font>

  385. [执行结果:]
  386. 2008年04月28日
  387. 23:14:18
  388. 2008年04月28日 23:14:18
  389. Mon Apr 28 23:14:18 CST 2008


  390. 三> 至于函数标签库里面的那些函数个人觉得没有必要看了,用JAVA代码可以容易写出,懒的记啦,呵呵
  391. 最后再说一下自定义标签时的步骤[简单的那种,嘿嘿,没办法人比较懒]
  392. 1>写功能类
  393. 2>写出描述文件TLD,并把它放在 WEB-INFO/目录下
  394. 这样以后就可以在页面上调自己的标签啦

  395. 下面以一简单例子为例 [功能极其简单[输出当前的系统时间],只是学习一下自快建标签的过程]


  396. 1>功能类///-----------DateTag.java
  397. package taglibs;

  398. import javax.servlet.jsp.tagext.BodyTagSupport;
  399. import javax.servlet.jsp.JspWriter;
  400. import java.io.IOException;
  401. import java.text.SimpleDateFormat;
  402. import java.util.Date;

  403. import javax.servlet.jsp.JspException;
  404. import javax.servlet.jsp.PageContext;
  405. import javax.servlet.jsp.tagext.Tag;

  406. public class
  407. private
  408. private

  409. public int
  410. try
  411. Date date = new
  412. SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy年MM月dd日");
  413. pageContext.getOut().print(dateFormater.format(date));
  414. } catch
  415. e.printStackTrace();
  416. }
  417. return
  418. }

  419. public int
  420. return
  421. }

  422. public
  423. return null;
  424. }

  425. public void
  426. }

  427. public void
  428. this.pageContext = pageContext;
  429. }

  430. public void
  431. this.tag = parent;
  432. }
  433. }
  434. 2> //-----------datetag.tld
  435. <?xml version="1.0" encoding="UTF-8"?>
  436. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  437. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  438. 正文开始
  439. <taglib>
  440. <tlib-version>1.0</tlib-version>
  441. <jsp-version>1.2</jsp-version>
  442. 上面两行说明版本问题,第二句说明该标签库要求的JSP版本为 1.2
  443. <short-name>dateTagExample</short-name>
  444. <uri>/mytags</uri>

  445. 真正开始
  446. <tag>
  447. <name>date</name> //标签名 [也即在JSP页面上访问的名称为:date]
  448. <tag-class>taglibs.DateTag</tag-class> ///这里指明了该标签的处理功能类
  449. <body-content>empty</body-content>
  450. </tag>
  451. </taglib>

  452. [注意:] 每个标签库可以包含一组标签,也可以只描述一个标签,一般情况下,把一组功能类似的标签旋转在一个标签库中...
  453. [若有多个标签时,只要多加几<tag>节点即可]


  454. JSP页面上应用刚才那个标签
  455. <%@ taglib uri="/WEB-INF/datetag.tld" prefix="mytags"
  456. 应用: 下面是使用自定义标签输出的内容:<br> <mytags:date/>