客户化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.创建标签的处理类

  1. package com.tag;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.jsp.JspException;
  6. import javax.servlet.jsp.tagext.TagSupport;
  7.  
  8. public class MyTag extends TagSupport
  9. {
  10. @Override
  11. public int doStartTag() throws JspException
  12. {
  13. try
  14. {
  15. //向页面上输出字符串
  16. this.pageContext.getOut().println("hello world");
  17. }
  18. catch (IOException e)
  19. {
  20. // TODO 自动生成的 catch 块
  21. e.printStackTrace();
  22. }
  23. return EVAL_BODY_INCLUDE;
  24. }
  25.  
  26. @Override
  27. public int doEndTag() throws JspException
  28. {
  29. try
  30. {
  31. this.pageContext.getOut().println("welcome");
  32. }
  33. catch (IOException e)
  34. {
  35. // TODO 自动生成的 catch 块
  36. e.printStackTrace();
  37. }
  38.  
  39. return EVAL_PAGE;
  40. }
  41. }

Mytag1

2.创建标签的描述文件(放在WEB-INF目录下)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  3. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  4.  
  5. <taglib>
  6.  
  7. <tlib-version>1.0</tlib-version>
  8. <jsp-version>1.1</jsp-version>
  9. <short-name>myTag</short-name>
  10. <uri>/myTag</uri>
  11.  
  12. <tag>
  13.  
  14. <name>firstTag</name>
  15. <tag-class>com.tag.MyTag</tag-class>
  16. <body-content>empty</body-content>
  17. </tag>
  18.  
  19. <tag>
  20. <name>message</name>
  21. <tag-class>com.tag.MyTag2</tag-class>
  22. <body-content>empty</body-content>
  23. <attribute>
  24. <name>key</name>
  25. <required>true</required>
  26. </attribute>
  27. </tag>
  28.  
  29. </taglib>

myTag.tld

3.mytag.jsp文件

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/myTag" prefix="hello"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11.  
  12. <p> <font color="blue">
  13.  
  14. <hello:firstTag ></hello:firstTag>
  15. </font></p>
  16.  
  17. </body>
  18. </html>

4.标签中含有属性值

  1. package com.tag;
  2.  
  3. import java.util.Properties;
  4.  
  5. import javax.servlet.jsp.JspException;
  6. import javax.servlet.jsp.PageContext;
  7. import javax.servlet.jsp.tagext.TagSupport;
  8.  
  9. public class MyTag2 extends TagSupport
  10. {
  11. private String key;
  12.  
  13. @Override
  14. public int doEndTag() throws JspException
  15. {
  16. try
  17. {
  18. Properties ps = (Properties)this.pageContext.getAttribute("ps", PageContext.APPLICATION_SCOPE);
  19.  
  20. String message = ps.getProperty(key);
  21.  
  22. this.pageContext.getOut().println(message);
  23.  
  24. }catch(Exception e )
  25. {
  26. e.printStackTrace();
  27. }
  28. return EVAL_PAGE;
  29. }
  30.  
  31. public String getKey()
  32. {
  33. return key;
  34. }
  35.  
  36. public void setKey(String key)
  37. {
  38. this.key = key;
  39. }
  40. }

MyTag2

5.servlet类

  1. package com.tag.servlet;
  2.  
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5.  
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.http.HttpServlet;
  8.  
  9. public class InitTag extends HttpServlet {
  10.  
  11. public void init(javax.servlet.ServletConfig config) throws javax.servlet.ServletException {
  12. Properties ps= new Properties();
  13.  
  14. try{
  15.  
  16. ServletContext context = config.getServletContext();
  17.  
  18. InputStream is = context.getResourceAsStream("/WEB-INF/message.properties");
  19.  
  20. ps.load(is);
  21.  
  22. is.close();
  23.  
  24. //将properties对象放在application范围内
  25. context.setAttribute("ps", ps);
  26. }catch(Exception e )
  27. {
  28. e.printStackTrace();
  29. }
  30.  
  31. }
  32.  
  33. }

InitTag

6.已经配置好了tld文件

7.web.xml文件中

  1. <servlet>
  2. <description></description>
  3. <display-name>InitTag</display-name>
  4. <servlet-name>InitTag</servlet-name>
  5. <servlet-class>com.tag.servlet.InitTag</servlet-class>
  6. <load-on-startup>10</load-on-startup>
  7. </servlet>

8.jsp文件中

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/myTag" prefix="hello" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <hello:message key="title"/><br>
  12. <hello:message key="body"/>
  13. </body>
  14. </html>

mytag2.jsp

自定义标签(客户化jsp标签)的更多相关文章

  1. jsf标签,jsp标签与jstl标签

    JSF通过定制标签与JSP集成.之前展示过的所有 JSF标签,<h:inputText>.<h:outputText>.<h:form> 和<f:view&g ...

  2. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

    学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签.  jsp标签的分 ...

  3. Jsp标签字典开发_基于Spring+Hibernate

    目录 1. Jsp标签字典开发_基于Spring+Hibernate 1.1. 简述 1.2. 定义DictItem实体 1.3. 定义字典的@interface 1.4. 定义字典缓存类 1.5. ...

  4. javaweb之jsp标签

    1.JSP标签简介 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 2.JSP常用标签 ...

  5. 自定义JSP标签库及Properties使用

    自定义JSP标签库及Properties使用 自定义JSP标签 自定义JSP标签技术是在JSP 1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁. 这些可重用的标 ...

  6. 自定义JSP标签入门

    1.编写一个实现Tag接口的java类 package TagDemo; import javax.servlet.http.HttpServletRequest; import javax.serv ...

  7. JSP第六篇【自定义标签之传统标签】

    为什么要使用自定义标签? JSTL标签库只提供了简单的输出等功能,没有实现任何的HTML代码封装,并且某些复杂类型转换,或者逻辑处理的时候,JSTL标签库完成不了,需要自定义标签! 编写自定义标签的步 ...

  8. JSP自定义标签之简单标签入门

    在sun官方文档上有下面这样一段话. 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Ta ...

  9. jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题

    jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题 之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一 ...

随机推荐

  1. 左偏树 / 非旋转treap学习笔记

    背景 非旋转treap真的好久没有用过了... 左偏树由于之前学的时候没有写学习笔记, 学得也并不牢固. 所以打算写这么一篇学习笔记, 讲讲左偏树和非旋转treap. 左偏树 定义 左偏树(Lefti ...

  2. 中途相遇法 解决 超大背包问题 pack

    Description [题目描述] 蛤布斯有n个物品和一个大小为m的背包,每个物品有大小和价值,它希望你帮它求出背包里最多能放下多少价值的物品. [输入数据] 第一行两个整数n,m.接下来n行每行两 ...

  3. Ubuntu 16.04下使用Wine安装文件内容搜索工具Search and Replace

    说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.关于没有.wine文件夹的解决方法:在命令行上运行winecfg: 下载: (链接 ...

  4. 获取非行间样式getComputedStyle

    有如下代码: 1 2 3 div {     width: 200px; } 1 2 3 <div id="aa" style="height: 100px;&qu ...

  5. javascript --- 兼容的那些事

    绑定事件 var addEvent = function( obj, type, fn ) { if (obj.addEventListener) obj.addEventListener( type ...

  6. Please configure Spring facet or use 'Create Default Context' to add one including all unmapped files.

    有时候我们刚进入 Intellij IDEA时会出现这样一个情况,原因是IDEA没有找到spring的配置文件,我们需要添加spring文件给idea管理 参考: 1.https://www.jetb ...

  7. npm、yarn、pnpm

    它们都是当前主流的包管理工具 pnpm:https://github.com/pnpm/pnpm yarn: https://github.com/yarnpkg/yarn npm: https:// ...

  8. C# PropertyGrid控件应用心得 【转】

    源文 : http://blog.csdn.net/luyifeiniu/article/details/5426960 c#stringattributesobjectmicrosoftclass ...

  9. css3 - 动态伪类

    动态伪类分为以下几种: 1. hover(经过) 2. active(点击后) 3. focus(聚焦) - input专用 4. visited(访问后) 使用:

  10. Quality control

    定义测试         为测试添加测试项     测试项目按类型分2种 Qualitative 定性,描述类的,比如颜色,是,否 Quantitative 定量,有明确的衡量         定性 ...