在本章中,我们将讨论JSP中的自定义标签。自定义标签是用户定义的JSP语言元素。当包含自定义标签的JSP页面被转换成一个servlet时,标签被转换为一个名为标签处理程序的对象的操作。 然后,Web容器在执行JSP页面的servlet时调用这些操作。

JSP标签扩展允许创建可以直接插入JSP的新标签。JSP 2.0规范引入了用于编写这些自定义标签的简单标签处理程序。

要编写自定义标签,可以简单地扩展SimpleTagSupport类并覆盖doTag()方法,可以在这个方法中放置代码来为标签生成内容。

创建标签示例

为了更好的演示如何使用JSP中的自定义标签,打开Eclipse创建一个动态Web项目:CustomTags,其项目结构如下所示 -

假设要定义一个名为的自定义标签,并且希望以下列方式来使用它:

要创建自定义JSP标记,必须首先创建一个充当标记处理程序的Java类。在这个示例中创建一个HelloTag类,如下所示:

文件:HelloTag.java

package com.yiibai;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.io.*;

public class HelloTag extends SimpleTagSupport {

public void doTag() throws JspException, IOException {

JspWriter out = getJspContext().getOut();

out.println("您好,这是一个自定义标签内容!");

}

}

上述代码只是简单的编码,其中doTag()方法使用getJspContext()方法获取当前的JspContext对象,并使用它发送“Hello Custom Tag!”到当前的JspWriter对象

最后,创建以下标签库文件:{webapps}/WEB-INF/custom.tld , 内容如下 -

1.0

2.0

Custom TLD

Hello

com.yiibai.HelloTag

empty

在JSP程序中使用上面定义的自定义标签Hello,如下所示:

pageEncoding="UTF-8"%>

自定义标签示例

以下是自定义标签输出的内容:


调用上述JSP,这应该产生以下结果 -

访问标签体

可以在标签正文中添加一条消息,如标准标签所示。 考虑想定义一个名为的自定义标签,并且使用下面的方式来使用它 -

This is message body

在上述标签代码中进行以下更改来处理标签的正文 -

package com.yiibai;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.io.*;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.io.*;

public class HelloTag extends SimpleTagSupport {

StringWriter sw = new StringWriter();

public void doTag()

throws JspException, IOException {

getJspBody().invoke(sw);

getJspContext().getOut().println(sw.toString());

}

}

这里,由调用产生的输出首先捕获到一个StringWriter中,然后再写入与该标签关联的JspWriter。需要更改TLD文件,如下所示:

文件:custom.tld

1.0

2.0

Example TLD with Body

Hello

com.yiibai.HelloTag

scriptless

现在在正文中调用上面的标签,如下所示:

文件:index2.jsp

pageEncoding="UTF-8"%>

自定义标签示例

以下是自定义标签输出的内容:


这是标签体的内容

执行上面示例代码,将得到以下结果 -

自定义标签属性

也可以使用各种属性以及自定义标签。要接受属性值,自定义标签类需要实现setter方法,与JavaBean setter方法相同,如下所示:

文件:CTagAttr.java

package com.yiibai;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.io.*;

public class CTagAttr extends SimpleTagSupport {

private String message;

public void setMessage(String msg) {

this.message = msg;

}

StringWriter sw = new StringWriter();

public void doTag()

throws JspException, IOException {

if (message != null) {

/* Use message from attribute */

JspWriter out = getJspContext().getOut();

out.println( message );

} else {

/* use message from the body */

getJspBody().invoke(sw);

getJspContext().getOut().println(sw.toString());

}

}

}

属性的名称是message,所以setter方法是setMessage()。现在使用元素在TLD文件中添加此属性,如下所示:

1.0

2.0

Example TLD with Body

Hello

com.yiibai.CTagAttr

scriptless

message

在JSP中使用HelloTag的message属性如下 -

文件:ctagattr.jsp

pageEncoding="UTF-8"%>

自定义标签属性示例

以下是自定义标签输出的内容:


这将产生以下结果 -

下面是包括的属性及说明 -

编号

属性

描述

1

name

name元素定义属性的名称。每个属性名称对于特定标签必须是唯一的。

2

required

此规范如果此属性是必需的或是可选的。则可设置为:false。

3

rtexprvalue

声明tag属性的运行时表达式值是否有效

4

type

定义此属性的Java类类型。 默认情况下,它被假定为String类型

5

description

可以提供信息描述。

6

fragment

声明此属性值是否应被视为JspFragment。

以下是指定属性相关属性的示例 -

.....

attribute_name

false

java.util.Date

false

.....

如果使用两个属性,则可以按如下所示修改TLD:

.....

attribute_name1

false

java.util.Boolean

false

attribute_name2

true

java.util.Date

.....

JSP自定义标签属性操作数据库示例

在上面几个示例中,我们已经演示了如何创建一个自定义标签,打印给定标签名称和特定属性内容。这里将进一步演示如何在自定义标签中读取数据库表中的数据记录。假设要使用自定义标签来显示最新入职的3名员工,参考以下实现步骤。

创建数据库和表 -

DROP TABLE IF EXISTS `employees`;

CREATE TABLE `employees` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(64) NOT NULL DEFAULT '',

`age` int(3) unsigned NOT NULL DEFAULT '0',

`education` varchar(32) DEFAULT '' COMMENT '学历',

`address` varchar(254) DEFAULT NULL,

`salary` float(8,2) unsigned DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of employees

-- ----------------------------

INSERT INTO `employees` VALUES ('1', '李家诚', '23', '其它', '海口市人民大道1800号', '8900.00');

INSERT INTO `employees` VALUES ('2', '张辉', '28', '本科', '广州天河区珠村市场', '19999.99');

INSERT INTO `employees` VALUES ('3', '林贤弟', '29', '博士', '广州白云区龙塘村120号', '18990.99');

INSERT INTO `employees` VALUES ('4', '王小简', '23', '本科', '海口人民大道1688号', '899.98');

INSERT INTO `employees` VALUES ('5', '蔡世杰', '27', '专科', '上海市宝山区联杨路2211弄26号', '15800.00');

创建一个Java类文件:Employee.java

package com.yiibai;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

import java.sql.*;

public class EmployeeTag extends TagSupport {

private String number;

public String getNumber() {

return number;

}

public void setNumber(String number) {

this.number = number;

}

public int doStartTag() throws JspException {

JspWriter out = pageContext.getOut();

try {

Class.forName("com.mysql.jdbc.Driver");

Connection con = DriverManager.getConnection("jdbc:mysql://localhost/testdb?useSSL=false&characterEncoding=utf8", "root", "123456");

PreparedStatement ps = con.prepareStatement("SELECT name,education,age FROM `employees` ORDER BY id DESC limit "+this.number);

//ps.setInt(1, Integer.parseInt(this.number));

System.out.println("number => "+this.number);

ResultSet rs = ps.executeQuery();

if (rs != null) {

// column name

out.write("

out.write("

");

out.write("

姓名学历年龄");

out.write("

");

// column value

while (rs.next()) {

out.write("

");

out.write("

" + rs.getString("name") + "" + rs.getString("education") + "" + rs.getString("age") + "");

out.write("

");

}

out.write("

");

}

con.close();

} catch (Exception e) {

System.out.println(e);

}

return SKIP_BODY;

}

}

文件:empl.tld

/p>

PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

1.2

2.0

c

yiibai

NewEmpl

com.yiibai.EmployeeTag

number

true

文件:new_empl.jsp

pageEncoding="UTF-8"%>

自定义标签+数据库

最新加入的3位员工:


在编写完成上面示例代码后,运行这个JSP文件,应该会看到以下结果 -

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

java jsp 自定义标签_JSP自定义标签相关推荐

  1. 让你认清楚JSP中的所有东西(java/JSP/EL/OGNL/JSTL/c标签/s标签/HTML/javascript/CSS)

    先来解释名词: java:jsp的基础,服务器端语言. javascript:运行在浏览器里的客户端脚本语言,目的是让网页更加生动活泼功能强大. HTML(Hypertext Markup Langu ...

  2. java jsp学习指南_JSP教程–最终指南

    java jsp学习指南 编者注: JavaServer Pages(JSP)技术使您可以轻松创建同时包含静态和动态组件的Web内容. JSP技术提供了Java Servlet技术的所有动态功能,但提 ...

  3. java jsp页面如何添加C标签

    在https://mvnrepository.com/找两个jar包分别是: <dependency> <groupId>javax.servlet.jsp.jstl</ ...

  4. java jsp小例题_JSP 相关试题(一)

    选择题 1.当用户请求jsp页面时,JSP引擎就会执行该页面的字节码文件响应客户的请求,执行字节码文件的结果是(C) A)发送一个JSP源文件到客户端    B)发送一个Java文件到客户端 C)发送 ...

  5. java jsp 跳转_JSP 页面跳转的实现方法

    客户端跳转 1. 使用 href 超链接标记  跳转 2. 使用表单提交完成跳转 ... 3. 使用 JavaScript 4. 使用 response.sendRedirect(String pat ...

  6. java jsp页面传值_JSP 页面传值方法总结

    JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧. 试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式. 1. URL 链接后追加参数 URL 后面追加参数 resp ...

  7. java jsp网页新闻_JSP新闻显示

    MYSQL数据库创建新闻表,用户登陆时使用SERVLET获取用户名,效验通过后直接跳转新闻列表页面,JSP使用EL显示新闻列表 1.首先创建数据库及用户.新闻表 CREATE DATABASE /*! ...

  8. java jsp网页计算器_JSP实现计算器功能(网页版)

    jsp实现网页计算器代码如下:只有两个jsp页面 myCal.jsp如下: String path = request.getContextPath(); String basePath = requ ...

  9. java jsp 跳转_JSP页面跳转方法大全

    先来介绍一下在服务端JSP脚本中跳转页面的几种方法: 1. response.sendRedirct("跳转到页面"); 该方法通过修改HTTP协议的HEADER部分,对浏览器下达 ...

最新文章

  1. Java的继承多态的练习
  2. 阿里巴巴收购以色列VR公司,大厂死磕VR为哪般?
  3. java B2B2C 源码多租户电子商城系统-Spring Cloud组件详解
  4. Vue.js Class 与 Style 绑定
  5. niceScroll在ie11和edge浏览器上面滚动时抖动问题
  6. 将EditText的光标定位到字符的最后面
  7. win7 安装mysql 5.7.9记录
  8. 1650显卡学计算机,适合老电脑升级?GTX1650显卡开箱,性价比依然不高!
  9. springbatch读取文件_通过例子讲解Spring Batch入门,优秀的批处理框架
  10. 自动化部署mysql主从复制集群_使用docker部署mysql主从复制集群
  11. 回调函数 EnumFontFamProc
  12. 计划任务中使用NT AUTHORITY\SYSTEM用户和普通管理员用户有什么差别
  13. 清明节不加班??不存在的
  14. Character与char的区别
  15. tapd获取相应内容
  16. python图片修复软件下载_python实现的jpg格式图片修复代码
  17. ENVI系列--遥感影像UTM投影计算公式
  18. 极客时间 IT 20+ 张 各架构 高清技能图谱
  19. Vue处理后台返回List集合带有Object对象的数据
  20. PTA:7-10 深入虎穴 (25 分)

热门文章

  1. 计算机程序设计c++ 11-1:派生类
  2. 高校计算机实验技术 面试,2014计算所面试回忆(网络数据科学与技术重点实验室)...
  3. cad的文字嵌入线条_将文字转换为线条方法一则
  4. java 堆内存使用情况_java语言:JVM堆内存使用率持续上升如何排查
  5. jadx:好用的反编译工具
  6. 短连接时出现connection reset问题的原因
  7. 安卓源代码_都2020年了,还有人以为安卓系统是谷歌的?
  8. 初中计算机卡片的制作教案,卡片的制作教案.doc
  9. 360n6手机可以刷鸿蒙系统吗,360手机N6卡刷刷机教程_360手机N6升级更新官方系统包...
  10. 点阵(显示一个汉字)