JSTL是JSP的标准标签库,他提供了许多非常实用的功能,免去了我们自定义标签的麻烦,从而达到在JSP页面中无Scriptlet的效果。
JSTL只是方便了我们开发,如果不使用,并不会妨碍我们开发,一般JSTL是与表达式语言一起使用的。
JSTL1.2的包在MyEclipse中配置struts时能够取得。
把JSTL.jar放入tomcat\lib中,并把JSTL.jar中的tld文件放入WEB-INF中,他所提供的tld文件有:
(1)c.tld 核心标签库,提供比如迭代输出等操作。
(2)fmt.tld 格式化操作。
(3)sql.tld 提供sql查询、更新等操作。
(4)x.tld 提供xml的操作。
(5)fn.tld 提供字符串的函数操作,比如contains、startsWith等操作。
用于输出,一般结构如下:<c:out value=" " escapeXml=" " default=" "/>
value表示需要输出的值;
escapeXml表示是否需要将类似<转为"<";
default表示如果value为null,则输出此语句;
用于设置内置对象属性或自定义对象属性,一般结构如下:
(1)<c:set var=" " value=" " scope=" "/>
var表示属性的名称;
value表示属性的值;
scope表示存储的范围;
(2)<c:set target=" " property=" " value=" "/>
target表示对象名称;
property表示属性名称;
value表示属性的值;
用于移除内置对象属性;一般结构如下:
<c:remove var=" " scope=" "/>
var表示属性名称;
scope表示属性范围;
用于捕获异常,类似try - catch;一般结构如下:
<c:catch var=" ">
语句
</c:catch>
var用来保存异常的信息;
类似if语句,一般结构如下:
<c:if test=" " var=" " scope=" ">
执行语句
</c:if>
test 表示判断;
var表示保存判断结果;
scope表示结果保存范围;
用于多重判断;一般结构如下:
<c:choose>
<c:when test = " "> <!--用于判断 -->
语句
</c:when>
<c:when test = " ">
语句
</c:when>
<c:otherwise> <!--当全部的when不成立时,进入 -->语句
</c:otherwise>
</c:choose>
用于迭代输出;一般结构如下:
<c:forEach items=" " var= " " [ begin=" " ] [ end=" " ] [ step=" " ]>
${var}
</c:forEach>
items表示输出的集合;
var表示迭代器的元素;
begin表示从哪个索引开始;
end表示到哪个索引结束;
step表示输出的间隔;
用于分隔字符串并迭代输出;一般结构如下:
<c:forTokens items=" " delims=" " var=" ">
${var}
</c:forTokens>
items表示字符串;
delims表示分隔符;
var表示迭代器;
用于客户端跳转,一般结构如下:
<c:redirect url=" " >
<c:param name=" " value=" "/> 可以传递参数;
</c:redirect>
包含某个网页,一般结构如下:
<c:import url=" " charEncoding=" " var=" ">
<c:param name=" " value=" "/>
</c:import>
var表示保存的导入内容对象。
代码实例:
<%@ page contentType="text/html" pageEncoding="GBK" import="java.util.*"%> <%@ taglib prefix="c" uri="jstl/c"%> <jsp:useBean id="per" class="org.person.Person" scope="page"/> <html> <head> <title></title> </head> <body> <% per.setName("xiazdong"); per.setAge(20); pageContext.setAttribute("per",per); %> <c:out value="${per}" escapeXml="true" default="无内容"/> <c:out value="xiazdong"/> <c:set var="name" value="xiazdong" /> <h3>姓名:${name}</h3> <c:set target="${per}" property="name" value="yxWang"/> <c:out value="${per}" escapeXml="true" default="无内容"/> <!--设定属性并删除 --> <c:set var="attr" value="tmp" scope="request"/> <h3>属性为:${attr}</h3> <c:remove var="attr" scope="request"/> <h3>删除后,属性为:${attr}</h3> <c:if test="${30>10}" var="result" scope="page"> <h3>30比10大</h3> </c:if> <% pageContext.setAttribute("num",15); %> <c:choose> <c:when test="${num<15}"> <h3>num小于15</h3> </c:when> <c:when test="${num>15}"> <h3>num大于15</h3> </c:when> <c:otherwise> <h3>num等于15</h3> </c:otherwise> </c:choose> <% List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); pageContext.setAttribute("list",list); %> <c:forEach items="${list}" var="iter"> ${iter}、 </c:forEach> <br /> <c:forEach items="${list}" var="iter" begin="2"> ${iter}、 </c:forEach> <br /> <c:forTokens items="a:b:c" delims=":" var="ite"> ${ite}、 </c:forTokens> <br /> </body> </html>
SQL标签库的作用就是只需要一个标签就可以进行数据库连接、增删改查操作;非常方便,但是违背了MVC设计模式:JSP中只有显示操作。
此标签用于进行数据库连接,形如:
<sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/xiazdong" user="root" password="12345" var="ds"/>
这样就连接了数据库。
此标签用于查询,形如:
<sql:query sql=" " var="result" dataSource="${ds}" [startRow=" "] [ maxRows=" "]/>
var中的result存放了结果,查询后怎么显示呢?
startRow表示开始显示的是第几行。
maxRows表示一页能够显示的行数。
因此这个标签可以用于分页。
<c:forEach items="${result.rows}" var="iter">
${iter.name}
${iter.age}
</c:forEach>
即可进行迭代输出.
${result.rowCount}返回行数;
此标签用于更新数据库记录,形如:
<sql:update sql=" " var="result" dataSource="${ds}"/>
PreparedStatement能够通过?进行SQL语句的填充,再通过set进行设置。在JSTL中,也是可以实现的,
通过<sql:param value=" "/>和<sql:dateParam type="date" value=" "/>
形如:
request.setAttribute("n","xiazdong");
<sql:query sql="SELECT name FROM emp WHERE name=?" var="result" dataSource="${ds}">
<sql:param value="${n}"/>
</sql:query>
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ taglib prefix="c" uri="jstl/c"%> <%@ taglib prefix="sql" uri="jstl/sql"%> <html> <head></head> <body> <sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mldn" user="root" password="12345" var="ds"/> <sql:query sql="SELECT * FROM emp" var="result" dataSource="${ds}"/> <table border="2" width="80%"> <c:forEach items="${result.rows}" var="iter"> <tr> <td>${iter.empno}</td> <td>${iter.ename}</td> </tr> </c:forEach> </table> <% request.setAttribute("name","zzz"); request.setAttribute("date",new java.util.Date()); request.setAttribute("id","2"); %> <sql:update sql="DELETE FROM emp WHERE empno=0" var="dresult" dataSource="${ds}"/> <sql:update sql="UPDATE emp SET ename=?,hiredate=? where empno=?" dataSource="${ds}"> <sql:param value="${name}"/> <sql:dateParam value="${date}" type="date"/> <sql:param value="${id}"/> </sql:update> </body> </html>
XML标签库的作用就是能够简单操作XML文件,封装了DOM或者SAX的复杂的步骤,比如DOM解析必须:DocumentBuilderFactory、DocumentBulder等一系列的准备;而JSTL只需要一个标签即可。
在XML标签库中必须要使用XPath,XML文件就像一棵树,XPath能够找到XML中的一个节点。
/ 表示根节点;
// 表示任意路径子节点;
../ 表示父节点;
@ 表示属性
此标签用于输出,形如:
<x:out select=" "/>
select中的内容就是XPath,我们需要找到某个节点 ,并输出其内容。
此标签用于解析XML文件,形如:
<x:parse var=" " doc=" "/>
doc表示xml文件对象;
var表示解析完的根节点;
一般都是以:
<c:import url="1.xml" var="xml1"/>
<x:parse doc="${xml1}" var="root"/>
进行导入并解析;
将xml中某个节点的内容保存到一个属性中去;形如:
<x:set select=" " var=" " scope=" "/>
select表示XPath路径;
var表示保存的属性;
scope表示保存范围;
此标签类似核心标签库中的<c:choose>,功能是多重判断;
<x:choose>
<x:when select=" "> //是否存在XPath路径
......
</x:when>
<x:otherwise>
</x:otherwise>
</x:choose>
迭代输出内容,比如:
<personlist> <person> <name id="1">xiazdong</name> <age>20</age> </person> <person> <name id="2">xzdong</name> <age>15</age> </person> </personlist>我们就可以迭代输出person的内容;因为有两个person;
下面就是迭代输出以上person节点的代码:
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ taglib prefix="c" uri="jstl/c"%> <%@ taglib prefix="x" uri="jstl/x"%> <html> <head></head> <body> <c:import url="persons.xml" var="pxf" charEncoding="GBK"/> <x:parse var="personXml" doc="${pxf}"/> <x:set select="$personXml//person" var="nameXml"/> <x:forEach select="$nameXml" var="iter"> <h3><x:out select="name"/></h3> </x:forEach> </body> </html>