JavaWeb笔记-13-JSTLcore库、fmt库、 自定义标签案例(三种)

day13内容

这里写图片描述
这里写图片描述

1、JSTL标签库


jstl是apache对EL表达式的扩展,依赖EL
    使用jstl需要导入jstl1.2.jar

jstl标签库中四大库
    core:核心标签库
    fmt:格式化标签库 日期、数字
    sql: 过时
    xml: 过时

使用前先通过taglib导入标签库。
在jsp页面中:<%taglib prefix="前缀 "uri="路径"%>

2、core库 –> c标签


1) 输出:

value : 可以是字符串常量,也可以是EL表达式
default: 当要输出的内容是null时,输出默认值
escapexml:为true时,将自动转义
<c:out value="${aaa}" default="xxx" escopexml="true"/>

2) 设置域的属性

var变量名
value:变量值
scope:域,默认为page。 可选值为四大域。

3)remove 删除域属性

var:变量名
scope: 表示删除所有域中指定名称的变量。指定域后范围为指定域

4)url:

value:指定一个路径,在路径前自动添加项目名。但必须以"/"开头
param: 表示给url后添加参数
var: 指定变量名。url将不会输出到页面中

5)if: 与java中用法相同。

6)choose:对应java中的if/else if/else语句

例如:                           对应的if/else结构:              
<c:choose>                            if(...){        
   <c:when test="">...</c:when>       } else if{
   <c:when test="">...</c:when>       } else if{
   <c:when test="">...</c:when>       } ...
   <c:otherwise>...</c:otherwise>     else{...}
</c:choose>

7)forEach:

1)可以用计数方式来循环
    属性:
    var:设置循环遍历   
    begin:设置起始值
    end: 结束值
    step:设置步长  等同于java中的 i++或i+=2 等。
    items: 指定循环谁,可以是数组或集合。

    计数方式:
    <c:forEach var="i" begin="1" end="10">
        ${i}    // i从1开始 到10结束。
    </c:forEach>

2)用来循环遍历数组、集合
    String[] strs = {"one","two"};   //创建数组
    request.setAttribute("strs",strs);   //设置属性,存放数组

    <c:forEach items="${strs}" var="str">  //遍历,相当于增强for
        ${str}
    </c:forEach>

    varStatus : 循环状态 可以设置循环状态。
    count:已遍历元素个数
    index:当前元素下标
    first 是否为第一个元素
    last:是否为最后一个元素
    current:表示当前项目  Object类型

eg:<c:forEach items="${strs}" var="str" varStatus="vs">  
    ${vs.index}  ${vs.count}
</c:forEach>

3、fmt库 格式化输出


<fmt: formatDate value="" pattern="">
value:指定一个Date类型的变量
pattern:用来指定输出的模板! 例如: yyyy-MM-dd

<fmt: formatNumber value="" pattern="0.00">
pattern表示四舍五,保留两位数。

4、自定义标签过程


步骤:
1)定义标签处理类  继承SimpleTagSupport
2)配置tld文件,是一个xml文件
3)在jsp页面中使用<%@taglib%> 来指定文件位置。

标签处理类介绍

    simpleTag接口:
    void doTag(): 每次执行标签时都会调用
    JspTag getParent():返回父标签
    void setParent(JspTag):设置父标签
    void setJspBody(JspFragment):设置标签体
    void setJspContext(JspContext):设置jsp上下文对象,儿子是Pagecontext。

示例一:自定义标签(无标签体)

1)设置标签处理类:

    1)继承SimpleTagSupport
    2)在setJspContext(JspContext context) 中
        //保存传过来的pagecontext
        this.pagecontext = (PageContext) context;  

    3)在setJspBody(JspFragment body) 中
        //保存传过来的body
        this.body = body;

2)配置tld文件。

    tld一般放在WEB-INF之下,保证客户端访问不到。
     <tag>
    <name>myTag1</name>  //指定当前标签的名称
    <tag-class>/tag/MyTag1.java</tag-class>  //指定当前标签的标签处理类
    <body-content>empty</body-content>  // 指定标签体的类型。这里使用空标签
     </tag>

3)在jsp页面中指定文件位置

<%@ taglib prefix="it" uri="/WEB-INF/tlds/tags.tld"%> 
    prefix 为前缀。  uri 路径

4)在jsp中使用标签。

    <body>
         <h1><it:myTag1/> </h1>  使用prefix定义的前缀:和tld文件中的标签名称
    </body>

示例二:自定义标签(有标签体)

标签体内容:
empty: 无标签体
scriptless: 只能是EL表达式,也可以是其他的标签。
tagdependent:标签体内容不会被执行,而是直接赋值给标签处理类。

1)定义标签处理类:

    public void doTag() throws JspException, IOException {  
        //获取当前jsp页面的输出流。
        Writer out = this.getJspContext().getOut();
        out.write("****  TAG 3  ****");
        //得到标签体 ,执行标签体内容,把结果写到指定的流中
        this.getJspBody().invoke(out);
    }

2)配置tld文件

     <tag>
        <name>myTag3</name>
        <tag-class>tag.MyTag3</tag-class>
        <body-content>scriptless</body-content>  //表示含有标签体
     </tag>

3)在jsp页面中指定文件位置
4)在jsp中使用标签

 <body>
 <%
    request.setAttribute("xxx", "张三");  //向request域中存放属性
 %>
    <it:myTag3>我是TAG3</it:myTag3>    //执行内容标签体
    <it:myTag3>${xxx} </it:myTag3>  //执行内容为EL表达式的标签体
  </body>

SkipPageException异常:

在doTag()方法下抛出此异常,在执行完自定义标签后,不再执行jsp页面下的东西。
public void doTag() throws JspException, IOException {  

    //得到已传递的JSP对象。得到用于输出的out内置对象 ,调用print方法输出
    this.getJspContext().getOut().print("****  TAG 4  ****");

    throw new SkipPageException;  //抛出此异常,后面的将不执行
}

示例三:设置带标签属性的标签体。

步骤:
1)在标签处理类中添加属性
        属性至少含有setXxx()方法
2)在tld文件中配置属性。
3)在jsp中使用

1)添加属性 test

private boolean test;
    //此方法将由tomcat调用,并在daTag()之前
public void setTest(boolean test){
    this.test = test;
}

2)在tld文件中配置

<tag>
    <name>myTag4</name>  //指定当前标签的名称
    <tag-class>/tag/MyTag4.java</tag-class>  //指定当前标签的标签处理类
    <body-content>scriptless</body-content>  // 指定标签体的类型
     <tag>

    <attribute>    //属性标签
        <name>test</name>    //指定属性名    
        <required>true</required>    //指定属性是否必须存在
        <rtexprvalue>true</rtexprvalue>   //指定是否可以使用EL表达式
    </attribute>
 </tag>

3)在jsp页面中指定文件位置
4)在jsp中使用

//属性test必须有值(在tld中设置的)
 <it:myTag4 test="${empty param.xxx} }"></it:myTag4>

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/81358402