Jsp2.0自定义标签(第一天)——一个简单的例子
今天是学习自定义标签的第一天
Jsp2.0以来,自定义标签的实现比传统标签的实现容易了很多,一般只要extends类SimpleSupport重写doTag()方法即可。
先看最简单的例子,输出一个Hello World
效果图:
jsp页面的代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="myout" uri="/lirui" %>
<html>
<head>
</head>
<body>
<h1>我的测试页面</h1>
<myout:demo value="Hello World"/>
</body>
</html>
页面上的Hello World就是<myout:demo value="Hello World"/> 这一行代码输出的,
但是<myout:demo value="Hello World"/> 为什么会输出Hello World呢?是哪里定义了该标签有输出value值的功能呢?
解答:
要实现<myout:demo value="Hello World"/> 有输出功能,主要有四部分:
第一部分:定义标签的地方。既然是自定义标签,自然有定义该标签的文件(*.tld),这里定义为demo.tld,一般放在WEB-INF下
<?xml version="1.0" encoding="utf-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>myout</short-name>
<!-- 输出值 -->
<tag>
<!-- 定义标签的名称 -->
<name>demo</name>
<!-- 定义该标签的具体业务逻辑,比如上面的输入:Hello World -->
<tag-class>com.tag.support.TagDemo</tag-class>
<!-- 标签体是否为空,这里设置为空 -->
<body-content>empty</body-content>
<!-- 标签的属性 -->
<attribute>
<!-- 属性名 -->
<name>value</name>
<!-- 是否必须,true表示必须要写value属性值 -->
<required>true</required>
<!-- 是否支持表达式,一般是EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<taglib>
第二部分:实现具体业务功能的类,也就是上面demo.tld中的<tag-class>com.tag.support.TagDemo</tag-class> 。
在Jsp2.0以后,自定义标签的实现类一般继承SimpleTagSupport这个类并重写doTag方法
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport; public class TagDemo extends SimpleTagSupport {
//注意:这个属性要与tld文件中定义的属性一致,并提供get和set方法
private String value; public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
}
//具体业务实现类
@Override
public void doTag() throws JspException, IOException {
//this.getJspContext()获得JspContext对象也就是前台页面的PageContext
//可以看出页面输出Hello World注意是这里的write方法实现的
this.getJspContext().getOut().write(value);
}
}
第三部分:在页面引入该标签。
<%@taglib prefix="myout" uri="/demo" %>
但是这地方有些问题,uri=“/demo”究竟是怎么引用到上面所定义的标签呢?
别急还有第四部分
第四部分:在web.xml中定义uri指向
<jsp-config>
<taglib>
<taglib-uri>/demo</taglib-uri>
<taglib-location>/WEB-INF/demo.tld</taglib-location>
</taglib>
</jsp-config>
现在明白对前面的引入究竟是怎么一回事了吧!!!
其实还有另外一种方式在指向/demo,就是在前面的demo.tld文件中加上<uri>/demo</uri>,具体看下面
<?xml version="1.0" encoding="utf-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>myout</short-name>
<!-- 这就是比上面的demo.tld文件多添加了一行 ,web.xml里就不需要再配置了--><uri>/demo</uri>
<!-- 输出值 -->
<tag>
<!-- 定义标签的名称 -->
<name>demo</name>
<!-- 定义该标签的具体业务逻辑,比如上面的输入:Hello World -->
<tag-class>com.tag.support.TagDemo</tag-class>
<!-- 标签体是否为空,这里设置为空 -->
<body-content>empty</body-content>
<!-- 标签的属性 -->
<attribute>
<!-- 属性名 -->
<name>value</name>
<!-- 是否必须,true表示必须要写value属性值 -->
<required>true</required>
<!-- 是否支持表达式,一般是EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
这样的话,你在web.xml就不需要配置了。
今天是学习Jsp自定义标签第一天,例子也比较简单,后续会慢慢深入。。。
由于是分享自己的学习心得,可能有地方还有问题,请看到问题的网友及时指正。
Jsp2.0自定义标签(第一天)——一个简单的例子的更多相关文章
- JSP2.0自定义标签
JSP1.0中可以通过继承TagSupport或者BodyTagSupport来实现自定义的tag处理方法. JSP2.0中也支持另外一种更为简单的自定tag的方法,那就是直接讲JSP代码保存成*.t ...
- Jsp2.0自定义标签(第二天)——自定义循环标签
今天是学习自定义标签的第二天,主要是写一个自定义的循环标签. 先看效果图: 前台页面Jsp代码 <%@ page language="java" contentType=&q ...
- Jsp2.0自定义标签(第三天)——EL表达式的使用
1.提出问题: 我们经常会看到这样的jsp页面代码: 浏览器显示: 为什么会在页面输出:Hello World ,${per}究竟是如何找到“Hello World”的呢? 2.分析问题: 要想解决 ...
- JSP2的自定义标签和方法
Jsp2的自定义标签 Jsp2 开发标签库的几个步骤: 开发自定义标签处理类. 建立一个*.tld文件,每个tld文件对应一个标签库,每个标签库可对应多个标签. 在jsp文件中使用自定义标签 空标签 ...
- JSP2.2自定义标签、EL函数
简介 JSTL是一个JSP标准标签库,可以解决大部分问题,但是如果我们需要一些更特殊的功能,就需要自定义类似JSTL中标签的标签.如果EL表达式无法满足我们的需求,我们也可以自定义EL函数. tld后 ...
- 一个简单的例子搞懂ES6之Promise
ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...
- Spring-Context之一:一个简单的例子
很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
随机推荐
- Hyper-V 网络虚拟化技术细节
Hyper-V 网络虚拟化技术细节 适用对象:Windows Server 2012 R2 服务器虚拟化能让多个服务器实例在同一台物理主机上同步运行,但各个服务器实例都是相互独立的. 每台虚拟机的运作 ...
- 精通CSS高级Web标准解决方案(4、对链接应用样式)
4.1 简单的链接样式 锚可以作为内部引用,也可以作为外部链接,应该区分对待. 伪类选择器: :link 用来寻找没有访问过的链接 :visited 用来寻找已经访问过的链接 a:link{color ...
- Android App程序结构
先看结构图: ====================================== 1. /src 源码目录,不解释. 2. /gen gen目录是ADT 自动生成的代码所在位置 ...
- mysql错误之2014
error:2014 Commands out of sync; you can't run this command now 这个错误号我也真是醉了. 一直纠结于为什么存储过程执行完,commit操 ...
- 树的合并 connect
树的合并 connect 题目描述 话说moreD经过不懈努力,终于背完了循环整数,也终于完成了他的蛋糕大餐. 但是不幸的是,moreD得到了诅咒,受到诅咒的原因至今无人知晓. moreD在发觉自己得 ...
- docker介绍与安装
.docker是什么 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup,namespace,Union FS等技术,对应用进程进行封装隔离,并且独立于宿主机与其 ...
- 解决ie8下面placeholder显示问题
今天测试反馈一个bug,需要在ie8下面看到placeholder提示,开始的想法是对ie8进行降级处理,在ie8下面就不显示了. 现在测试反馈了,解决办法. function isLowIE() { ...
- 【04】【转】Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
目录 简介和安装 测试MySQL 认识一下Connection Options MYSQL CURD 插入 更新 查询 删除 Nodejs 调用带out参数的存储过程,并得到out参数返回值 结束数据 ...
- 球形空间产生器sphere(bzoj 1013)
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...
- WPF 自动选择dll,以SQLite为例
在学习sqlite的过程中,发现它的dll是区分32位和64位的,起初觉得很恼火,但是仔细看了下, 发现让程序自行选择dll其实也不是一件很麻烦的事情,如下: 1>创建一个sqlite数据 2& ...