JSP自定义标签必知必会
2016-01-29 13:50
483 查看
自定义标签技术自sun公司发布以来,便一向很受欢迎!下面我就来谈一谈如何实现自定义标签,以及如何使用自定义标签。
首先这个类要实现一个特殊的接口,那就是Tag接口,实现里面的方法。
在WEB-INF目录下新建一个tld文件,名称随意,然后按照相关的xml约束进行声明即可
在需要引入的jsp页面添加命令
实现的步骤就是这样,下面我们一起来看一个小例子吧,这样印象会更加的深刻!
再是在tld文件中进行声明:
注意:
最后是在页面上引用自定义标签:
测试结果:
控制jsp页面某一部分(一般认为是标签体)是否执行(编写一个实现了Tag接口的类,控制doStartTag方法的返回值,Tag.EVAL_BODY_INCLUDE时执行标签体,返回Tag.SKIP_BODY时不执行标签体)
控制整个页面是否执行(编写一个实现Tag接口的类,控制doStartTag方法的返回值,返回Tag.EVAL_PAGE,则执行下面的jsp页面,返回Tag.SKIP_PAGE则不执行后续的jsp页面,如果设置在页面头部,则服务器不会向浏览器发送jsp页面)
控制标签页面标签内容重复执行(编写一个实现IterationTag接口的实现类,控制doAfterBody方法的返回值,返回值为BodyTag.EVAL_BODY_AGAIN时重复执行,一直到该方法的返回值为BodyTag.SKIP_PAGE时停止重复执行)
修改jsp标签内容再输出(需要编写一个实现BodyTag接口的实现类,然后控制doStartTag,控制返回值为BodyTag.EVAL_BODY_BUFFERED时,就可以在doEndTag 方法中获得bodyContent对象的实例,这一切由complier来执行。然后就可以实现自己的逻辑了)。
下面来看一个小例子吧。
第二步:在tld文件中进行声明,相关信息:
第三步:在jsp页面添加引用。
测试结果:
总结:
官方文档对这些方法的调用过程及使用方法做了详细的介绍,应该对文档熟练阅读并理解
代码逻辑很清晰,按照流程就不容易出错
自定义标签的出现便是为了消除jsp页面中的java代码,应学会其与el表达式的配合!
如何实现自定义标签
首先我们应该知道原理,不管是标签还是JSP,本身实际上都会被JSP Complier翻译成Servlet,然后才会被执行。那么在Java这门面向对象的语言中,标签就应该是一个特殊的类。之所以说它特殊,仅仅是它出现的地方,以及实现的功能与我们平时见到的普通的类有些不一样罢了。我们完全可以将标签视为一个简单的java类。就是这样!下面我们就来看一看要怎么写出这样一个类吧首先这个类要实现一个特殊的接口,那就是Tag接口,实现里面的方法。
在WEB-INF目录下新建一个tld文件,名称随意,然后按照相关的xml约束进行声明即可
在需要引入的jsp页面添加命令
<%@ taglib uri="/summer" prefix="summer"%>,然后我们就可以使用自定义的标签了。
实现的步骤就是这样,下面我们一起来看一个小例子吧,这样印象会更加的深刻!
小案例:检测客户机的IP地址
首先是创建一个实现了Tag接口的实现类:package web.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; public class ViewIPTag implements Tag { PageContext pageContext=null; public ViewIPTag() { // TODO Auto-generated constructor stub } @Override public int doEndTag() throws JspException { // TODO Auto-generated method stub return 0; } @Override public int doStartTag() throws JspException { // TODO Auto-generated method stub String ip = pageContext.getRequest().getRemoteAddr(); try { pageContext.getOut().write(ip); } catch (IOException e) { // TODO Auto-generated catch block throw new RuntimeException(e); } return 0; } @Override public Tag getParent() { // TODO Auto-generated method stub return null; } @Override public void release() { // TODO Auto-generated method stub } @Override public void setPageContext(PageContext arg0) { // TODO Auto-generated method stub this.pageContext = arg0; } @Override public void setParent(Tag arg0) { // TODO Auto-generated method stub } }
再是在tld文件中进行声明:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>JSTL 1.1 XML library</description> <display-name>JSTL XML</display-name> <tlib-version>1.1</tlib-version> <short-name>x</short-name> <uri>/summer</uri> <!-- 返回客户机的IP地址的自定义标签 --> <tag> <name>viewIP</name> <tag-class>web.tag.ViewIPTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
注意:
里面的uri是一个命名空间,可以自定义,随意设置,但是在需要引用的jsp页面上需要一致,这样才能获得自定义的标签使用
最后是在页面上引用自定义标签:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/summer" prefix="sumer"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>输出客户机的IP地址!</title> </head> <body> 您的IP地址是: <sumer:viewIP></sumer:viewIP> </body> </html>
测试结果:
自定义标签之manipulate篇
自定义标签可以实现如下功能:控制jsp页面某一部分(一般认为是标签体)是否执行(编写一个实现了Tag接口的类,控制doStartTag方法的返回值,Tag.EVAL_BODY_INCLUDE时执行标签体,返回Tag.SKIP_BODY时不执行标签体)
控制整个页面是否执行(编写一个实现Tag接口的类,控制doStartTag方法的返回值,返回Tag.EVAL_PAGE,则执行下面的jsp页面,返回Tag.SKIP_PAGE则不执行后续的jsp页面,如果设置在页面头部,则服务器不会向浏览器发送jsp页面)
控制标签页面标签内容重复执行(编写一个实现IterationTag接口的实现类,控制doAfterBody方法的返回值,返回值为BodyTag.EVAL_BODY_AGAIN时重复执行,一直到该方法的返回值为BodyTag.SKIP_PAGE时停止重复执行)
修改jsp标签内容再输出(需要编写一个实现BodyTag接口的实现类,然后控制doStartTag,控制返回值为BodyTag.EVAL_BODY_BUFFERED时,就可以在doEndTag 方法中获得bodyContent对象的实例,这一切由complier来执行。然后就可以实现自己的逻辑了)。
下面来看一个小例子吧。
实现标签内容大写输出的自定义标签
第一步,编写实现了BodyTag接口的实现类:package web.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; import javax.servlet.jsp.tagext.Tag; /** * 修改标签体内容的自定义标签(转换成大写的形式) * @author Summer * */ public class TagBodyModify extends BodyTagSupport { /** * 设置标签体被执行的返回值,残能实现后续操作 * 在返回值为BodyTagSupport.EVAL_BODY_BUFFERED时会通知JSP Complier自动生成一个BodyContent对象 * 用于后续的操作所用 */ @Override public int doStartTag() throws JspException { // TODO Auto-generated method stub return BodyTagSupport.EVAL_BODY_BUFFERED; } /** * 在doStartTag方法中已经获得了一个bodyContent对象,这样我们就可以在doStartTag或者doEndTag方法中 * 进行对标签体内容的加工的操作 */ @Override public int doEndTag() throws JspException { // TODO Auto-generated method stub String content = bodyContent.getString(); String result = content.toUpperCase(); try { this.pageContext.getOut().write(result); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return Tag.EVAL_PAGE;//BodyTagSupport(父类)会默认返回这个方法 } }
第二步:在tld文件中进行声明,相关信息:
<!--Manipulate操作标签体内容的的自定义的标签 --> <tag> <name>TagBodyModify</name> <tag-class>web.tag.TagBodyModify</tag-class> <body-content>JSP</body-content> </tag>
第三步:在jsp页面添加引用。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/summer" prefix="summer"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>控制标签体内容转换成大写的测试页面</title> </head> <body> <summer:TagBodyModify>I am Summer !</summer:TagBodyModify> </body> </html>
测试结果:
总结:
官方文档对这些方法的调用过程及使用方法做了详细的介绍,应该对文档熟练阅读并理解
代码逻辑很清晰,按照流程就不容易出错
自定义标签的出现便是为了消除jsp页面中的java代码,应学会其与el表达式的配合!
相关文章推荐
- jsapi 同时上传多张照片
- servlet+jsp实现过滤器 防止用户未登录访问
- JS刷新当前页面的几种方法总结
- js 判断截取数字
- js 转json格式的字符串为对象或数组(前后台)
- Anynote 基于ExtJS多用户个人信息管理系统
- javascript学习笔记之五
- d3js绘制多系统柱形图
- JSP简单练习-数组应用实例
- 利用jsPerf优化Web应用的性能
- baidu Touch.js 旋转不了
- js 中文排序
- 如何利用js正则表达式判断ip地址的合法性
- JavaScript学习总结之JS、AJAX应用
- JSON和JS对象之间的互转
- Javascript 和 json 使用Ajax
- JS获取url参数及url编码、解码
- js ==与===区别(两个等号与三个等号)
- 常用的json解析方式
- js获取checkbox中所有选中值及input后面所跟的文本