自定义JSP标签
来源:互联网 发布:app端口的作用 编辑:程序博客网 时间:2024/06/14 00:24
一、自定义JSP标签概述
自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过 一个XML文件来描述它的使用。当页面中需要使用类似的显示逻辑时,就可以在页面中插入这个标签,从而完成相应的功能。
使用自定义标签,可以分离程序逻辑和表示逻辑,将Java代码从HTML中剥离,便于美工维护页面;自定义标签也 提供了可重用的功能组件,能够提高工程的开发效率。
自定义标签主要用于移除Jsp页面中的java代码
二、自定义JSP标签的开发流程
使用Java处理类来开发自定义JSP标签时,主要分为下几个步骤:
1. 创建标签的处理类(Tag Handle Class)。这个类实现Tag接口,用来定义标签的行为,并在JSP引擎遇到自定义标 签时调用执行。
2. 创建标签库描述 (tld) 文件(Tag Library Descriptor File),在tld文件中对标签处理器类进行描述。
3.在JSP文件中用taglib指令引入标签库,然后使用标签库描述文件中指定的标签名来使用它。
三、Tag接口的执行流程
1.编写一个java类,实现Tag接口,并覆盖其中的doStartTag方法
package mytag;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.Tag;public class IPTag implements Tag{//声明接收pageContext的属性private PageContext pageContext;//WEB容器执行完自定义标签的标签体后,//就会接着去执行自定义标签的结束标记,//此时,WEB容器会去调用标签处理器的doEndTag方法@Overridepublic int doEndTag() throws JspException {System.out.println("-------------doEndTag--------------");return 0;}//调用了setPageContext方法和setParent方法之后,//WEB容器执行到自定义标签的开始标记时,//就会调用标签处理器的doStartTag方法@Overridepublic int doStartTag() throws JspException {System.out.println("-----------------doStartTag-----------------");//进行处理操作//获取request对象HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();//通过request对象 获取ip地址String addr = request.getRemoteAddr();HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();PrintWriter out=null;try {out = response.getWriter();out.write(addr);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return 0;}@Overridepublic Tag getParent() {System.out.println("--------------------getParent---------------------");return null;}//通常WEB容器执行完自定义标签后//,标签处理器会驻留在内存中,为其它请求服务,//直至停止web应用时,web容器才会调用release方法@Overridepublic void release() {// TODO Auto-generated method stub}//JSP引擎实例化标签处理器后,//将调用setPageContext方法//将JSP页面的pageContext对象传递给标签处理器,//标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。@Overridepublic void setPageContext(PageContext pc) {System.out.println("------------------setPageContext-------------"); this.pageContext=pc;}//setPageContext方法执行完后,//WEB容器接着调用的setParent方法//将当前标签的父标签传递给当前标签处理器,//如果当前标签没有父标签,//则传递给setParent方法的参数值为null。@Overridepublic void setParent(Tag t) {System.out.println("-------------setParent------------------");}}
2.在web工程的Web-INF目录中新建一个tld文件,对标签处理器类进行描述。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"><taglib><tlib-version>1.0</tlib-version><jsp-version>1.2</jsp-version><short-name>myTag</short-name><uri>http://www.csdn.com</uri><tag> <name>ip</name> <tag-class>mytag.IPTag</tag-class> <body-content>empty</body-content>//tld文件中的四种标签体类型 EMPTY JSP scriptless tagdepentend </tag></taglib>
3.在jsp页面中导入并使用上面开发的标签
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://www.csdn.com" prefix="myTag" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <%-- <%@ include file="/2.jsp" %> --%> <%-- <jsp:forward page="1.jsp"> <jsp:param value="12" name="id"/> </jsp:forward> --%> <!-- 输出客户机的ip地址 --> <%-- <% String addr = request.getRemoteAddr(); %> <%=addr %> --%> <myTag:ip/> </body></html>
四、Tag Handle
1.创建标签Tag Handle的处理类(Class)。
这个类实现Tag接口,用来定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。
例如:
class IPTag implements Tag{}
class MyTag1 extends TagSupport {}
MyTag3 extends BodyTagSupport{}
说明TAG接口中的常量:
Tag.SKIP_PAGE:跳过其它处理(控制整个jsp页面是否执行)
Tag.EVAL_PAGE:继续执行其它处理
//控制jsp页面某一部分内容是否执行
if(x==1){
return Tag.EVAL_PAGE;
}else{
return Tag.SKIP_BODY;
}
Tag.EVAL_BODY_INCLUDE: 传入现有输出流
Tag.SKIP_BODY:跳过标签体.
BodyTag接口中:
BodyTag.EVAL_BODY_BUFFERED:创建新的缓冲区,并且创建BodyContent
IterationTag 接口中:
IterationTag.EVAL_BODY_AGAIN:重复执行
其它简单标签的使用:
MyTag1 extends SimpleTagSupport{}
例:
package simpletag;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspContext;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.JspTag;import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyTag1 extends SimpleTagSupport {@Overridepublic void doTag() throws JspException, IOException {System.out.println("---------------doTag----------------");PageContext pageContext = (PageContext) this.getJspContext();HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();String addr = request.getRemoteAddr();HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();PrintWriter out = response.getWriter();out.write(addr);super.doTag();}@Overrideprotected JspFragment getJspBody() {System.out.println("========================simpleTagSupport-----getJspBody");return super.getJspBody();}@Overrideprotected JspContext getJspContext() {System.out.println("======================simpleTagSupport-----getJspcontext");return super.getJspContext();}@Overridepublic JspTag getParent() {System.out.println("--------------------getParent-----------------");return super.getParent();}@Overridepublic void setJspBody(JspFragment jspBody) {System.out.println("----------------setJspBody-------------------");super.setJspBody(jspBody);}@Overridepublic void setJspContext(JspContext pc) {System.out.println("------------setJspContext------------------");super.setJspContext(pc);}@Overridepublic void setParent(JspTag parent) {System.out.println("--------------setParent---------------------");super.setParent(parent);}}
2.创建标签库描述 (tld) 文件(Tag Library Descriptor File),在tld文件中对标签处理器类进行描述。
<taglib>元素是标签库描述符的根元素,它包含12个子元素,详细介绍如下。
(1)<description>:标签库的一个文本描述。
(2)<tlib-version>:指定标签库的版本。
(3)<short-name>:为标签定义简短的名字,在taglib指令中可作为首选的前缀名使用。
(4)<uri>:定义一个URI,用于唯一地标识此标签库。
(5)<tag>:用于指定自定义标签的相关信息。
(6)<display-name>:为标签库指定一个简短的别名。
(7)<small-icon>:为标签库指定大小为16×16的小图标(gif或jpeg格式),该图标可在图形界面工具中显示。
(8)<large-icon>:为标签库指定大小为32×32的大图标(gif或jpeg格式),该图标可在图形界面工具中显示。
(9)<validator>:为标签库提供一个验证器。
(10)<listener>:为标签库提供一个监听器。
(11)<tag-file>:用于描述标签文件。
(12)<function>:用于指定在表达式语言中使用的函数。
- JSP----自定义标签---简单标签
- jsp自定义标签-----嵌套标签
- JSP标签编程----自定义标签
- JSP 自定义标签:简单标签
- JSP标签-JSTL-自定义标签
- JSP自定义标签-Select标签
- jsp 自定义标签---标签文件
- JSP自定义标签
- JSP自定义标签学习心得
- JSP自定义标签试验
- JSP 自定义标签库
- 自定义JSP标签
- 创建JSP自定义标签
- 关于自定义标签 jsp
- 关于自定义标签 jsp
- jsp 自定义分页标签
- JSP自定义标签简介
- JSP自定义标签例子
- hdu1711Number Sequence
- paip.配置ef_unified_filter() failed ext_filter_module mod_ext_filter.so apache 错误解决
- Myeclipse SVN 修改用户名和密码
- Geeks 面试题: Coin Change最大找零方案数
- 今晚吃火锅呢
- 自定义JSP标签
- 使用celery之怎么让celery跑起来
- paip.输出内容替换在Apache 过滤器filter的设置
- 正则表达式规则
- LeetCode Anagrams
- Codeforces Round #221 (Div. 2) E. Circling Round Treasures (搜索+判断点在多边形内)
- 百度空间任意删除用户上传图片,
- 如何修改element.style样式
- linux 下pyhton 删除指定目录下所有的重复内容的文件