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引擎遇到自定义标签时,首先创建标签处理类的实例对象,然后按照通信规则依次调用其方法。调用顺序如下:
- 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页面导入并使用自定义函数
- JavaWeb——自定义标签与JSTL
- Javaweb学习笔记6—EL表达式与JSTL及自定义标签
- JavaWeb笔记——JSTL标签
- 【JavaWeb】EL表达式与JSTL标签
- JavaWeb -- 自定义标签实例, 防盗链, JSTL 核心标签
- JavaWeb学习篇之----自定义标签&&JSTL标签库详解
- JavaWeb学习篇之----自定义标签&&JSTL标签库详解
- JavaWeb-12 (自定义标签库开发&JSTL标签库)
- JavaWeb学习篇之----自定义标签&&JSTL标签库详解
- JavaWeb学习篇之----自定义标签&&JSTL标签库详解
- JavaWeb学习篇之----自定义标签&&JSTL标签库详解
- jstl——自定义标签步骤
- JavaWeb入门实战—EL表达式&JSTL标签
- JSTL标签库与自定义标签
- JavaWeb---JSTL数据库标签
- javaweb中的jstl标签
- 02-JavaWeb-JSTL标签
- 超全面的JavaWeb笔记day13<JSTL&自定义标签>
- iOS:详解MJRefresh刷新加载更多数据的第三方库
- 后台学习二---springmvc前后台交互
- CSS tab 选项卡(兼容好)
- python学习笔记01
- [c++基础]运算符重载,共有数据保护,静态成员
- JavaWeb——自定义标签与JSTL
- 各浏览器下 scrollTop的差异
- 实验记录-BLDC六步法驱动-高侧全斩波与半斩波驱动效果对比
- leetcode-注意事项
- SQL中排除某一列代码字段含有字母的记录
- 随机森林算法精讲博客收藏
- WIN7 DOS 磁盘管理器 <<转>>
- Android 添加源码到ecl…
- EM算法的python实现