08.十分钟学会JSP传统标签编程
一、认识标签
1,说明:传统标签编程在开发中基本用不到,学习标签编程主要还是为了完善知识体系。
2,标签的主要作用:移除或减少jsp中的java代码
3,标签的主要组成部分及运行原理
4,简单标签示例:继承javax.servlet.jsp.tagext.TagSupport
标签开发步骤
4.1编写一个继承TagSupport(或实现Tag接口)的类
package com.chen.ying;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class FirstTag extends TagSupport {
public int doStartTag()throws JspException{
System.out.println("调用doStartTag方法");
HttpServletRequest req=(HttpServletRequest)pageContext.getRequest();
JspWriter out=pageContext.getOut();
String ip=req.getRemoteAddr();//通过request对象取得ip地址
try {
out.write(ip);//输出时有可能会抛出异常
} catch (IOException e) {
e.printStackTrace();
}
return TagSupport.SKIP_BODY;//表示跳过标签体
}
}
4.2在WEB-INF目录下新建*.tld文件,用于表示标签库,在*.tld文件中对标签处理类进行描述
<?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">
<!-- description用来添加对taglib(标签库)的描述 -->
<description>陈程编程开发的自定义标签库</description>
<!--taglib(标签库)的版本号 -->
<tlib-version>1.0</tlib-version>
<short-name>GaclTagLibrary</short-name>
<!--
为自定义标签库设置一个uri用于表示标签库,uri以/开头,/后面的内容随便写,如这里的/chen ,
在Jsp页面中引用标签库时,需要通过uri找到标签库
在Jsp页面中就要这样引入标签库:<%@taglib uri="/chen" prefix="anyword"%>
-->
<uri>/chen</uri>
<!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述 -->
<!-- 一个tag标记对应一个自定义标签 -->
<tag>
<description>这个标签的作用是用来输出客户端的IP地址</description>
<!--
为标签处理器类配一个标签名,在Jsp页面中使用标签时是通过标签名来找到要调用的标签处理器类
通过IP就能找到对应的com.chen.ying.FirstTag类
-->
<name>IP</name>
<!-- 标签对应的处理器类-->
<tag-class>com.chen.ying.FirstTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
4.3在jsp页面中使用自定义标签
使用<%@taglib uri=”标签库的uri” prefix=”标签的使用前缀”%>来引入要使用的标签库,前缀可任意设置

显示结果

每次调用<haha:IP>标签时,都会触发doStartTag()方法

从上面代码可以看到,使用标签可以移除jsp中的java代码
二、定义有属性的标签
1, 要求

2, 完成一个日期格式化显示的操作,即根据用户输入的日期格式化模板显示日期。
2.1编写标签类
package com.chen.ying;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class DataTag extends TagSupport {
private String format;
public int doStartTag()throws JspException{
SimpleDateFormat sdf=new SimpleDateFormat(this.format);//设置日期格式
try {
pageContext.getOut().write(sdf.format(new Date()));//用指定格式显示日期
} catch (IOException e) {
e.printStackTrace();
}
return TagSupport.SKIP_BODY;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {//在标签中通过反射机制设置
this.format = format;
}
}
2.2在标签库中配置标签

2.3在jsp使用标签

3, 小结

三、TagSupport类
1, 要求

2, TagSupport主要属性及方法

Int doStartTag()

int doAfterBody()

int doEndTag()

3,Tag接口执行流程

4,含标签体的标签:判断某个属性范围内是否存在指定的属性名称的属性
4.1编写标签处理器类
package com.chen.ying;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class AttributeTag extends TagSupport {
private String name;//接收属性的名称
private String scope;//接收属性的范围
public int doStartTag()throws JspException{
Object value=null;
if("page".equals(this.scope)){//是否是page属性范围
value=pageContext.getAttribute(this.name,pageContext.PAGE_SCOPE);
}
if("request".equals(this.scope)){//是否是request属性范围
value=pageContext.getAttribute(this.name,pageContext.REQUEST_SCOPE);
}
if("session".equals(this.scope)){//是否是session属性范围
value=pageContext.getAttribute(this.name,pageContext.SESSION_SCOPE);
}
if("application".equals(this.scope)){//是否是属性范围
value=pageContext.getAttribute(this.name,pageContext.APPLICATION_SCOPE);
}
if(value==null){//表示没有此属性,不执行标签体
return TagSupport.SKIP_BODY;
}
else{//执行标签体
return TagSupport.EVAL_BODY_INCLUDE;
}
}
public void setName(String name) {
this.name = name;
}
public void setScope(String scope) {
this.scope = scope;
}
}
4.2在标签库中配置标签

4.3在jsp中使用标签‘

是否执行标签体,由返回值决定
5,小结

四、迭代标签
1, 要求

在MVC模式中强调,在一个JSP文件中最好不要出现script代码,因为这样会破坏程序的结构,维护起来非常麻烦,JSP文件就只是用来接收、判断与输出的。现在要在JSP中完成集合的输出,为了不出现script代码,可以用迭代标签
2, 迭代标签开发步骤
2.1编写标签处理类
public class IteratorTag extends TagSupport {
private String name;
private String scope;
private String id;//指定保存集合中的每个元素的属性名称
private Iterator<?> iter=null;
public int doStartTag()throws JspException{
Object value=null;
if("page".equals(this.scope)){//是否是page属性范围
value=pageContext.getAttribute(this.name,pageContext.PAGE_SCOPE);
}
if("request".equals(this.scope)){//是否是request属性范围
value=pageContext.getAttribute(this.name,pageContext.REQUEST_SCOPE);
}
if("session".equals(this.scope)){//是否是session属性范围
value=pageContext.getAttribute(this.name,pageContext.SESSION_SCOPE);
}
if("application".equals(this. Scope)){//是否是属性范围
value=pageContext.getAttribute(this.name,pageContext.APPLICATION_SCOPE);
}
if(value!=null&&value instanceof List<?>){//有此属性且为List类型
this.iter=((List<?>)value).iterator();
if(iter.hasNext()){
pageContext.setAttribute(this.id,iter.next());
//将集合元素保存在指定属性名的属性范围中
return TagSupport.EVAL_BODY_INCLUDE;//执行标签体,通过id属性名输出集合元素
}
else{
return TagSupport.SKIP_BODY;
}
}
else{
return TagSupport.SKIP_BODY;
}
}
public int doAfterBody()throws JspException{
if(iter.hasNext()){
pageContext.setAttribute(this.id,iter.next());
//将集合元素保存在属性范围中,属性名在jsp中指定
return TagSupport.EVAL_BODY_AGAIN;//如果还有元素,交给doAfterBody()处理
}
else{
return TagSupport.SKIP_BODY;
}
}
public void setName(String name) {
this.name = name;
}
public void setScope(String scope) {
this.scope = scope;
}
public void setId(String id) {
this.id = id;
}
}
注意,如果是要执行一次标签体则在doStartTag()中返回EVAL_BODY_INCLUDE,如果是要多次执行标签体,则在doAfterBody()中返回EVAL_BODY_AGAIN;
2.2在标签库中配置标签处理类

有时候tomcat会出现如下错误
Unable to find setter method for ***
只要在对应属性配置处添加<type>属性类型</type>即可解决

2.3在jsp中使用标签

id用于指定list中每个元素保存在属性范围中的属性名,以方便用表达式语言输出
2.4结果

3, 小结
通过标签操作对象,可分为以下步骤:首先在servlet中将对象保存在属性范围内,然后:1,确定标签的属性有哪些,如要操作对象属性的名称,范围等2,通过对象属性得到对象,然后处理对象,可将处理后的结果保存在指定属性名的属性范围内,然后在标签体中显示处理结果,如上述id=”person”.
五、 BodyTagSupport类
1, 要求

2, 定义

3, 主要扩充方法

4, BodyContent类

5, BodyTag接口的执行流程

6,TagExtraInfo类和VariableInfo类

TagExtraInfo类的主要方法

VariableInfo类的主要方法

7,小结

以上都是传统标签开发,在实际开发中并不常用,下面的简单标签才是重点
08.十分钟学会JSP传统标签编程的更多相关文章
- 十分钟学会Scratch图形化编程
一.概要 Scratch是麻省理工学院开发的供儿童或者初学者学习编程的开发平台.其通过点击并拖拽的方式,完成编程,可以使儿童或者成人编程初学者学习编程基础概念等.Scratch是一款积木式图形编程软件 ...
- javaweb学习总结(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- javaweb(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony
这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人 ...
- 十分钟学会 tmux
tmux 是一款终端复用命令行工具,一般用于 Terminal 的窗口管理.在 macOS 下,使用 iTerm2 能应付绝大多数窗口管理的需求. 如上图所示,iTerm2 能新建多个标签页(快捷键 ...
- 快速入门:十分钟学会Python
初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...
- JSP传统标签开发
1.标签技术的API类继承关系 1).JspTag接口是所有自定义标签的父接口 该接口中没有任何属性和方法,只有两个直接子接口,Tag接口和SimpleTag接口,把实现Tag接口的自定义标签叫做传统 ...
- Python十分钟学会
初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...
- 快速入门:十分钟学会Python(转)
初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...
随机推荐
- solr的学习
1): http://archive.apache.org/dist/lucene/solr/ref-guide/ pdf下载地址 solr历史版本的下载:http://archive.apach ...
- 雪花算法生成全局唯一ID
系统中某些场景少不了全局唯一ID的使用,来保证数据的唯一性.除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id.百度了不少php相关的生成 ...
- 通过分析反汇编还原 C 语言 if…else 结构
让我们从反汇编的角度去分析并还原 C 语言的 if - else 结构,首先我们不看源代码,我们用 OllyDBG 载入 PE 文件,定位到 main 函数领空,如下图所示. 在图示中,我已经做好了关 ...
- [pytorch学习]2. 官网60分钟教程摘要
https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 1. Pytorch的基本单元,tensor,本质上和num ...
- 《黑白团团队》第八次团队作业:Alpha冲刺
项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 <黑白团团队>第七次作业:团队项目设计完善&编码 Git ...
- xdebug PHPStrom调试 安装
1.publi目录下新建info文件: 2.搜索是否已经安装过xdebug 3.下载安装 >[info] 自动查找相对应的版本 == 打开php.ini 原始: [XDebug]xdebug.p ...
- VS2015 建立一个C++的MFC简易窗体程序项目
一开始建立的窗体工程都是带很多窗口,而且自己拉到窗体的控件,一调试就看不到了,是因为新建立工程项目时勾选了太多其他的了,这里记录分享一下建立一个单纯的窗体程序项目步骤给有需要的人也可以学习. 第一步: ...
- 0223实战:MySQL Sending data导致查询很慢的问题详细分析
转自博客http://blog.csdn.net/yunhua_lee/article/details/8573621 [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据 ...
- 楼控-西门子-PPM设置及接线教程
第一部分:现场接线 1. 拨码:朝向数字那一端为0,远离数字那一端为1,PPM的地址设定方法就是将拨码器拨为跟系统架构表一样的数字,比如一个1U32的BACnet编号为77020,那么它的MAC地址就 ...
- oracle BBED 直接改动数据库block块
1.BBED配置 1)将相应文件放到$ORACLE_HOME/rdbms/mesg和$ORACLE_HOME/rdbms/lib中: --将lib中bbedus.msb和bbedus.msg ...