JavaWeb——自定义标签与JSTL

来源:互联网 发布:淘宝店铺类型收费标准 编辑:程序博客网 时间:2024/06/04 23:29

1、自定义标签的作用

封装反复执行的代码,使之在多个应用程序中重复使用,提高开发效率。

2、自定义标签的开发步骤

  • 编写标签处理类

    public int doStartTag() throws JspException{        try{            SimpleDateFormat fmt = null;            if (type.equals("date")){                fmt = new SimpleDateFormat("yyyy年MM月dd日");            }            if (type.equals("time")){                fmt = new SimpleDateFormat("hh时mm分ss秒");            }            if (type.equals("all")){                fmt = new SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒");            }                           //将最后结果输出到页面            pageContext.getOut().print(fmt.format(date));                   }catch(Exception ex){            throw new JspTagException(ex.getMessage());        }               //跳过标签体的执行        return SKIP_BODY;           }}
  • 创建标签描述符TLD

标签库描述文件(TLD)定义了用户的标签库,采用XML文件格式。

<taglib>  <tlib-version>mytaglib 1.0</tlib-version>  <!--标签库的版本号-->  <jsp-version>jsp 2.0</jsp-version>  <!--JSP版本号-->  <short-name>mytag</short-name>  <!--标签库的默认前缀-->  <uri>http://www.e868.net/mytag</uri>  <!--标签库的唯一访问标识符-->  <tag>    <name>echo</name>  <!--标签的名字-->    <tag-class>mytags.Echo</tag-class>  <!--标签的处理类-->    <body-content>empty</body-content>  <!--标签体的内容,有三个可选值:empty/JSP/tagdependent-->    <attribute>  <!--标签的属性-->        <name>msg</name>  <!--属性名称-->        <required>true</required>  <!--属性是否为必须的-->        <rtexprvalue>true</rtexprvalue>  <!--属性值是否支持JSP表达式-->    </attribute>  </tag>  <tag>    <name>formatdate</name>    <tag-class>mytags.FormatDate</tag-class>    <body-content>empty</body-content>    <attribute>        <name>date</name>        <required>true</required>        <rtexprvalue>true</rtexprvalue>    </attribute>    <attribute>        <name>type</name>        <required>true</required>        <rtexprvalue>true</rtexprvalue>    </attribute>      </tag>  <tag>    <name>touppercase</name>    <tag-class>mytags.ToUpperCase</tag-class>    <body-content>tagdependent</body-content>    <variable>  <!--定义标签的变量-->        <name-from-attribute>var</name-from-attribute>  <!--变量名-->        <variable-class>java.lang.String</variable-class>  <!--变量的类型-->        <scope>AT_BEGIN</scope>  <!--变量的作用范围,有三个可选值:NESTED/AT_BEGIN/AT_END-->    </variable>    <attribute>        <name>var</name>        <required>true</required>    </attribute>      </tag></taglib>
  • JSP页面引用标签库
    <%@taglib prefix="mytag" uri="http://www.e868.net/mytag"%>
  • JSP页面使用标签
    <mytag:echo msg="hello,world!"/>    <mytag:echo msg="<%=(new Date()).toString()%>"

3、自定义标签的执行步骤

JSP引擎遇到自定义标签时,首先创建标签处理类的实例对象,然后按照通信规则依次调用其方法。调用顺序如下:

  1. public void setPageContext(PageContext pc),调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信
  2. public void setParent(Tag t),Web容器调用setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
  3. public int doStartTag(),WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
  4. public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
  5. public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。

4、JSTL标签库

4.1 JSTL标签库介绍

JSTL标签库的使用是为了弥补html标签的不足,目的是不希望在jsp页面出现java逻辑代码。

4.2 JSTL标签库分类

  • 核心标签(用的最多)
  • 国际化标签
  • 数据库标签
  • XML标签
  • JSTL标签(EL函数)

4.3 核心标签库

JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的基本功能,减少编码工作。

从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。

  1. 表达式控制标签:out标签、set标签、remove标签、catch标签。
  2. 流程控制标签:if标签、choose标签、when标签、otherwise标签。
  3. 循环标签:forEach标签、forTokens标签。
  4. URL操作标签:import标签、url标签、redirect标签、param标签。

在JSP页面引入核心标签库的代码为:<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>

<c:out>

<c:out> 用于输出数据对象的内容或结果。两种常用语法格式:

  • <c:out value=”要显示的数据对象” [escapeXml=”true|false”] [default=”默认值”]/>
  • <c:out value=”要显示的数据对象” [escapeXml=”true|false”]>默认值</c:out>

[]中的内容不是必须的,value属性是标签输出的嫩荣,escapeXml是指,是否将> < 等特殊字符进行HTML编码转换后输出,默认是true,如果value的属性值中存在HTML标签,例如<a href="url">,则需要把excapeXml的值设为false,当value的值为null时,输出default的值。

<c:set>

<c:set>标签用于把某一对象存放在指定的域范围内,或者将某一对象存储到Map或者JavaBean对象中。

<c:set>标签的编写共有4种语法格式。

- <c:set var="" value="" [scope=""]/>- <c:set var="" [scope=""]>value</c:set>- <c:set value="" target="" property=""/>- <c:set target="" property="">value</c:set> 

前两种表示将在scope域范围中,存放var对象,值为value,后两种表示在target=JavaBean/map对象中设置property的值为value,意义等同于setter。

<c:remove>

用于从指定的JSP范围内移除某变量。

<c:remove> 标签的使用格式:<c:remove var="" [scope=""]/>

<c:catch>

用于捕获嵌套在标签体中的内容抛出的异常。
<c:catch var=""></c:catch>将可能出现异常的代码包起来,定义一个var变量捕获异常。var变量存储在page域对象中。

    <c:catch var="errorInfo">        <%--实现了一段异常代码,向一个不存在的JavaBean中插入一个值--%>        <c:set target="person" property="hao"></c:set>    </c:catch>

<c:if>

实现条件控制。

  • 没有body:

    <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
  • 有body:

    <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>        标签体内容</c:if>

test中是java代码的if()括号中的内容,var变量存放括号中的判断结果,默认的scope范围是page。

<c:choose> <c:when> <c:otherwise>

这三个标签一起使用,构造java中的if-else if-else的逻辑关系。
<c:choose>作为<c:when><c:otherwise>的父标签。

<c:set var="score" value="85"/><c:choose>        <c:when test="${score>=90}">            你的成绩为优秀!        </c:when>        <c:when test="${score>70 && score<90}">            您的成绩为良好!        </c:when>        <c:when test="${score>60 && score<70}">            您的成绩为及格        </c:when>        <c:otherwise>            对不起,您没有通过考试!        </c:otherwise></c:choose>

<c:forEach>

根据循环条件遍历集合中的元素。

<c:forEach    var=""          用于存储从集合中取出的元素,属性类型是String     items=""        指定要遍历的集合Arrays/Iterator/Enumeration/Map/String []args/Collection    [varStatus=""]  用于存储从集合中取出的元素的信息。    [begin=""]      开始位置,默认为0    [end="" ]       结束位置,默认为结尾    [step=""]>      循环步长body</c:forEach>

举例:

<%List<String> list= new ArrayList<String>();list.add(0,"Monday");list.add(1,"Tuesday");list.add(2,"Wednesday");list.add(3,"Thursday");list.add(4,"Friday");list.add(5,"Saturday");list.add(6,"Sunday");request.setAttribute("list",list);%><h2>输出list</h2><c:forEach var="weekday" items="${list}">    <c:out value="${weekday}"></c:forEach>

<c:forTokens>

该标签用于浏览字符串,并根据指定的字符将字符串截取。

<c:forTokens     items=”strigOfTokens”       指定被迭代的字符串    delims=”delimiters”         指定使用的分隔符    [var=”name”]                指定用来存放遍历到的成员    [begin=”begin”]             开始位置    [end=”end” ]                结束位置    [step=”len” ]               步长    [varStatus=”statusName”] >  成员状态信息body</c:forTokens>

举例:

<c:forTokens var="str" items="北、京、欢、迎、您" delims="、">      <c:out value="${str}"></c:out><br/></c:forTokens>

<c:import>

该标签用于将静态或动态文件导入到本JSP页面,可以包含不限于本WEB应用的其他文件和资源。

<c:import     url=”url”     [context=”context”]    [value=”value”]    [scope=”page|request|session|application”]     [charEncoding=”encoding”]/><c:import     url=”url”     varReader=”name”     [context=”context”]    [charEncoding=”encoding”]/>

注意:

  • 当通过这个标签导入外部文件的内容时,若文件中含有中文字符,注意要将编码格式一致。
  • 将另一个html或jsp文件包含进本jsp文件时,要求时完整格式的代码,这样才能正确输出。

<c:url>

标签用于在JSP页面中构造一个URL地址,主要目的是实现URL的重写。

语法格式:

第一种:<c:url value="" [context=""] [var=""] [scope=""]/>第二种:<c:url value="" [context=""] [var=""] [scope=""]>     <c:param> sbutags</c:url>

<c:redirect>

标签用来实现请求的重定向。

相当于jsp中的<% request.sendRedirect(“other.jsp”)%>

或者servlet中的RequestDispatch.forward(“other.jsp”)的功能。

<c:param>

<c:param>标签为一个URL地址附加参数,可以嵌套在<c:url><c:redirect><c:import>标签中。

语法格式:

第一种:<c:param name="" value=""/>第二种:    <c:param name="">      value  </c:param>

4.4 EL表达式

EL表达式的主要作用:

  1. 获取数据
  2. 执行运算
  3. 获取web开发常用对象
  4. 调用Java方法

获取数据

使用EL表达式获取数据的语法:${标识符}

举例:

<% request.setAttribute("name","lqy"); %>使用EL表达式获取数据:${name}<%  Person p = new Person();    p.setAge(18);    request.setAttribute("person" ,p);%>使用EL表达式获取数据:${person.age}

执行运算

使用EL表达式执行运算的语法:${表达式}
EL表达式支持的运算符:关系运算符/逻辑运算符/empty运算符/二元运算符/[]和.运算符

举例:

关系运算符:${user==null}  ${user eq null}empty运算符:<c:if test="${!empty(list)}">                <c:forEach var="str" items="${list}">                    <c:out value="${str}"/>                </c:forEach>            </c:if>二元运算符:${user==null? "sorry,no user" : "welcome"+user.username"}

获取web开发常用对象

EL表达式定义了11个隐含对象,使用这些隐含对象可以获得web开发中的一些常见对象,并读取这些对象的数据。

语法:${隐含对象名称}:获得对象的引用

EL表达式定义的11个隐含对象(引用于孤傲苍狼):
引用

调用java方法

开发自定义函数,使用EL表达式调用Java类的方法。

语法:${prifix:method(params)}

开发步骤:

  1. 编写java类的静态方法
  2. 编写标签库描述符tld文件,在tld文件中描述自定义函数
  3. 在jsp页面导入并使用自定义函数
0 0
原创粉丝点击