自定义标签:
1.修改web.xml文件在其中加上对自定义标签的支持:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<jsp-config>
<taglib>
<taglib-uri>/tld/helloworld</taglib-uri>
<taglib-location>/WEB-INF/tlds/helloworld.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
---------------------------------------------------------------------------------
----
2.在META-INF下创建tld文件夹并且创建helloword.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><!--这个标签库要求的jsp规范版本-->
<short-name>mytag</short-name><!--jsp页面编写工具可以用来创建助记名的可选名字-->
<tag>
<name>helloworld</name><!--唯一标签名字-->
<tag-class>com.credream.mytag.HelloWorldTag</tag-class><!--标签helloword类的完全
限定名-->
<body-content>empty</body-content><!-- 正文内容类型 -->
</tag>
</taglib>
---------------------------------------------------------------------------------
----------
这里注意:web.xml和xxx.tld这两个XML文件的头信息的版本匹配很重要,否则会导致页面
报错找不到标签 。
3、创建标签处理程序类 HelloWorldTag(重写doStartTag和doEndTag方法)。
package com.credream.mytag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
/**
* TagSupport与BodyTagSupport的区别:
* 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需
要就用TagSupport,否则就用BodyTagSupport
* 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为
BodyTagSupport继承了TagSupport
*/
public class HelloWorldTag extends TagSupport {
@Override
public int doEndTag() throws JspException {
try {
pageContext.getOut().write("Hello World!!!");
} catch (IOException e) {
e.printStackTrace();
throw new JspTagException("调用doEndTag方法的时候出错
了...");
}
return EVAL_PAGE;
}
@Override
public int doStartTag() throws JspException {
return EVAL_BODY_INCLUDE;
}
}
---------------------------------------------------------------------------------
----------------
这时候要注意一些参数的意思:
补充:
doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与
SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字。
doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE
,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页。
doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与
SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。
EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用。
EVAL_PAGE:继续处理页面,doEndTag()函数可用。
SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用。
SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用。
EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理
tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法。
EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag
的时候是很有用的。
预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回
SKIP_BODY,doEndTag()返回EVAL_PAGE。如果继承了TagSupport之后,如果没有改写任何的方
法,标签处理的执行顺序是:doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网
页 。如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执
行顺序是:doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页 。
---------------------------------------------------------------------------------
---------------------------------------------------------------------
4.编写测试网页hello.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/tld/helloworld" prefix="mytag"%><!-- 在页面中加以声明 -->
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName
()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<mytag:helloworld/>
</body>
</html>
---------------------------------------------------------------------------------
分享到:
相关推荐
"Java代码实例-新闻发布系统(纯JSP页面写Java代码).zip" 这个标题表明我们正在处理一个使用Java编程语言开发的新闻发布系统的代码实例。这个系统完全基于JSP(JavaServer Pages)技术实现,JSP是一种用于创建动态...
在"JAVA代码实例-画图形学(论文+源代码).rar"这个压缩包中,可能包含了以下几方面的内容: 1. 论文:这部分可能是一篇关于Java图形学的学术论文,详细阐述了图形学的基本概念、理论和在Java中的应用。论文可能会...
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...
"Java实例程序-适用于初学者"这个压缩包文件提供了丰富的学习资源,帮助初学者快速理解并实践Java编程。 1. **基础语法** - 变量:在Java中,变量是存储数据的地方,分为基本类型(如int、double)和引用类型(如...
以下是对Java自定义注解及其应用实例的详细讲解。 ### 一、Java注解概述 1. **定义**: 注解是一种声明式的编程元素,以`@`符号开头,后面跟着注解的名称。它们可以应用于类、接口、方法、变量等不同级别。 2. **...
4. **JSTL(JavaServer Pages Standard Tag Library)**:为了简化JSP页面的编程,通常会使用JSTL标签库,它包含一系列预定义的标签,可以更方便地执行常见任务,如循环、条件判断、数据库操作等。 5. **框架应用**...
Java代码实例 - 基于BS结构的OA流程可视化研究与实现 在信息化时代,办公自动化(Office Automation,简称OA)系统已经成为企业管理和协同工作的核心工具。本项目着重探讨了如何利用Java技术,在B/S(Browser/...
本实例源码是基于Java实现的高性能RPC框架——nfs-rpc,专为分布式系统设计,以提高服务之间的通信效率和可靠性。以下是关于这个框架的一些关键知识点: 1. **RPC基础**:RPC的核心思想是调用远程服务就像调用本地...
使用这个Java客户端时,开发者需要首先启动Appium服务器(最好是1.15版本),然后在Java测试项目中引入这个库,通过创建`AppiumDriver`实例来连接到服务器。之后,可以利用提供的API来控制模拟器或真实设备上的应用...
该压缩包文件包含了一个基于Java实现的局域网聊天室系统的源代码和相关论文,是适合于毕业设计或学习Java网络编程的实例。这个系统能够让在同一局域网内的用户进行实时交流,提供了一个简单但实用的通信平台。下面将...
2. **基本使用**:演示如何在Java代码中创建FCKeditor实例,初始化编辑器,并将其嵌入到网页或Swing界面中。 3. **事件处理**:讲解如何监听和处理用户在编辑器中的操作,如文本改变、图片上传等事件。 4. **...
在Struts2框架中,自定义标签是扩展和优化应用功能的重要手段,它允许开发者创建符合业务逻辑且可重用的视图组件。本实例将深入探讨如何在Struts2中实现自定义标签,以及其背后的原理和步骤。 首先,自定义标签在...
在"spring自定义标签例子"这个项目中,我们可以深入理解这一特性,特别是通过Chapter2工程的实例来学习。 Spring框架的自定义标签通常用于简化XML配置,提升可读性和可维护性。这些标签是基于Java的`org.spring...
标题"基于Java的实例源码-高性能Java网络框架 MINA.zip"表明,这是一个关于Java网络编程的实例源代码包,使用的框架是MINA(Multipurpose Infrastructure for Network Applications)。MINA是一个高性能、异步事件...
这个"Java实例 - 集合打乱顺序源代码-详细教程"很可能是提供了一系列示例和解释,帮助开发者学习如何在Java中随机地重新排序集合元素。以下是对这个主题的详细讲解: 首先,Java中最常用的集合类有ArrayList、...
本教程通过源代码实例,深入讲解了Java集合框架中不同类型的集合(如List、Set、Queue等)以及它们之间的比较方法。 1. **集合接口** - `Collection`: 所有集合类的父接口,提供了一些基本操作,如添加元素、删除...
在本资源包“Java 实例 - 状态监测源代码+详细指导教程.zip”中,包含了一个全面的学习资源,旨在帮助用户深入理解如何在Java中实现状态监测功能。这个教程不仅提供了源代码,还搭配了详尽的指导,使得学习者能够...
"基于Java的实例源码-批量作业执行框架 MyBatchFramework.zip" 这个标题揭示了我们讨论的主题是一个用Java语言编写的批量作业执行框架,名为MyBatchFramework。批量作业执行框架通常用于处理大量数据或需定时运行的...
在这个“基于Java的实例源码-P2P应用程序协议框架 Java BEEP Core.zip”压缩包中,包含的主要文件是"beepcore-0.9.08",这可能是一个特定版本的Java BEEP Core库。这个库通常包含了源代码、编译好的JAR文件以及相关...
本教程将深入探讨JSP自定义标签的实现与应用,并结合MVC(Model-View-Controller)设计模式,介绍如何构建一个简单的MVC自定义框架。 首先,JSP自定义标签的工作原理是基于TLD(Tag Library Descriptor)文件,它...