客户化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标签)的更多相关文章

  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. [java基础] 001 - 记一次堆栈溢出异常(StackOverFlowError)

    上午经理发来一个任务,解决某个接口异常,此接口第一次调用成功返回: {ret=Y, orderResultList=[{itemno=31920190521083622032, sub_msg=成功, ...

  2. 【java】spring项目中 对entity进行本类间的克隆

    方法1: [使用spring自带BeanUtils实现克隆] [要求:需要被克隆的类实现Cloneable接口并且重写clone()方法] >例子: >>实体: package co ...

  3. jquery 查找子元素的几种方法

    <div class="tm-clear tb-hidden tm_brandAttr" id="J_BrandAttr" style="dis ...

  4. jsp网页在浏览器中不显示图片_eclipse环境下配置tomcat中jsp项目的虚拟路径

    遇到的问题是这种,在jsp网页中嵌入了本地的图片,由于会用到上传到服务器的图片,所以没有放到项目里面,而是把全部图片单独放到一个文件夹里,然后打算使用绝对路径把要显示的图片显示出来.比方是放在了E盘的 ...

  5. xgboost的SparkWithDataFrame版本实现

    再xgboost的源码中有xgboost的SparkWithDataFrame的实现,如下:https://github.com/dmlc/xgboost/tree/master/jvm-packag ...

  6. vue2.0 自定义 图片上传(UpLoader)组件

    1.自定义组件 UpLoader.vue <!-- 上传图片 组件 --> <template> <div class="vue-uploader"& ...

  7. ios You app information could not be saved. Try again. If the problem persists, contact us

    ios You app information could not be saved. Try again. If the problem persists, contact us  大概意思:你的a ...

  8. Linux free显示讲解

    http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html 解释一下Linux上free命令的输出. 下面是free的运行 ...

  9. python--多种程序分析(2)

    1.文件操作有哪些模式?请简述各模式的作用 r模式只读  w模式只写 a模式只添加   r+可读可写  w+可写可读  a+可读可添加   rb  二进制只读  wb 二进制只写   ab 二进制添加 ...

  10. shiro框架的使用

    1.配置二级缓存 <ehcache updateCheck="false" name="shiroCache"> <defaultCache ...