JSTL

Apache提供的标签库,jar包:jstl-1.2.jar,如果用MyEclipse,它会自动导入,无需自己导入,如果没有使用MyEclipse那么需要自行导入。

------------------

导入JSTL核心标签库
  <%taglib prefix="c" uri="http://java.sun.com/jstl/core"%>

<c:set>
  * <c:set var="a" value="hello"/> 创建名为a,值为hello的域属性,范围:page
  * <c:set var="a" value="hello" scope="session"/> 范围为session

<c:out>
  * <c:out value="aaa"/> 输出字符串aaa
  * <c:out value="${aaa"/> 输出域属性aaa,其中与${aaa}相同
  * <c:out value="${aaa}" default="xxx"/>如果${aaa}不存在,那么输出xxx字符串
  * <c:out value="${aaa}" escapeXml="true"/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击

<c:remove>
  * <c:remove var="a"/> 删除名为a的域属性
  * <c:remove var="a" scope="page"/> 删除page域中名为a的域属性

<c:url>
  * <c:url value="/AServlet"/> 输出URL:/项目名/AServlet
  * <c:url value="/AServlet" var="url" scope="page"/> 把生成的url保存到page域中,而不会输出
  * <c:url value="/AServlet">:输出URL:/项目名/AServlet?username=%xx%xx%xx%xx%xx%xx,其中张三会被URL编码
    <c:param name="username" value="张三"/>
  </c:url/>

<c:if>
  * <c:if test="${条件}"> 当条件为true时执行标签体内容
    hello
   </c:if>

<c:choose>
    * <c:choose>
      <c:when test="${条件1}">a</c:when>
      <c:when test="${条件2}">b</c:when>
      <c:when test="${条件3}">c</c:when>
      <c:otherwise>d</c:otherwise>
      </c:choose>

  等同与:
    if() {
    } esle if() {
    } esle if() {
    } else if() {
    } else {
    }

<c:forEach>

  可以用来遍历数组、List、Map、

    1. 计数循环

      <c:forEach begin="1" end="10" var="i">
        ${i}
      </c:forEach>
    等同于
      for(int i = 1; i <= 10; i++) {
      out.println(i);
      }

      <c:forEach begin="1" end="10" var="i" step="2">
        ${i}
      </c:forEach>
    等同于
      for(int i = 1; i <= 10; i+=2) {
      out.println(i);
      }

    2. 遍历数组

      <%
        String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
        pageContext.setAttribute("ns", names);
      %>
      <c:forEach var="item " items="${ns } ">
        <c:out value="name: ${item } "/><br/>
      </c:forEach>

    3. 遍历List

      <%
        List<String> names = new ArrayList<String>();
        names.add("zhangSan");
        names.add("liSi");
        names.add("wangWu");
        names.add("zhaoLiu");
        pageContext.setAttribute("ns", names);
      %>
      <c:forEach var="item" items="${ns }">
        <c:out value="name: ${item }"/><br/>
      </c:forEach>

    4. 遍历Map

      <%
        Map<String,String> stu = new LinkedHashMap<String,String>();
        stu.put("number", "N_1001");
        stu.put("name", "zhangSan");
        stu.put("age", "23");
        stu.put("sex", "male");
        pageContext.setAttribute("stu", stu);
      %>
      <c:forEach var="item " items="${stu }">
        <c:out value="${item.key }: ${item.value } "/><br/>
      </c:forEach>

    5. 循环状态对象

      循环状态对象是用来说明循环的状态的,属性如下:
          count:int类型,当前以遍历元素的个数;
          index:int类型,当前元素的下标;
          first:boolean类型,是否为第一个元素;
          last:boolean类型,是否为最后一个元素;
          current:Object类型,表示当前项目。

            <c:forEach var="item" items="${ns }" varStatus="vs" >
              <c:if test="${vs.first } ">第一行:</c:if>
              <c:if test="${vs.last } ">最后一行:</c:if>
              <c:out value="第${vs.count } 行: "/>
              <c:out value="[${vs.index } ]: "/>
              <c:out value="name: ${vs.current } "/><br/>
            </c:forEach>

导入JSTL格式化标签库

  <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

    <%
      Date date = new Date();
      pageContext.setAttribute("d", date);
    %>
    <fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss "/>

 

    <%
        double d1 = 3.5;
        double d2 = 4.4;
        pageContext.setAttribute("d1", d1);
        pageContext.setAttribute("d2", d2);
    %>
    <fmt:formatNumber value="${d1 }" pattern="0.00 "/><br/>
    <fmt:formatNumber value="${d2 }" pattern="#.## "/>

      * pattern:0.00,表示小数不足两位时,使用0补足两位
      * pattern:#.##,表示小数不足两位时,有几位显示几位,不会补足

示例代码:

 <%@ page language="java" import="java.util.*,cn.yzu.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<!-- JSTL标签以及EL表达式的使用与区别 -->
<!-- 输出标签 -->
<%
request.setAttribute("a", "<font color='red'>aaaaa</font>");
request.setAttribute("b", null);
%>
${a}&nbsp;&nbsp;&nbsp;
<c:out value="a"/>&nbsp;&nbsp;&nbsp;
<c:out value="${a}"/><br>
<c:out value="b" default="bbbbb"></c:out><br> <!-- 如果b为空,输出default内容 -->
<c:out value="${a}" escapeXml="false"/><hr> <!-- 转义,默认的true --> <!-- 在域中设置值,默认是pageScope -->
<c:set var="c" value="ccccc"/>
<c:set var="d" value="ddddd" scope="request"/>
<c:out value="${pageScope.c}"/>&nbsp;&nbsp;&nbsp;
<c:out value="${d}"/><hr> <!-- 删除域中的值,默认是删除所有域中的值,如下例是删除所有域中的键为e的元素 -->
<c:remove var="e"/>
<c:remove var="c" scope="page"/>
<c:out value="${pageScope.c}"/><hr> <!-- URL标签 -->
<c:url value="/"/>&nbsp;&nbsp; <!-- 输出项目名,加/ -->
${pageContext.request.contextPath }<br><!-- 输出项目名,不加/ -->
<!-- 下面两个可以达到一样的效果 -->
<c:url value="/AServlet"/>&nbsp;&nbsp;
${pageContext.request.contextPath }/AServlet<br>
<c:url value="/AServlet">
<c:param name="username">张三</c:param><!-- 可以为URL增加参数 -->
</c:url>
<c:url value="/AServlet" var="f" scope="page"/><br> <!-- 将地址赋给page域的f -->
<c:out value="${f}"/>&nbsp;&nbsp;
<!-- 下例相当于<a href="/webBegin/index.jsp">重新请求本页面</a> -->
<a href="<c:url value='/index.jsp'/>">重新请求本页面</a><hr> <!-- if,choose选择标签 -->
<c:set var="g" value="87"/>
<c:if test="${g>=0&&g<=100 }">
你得了${g }分
</c:if>&nbsp;
<c:choose>
<c:when test="${g>=85}">成绩优秀</c:when>
<c:when test="${g>=60}">成绩及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose><hr> <!-- 循环遍历标签 -->
<c:forEach begin="1" end="10" step="2" var="h">
${h }&nbsp;
</c:forEach><br>
<%
String str[]={"one","two","three"};
request.setAttribute("str", str);
%>
<c:forEach items="${str}" var="nstr"> <!-- 注意,items="${str}"千万不可写成items="${str} ",后面不可有空格 -->
${nstr }&nbsp;
</c:forEach><br>
<c:forEach items="${str}" var="nstr" varStatus="vs">
${vs.count }:${nstr }&nbsp;
</c:forEach><hr> <!-- 格式化标签 -->
<%
request.setAttribute("date", new Date());
request.setAttribute("m", 3.1415);
%>
<fmt:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/><br>
<fmt:formatNumber value="${m }" pattern="0.000"/><br>
<fmt:formatNumber value="${m }" pattern="0.00000"/><br><!-- 四舍五入保留五位小数,小数不足时,使用0补足两位 -->
<fmt:formatNumber value="${m }" pattern="#.#####"/><br><!-- 四舍五入保留五位小数,小数不足时,不补足 -->
</body>
</html>

index.jsp

运行结果:

 

补充:自定义标签

1. 步骤
  * 标签处理类(标签也是一个对象,那么就需要先有类!)
  * tld文件,它是一个xml
  * 页面中使用<%@taglib%>来指定tld文件的位置

2. 标签处理类
  SimpleTag接口:
    * void doTag():每次执行标签时都会调用这个方法;
    * JspTag getParent():返回父标签(非生命周期方法)
    * void setParent(JspTag):设置父标签
    * void setJspBody(JspFragment):设置标签体
    * void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext

  其中doTag()会在其他三个方法之后被tomcat调用。

3. 配置tld文件

  tld文件一般都放到WEB-INF之下,这样保证客户端访问不到!
    <tag>
      <name>myTag1</name> 指定当前标签的名称
      <tag-class>cn.itcast.tag.MyTag1</tag-class> 指定当前标签的标签处理类!
      <body-content>empty</body-content> 指定标签体的类型,我们这里使用的是空标签!
      </tag>

4. 页面中指定tld文件位置

  <%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>
  导标签库,就是为页面指定tld文件的位置!

标签体内容
  * empty:无标签体!
  * JSP:jsp2.0已经不在支持这个类型了!表示标签体内容可以是:java脚本,可以是标签,可以是el表达式
  * scriptless:只能是EL表达式,也可以是其他的标签!
  * tagdependent:标签体内容不会被执行,而是直接赋值标签处理类!

不在执行标签下面内容的标签!

  在标签处理类中的doTag()中使用SkipPageException来结束!
  Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageException,它会跳过本页面其他内容!

标签属性

  步骤:
    1. 给你的标签处理类添加属性!
      为标签处理类添加属性,属性至少要且一个set方法!这个set方法会在doTag()方法之前被tomcat执行!所在doTag()中就可以使用属性了。

    2. 在tld文件中对属性进行配置

      <attribute>
        <name>test</name> 指定属性名
        <required>true</required> 指定属性是否为必需的
        <rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL
      </attribute>

JSTL标签详解以及应用实例的更多相关文章

  1. jsp页面中jstl标签详解

    JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...

  2. 【转】jsp页面中jstl标签详解

    原文地址: JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实 ...

  3. jstl标签详解 (转载)

    JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...

  4. jsp页面中jstl标签详解[转]

    JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...

  5. Java jsp页面中jstl标签详解

    JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...

  6. 引用 struts2标签详解 - wo的的日志 - 网易博客

    引用 元元 的 struts2标签详解   引用 COLD 的 struts2标签详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@t ...

  7. Mybatis批量insert 返回主键值和foreach标签详解

    Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...

  8. route命令详解与使用实例 ,同时访问内外网

    route命令详解与使用实例     2011-10-18 12:19:41|  分类: 其他 |  标签:route   |字号 订阅   1.   使用背景 需要接入两个网络,一个是部署环境所在内 ...

  9. 官网实例详解-目录和实例简介-keras学习笔记四

    官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras   版权声明: ...

随机推荐

  1. Java for LeetCode 225 Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  2. Java for LeetCode 224 Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  3. winform,wpf,winrt获取屏幕分辨率

    winform 当前的屏幕除任务栏外的工作域大小     this.Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Widt ...

  4. AIX系统中安装Java6全过程(全部)

    ====================================================   From: GCG TSC pSeries <ibm800p@cn.ibm.com& ...

  5. C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?

    第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问 ...

  6. August 19th 2016 Week 34th Friday

    Friends are not the people you meet at the top, they are the people who were with you at the bottom. ...

  7. August 12th 2016 Week 33rd Friday

    Everything is good in its season. 万物逢时皆美好. Every dog has its day. You are not in your best condition ...

  8. 解决osg路径与文件名中的中文字符问题

    转至:http://blog.csdn.net/zhuqinglu/article/details/2064013 在打开或者保存一个osg模型的时候,经常遇到中文路径或者中文文件名的问题,此时会提示 ...

  9. iOS - 定制多样式二维码

    二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息.   最常见的二维码功能包括信息获取.网 ...

  10. monkey测试

    一.理解monkey测试 1.Monkey测试是Android自动化测试的一种手段.Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常. 2.当Mon ...