第九章 Jsp标准标签库 什么是Jsp标准标签库 1)Jsp标准标签库(javaServer pages standard tag library)简称jstl是jsp已经为我们做好的 可以直接使用的用于编写和开发jsp页面的一组标准标签。 2)jstl的最终目的是希望为我们提供一个无脚本环境,在此环境中用户可以使用标签来代替以前的Java程序段。 这样简化的jsp页面的开发,即使一个不懂java程序的用户也可以使用jstl来进行jsp页面的开发 3)jstl包含三类标签: A)核心标签库 11)通用标签 22)条件标签 33)迭代标签 D)国际化与格式化标签库 E)Sql标签库 核心标签库 1)核心标签库由通用标签、条件标签、迭代标签所构成 2)通用标签用于操作jsp页面创建的范围变量 3)条件标签用于对jsp页面中的代码进行条件判断和处理 4)迭代标签用于循环遍历一个对像集合。相当于C#中的for earch 5)要使用核心标签库,必须经过两个步骤 A)设置工程需要库为JSTL1.1-->选择Project-->ProjectProperty-->RequiredLibrarles-->Add B)必须要导入核心标签库的Url格式如下: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 通用标签 1)通用标签用于设置、删除和显示在jsp页面内创建的变量值。 2)<c:set var="变量名" value="值" scope="范围"/>用于设置变量值 其中的范围是:page,request,session.application,默认为page 比如: <c:set var="uid" value="chen" scope="session"/> 相当于:<% session.setAttribute("uid","chen"); %> 只不过一个是jsp标签,一个是Javascriptlet Java代码段 3)<c:out value="${变量名}"/>用于显示变量的值或直接通过EL来进行显示${变量名} 4)<c:remove var="变量名" scope="范围"/> 条件标签 1)条件标签以支持jsp页面中的各种条件,共有两种类型 A)<c:if test="条件" > 相当于 if (条件) 内容 { </c:if> } 举例: 1)让用户输入两个数,求出最大值与最小值 提示:创建一个页面max.jsp页面,然后提交到dowithmax.jsp页面 <c:if test="${param.num1>0+param.num2}"> <c:set var="max" value="${param.num1}"/> </c:if> <c:if test="${param.num1<0+param.num2}"> <c:set var="max" value="${param.num2}"/> </c:if> 最大值是:<c:out value="${max}"/> 2)让用户输入商品数量、商品单价、选择是否是会员来核算应付款 一级会员:98折 二级会员:97折 三级会员:96折 提示:创建一个buy.jsp页面,然后创建一个dowithbuy.jsp页面 <c:if test="${param.vip==1}"> <c:set var="discount" value="0.99"/> </c:if> <c:if test="${param.vip==2}"> <c:set var="discount" value="0.98"/> </c:if> <c:if test="${param.vip==3}"> <c:set var="discount" value="0.97"/> </c:if> 应付款:${param.amount*param.unitprice*discount} B)<c:choose> <c:when test="条件1"> 内容 </c:when> <c:when test="条件2"> 内容 </c:when> .............. <c:otherwise> 内容 </otherwise> </c:choose> 1:修改上页的两例 2:让用户输入两个数和一个操作符,求出对应值 迭代标签 1)迭代标签相当于C#中的for earch,就是循环。 2)迭代标签有两种形式。一种是<forEeach>,另外一种是<forTokens> A):<c:forEeach var="迭代变量名" items="集合" varStatus="状态变量名"> 内容 </c:forEeach> 说明: var表示变量名相当于foreach(int item in 集合) 中的item items:相当于foreach中的item varStatus:是状态变量,可以省略 通常有: ${状态变量名.count}---从1开始的当前迭代项 ${状态变量名.index}---从0开始的当前迭代项 举例: 1) <% String[] Car={"彩电","空调","手机","微波炉"}; %> 所有的汔车如下: <c:forEach var="shop" items="<%=Car%>" varStatus="status"> <ul>第${status.count}种商品是${shop}</ul> </c:forEach> 2)从数据库中查询出一个ResultSet并存放ArraryList。通过迭代标签进行输出 public class shop { public ArrayList getAllShop() { ArrayList shops = new ArrayList(); ResultSet rs = tagapp.DbManager.RunHasResultSql("select * from shopinfo"); while (rs.next()) { shop demo = new shop(); demo.setId(rs.getString(1)); demo.setName(rs.getString(2)); demo.setUnitPrice(rs.getInt(3)); shops.add(demo); } return shops; } <jsp:useBean id="demo" scope="session" class="tagapp.shop"/> <c:forEach var="item" items="<%=demo.getAllShop()%>"> ${item.id} ${item.name} ${item.unitPrice} <br> </c:forEach> B):<c: forTokens items="以分隔符分开的字符串" delims="分隔符" var="迭代变量名"> 内容 </c:forTokens 应用举例: 1) <c:set var="shops" value="彩电,空调,热水器"/> <c:forTokens delims="," items="${shops}" var="item"> ${item}<br /> </c:forTokens> 2)从数据库中取出由固定分隔符分开的某个字段的值 shop表: s1-彩电-1200 s2-空调-1300 s3-微波炉-1500 国际化与格式化标签 1)国际化与格式化标签主要是用来实现一个WEB应用程序同时有几种国家的语言 2)必须要导入:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 2)原理: A:为每一种语言做一个资源文件。比如: app_en.properties(英文), app_zh.properties(中文) 格式形如:键=值 app_en.properties文件的内容如下 uid=this my uid pwd=this my pwd login=login reset=reset app_zh.properties文件的内容如下 uid=用户名 pwd=密码 login=登录 reset=重置 1:注意资源文件命名的规范:文件名_两个字符标识. properties 2:如果是中文为了避免乱码。要通过如下命令进行转换 native2ascii -encoding gb2312 源文件 目的文件 比如: native2ascii -encoding gb2312 app_zh1.properties(源文件) app_zh1.properties(目的文件) 3:资源文件一定要放在WEB-INF\classes下面,classes一定要手动创建****** B:通过<fmt:setLocale value="en或zh"/>来决定使用那种语言的资源文件 C:通过<fmt:setBundle basename="app"/>来决定要加载那些资源文件 D:通过<fmt:message key="pwd" />来取出资源文件里面的值 E:注意B,C的顺序不能颠倒 举例: 1)登录的中文与英文的例子 <c:if test="${param.language==null || param.language=='en'}"> <fmt:setLocale value="en"/> </c:if> <c:if test="${param.language=='zh'}"> <fmt:setLocale value="zh"/> </c:if> <fmt:setBundle basename="app"/> Sql标签库 1)JSTL的SQL标签用于访问数据库,它提供的各种标签可用于在jsp页面内直接访问 数据库,从而减少了JavaScriptlet代码 2)要使用sql标签库,必须要导入<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> 3)Sql标签库由以下几种 A:设置数据源 格式:<sql:setDataSource driver="sun.jdbc.odbc.JdbcOdbcDriver" url="jdbc:odbc:jsp" var="conn"/> var:给数据源取一个别名,以后其它的sql标签将使用该变量做为数据源进行查询 scope:数据源变量的范围 B:对数据库进行更新操作 格式: <sql:update dataSource="${数据源变量}"> 写上更新语句,是不返回结果的(delete,update,insert,create) </sql:update> dataSource:指定进行数据更新的连接 比如: <sql:update dataSource="${conn}"> update shopinfo set unitprice=unitprice+100 </sql:update> C:对数据库进行查询 格式: <sql:query var="shops" dataSource="${conn}"> select语句 </sql:query> var:给查询的结果取一个变量名 dataSource:指定进行数据更新的连接 此标签经常与<forEarch>标签一起使用,来显示查询出的值 在使用<forEarch>时可以使用begin end 来指定需要从那里开始到那里结束**** 比如: <sql:query var="shops" dataSource="${conn}"> select * from shopinfo </sql:query> <c:forEach var="row" items="${shops.rows}"> ${row.id} ${row.name} ${row.unitprice} </c:forEach> 说明: 1)<c:forEach var="row" items="${shops.rows}" begin="1"> 从第二行开始,全部取到 2)<c:forEach var="row" items="${shops.rows}" begin="1" end="3"> 从第二行到第四行,全部取到 D:为sql语句中的参数设置值,它一般是<sql:query>与<sql:update>的子标签 格式:<sql:param value="值"/> 比如: <c:set var="id" value="s1"/> <sql:query var="shops" dataSource="${conn}"> select * from shopinfo where id=? <sql:param value="${id}"/> </sql:query> 举例: 1)通过标签从数据库查询出数据,并显示出来 2)从表单填写商品信息并添加到数据库中 3)让用户从表单中选择部门编号,从另一个页面中显示所有该部门的职工 2)在第一题的基础上进行数据的分页 <c:if test="${conn==null}"> <sql:setDataSource driver="sun.jdbc.odbc.JdbcOdbcDriver" url="jdbc:odbc:jsp" var="conn" scope="session"/> <sql:query var="shops" dataSource="${conn}" scope="session"> elect * from test </sql:query> <c:set var="curpage" value="1" scope="session"/> //设置当前页的变量curpage </c:if> <c:choose> c:when test="${shops.rowCount==0}"> 没的查询的结果 </c:when> <c:otherwise> //开始查询 <c:if test="${param.page == 'next'}"> //如果是下一页 <c:if test="${pagesize*curpage<shops.rowCount}"> //如果没有到末尾 <c:set var="curpage" value="${curpage+1}" scope="session"/> </c:if> </c:if> <c:if test="${param.page=='prio'}"> 如果是上页 <c:if test="${curpage>1}"> //如果没有到首页 <c:set var="curpage" value="${curpage-1}" scope="session"/> </c:if> </c:if> <c:forEach var="row" items="${shops.rows}" begin="${pagesize*(curpage-1)}" end="${pagesize*curpage-1}" > <tr> <td><div align="center">${row.id}</div></td> <td><div align="center">${row.a}</div></td> <td><div align="center">${row.b}</div></td> </tr> </c:forEach> <a href="jsp1.jsp?page=next">下一页</a> <a href="jsp1.jsp?page=prio">上一页</a> </c:otherwise> </c:choose>

评论