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引擎遇到自定义标签时,首先创建标签处理类的实例对象,然后按照通信规则依次调用其方法。调用顺序如下:
- public void setPageContext(PageContext pc),调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
- public void setParent(Tag t),Web容器调用setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
- public int doStartTag(),WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
- public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
- 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操作标签。
- 表达式控制标签:out标签、set标签、remove标签、catch标签。
- 流程控制标签:if标签、choose标签、when标签、otherwise标签。
- 循环标签:forEach标签、forTokens标签。
- 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表达式的主要作用:
- 获取数据
- 执行运算
- 获取web开发常用对象
- 调用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)}
开发步骤:
- 编写java类的静态方法
- 编写标签库描述符tld文件,在tld文件中描述自定义函数
- 在jsp页面导入并使用自定义函数