自定义标签(客户化jsp标签)
客户化jsp标签技术是在jsp1.1版本中才出现的,他支持用户在jsp文件中自定义标签,这样可以使jsp代码更加简单,这些可重用的标签能够处理复杂的逻辑运算和事物或定义jsp网页的输出内容和格式。
创建客户化jsp标签的步骤:
(1)创建标签的处理类
(2)创建标签的描述文件
(3)在jsp文件中引入标签库,然后插入标签。例如:<mm:hello />其中 mm叫做标签前缀,hello叫做标签名
jsp tag API
Servlet容器编译jsp网页时,如果遇到自定义标签,就会调用这个标签的处理类。
标签处理类必须扩展以下两个类之一:
--javax.servlet.jsp.tagext.TagSupport
--javax.servlet.jsp.tagext.BodyTagSupport
TagSupport方法,其中 里面有两个重要的类,定义标签处理类的时候,都会重写这两个方法:doStartTag() 和 doEndTag()方法。
(1)doStartTag:servlet容器遇到自定义标签的起始标志时。调用该标签
(2)doEndTag:servlet容器遇到自定义标签的结束标志时,调用该标签
(3)setValue(String k, Object o):在标签处理类中设置key/value时,调用该标签
(4)getValue(String k ):在标签处理类中根据参数key返回匹配的value
(5)removeValue(String k):在标签处理类中删除key/value
(6)setPageContext(PageContext pc):设置PageContext对象,该方法由servlet容器在调用doStartTag或doEndTag方法前调用
(7)setParent(Tag t):设置嵌套了当前标签的上一层标签的处理类,该方法由servlet容器在调用doStartTag或doEndTag()方法前调用
(8)setParent():返回嵌套了当前标签的上一层标签的处理类
TagSupport两个重要属性
(1)parent:代表嵌套了当前标签的上层标签的处理类
(2)pageContext:代表web应用中javax.servlet.jsp.pageContext对象
jsp容器在调用doStartTag或doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent.在doStartTag或doEndTag方法中,可以通过getParent方法获取上层标签的处理类:在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可直接访问pageContext变量
pageContext类提供了保存和访问web应用的共享数据的方法:
public void setAttribute(String name, Object value,int scope)
public Object getAttribute(String name,int scope)
其中,scope参数用来指定属性存在范围,他的可选值包括:
--pageContext.PAGE_SCOPE
--pageContext.SESSION_SCOPE
--pageContext.REQUEST_SCOPE
--pageContext.APPLICATION_SCOPE
例如:pageContext.setAttribute("username","zhangsan",pageContext.SESSION_SCOPE);
public int doStartTag() throws jspException
public int doEndTag() throws jspException
doStartTag()方法返回一个整数值,用来决定流程的后续流程,他有iangge可选值:
--Tag.SKIP_BODY 表示标签之间的内同可忽略
--Tag.SKIP_BODY_INCLUDE 表示标签之间的内容正常执行
doEndTag()方法也返回一个整数值,用来决定流程后续流程。他存在两个可选值
--tag.SKIP_PAGE 立刻停止执行jsp网页,网页未处理的静态内容和jsp程序军备忽略,任何已有的输出内容立刻返回到客户端浏览器上。
--tag.EVAL_PAGE: 正常执行流程
在标签中还可以包含自定义的属性:
<prefix:mytag username="zhangsan" >....</prefix:mytag> 在标签处理类中应该讲这个属性作为成员变量并且分别提供设置和读取属性的get和set方法,假定以上username为string类型,可以定义如下方法
private String username;
public void set...
public String get...
举例:
1.创建标签的处理类
package com.tag; import java.io.IOException; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport; public class MyTag extends TagSupport
{
@Override
public int doStartTag() throws JspException
{
try
{
//向页面上输出字符串
this.pageContext.getOut().println("hello world");
}
catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return EVAL_BODY_INCLUDE;
} @Override
public int doEndTag() throws JspException
{
try
{
this.pageContext.getOut().println("welcome");
}
catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
} return EVAL_PAGE;
}
}
Mytag1
2.创建标签的描述文件(放在WEB-INF目录下)
<?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.1</jsp-version>
<short-name>myTag</short-name>
<uri>/myTag</uri> <tag> <name>firstTag</name>
<tag-class>com.tag.MyTag</tag-class>
<body-content>empty</body-content>
</tag> <tag>
<name>message</name>
<tag-class>com.tag.MyTag2</tag-class>
<body-content>empty</body-content>
<attribute>
<name>key</name>
<required>true</required>
</attribute>
</tag> </taglib>
myTag.tld
3.mytag.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/myTag" prefix="hello"%>
<!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>Insert title here</title>
</head>
<body> <p> <font color="blue"> <hello:firstTag ></hello:firstTag>
</font></p> </body>
</html>
4.标签中含有属性值
package com.tag; import java.util.Properties; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport; public class MyTag2 extends TagSupport
{
private String key; @Override
public int doEndTag() throws JspException
{
try
{
Properties ps = (Properties)this.pageContext.getAttribute("ps", PageContext.APPLICATION_SCOPE); String message = ps.getProperty(key); this.pageContext.getOut().println(message); }catch(Exception e )
{
e.printStackTrace();
}
return EVAL_PAGE;
} public String getKey()
{
return key;
} public void setKey(String key)
{
this.key = key;
}
}
MyTag2
5.servlet类
package com.tag.servlet; import java.io.InputStream;
import java.util.Properties; import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet; public class InitTag extends HttpServlet { public void init(javax.servlet.ServletConfig config) throws javax.servlet.ServletException {
Properties ps= new Properties(); try{ ServletContext context = config.getServletContext(); InputStream is = context.getResourceAsStream("/WEB-INF/message.properties"); ps.load(is); is.close(); //将properties对象放在application范围内
context.setAttribute("ps", ps);
}catch(Exception e )
{
e.printStackTrace();
} } }
InitTag
6.已经配置好了tld文件
7.web.xml文件中
<servlet>
<description></description>
<display-name>InitTag</display-name>
<servlet-name>InitTag</servlet-name>
<servlet-class>com.tag.servlet.InitTag</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
8.jsp文件中
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/myTag" prefix="hello" %>
<!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>Insert title here</title>
</head>
<body>
<hello:message key="title"/><br>
<hello:message key="body"/>
</body>
</html>
mytag2.jsp
自定义标签(客户化jsp标签)的更多相关文章
- jsf标签,jsp标签与jstl标签
JSF通过定制标签与JSP集成.之前展示过的所有 JSF标签,<h:inputText>.<h:outputText>.<h:form> 和<f:view&g ...
- 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签. jsp标签的分 ...
- Jsp标签字典开发_基于Spring+Hibernate
目录 1. Jsp标签字典开发_基于Spring+Hibernate 1.1. 简述 1.2. 定义DictItem实体 1.3. 定义字典的@interface 1.4. 定义字典缓存类 1.5. ...
- javaweb之jsp标签
1.JSP标签简介 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 2.JSP常用标签 ...
- 自定义JSP标签库及Properties使用
自定义JSP标签库及Properties使用 自定义JSP标签 自定义JSP标签技术是在JSP 1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁. 这些可重用的标 ...
- 自定义JSP标签入门
1.编写一个实现Tag接口的java类 package TagDemo; import javax.servlet.http.HttpServletRequest; import javax.serv ...
- JSP第六篇【自定义标签之传统标签】
为什么要使用自定义标签? JSTL标签库只提供了简单的输出等功能,没有实现任何的HTML代码封装,并且某些复杂类型转换,或者逻辑处理的时候,JSTL标签库完成不了,需要自定义标签! 编写自定义标签的步 ...
- JSP自定义标签之简单标签入门
在sun官方文档上有下面这样一段话. 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Ta ...
- jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题
jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题 之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一 ...
随机推荐
- Codeforces 471 D MUH and Cube Walls
题目大意 Description 给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. Input 第一行给出数字N.N在[2,1000000 ...
- SQL-基础学习2--ORDER BY ,DESC,WHERE, BETWEEN,AND ,OR ,IN ,NOT
所使用的数据库资料在:数据库资料 第三课:排序检索数据 3.1 排序数据 按单列排序 如果不排序,数据一般将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序.但是,如果数据随后进行 ...
- Java反射之Field用法
在Java反射中Field用于获取某个类的属性或该属性的属性值 一:如何通过Field反射获取类的属性 Field提供如下几种方法: :1:Class.getDeclaredField(String ...
- DEDECMS5.5怎样调用{dede:field.content/}做简介之类的单独页面?
很多时候,如果用dede来做一些企业公司网站,或者一些部门网站的时候.需要某些栏目是一个单页的文章,用于公司简介或者企业文化之类的.那么就要用到栏目功能的栏目内容,也就是dede的content标签. ...
- iOS开发 NSArray技巧
sh数组快速倒序 NSArray *arr = @[@"first",@"second"]; arr = arr.reverseObjectEnumerator ...
- 投影纹理映射(Projective Texture Mapping) 【转】
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 投影纹理映射( Projective ...
- python+OpenCV进行人脸检测【转】
OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: $ su ...
- QQ空间g_tk、bkn加密参数算法
g_tk是腾讯在QQ空间这一领域使用的密文,有写数据包或者url参数中需要加入你计算出的g_tk才能成功! 下面是通过浏览器抓包工具抓取 访问该js内容找出 QZONE.FrontPage.getAC ...
- PHP中的$_SERVER['PATH_INFO']
PHP中的全局变量$_SERVER['PATH_INFO']是一个很有用的参数,众多的CMS系统在美化自己的URL的时候,都用到了这个参数. 对于下面这个网址: http://www.test.com ...
- 关于 ++x 和 x++ 比较难的一个例子
public class testMain { static{ int x = 5;//如果后面有static int x, 前面的定义就没有用x会被重新定义为0 } static int y; st ...