JSTL详解
|
david_0703
david_0703
普通会员
|
1 # 大 中 小 发表于 2008-01-22 14:10:36
JSTL详解(一)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${age<18}">
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
<taglib>
<taglib>
<taglib>
<taglib>
<taglib>
<taglib>
<taglib>
好了,一个最简单的包含有jstl的页面设计完成了。下面测试。
1
JSTL详解(二) 一般用途的标签
l
l
l
l
下面,我来讲述一下他们的作用: <c: out> 它是一个输出的标签,负责把计算出的结果输出到jspwriter,就跟调用out.println()基本一样。没有BODY的时候,使用下面的语法: <c: out value=”value” [escapeXml]=”{true|false}” [default=”defaultValue”]/> 有BODY的时候,使用下面的语法: <c: out value=”value” [escapeXml]=”{true|false}” >
</c: out> 注意,escapeXml的作用是是否将代码交给xml解析器解释,true为交给xml解析器解释,false为交给浏览器解释,见红色部分代码 举例:c_out.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <html> <head> <title>JSTL: c: out的使用</title> </head> <body bgcolor="#FFFFFF"> <hr> <c:set var="sessionAttr" value="sessionValue" scope="session"/> <c:set var="pageAttr" value="pageValue" scope="page"/> <c:set var="requestAttr" value="requestValue" scope="request"/> <c: out value="以下输出的是前面设置的属性<br>" escapeXml="false"/> <c: out value="${sessionAttr}"/> <c: out value="${pageAttr}"/> <c: out value="${requestAttr}"/> <c: out value="${test_nodef}" default="没有test_nodef这个变量"/> </html> <c:set> 这个标签用于在某个范围(page,request,session,application)里面设置特定的值(默认为page),或者设置某个已经存在的javabean的属性。类似于<%request.setAttribute(“name”,value)%> 语法: 1、使用value属性设置一个特定范围里面的属性: <c:set value=”value” var=”varName” [scope= “{page|request|session|application}”]/ > 2、使用value属性设置一个特定范围里面的属性,带有BODY: <c:set value=”value” var=”varName” [scope= “{page|request|session|application}”] > Body content </c:set> 3、设置某个特定对象的一个属性: <c:set value=”value” target=”target” property=”propertyName”/ > 4、设置某个特定对象的一个属性, 带有BODY: <c:set value=”value” target=”target” property=”propertyName” > Body content </c:set> 举例:c_set.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <jsp:useBean id="user" class="com.j2ee14.ch12.User"/> <html> <head> <title>JSTL:的使用c:set</title> </head> <body bgcolor="#FFFFFF"> <hr> 设置一个属性,然后输出它<br> <c:set var="maxCount" value="100"/> <c: out value="${maxCount}"/> <hr>设置属性时,把它的值放在标签的body中。 <c:set var="password"> ksdjfxsdf234234 </c:set> <c: out value="${password}"/> <hr>设置javaBean的属性,然后输出这些属性值: <c:set value="hellking" target="${user}" property="userName"/> userName=<c: out value="${user.userName}"/> <hr>设置属性,并且指定它们的范围,属性的默认范围是page。 <c:set value="20" var="maxIdelTime" scope="session"/> <c:set value="next.jsp" var="nextPage" scope="page"/> </body> </html> <c:remove> 它的作用是删除某个变量或者属性。类似于<%session.removeAttribute(“name”)%>,它的语法是:<c:remove var=”varName” [scope= “{page|request|session|application}”]/ > 举例:c_remove.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <html> <head> <title>JSTL:c:remove的使用</title> </head> <body bgcolor="#FFFFFF"> <c:set value="10000" var="maxUser" scope="application"/> <c:set value="10" var="count" scope="session"/> maxUser=<c: out value="${maxUser}"/><br> count=<c: out value="${count}"/> <hr>调用c:remove... <c:remove var="maxUser" scope="application"/> <c:remove var="count"/> 调用了c:remove后,参数值为: maxUser=<c: out value="${maxUser}"/>, count=<c: out value="${count}"/>, </body> </html> <c:catch> 它的作用是捕捉由嵌套在它里面的标签所抛出来的异常。类似于<%try{}catch{}%>,它的语法是:<c:catch [var=”varName”]>nested actions</c:catch> 举例:c_catch.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <html> <head> <title>JSTL:catch的使用</title> </head> <body bgcolor="#FFFFFF"> <c:catch var="error"> <% Integer.parseInt("sdkfj"); %> </c:catch> <hr>异常: <c: out value="${error}"/> <hr>异常 exception.getMessage= <c: out value="${error.message}"/> <hr> 异常exception.getCause= <c: out value="${error.cause}"/> </body> </html> JSTL详解(三) 条件标签包括以下几种: l
l
l
l
下面,我来分别介绍: l
语法:
2、有body的情况 <c:if test=”testCondition” var=”varName” [scope=“{page|request|session|application}”]> Body内容 </c:if> 举例:c_if.jsp
<%@ page c language="java" %> <html> <head> <title>JSTL:c:if的使用</title> </head> <body bgcolor="#FFFFFF"> <c:set var="count" value="100"/> <c:if test="${count>78}"> count>78 </c:if> </body> </html> l
语法:<c:choose> Body内容(<c:when>,<c: otherwise>) </c:choose> 注意:它的body内容只能是由以下的元素组成: 1.
2.
3.
l
语法: <c:when test=”testCondition”> Body内容 </c:when> 注意:它有两个限制: 1.
2.
l
语法: <c: otherwise> Conditional block </c: otherwise> 它的使用有两个限制: 1.
2.
<c:choose>,<c: otherwise>,<c:when>举例:c_choose.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <c:set var="count" value="100"/> <html> <head> <title>JSTL:c:choose的使用</title> </head> <body bgcolor="#FFFFFF"> <c:choose> <c:when test="${count <=0}"> <font color="blue"> </c:when> <c:when test="${count<=60&&count>0}"> <font color="red"> </c:when> <c: otherwise> <font color="green"> </c: otherwise> </c:choose> count的值是:<c: out value="${count}"/> </font> </body> </html> JSTL详解(四) 迭代标签的使用 如果使用scriptlets,那么,我们经常使用Iterator或者Enumeration来进行迭代,如: Iterator it = collection.iterator(); while(it.hasNext()){ SomeBean someBean = (SomeBean)it.next(); out.println(someBean.getXXX()); ………….. } 在前面的一次中,我们开发过一个迭代标签,JSTL中也提供了对迭代进行支持的标签,并且,他的功能比上一章的强大的多。JSTL中的迭代标签有两个: l <c:forEach>; l <c:forTokens>; 1、<c:forTokens>专门处理TokenString的迭代,可以指定一个或者是多个分隔符。由于他们使用的很少,在这里就不介绍了。 2、<c:forEach>是最常用的,他几乎能够完成所有的迭代任务,就象jsp中的for(int i=j;i<k;i++)下面我来详细介绍。(注意,“[]”里面的是可选条件) 语法:a、在Collection中迭代: <c:forEach [var=”varName”] items=”collection” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”]> Body 内容 </c:forEach> b、迭代固定的次数: <c:forEach [var=”varName”] [varStatus=”varStatusName”] begin=”begin” end=”end” [step=”step”]> Body 内容 </c:forEach> 举例:c_forEach1.jsp(在Collection中迭代) <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <%@ page import="java.util.*,com.j2ee14.ch12.User"%> <% Collection users_c=new ArrayList(); for(int i=0;i<3;i++) { User user=new User(); user.setUserName("foo"+i); user.setPassword("foo"+i); users_c.add(user); } session.setAttribute("users",users_c); %> <html> <head> <title>JSTL:c:forEach的使用之一</title> </head> <body bgcolor="#FFFFFF"><center> <h4>迭代某个collection中的元素。</h4> <table border=1> <tr><td>用户名</td><td>密码</td></tr> <c:forEach var="users" items="${users}"> <tr> <td><c: out value="${users.userName}"/></td> <td><c: out value="${users.password}"/></td> </tr> </c:forEach> </table> </center></body> </html> 举例:c_forEach2.jsp(迭代固定的次数) <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <html> <head> <tcounttle>JSTL:c:forEach的使用之二</tcounttle> </head> <body bgcolor="#FFFFFF"><center> <h4>第二种迭代:50-60</h4> <c:forEach var="count" begin="50" end="60"> <c: out value="${count}"/> ** </c:forEach> <h4>第二种迭代:10 to 100,step=10</h4> <c:forEach var="count" begin="10" end="100" step="10"> <c: out value="${count}"/>** </c:forEach> </center> </body> </html> JSTL详解(五) 首先,感谢大家的关注,下面我来继续讲解:URL相关的标签,他们的作用主要是负责页面的导航、重定向、资源的获得以及参数的传递等等,他们有: l
l
l
l
<c:import> 作用:导入一个url的资源,相当于jsp 中的<jsp:include page=”path”>标签,同样也可以把参数传递到被导入的页面。 语法:a、资源的内容使用string对象向外暴露 <c:import url=”url” [context=”context”] [var=”varName”] [scope=”{page|request|session|application}”] [charEncoding=”charEncoding”]> Optional body content for <c:param> subtags </c:import> b、资源的内容使用redirect对象向外暴露 <c:import url=”url” [context=”context”] varReader=”varReaderName” [charEncoding=”charEncoding”]> Body content where varReader is consumed by another action </c:import> 举例:c_import.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <html> <head> <title>JSTL:c:import的使用</title> </head> <body bgcolor="#FFFFFF"> <h3>绝对路径 URL</h3> <blockquote> <ex:escapeHtml> <c:import url="http://127.0.0.1:8080/ch12/footer.jsp"/> </ex:escapeHtml> </blockquote> <h3>相对路径并且传递参数到指定的URL</h3> <blockquote> <c:import url="footer.jsp" charEncoding="gb2312"> <c:param name="userName" value="hellking"/> </c:import> </blockquote> </body> </html> <c:redirect> 作用:把客户的请求发送到另一个资源,相当于jsp中的<% request.sendRedirect(“other.jsp”)%>或者servlet中的RequestDispatch.forward(“other.jsp”)的功能。 语法:a、没有body的情况 <c:redirect url=”value” [context=”context”]/> b、有body,在body 中查询指定的参数 <c:redirect url=”value” [context=”context”]> <c:param> subtags </c:redirect> 举例:c:redirect.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <html> <head> <title>JSTL:c:redirect的使用</title> </head> <body bgcolor="#cc99cc"> <c:url value="footer.jsp" var="nextpage"><c:param name="userName" value="hellking"/></c:url> <c:redirect url="${nextpage}"/> </body> </html> <c:url> 作用:用于构造URL,主要的用途是URL的重写。 语法:a、没有body的情况 <c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session|application}”]/> b、有body ,并在body 中有重写的参数 <c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session|application}”]> <c:param> subtags </c:url> 举例:c_url.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page c language="java" %> <html> <head> <title>JSTL c:url 的使用</title> </head> <body bgcolor="#FFFFFF"> <c:url var="footer" value="footer.jsp" scope="page"> <c:param name="id" value="hellking"/> </c:url> <c: out value="${footer}"/> <br>另一种没有参数的URL<br> <c:url value="footer.jsp"/> </body> </html> <c:param> 作用:它是在<c:import>,<c:redirectt>,<c:url>中添加请求的参数。和一般的参数没什么区别。 语法:a、参数的值使用value属性指定 <c:param name=”name” value=”value”/> b、参数的值在body 中指定 <c:param name=”name”>
</c:param> 举例:c_param.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ page c language="java" %> <html> <head> <title>JSTL c:param的使用</title> </head> <body bgcolor="#FFFFFF"> <c:redirect url="footer.jsp"> <c:param name="userName"> hellking </c:param> </c:redirect> </body> </html> JSTL详解(六)
今天,我来讲解下一些很重要的jstl标签,如果运用得当,可以大大的简化数据库的操作,减少代码量。首先sql标签可以实现包括查询、更新、事务处理和设置数据源等强大的功能。下面分别讲述。 <sql:setDataSource> <sql:query> <sql:update> <sql:transaction> <sql:param> <sql:setDataSource> 语法:<sql:setDataSource>用来设置数据源,可以通过scope设置使用范围,如page、application、session等。有两种方式可以设置数据源,一种是直接使用在web中配置的数据源,只要指定jndi名就可以了(这个就不要我多讲了吧,呵呵),第二种是指定所有的连接属性。 <sql:setDataSource {dataSource=”dataSourceName” | url=”jdbcurl” [driver=”driverClassName”] [user=”userName”] [password=”password”] [var=”varName”] [scope=”{page|session|request|application}”]/> 举例:sql_datasource.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %> <%@ page c language="java" %> <html> <head> <title>JSTL:<sql:setDataSource>的使用</title> </head> <body bgcolor="#FFFFFF"> 创建普通的数据源:<br> <sql:setDataSource var="ds1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/jstlTest" user="jstl" password="jstl" /> 从jndi名称空间中获得一个数据源。<br> <sql:setDataSource var="ds2" dataSource="jdbc/ds2" /> </body> </html> <sql:query> 作用:不用说都知道了,数据库操作中最频繁的查询。 语法:a、没有body <sql:query sql=”sqlQuery” Var=”varName” [scope=”{page|session|request|application}”] [dataSource=”dataSourceName”] [maxRows=”maxRows”] [startRow=”startRow”] /> b、有一个body ,并在body 中指定了查询需要的参数 <sql:query sql=”sqlQuery” Var=”varName” [scope=”{page|session|request|application}”] [dataSource=”dataSourceName”] [maxRows=”maxRows”] [startRow=”startRow”] > <sql:param> actions </sql:query> c、有body,并且可以指定可选的参数(< sql:param >在后面讲述) <sql:query sql=”sqlQuery” Var=”varName” [scope=”{page|session|request|application}”] [dataSource=”dataSourceName”] [maxRows=”maxRows”] [startRow=”startRow”] > query optional<sql:param> actions </sql:query> 举例:sql_query.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> <%@ page c language="java" %> <html> <head> <title>JSTL:<sql:query>的使用</title> </head> <body bgcolor="#FFFFFF"> <sql:setDataSource var="ds2" dataSource="jdbc/ch12" /> 第一种查询:<hr> <sql:query var="query" dataSource="${ds2}"> SELECT * FROM sql_test </sql:query> <table border="1"> <c:forEach var="row" items="${query.rows}"> <tr> <td>Name: <c: out value="${row.id}"/></td> <td>mobile: <c: out value="${row.power}"/></td> </tr> </c:forEach> </table> <hr> 第2种查询:<hr> <sql:query var="query2" sql="SELECT * FROM sql_test where id=?" dataSource="${ds2}"> <sql:param value="01"/> </sql:query> <table border="1"> <c:forEach var="row" items="${query2.rows}"> <tr> <td>Name: <c: out value="${row.id}"/></td> <td>mobile: <c: out value="${row.power}"/></td> </tr> </c:forEach> </table> </body> </html> JSTL详解 (七) SQL相关的标签(二) <sql:update> 作用:主要是执行插入、更新和删除操作的标签。另外,还有一些没有返回结果集的sql操作也可以使用这个标签。比如 create table tableName(id int….); drop table tableName grant tableName 等等。。 语法:a、没有body的情况 <sql:update sql=”sqlUpdate” [dataSource=”dataSource”] [var=”varName”] [scope=”{page|session|request|application}”]/> b、有body ,并且在body中指定参数 <sql:update sql=”sqlUpdate” [dataSource=”dataSource”] [var=”varName”] [scope=”{page|session|request|application}”] > <sql:param> actions </sql:update> c、有body,在body中指定sql语句和可选的参数 <sql:update sql=”sqlUpdate” [dataSource=”dataSource”] [var=”varName”] [scope=”{page|session|request|application}”] > Update statement <sql:param> actions </sql:update> 举例:sql_update.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> <%@ page c language="java" %> <html> <head> <title>JSTL:的使用</title> </head> <sql:setDataSource var="ds2" dataSource="jdbc/ch12" /> 更新记录值1<hr> <sql:update var="update1" dataSource="${ds2}"> update sql_test set power='low' where id=01 </sql:update> 第2种更新:创建表<hr> <sql:update var="update4" sql="create table sql_temp_901(test varchar(20))" dataSource="${ds2}"/> 第3种更新:增加记录 <sql:update var="update5" sql="insert into sql_temp_901 values('hellking')" dataSource="${ds2}"/> 第4种更新:删除记录<hr> <sql:update var="update6" sql="delete from sql_temp_901 where test='hellking'" dataSource="${ds2}"/> 第5种更新:删除表<hr> <sql:update var="update7" sql="drop table sql_temp_901" dataSource="${ds2}"/> </body> </html> <sql:transaction> 作用:用语事务处理,它为<sql:query>和<sql:update>建立事务处理上下文,并且提供相同的数据源。 语法:<sql:transation [dataSource=”dataSourceName”]> [isolation=”isolationLevel”]> <sql:query> and <sql:update> statement </sql:transation> isolationLevel ::=”read_committed” |”read_uncommitted” |”repeatable_read” |”serializable” 注意:DataSource属性和其他标签的DataSource属性一样,isolactionlevel属性指定事务隔离的级别,如果没有指定它的值,那么就使用自己配置的DataSource事务隔离级别。而且,嵌套在里面的<sql:query> 和 <sql:update>标签不能再指定其他的数据源。<sql:transaction> 是数据库封装的轻量级事务处理,如果你需要复杂的事务处理或者分布试处理,它就不适合。 举例:sql_transaction.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> <%@ page c language="java" %> <html> <head> <title>JSTL:sql:transaction的使用</title> </head> <sql:setDataSource var="ds2" dataSource="jdbc/ch12" /> <h2>使用事务处理方式创建一个表:</h2> <sql:transaction dataSource="${ds2}"> <sql:update var="test_temp902"> create table test_temp902 ( id int primary key, name varchar(80) ) </sql:update> <sql:update sql="insert into test_temp902 values(01,'wyy')"/> <sql:update sql="update sql_test set power='wyy' where id=01"/> </sql:transaction> </body> </html> <sql:param> 作用:设置sql语句中“?”表示的占位符号的值。 语法:a、没有body,使用value指定。 <sql:param value=”value”/> b、在body中指定 <sql:param>
</sql:param> 举例:sql_param.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> <%@ page c language="java" %> <html> <head> <title>JSTL:sql:param的使用</title> </head> <sql:setDataSource var="example" dataSource="jdbc/ch12" /> 执行更新操作:<hr> <sql:update var="update2" sql="update sql_test set power=? where id=?" dataSource="${example}"> <sql:param value="high"/> <sql:param value="01"/> </sql:update> </body> </html>
天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
|
|||||
|


