JSTL标签库,自定义标签

JSTL 简介

JavaServer Pages Standard Tag Library由JCP(Java Community Process)指定标准

提供给 Java Web 开发人员一个标准通用的标签函数库

和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性

JSTL1.1安装

下载

JSTL 主要由Apache组织的Jakarta Project 实现

http://tomcat.apache.org/taglibs/standard/

容器必须支持Servlet 2.4 且JSP 2.0 以上版本

JavaEE1.4

安装

解压缩后将lib 中的jstl.jar、standard.jar 复制到WEB应用程序的WEB-INF\lib 下

1.核心标签库(core)

<c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。

  <h1>HTML转义输出</h1><hr>
  <a href="#">xxx</a>
  <c:out value="<a href=‘#‘>xxx</a>" ></c:out>
  ${fn:escapeXml(‘<a href="#">xxx</a>‘) }
  
  <h1>输出默认值</h1><hr>
  <%
  String addr = "西二旗";
  //pageContext.setAttribute("addr",addr);
   %>
<c:out value="${addr}" default="北京"></c:out>
${addr == null?"北京" : addr }
  <h1>输出变量</h1><hr>
  <%
  String name = "无双";
  pageContext.setAttribute("name",name);
   %>
   <c:out value="${name}"></c:out>
   ${name }
  <h1>输出常量</h1><hr>
  <c:out value="阿斯蒂芬"></c:out>
  ${"啦啦啦啦" }

<c:set>标签用于设置、修改域中的属性和值,默认的域是page

或者设置、修改Web域中的Map的键和值,或JavaBean的属性值。

  <h1>修改域中的JavaBean的属性的值</h1><hr>
  <%
  Person p = new Person();
  pageContext.setAttribute("p",p);
   %>
   <c:set target="${p}" property="name" value="克林顿"></c:set>
   ${p.name }
  
  <h1>设置或修改域中的Map的值</h1><hr>
  <%
  Map map = new HashMap();
  pageContext.setAttribute("map",map);
   %>
<c:set target="${map}" property="cellphone" value="10010"></c:set>  
<c:set target="${map}" property="cellphone" value="10086"></c:set>  
${map.cellphone }
  
  <h1>设置或修改域中的属性值</h1><hr>
  <c:set var="name" value="韦小宝"></c:set>
  <c:set var="name" value="阿珂"></c:set>

<c:remove>标签用于删除各种Web域中的属性,如果不写域名,则删除4个域中所有的同名的属性。

    <c:remove var="name" scope=”request”/>

<c:catch>标签用于捕获嵌套在<c:catch>标签体中的内容,抛出的异常,

其语法格式如下:<c:catch  var="e" >nested actions</c:catch> 将捕获的异常对象以e为的名字,存放到page域中,再利用el表达式, ${e.message} ,页面就会显示出异常信息。

  <c:catch var="e">
  <%
      int i = 1/0;
   %>
   </c:catch>
   ${e.message }

*<c:if test=“$(2>1)”>标签可以构造简单的“if-then”结构的条件表达式

test后接一个el表达式,el返回值为boolean类型,若为true,则执行标签体中的内容。想达到if-else的目的,只能在写一次c:if,将条件取反。

  <c:if test="${2>1}">
  确实是这样的....
  </c:if>
  <c:if test="${2<=1}">
    你确定吗?
  </c:if>

*<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。

<c:choose>
<c:when test="${count == 0}">
对不起,没有符合您要求的记录。
</c:when>
<c:otherwise>
符合您要求的记录共有${count}条.
</c:otherwise>

*<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。

  <h1>实验:遍历10到100的偶数,如果数字所在的位置是3的倍数,显示成红色</h1><hr>
  <c:forEach begin="10" end="100" step="2" var="i" varStatus="stat">
  <c:if test="${stat.count % 3 == 0}"> //count表示当前数字的总数 index自然数的位置
  <font color="red">
  ${i }
  </font>
  </c:if>
  <c:if test="${stat.count % 3 != 0}">
  <font color="blue">
  ${i }
  </font>
  </c:if>
  </c:forEach>
  
  <h1>循环执行指定的内容若干次</h1><hr>
  <c:forEach begin="0" end="10" step="2" var="i" >
  ${i },  //0,2,4,6,8,10,
  </c:forEach>
 
  <h1>遍历Map中的数据</h1><hr>
  <%
  Map map = new LinkedHashMap();
  map.put("name","曹操");
  map.put("age","59");
  map.put("wife","小乔");
  map.put("gender","男");
  pageContext.setAttribute("map",map);
   %>
  <c:forEach items="${map}" var="entry" >  //entry存放的是一对键值
  ${entry.key } : ${entry.value }<br>
  </c:forEach>
  
  <h1>遍历集合中的数据</h1><hr>
  <%
    List list = new ArrayList();
    list.add("美国");
    list.add("中国");
    list.add("俄罗斯");
    list.add("印度");
    list.add("巴西");
      pageContext.setAttribute("list",list);
   %>
   <c:forEach items="${list}" var="c">
   ${c }<br>
   </c:forEach>
   
  <h1>遍历数组中的数据</h1><hr>
  <%
  String   city = {"北京","上海","广州","铁岭","葫芦岛"};
  pageContext.setAttribute("city",city);
   %>
   <c:forEach items="${city}" var="c"> 
   ${c }<br>
   </c:forEach>

*<c:forTokens>切割字符串,将切好的字符串对象存在数组了,遍历数组的字符串对象。

  <c:forTokens items="www.itheima.com" delims="." var="str">
  ${str }<br>  //str表示数组中的一个字符串对象
  </c:forTokens>  //wwwitheimacom

<c:import> 标签,实现include操作

<c:import url="/index.jsp" var="p" scope="page"></c:import>
//将index.jsp内容,作为对象p 存到当前页面的page域中,方便引用。

<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面

  <%
  String url = response.encodeURL(request.getContextPath()+"/index.jsp");
  %>
  <a href="<%= url %>">hhhh</a>
  <c:url value="/index.jsp" context="${pageContext.request.contextPath}" var="url" scope="page"></c:url>
  <a href="${url }">xxx</a>

<c:redirect>标签用于实现请求重定向

  <c:redirect url="/index.jsp" context="${pageContext.request.contextPath}">
    <c:param name="name" value="zhang"></c:param>
  </c:redirect>

<c:param>标签  在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。

自定义标签技术: 

传统标签:

(1)写一个类实现Tag接口  javax.servlet.jsp.tagext.Tag

(2)写一个tld文件,描述写好的类

tld文件放在WEB-INF文件夹下(除classes和lib以外)。tld文件的schemaLocation不对,要修改为,也就是把前面的地址复制一下粘贴到后面的地址再加个/

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

(3)在jsp页面中引入tld文件,就可以在jsp页面中使用自定义标签了

生命周期:

第一次自定义标签被访问的时候产生对象,驻留在内存中,随着web应用的销毁而销毁。

执行过程:

setPageContext  getParent  dastart doend releast

特点:

分为doStartTag 和 doEndTag方法来分别处理发现开始标签和发现结束标签时的代码,在doStartTag可以通过返回值来控制标签体是否允许执行,在doEndTag方法里可以通过返回值控制标签之后的剩余页面是否允许执行

传统标签的这种开发方式,需要我们分析发现开始标签和发现结束标签时都需要执行什么代码,还需要分析到底要返回什么样的标签体控制程序执行,相对来说相当的繁琐。

简单标签:

(1)写一个类实现SimpleTag接口(继承SimpleTag接口的默认实现类SimpleTagSupport)

(2)写一个tld文件,描述写好的类

(3)在jsp页面中引入tld文件,就可以在jsp页面中使用自定义标签了

生命周期+执行过程

1.当jsp在执行的过程中,每当遇到一个简单标签时,都会创建一个处理类对象.

2.调用setJspContext传入当前jsp页面的PageContext对象.

3.如果当前标签有父标签则调用setParent方法将父标签传入,如果没有父标签则这个方法不会被调用.

4.如果该标签具有属性,调用属性的setXXX方法将属性的值传入

5.如果当前标签具有标签体,则会调用setJspBody将封装了标签体信息的JspFragment传入,如果没有标签体,这个方法不执行

6.最后调用doTag方法,在这个方法里我们可以书写处理标签事件的java代码

7.当自定义标签执行完成后,简单标签对象就销毁掉了.

要实现的功能:

控制标签体是否执行<c:if>

控制标签之后的内容是否执行

控制标签体重复执行<c:foreach>

修改标签体后输出<c:out>

为自定义标签来增加一个属性:

在标签处理类中增加一个javabean属性,这个属性就是要增加的标签的属性,并对外提供setXXX方法。

在tld文件中这个标签的描述中描述一下该属性

*想要开发一个简单标签,

写一个类继承SimpleTagSupport覆盖doTag方法就可以了,可以调用getJspContext/getJspBody来获取需要的内容

*在tld文件中对标签进行描述

<tlib-version>1.0</tlib-version>

<short-name>MyTag</short-name>  //标识tld文件

<uri>http://www.itheima.com/MyTag</uri>

<tag>

<name>simpleDemo1</name>  //标签的名字

<tag-class>com.itheima.simletag.SimpleDemo1</tag-class>  //标签的处理类

<body-content>scriptless</body-content>

//标签体的类型 JSP(简单标签不能写) Scriptless(任意的jsp内容,不包括java代码) empty(空标签) tagdependent(标签体是给后台用的,一般不用这种类型)

<attribute>  //声明一个属性,可以声明多个属性

<name>times</name>   //属性的名字

<required>true</required>  //是否为必须存在的属性

<rtexprvalue>true</rtexprvalue>  //是否支持el表达式

<type>int</type>  // 属性的java类型

</attribute>

</tag>

自定义标签开发_案例

自定义标签打jar包

1、新建一个java工程,Exec

2、将继承SimpleTagSupport的java类复制到src目录下

3、工程名 - 右键 -  build path -  configure build path  -  libraries  -  add library

- myeclipes library - javaEE 5 libraries

4. 工程名 右键新建文件夹META-INF 文件夹

5. 将tld文件放入WEB-INF文件夹下

6. 工程名 右键-Export - jar - JAR file - 勾选要打包的工程 - 选好保存的路径

IFTag.java

public class IFTag extends SimpleTagSupport {
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
 
@Override
public void doTag() throws JspException, IOException {
if(test){
getJspBody().invoke(null);
}
}
}

Exec.tld

 <tlib-version>1.0</tlib-version>
 <short-name>exec</short-name>
 <uri>http://www.itheima.com/exec</uri>
 <tag>
     <name>if</name>
     <tag-class>com.itheima.exec.IFTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
        <type>boolean</type>
    </attribute>
 </tag>

exec.jsp

<exec:if test="${3>2}">
    确实是这样的!
</exec:if>
<exec:if test="${3<=2}">
    你确定吗?
</exec:if>
 、
时间: 2024-10-16 23:32:48

JSTL标签库,自定义标签的相关文章

18、EL表达式、JSP标签、JSTL标签、自定义标签

EL表达式 jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>. 以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码. 使用EL表达式替换掉jsp表达式 EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!! 语法: ${变量或表达式} EL语法 1 输出基本数据类型变量 从四个域获取 ${name} 指定域获取 ${pageScope.name} 域范围: pageScoep / requestScope / sessionSco

JSTL标签库:Remove标签Catch标签

看注释 <c:remove> 标签删除变量,无论是从指定的范围内或范围内的变量(如果没有指定范围).这个动作通常是不特别有帮助,但它可以帮助确保一个JSP范围内的资源,它负责清理. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!-- 核心标签: 核心组的标签是最常用的JSTL标签.以下是在您的JSP的语法包括JSTL核心库

JSTL标签库:set标签

接着上一篇文章. 看注释: javabean类 package test.jstl.dom; public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void s

JSTL标签库:out标签

准备工作: 安装JSTL库: 如果您使用的是Apache Tomcat容器,那么按照下面两个简单的步骤: 下载的二进制发行版,从Apache标准标记库和解压的压缩文件. 下载地址:http://tomcat.apache.org/taglibs/index.html 使用标准的标签库从Jakarta Taglibs分布,复制发行版'lib'目录到应用程序的JAR文件 webapps\ROOT\WEB-INF\lib 目录中. 看代码看注释 <%@ page language="java&q

Jsp开发自定义标签,自定义标签将字符串转成指定的时间格式显示

本例以将 字符串格式的时间转成指定的时间格式显示. 第一步.定义一个标签处理程序类,需要集成javax.servlet.jsp.tagext.TagSupport,代码如下: import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.T

Django(七)—— 模板层:变量、过滤器、标签、自定义标签和过滤器

模板层:变量.过滤器.标签.自定义标签和过滤器 将页面的设计和Python的代码分离开会更干净简洁更容易维护. 我们可以使用 Django的 模板系统 (Template System)来实现这种模式 # django模板修改的视图函数 def current_time(req): from django.template import Template,Context now=datetime.datetime.now() t=Template('<html><body>现在时刻

web day13 JSTL标签库(c标签,自定义标签),MVC设计模式,JavaWeb经典三层框架

JSTL 1. jstl的概述 *apache的东西,依赖EL * 使用jstl需要导入jstl1.2.jar * 四大库: > core:核心库,重点 > fmt:格式化:日期.数字 > sql:过时 > xml:过时 2. 导入标签库 *jar包 * 在jsp页面中:<%@taglib prefix="前缀" uri="路径"%> ---------------------- core --> c标签! 1. out和s

JSTL函数标签库 fn标签

在使用jstl的函数标签库之前需要在页面中引入: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> 1.fn:contains(string, substring) 如果参数string中包含参数substring,返回true. 2.fn:containsIgnoreCase(string, substring) 如果参数string中包含参数substring(

一、JSP标签介绍,自定义标签

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 16.0000pt } h1 { margin-top: 17.0000pt; margin-bottom: 16.5000pt; margin-left: 21.6000pt; text-indent: -21.6000pt; page-break-after: avoid; page-