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)

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

  

HTML转义输出


  xxx   xxx" >   ${fn:escapeXml('xxx') }      

输出默认值


  <%   String addr = "西二旗";   //pageContext.setAttribute("addr",addr);    %> ${addr == null?"北京" : addr }   

输出变量


  <%   String name = "无双";   pageContext.setAttribute("name",name);    %>        ${name }   

输出常量


     ${"啦啦啦啦" }


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

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

  

修改域中的JavaBean的属性的值


  <%   Person p = new Person();   pageContext.setAttribute("p",p);    %>        ${p.name }      

设置或修改域中的Map的值


  <%   Map map = new HashMap();   pageContext.setAttribute("map",map);    %>       ${map.cellphone }      

设置或修改域中的属性值


     

 

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

    

标签用于捕获嵌套在标签体中的内容抛出的异常,

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

  
  <%
      int i = 1/0;
   %>
   
   ${e.message }




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

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

  1}">
  确实是这样的....
  
  
    你确定吗?
  

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



对不起,没有符合您要求的记录。


符合您要求的记录共有${count}条.


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

  

实验:遍历10到100的偶数,如果数字所在的位置是3的倍数,显示成红色


      //count表示当前数字的总数 index自然数的位置      ${i }               ${i }               

循环执行指定的内容若干次


     ${i },  //0,2,4,6,8,10,        

遍历Map中的数据


  <%   Map map = new LinkedHashMap();   map.put("name","曹操");   map.put("age","59");   map.put("wife","小乔");   map.put("gender","男");   pageContext.setAttribute("map",map);    %>     //entry存放的是一对键值   ${entry.key } : ${entry.value }
        

遍历集合中的数据


  <%     List list = new ArrayList();     list.add("美国");     list.add("中国");     list.add("俄罗斯");     list.add("印度");     list.add("巴西");       pageContext.setAttribute("list",list);    %>        ${c }
          

遍历数组中的数据


  <%   String   city = {"北京","上海","广州","铁岭","葫芦岛"};   pageContext.setAttribute("city",city);    %>         ${c }
   

 

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

  
  ${str }
  //str表示数组中的一个字符串对象     //wwwitheimacom

 

标签,实现include操作


//将index.jsp内容,作为对象p 存到当前页面的page域中,方便引用。

 

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

  <%
  String url = response.encodeURL(request.getContextPath()+"/index.jsp");
  %>
  ">hhhh
  
  xxx

 

标签用于实现请求重定向

  
    
  

标签  JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。标签可以嵌套在标签内,为这些标签所使用的URL地址附加参数。

 

自定义标签技术: 

传统标签:

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

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

 tld文件放在WEB-INF文件夹下(classeslib以外)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.当自定义标签执行完成后,简单标签对象就销毁掉了.

 

要实现的功能:

控制标签体是否执行

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

控制标签体重复执行

修改标签体后输出

 

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

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

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

 

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

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

 

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

1.0  

MyTag  //标识tld文件

http://www.itheima.com/MyTag

simpleDemo1  //标签的名字

com.itheima.simletag.SimpleDemo1  //标签的处理类

scriptless

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

 //声明一个属性,可以声明多个属性

times   //属性的名字

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

true  //是否支持el表达式

int  // 属性的java类型

    

        

自定义标签开发_案例

 

自定义标签打jar

1、新建一个java工程,Exec

2、将继承SimpleTagSupportjava类复制到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

 1.0
 exec
 http://www.itheima.com/exec
 
     if
     com.itheima.exec.IFTag
    scriptless
    
        test
        true
        true
        boolean
    
 

 

exec.jsp

2}">
    确实是这样的!


    你确定吗?

 、