JSTL标签库技术学习

JSTL标签库的主要函数演示。
导包

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

c:out标签演示

c:out标签等价 ${ 标识符} 的输出功能,不同点在于 c:out标签有两个属性
defalut属性,当读取的属性不存在,则输出默认值
escapeXml属性, 当该属性设置为true(默认)时,会把”<”编码成”<”输出,若设为false则不编码

h3>c:out标签演示</h3>
    <%
        pageContext.setAttribute("name", "Jack");
        pageContext.setAttribute("age", "22");
     %>
    <c:out value="${name}"></c:out>  , ${name} <br/>

    <!-- c:out标签和EL表达式输出的区别在于该标签的两个属性:defalut和escapeXml  -->
    <!-- 1. defalut属性,当读取的属性不存在,则输出默认值  -->
    <c:out value="${age}" default="18"></c:out>

    <!-- 2. escapeXml属性, 当该属性设置为true(默认)时,会把"<"编码成"&lt;"输出,若设为false则不编码  -->
    <%
       pageContext.setAttribute("str", "<font color='red'>湖南城院</font>");
     %>
    ${str}, <c:out value="${str}" escapeXml="true"></c:out> 

这里写图片描述

c:set标签演示

1.给JavaBean设置属性
2.给String类型的变量赋值, 相当于编程中的:定义变量

<h3>c:set标签演示</h3>
    <!-- 1.给JavaBean设置属性 -->
    <jsp:useBean id="u" class="cn.hncu.domain.User"></jsp:useBean>
    <c:set target="${u}" property="name" value="Tom" ></c:set>
    <c:set target="${u}" property="age" value="25" ></c:set>
    <c:set target="${u}" property="pwd" value="1234" ></c:set>
    <c:out value="${u}"></c:out>
    <br/>
    <!-- 2.给String类型的变量赋值, 相当于编程中的:定义变量  -->
    <c:set var="sum" value="120" scope="request"></c:set>
    <c:out value="${sum}"></c:out>

    <br/><br/><br/>
    <h3>c:remove标签演示</h3>
    <c:remove var="sum" scope="request"/> <!-- 如果没指定scope则依次从4个容器找 -->
    <c:out value="${sum}" default="0"></c:out>

这里写图片描述
* c:if标签演示 *

和Java中的 if–else 类似

<h3> c:if标签演示 </h3>
    <!-- 如果显示块比较复杂,那么用c:if显然比直接用EL表达式好得多 -->
    ${age>20? "成年啦!!!!":"嫩了点" } <br/>
    <!-- 用c:if写   if-else -->
    <c:if test="${age>20}" var="boo">  <!-- 把test中的测试条件的结果值存放到变量var中(可以指定scope) -->
               成年啦!!!!<br/>
       <form>
           Name:<input type="text" name="name"/> <br/>
           Pwd:<input type="password" name="pwd"/> <br/>
           <input type="submit"/>
       </form>
    </c:if>
    <c:if test="${!boo}">
        嫩了点
    </c:if>

    <c:if test="${age<20}">
              嫩了点
    </c:if>

这里写图片描述
c:forEach标签演示

用来遍历的标签,

<h3>c:forEach标签演示</h3>
     <p>一、普通for循环的功能</p>
     <c:forEach begin="1" end="10" step="2" var="i">
         ${i}:欢迎光临&nbsp;
     </c:forEach>
     <br/>
     <p>二、增强for循环的功能:遍历集合, forEach标签中的items属性代表被遍历的集合,var代表每次循环读出的元素</p>
     <!-- 1. 遍历数组 -->
     <%
        String strs[]={"aa","bb","111"};
        pageContext.setAttribute("strs", strs);
      %>
     <c:forEach items="${strs}" var="str">
        ${str},,
     </c:forEach>
     <br/>

     <!-- 2. 遍历List -->
     <%
         List list = new ArrayList();
         list.add("aaa");
         list.add("bbb");
         list.add("666");
         pageContext.setAttribute("list", list);
      %>
     <c:forEach items="${list}" var="str">
         ${str}&nbsp;
     </c:forEach>
     <br/>

      <!-- 3. 遍历Map -->
      <%
         Map map = new HashMap();
         map.put("name", "Jack");
         map.put("age", "25");
         map.put("pwd", "1234");
         pageContext.setAttribute("map", map);
         //Entry en = null; en.getKey(); en.getValue();
       %>
       <c:forEach items="${map}" var="en">
          ${en}<br/>
       </c:forEach>
       <c:forEach items="${map}" var="en">
          ${en.key} : ${en.value } <br/>
       </c:forEach>

       <!-- 4. 遍历 集合中的元素是值对象的情况  -->
       <%
          List<User> list2 = new ArrayList<User>();
          list2.add( new User("Jack",22,"1234") );
          list2.add( new User("张三",20,"1111") );
          list2.add( new User("Rose",23,"1222") );
          list2.add( new User("李四",30,"0000") );
          pageContext.setAttribute("list2", list2);
        %>
        <!-- varStatus属性代表的是一个封装了index和count两个成员变量的对象,
                             前者是从0开始的索引下标,后者是从1开始的计数器 -->
       <c:forEach items="${list2}" var="user" varStatus="idx">
           ${idx.index},${idx.count}: &nbsp;
           <c:out value="${user.name}"></c:out>,
           <c:out value="${user.age}"></c:out>,
           <c:out value="${user.pwd}"></c:out><br/>
       </c:forEach>

这里写图片描述

应用:用JSTL+EL表达式 实现表格行背景间隔显示

<html>
<head>
    <style type="text/css">
       table{
          width:300px;
          border: 1px solid red;
          border-collapse: collapse;
       }
       td,th{
          border: 1px solid red;
       }
       .bk{
          background: yellow;
       }
    </style>
</head>
<body>

    <h3> 用JSTL+EL表达式 实现表格行背景间隔显示</h3>
    <%
        List<User> list = new ArrayList<User>();
        list.add(new User("Jack", 22, "1234"));
        list.add(new User("张三", 20, "1111"));
        list.add(new User("Rose", 23, "1222"));
        list.add(new User("李四", 30, "0000"));
        list.add(new User("李四1", 30, "0000"));
        list.add(new User("李四2", 30, "0000"));
        list.add(new User("李四3", 30, "0000"));
        request.setAttribute("list", list);
    %>

    <table>
       <tr> <th>姓名</th> <th>年龄</th></tr>
       <c:forEach items="${list}" var="user" varStatus="idx">
           <c:if test="${idx.count%2==0}">
              <tr class="bk">
           </c:if>
           <c:if test="${idx.count%2==1}">
              <tr>
           </c:if>

              <td>${user.name}</td>  <td>${user.age}</td>
           </tr>
       </c:forEach>
    </table>

    <hr/>
    <table>
       <tr> <th>姓名</th> <th>年龄</th></tr>
       <c:forEach items="${list}" var="user" varStatus="idx">
           <c:if test="${idx.count%2==0}" var="boo">
              <tr class="bk">
           </c:if>
           <c:if test="${!boo}">
              <tr>
           </c:if>

              <td>${user.name}</td>  <td>${user.age}</td>
           </tr>
       </c:forEach>
    </table>

</body>
</html>

这里写图片描述

我再JSP页面对着JSTL函数的源码试了一些方法,代码如下

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>>JSTL标签库技术学习</title>


  </head>

  <body>
            <h3>JSTL标签库技术学习</h3>
    <%
        request.setAttribute("name", "aahnc     uanha a");
    %>
    ${fn:toUpperCase(name) }
    ${fn:toLowerCase(name) }
    ${fn:indexOf(name,"Hncu") } <%-- 后面的字符在前面不存在就返回-1,存在就返回最开始的位子 例子 0 --%>
    ${fn:contains(name,"Hncu") }
    ${fn:containsIgnoreCase(name,"hncu") }
    ${fn:startsWith(name,"aa") }
    ${fn:endsWith(name,"aa") }
    ${fn:substring(name,0,2)}      
    ${fn:substringAfter(name,"h") } <%-- 返回值为 第一个h 后面的  --%>
    ${fn:substringBefore(name,"n") } <%-- 返回值为 第一个h 前面的  --%>
    ${fn:trim("a b") } <%--   不管用 什么鬼?
                            public static String trim(String input) {
                                if (input == null) return "";
                                return input.trim();
                              } 
                       --%>
    <hr>
    hulonghncu<br/>
    ${fn:replace("hulonghncu","n","XX") }
    <hr>

  </body>
</html>

测试结果
这里写图片描述
jstl函数的源码

package org.apache.taglibs.standard.functions;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.jsp.JspTagException;
import org.apache.taglibs.standard.resources.Resources;
import org.apache.taglibs.standard.tag.common.core.Util;

public class Functions
{
  public static String toUpperCase(String input)
  {
    return input.toUpperCase();
  }

  public static String toLowerCase(String input)
  {
    return input.toLowerCase();
  }

  public static int indexOf(String input, String substring)
  {
    if (input == null) input = "";
    if (substring == null) substring = "";
    return input.indexOf(substring);
  }

  public static boolean contains(String input, String substring) {
    return (indexOf(input, substring) != -1);
  }

  public static boolean containsIgnoreCase(String input, String substring) {
    if (input == null) input = "";
    if (substring == null) substring = "";
    String inputUC = input.toUpperCase();
    String substringUC = substring.toUpperCase();
    return (indexOf(inputUC, substringUC) != -1);
  }

  public static boolean startsWith(String input, String substring) {
    if (input == null) input = "";
    if (substring == null) substring = "";
    return input.startsWith(substring);
  }

  public static boolean endsWith(String input, String substring) {
    if (input == null) input = "";
    if (substring == null) substring = "";
    int index = input.indexOf(substring);
    if (index == -1) return false;
    if ((index == 0) && (substring.length() == 0)) return true;
    return (index == input.length() - substring.length());
  }

  public static String substring(String input, int beginIndex, int endIndex) {
    if (input == null) input = "";
    if (beginIndex >= input.length()) return "";
    if (beginIndex < 0) beginIndex = 0;
    if ((endIndex < 0) || (endIndex > input.length())) endIndex = input.length();
    if (endIndex < beginIndex) return "";
    return input.substring(beginIndex, endIndex);
  }

  public static String substringAfter(String input, String substring) {
    if (input == null) input = "";
    if (input.length() == 0) return "";
    if (substring == null) substring = "";
    if (substring.length() == 0) return input;

    int index = input.indexOf(substring);
    if (index == -1) {
      return "";
    }
    return input.substring(index + substring.length());
  }

  public static String substringBefore(String input, String substring)
  {
    if (input == null) input = "";
    if (input.length() == 0) return "";
    if (substring == null) substring = "";
    if (substring.length() == 0) return "";

    int index = input.indexOf(substring);
    if (index == -1) {
      return "";
    }
    return input.substring(0, index);
  }

  public static String escapeXml(String input)
  {
    if (input == null) return "";
    return Util.escapeXml(input);
  }

  public static String trim(String input) {
    if (input == null) return "";
    return input.trim();
  }

  public static String replace(String input, String substringBefore, String substringAfter)
  {
    if (input == null) input = "";
    if (input.length() == 0) return "";
    if (substringBefore == null) substringBefore = "";
    if (substringBefore.length() == 0) return input;

    StringBuffer buf = new StringBuffer(input.length());
    int startIndex = 0;

    while ((index = input.indexOf(substringBefore, startIndex)) != -1)
    {
      int index;
      buf.append(input.substring(startIndex, index)).append(substringAfter);
      startIndex = index + substringBefore.length();
    }
    return input.substring(startIndex);
  }

  public static String[] split(String input, String delimiters)
  {
    if (input == null) input = "";
    if (input.length() == 0) {
      array = new String[1];
      array[0] = "";
      return array;
    }

    if (delimiters == null) delimiters = "";

    StringTokenizer tok = new StringTokenizer(input, delimiters);
    int count = tok.countTokens();
    String[] array = new String[count];
    int i = 0;
    while (tok.hasMoreTokens()) {
      array[(i++)] = tok.nextToken();
    }
    return array;
  }

  public static int length(Object obj)
    throws JspTagException
  {
    if (obj == null) return 0;

    if (obj instanceof String) return ((String)obj).length();
    if (obj instanceof Collection) return ((Collection)obj).size();
    if (obj instanceof Map) return ((Map)obj).size();

    int count = 0;
    if (obj instanceof Iterator) {
      Iterator iter = (Iterator)obj;
      count = 0;
      while (iter.hasNext()) {
        ++count;
        iter.next();
      }
      return count;
    }
    if (obj instanceof Enumeration) {
      Enumeration enum_ = (Enumeration)obj;
      count = 0;
      while (enum_.hasMoreElements()) {
        ++count;
        enum_.nextElement();
      }
      return count;
    }
    try {
      count = Array.getLength(obj);
      return count;
    } catch (IllegalArgumentException ex) {
      throw new JspTagException(Resources.getMessage("FOREACH_BAD_ITEMS")); }
  }

  public static String join(String[] array, String separator) {
    if (array == null) return "";
    if (separator == null) separator = "";

    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < array.length; ++i) {
      buf.append(array[i]);
      if (i >= array.length - 1) continue; buf.append(separator);
    }

    return buf.toString();
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值