zoukankan      html  css  js  c++  java
  • JavaWeb学习笔记11--JSTL标签库

    一、JSTL简介:

    JSTL全名为JavaServer Pages Standard Tag Library,中文名称为JSP标准标签函数库,目前最新的版本为1.2。JSTL是由JCP(Java Community Process)所指定的标准规格,它主要提供给Java Web开发人员一个标准通用的标签函数库。

    Web 程序开发人员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序可读性、维护性和方便性。

    既然是库文件,那我们就要先下载咯。下载链接:http://tomcat.apache.org/

    下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

    点击上图中红框部分的Taglibs,进入如下界面:

    点击上图中的红框部分,进入如下界面:

    上图中,点击最新版本进行下载。

    下载完之后,将jar包复制到JavaWeb工程的/WebContent/WEB-INF/lib目录下即可使用

     

    JSTL所提供的标签函数库主要分为五大类:

    • (1)核心标签库 (Core tag library)
    • (2)I18N 格式标签库 (I18N-capable formatting tag library)
    • (3)SQL 标签库 (SQL tag library)
    • (4)XML 标签库 (XML tag library)
    • (5)函数标签库 (Functions tag library

    最常用的是第一个,其他几个不是很常用。

    核心标签库 (Core tag library)主要有以下几种:

    1、表达式标签:

    • <c:out>:主要用来显示数据的内容,就像是 <%= scripting-language %> 一样
    • <c:set>:主要用来将变量储存至JSP范围中或是JavaBean的属性中
    • <c:remove>:主要用来移除变量
    • <c:catch>:主要用来处理产生错误的异常状况,并且将错误信息储存起来(用的少)

    2、流程控制:

    • <c:if>:用途和我们一般在程序中用的if 一样
    • <c :choose>:本身只当做 <c:when> 和 <c:otherwise> 的父标签
    • <c :when>/<c :otherwise>:使用<c:when>和<c:otherwise>来做流程控制时,两者都必须为<c:choose>的子标签(类似于switch···case···)

    3、迭代操作:

    • <c :forEach>:循环遍历,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。
    • <c :forTokens>:用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。

    下面来详细介绍一下这些标签。

    二、核心标签库:

    包含Web应用的常见工作, 比如:循环、表达式赋值、 基本输入输出等。

    1、表达式标签:

    • <c:out>:主要用来显示数据的内容,就像是 <%= scripting-language %> 一样
    • <c:set>:主要用来将变量储存至JSP范围中或是JavaBean的属性中
    • <c:remove>:主要用来移除变量
    • <c:catch>:主要用来处理产生错误的异常状况,并且将错误信息储存起来(用的少)

    代码举例:

    • <c:out>标签

    新建JavaWeb工程Test08,index.jsp代码如下:

     
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3     <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     5 <html>
     6 <head>
     7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     8 <title>Insert title here</title>
     9 <%
    10     request.setAttribute("name", "smyhvae");
    11 %>
    12 </head>
    13 <body>
    14     <c:out value="${requestScope.name} "></c:out>
    15  
    16 </body>
    17 </html>
     

    第03行、10行、14行是我添加的代码。

    03行(固定代码):使用JSTL不要忘记引入标签库。prefix="c"是前缀,“c”代表的是“<c:out>”这个表达式。uri中是填入命名空间,可以通过代码提示选择http://java.sun.com/jsp/jstl/core。可以通过下面的方式找到这个uri:在Java Reasources/Libraries/Web App Libraries/jstl.jar/META-INF目录下许多tld格式的文件,这些tld文件指的是标签库的声明文件:

    上图中的c.tld文件代表的就是core这个标签库,打开它,能够看到uri:

    其实第03行代码是固定写死了的,添加即可,可以不用深究。

    一旦引入core标签库,此时在body标签中,只要输入"<c",就可以通过代码提示看到许多标签。

    我们在第10行给request添加一个属性,然后就可以在第14行通过out输出标签输出这个值了(当然,也可以用EL表达式来输出),运行程序,效果如下:

    • <c:set>标签
     
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3     <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     5 <html>
     6 <head>
     7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     8 <title>Insert title here</title>
     9 <%
    10     request.setAttribute("name", "smyhvae");
    11 %>
    12 </head>
    13 <body>
    14     <%--输出标签 --%>
    15     <c:out value="${requestScope.name} "></c:out>
    16     
    17     <%--定义变量标签 --%>
    18     <c:set var="age" value="22"></c:set>    
    19     ${age }
    20  
    21 </body>
    22 </html>
     

    见18、19行代码。

    效果如下:

    2、流程控制:

    • <c:if>:用途和我们一般在程序中用的if 一样
    • <c :choose>:本身只当做 <c:when> 和 <c:otherwise> 的父标签
    • <c :when>/<c :otherwise>:使用<c:when>和<c:otherwise>来做流程控制时,两者都必须为<c:choose>的子标签(类似于switch···case···)

    新建index2.sp文件。代码如下:

     
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     5 <html>
     6 <head>
     7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     8 <title>Insert title here</title>
     9 <%
    10     request.setAttribute("name", "smyhvae");
    11 %>
    12 </head>
    13 <body>
    14 
    15     <%--流程控制标签if --%>
    16     <c:if test="${not empty requestScope.name }">
    17     欢迎你,${requestScope.name }
    18     </c:if>
    19 
    20     <c:if test="${empty requestScope.name }">
    21     请登录后操作
    22     </c:if>
    23     <br />
    24 
    25     <%--流程控制标签choose --%>
    26     <c:set var="age" value="22"></c:set>
    27 
    28     <c:choose>
    29         <c:when test="${age<18 }">
    30             未成年,不许进。
    31         </c:when>
    32         <c:when test="${age>=18 && age<50 }">
    33             欢迎光临。
    34         </c:when>
    35         <c:otherwise>
    36             老年人请注意身体。
    37         </c:otherwise>
    38     </c:choose>
    39 
    40 </body>
    41 </html>
     

    15至22行为if标签(和if语句的功能是一样的),16行中test里面的内容必须为boolean值:我们在第10行添加了name的值,然后在16行、20行判断name的值是否为空,进而做出判断。

    25行至38行为choose标签(和switch···case···的功能是一样的)。

    运行程序,效果如下:

    3、迭代操作:

    • <c :forEach>:循环遍历,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。
    • <c :forTokens>:用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。

    代码举例:

    • <c :forEach>

    新建类User,作为遍历的对象。User.java代码如下:

     
     1 package com.vae.bean;
     2 
     3 public class User {
     4     private String name;
     5     private String sex;
     6     private int age;
     7     public User() {
     8         super();
     9     }
    10     public User(String name, String sex, int age) {
    11         super();
    12         this.name = name;
    13         this.sex = sex;
    14         this.age = age;
    15     }
    16     public String getName() {
    17         return name;
    18     }
    19     public void setName(String name) {
    20         this.name = name;
    21     }
    22     public String getSex() {
    23         return sex;
    24     }
    25     public void setSex(String sex) {
    26         this.sex = sex;
    27     }
    28     public int getAge() {
    29         return age;
    30     }
    31     public void setAge(int age) {
    32         this.age = age;
    33     }
    34     @Override
    35     public String toString() {
    36         return "User [name=" + name + ", sex=" + sex + ", age=" + age + "]";
    37     }
    38 
    39     
    40 }
     

    新建文件index3.jsp,代码如下:

     
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <%@page import="com.vae.bean.User,java.util.*"%>
     4 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     6 <html>
     7 <head>
     8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     9 <title>Insert title here</title>
    10 
    11 <%
    12     List<User> users = new ArrayList<User>();
    13     User u1 = new User("生命壹号", "男", 22);
    14     User u2 = new User("生命二号", "男", 23);
    15     User u3 = new User("vae", "女", 24);
    16     users.add(u1);
    17     users.add(u2);
    18     users.add(u3);
    19     request.setAttribute("users", users);
    20 %>
    21 </head>
    22 
    23 <body>
    24     <table border="1">
    25         <tr>
    26             <th>name</th>
    27             <th>sex</th>
    28             <th>age</th>
    29         </tr>
    30 
    31         <c:forEach items="${requestScope.users }" var="user">
    32             <tr>
    33                 <td>${user.name}</td>
    34                 <td>${user.sex}</td>
    35                 <td>${user.age}</td>
    36             </tr>
    37         </c:forEach>
    38 </body>
    39 </html>
     

    核心代码是31行至37行。

    我们在12至19行里,往List中加入多个user对象的值,并放入request中。然后在第24行加入一个表格,在表格里通过<c :forEach>遍历User对象中的内容,这里用到了<c :forEach>中的两个属性:31行的"items"表示需要迭代的集合,"var"表示每次一取,定义的变量。

    运行程序,效果如下:

    <c :forEach>中的属性:

    我们在上面的代码中的31行用到了过<c :forEach>中的两个属性:items和var。接下来来学习一下其他的属性:

    • begin:表示从第几个开始索引,一般不写;
    • end:表示结束的位置。如果需要遍历十行,在此处写10即可。
    • step:增量。

    上面的三个属性用的比较少。

    • varStatus:当前的状态。它的状态有以下几个:

                index  索引 从0开始

                count  从1开始 当前遍历次数

                current 当前正在迭代的对象

                first  是否是第一个

                last   是否是最后一个        

    我们给varStatus举个例子。我们在上面的index3.jsp代码中进一步添加:

    index3.jsp:

     
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <%@page import="com.vae.bean.User,java.util.*"%>
     4 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     6 <html>
     7 <head>
     8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     9 <title>Insert title here</title>
    10 
    11 <%
    12     List<User> users = new ArrayList<User>();
    13     User u1 = new User("生命壹号", "男", 22);
    14     User u2 = new User("生命二号", "男", 23);
    15     User u3 = new User("vae", "女", 24);
    16     users.add(u1);
    17     users.add(u2);
    18     users.add(u3);
    19     request.setAttribute("users", users);
    20 %>
    21 </head>
    22 
    23 <body>
    24 
    25     <table border="1">
    26         <tr>
    27             <th>name</th>
    28             <th>sex</th>
    29             <th>age</th>
    30             <th>状态值</th>
    31         </tr>
    32 
    33         <c:forEach items="${requestScope.users }" var="user" varStatus="status">
    34             <tr>
    35                 <td>${user.name}</td>            
    36                 <td>${user.sex}</td>            
    37                 <td>${user.age}</td>            
    38                 <td>
    39                 index :${status.index }<br/>
    40                 count :${status.count }<br/>
    41                 current :${status.current }<br/>
    42                 first :${status.first }<br/>
    43                 last :${status.last }<br/>
    44                 </td>            
    45             </tr>
    46         </c:forEach>
    47     </table>
    48 </body>
    49 </html>
     

    加粗部分的30行、33行中的varStatus属性、38行至44行是我进一步添加的代码。运行程序,效果如下:

    通过上面的图片,再来回顾一下varStatus的各种状态,就一目了然了:

    • index  索引 从0开始
    • count  从1开始 当前遍历次数
    • current 当前正在迭代的对象
    • first  是否是第一个
    • last   是否是最后一个 

    代码举例:

    • <c :forTokens>

    新建index4.jsp文件,代码如下:

    index4.jsp:

     
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     5 <html>
     6 <head>
     7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     8 <title>Insert title here</title>
     9 </head>
    10 <body>
    11 
    12     <c:set var="likes" value="羽毛球,摄影,音乐"></c:set>
    13     <c:forTokens items="${likes }" delims="," var="myValue">
    14         ${myValue }<br/>
    15     </c:forTokens>
    16 </body>
    17 </html>
    复制代码

    12行:字符串的键为likes,值为"羽毛球,摄影,音乐"。

    13行:遍历items中的字符串,delims中的逗号是分隔符。

    运行程序,效果如下:

    【工程文件】

    链接:http://pan.baidu.com/s/1qWNU6Xe

    密码:itqn

  • 相关阅读:
    3.这个月有几天?
    3.这个月有几天?
    3.这个月有几天?
    2.求一个整数有几位(简单字符串操作)
    Algs4-1.2.1编写一个Point2D的用例-分治法
    Algs4-1.2.1编写一个Point2D的用例
    Algs4-1.1.39随机匹配
    Algs4-1.1.38二分查找与暴力查找
    Algs4-1.1.37糟糕的打乱
    Algs4-1.1.36乱序检查
  • 原文地址:https://www.cnblogs.com/huangyangquan/p/8998052.html
Copyright © 2011-2022 走看看