tagsupportjsp自定义标签用得多吗

tagsupport  时间:2021-06-03  阅读:()

自定义标签中<required>true</required><rtexprvalue>true</rtexprvalue>分别代表什么含义?

在JSP中有一种机制,可以让你在JSP页面中插入与HTML类似的标记。

本文介绍JSP定制标记的基本概念和构成,以及如何开发和应用JSP定制标记。

关键字 JSP,XML,TLD,标记符

什么是标记 使用HTML语言我们可以这样去编辑我们的网页:

<HTML>

    <HEAD>

<TITLE>

HELLO WORLD

</TITLE>

</HEAD>

<BODY>

HELLO WORLD

</BODY>

</HTML>

在这里我们把</HEAD>,<TITLE>,<BODY>称为标记。

HTML 标记( HTML Markup)是HTML文档的控制语言,用于指定浏览器显示和打印文档的方式.它是用小于号"<"和大于号">"括起来的短语和符号,如 <Html>、</Body>等。

许多HTMl标记以成对的方式出现,如<TITLE>< /TITLE>、<Body></Body> 等。

在JSP中我们也可以定制自己的标记,以供JSP页面使用,如下例所示

<!—login.jsp-->

<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>

<html>

 <head>

<title>login</title>

 </head>

 <body>

   <tagclass:login width="200" height= "100" >

</tagclass:login>

 </body>

</html>

在上例中</tagclass:login>就是一个JSP定制标记符。

widtht、height是这个标记的属性。

<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>是一个标记库定义指令,在稍后我们将会讨论。

在JSP中定制标记符,实质上就是以标记的形式封装了一个俱有独立功能的Java类。

标记的使用减少了直接嵌入JSP页面的Java代码,方便了页面的布局,并且有利于代码的复用,提高了开发的效率。

JSP服务器解析标记的过程 那么当一个标记被嵌入JSP页面后,JSP服务器是如何对这个标记进行解析的呢?各对象的含义如下所示:

Client: 表示客户端。

JSP-Server:JSP服务器。

JSP-Page:JSP页面。

TLD:  标记库描述文件,定义标记和标记的各种属性和处理文件等。

TagClass 标记处理程序

当一个用户访问一个JSP页面时,这个请求被发送到JSP服务器,JSP服务器会根据这个请求去调用相应的页面,如果这个页面中有自定义的标记, JSP服务就会根据页面指令<%@ taglib>去访问TLD得到处理程序的相关信息,接着调用该处理程序的构造器方法,启动标记符处理程序,并读取标记符的属性和相应值。

对每个没有设置属性的,调用相应的set方法。

当标记符第一次使用时,它的任何属性都不会做过设置,因此对每个属性都调用set方法。

属性设置完以后,JSP服务器调用处理程序的doStartTag(),然后再调用doEndTag()方法。

最后JSP服务器会继续处理剩下的页面,在页面结尾调用release ()方法,清理占用的所有资源。

TLD文件 TLD(TLD:Tag Library Descriptor标记库描述符)文件,标准的XML格式的标记定义文件,被用来存放标记符的信息,下面就是一个典型的TLD文件。

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!—XML的版本及其字符集-->

<!DOCTYPE taglib

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

 " /j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<!—文档类型定义-->

<taglib>

<!—此标记说明我们开始描述一个标记库-->

<tlibversion>1.0</tlibversion>

 <!—标记库的版本-->

<jspversion>1.1</jspversion>

 <!—所使用的JSP的版本-->

 <shortname>tagclass</shortname>

 <!—缺省的名称-->

<tag>

   <name>login</name>

    <!—标记的名称-->

<tagclass>

tagclass.login.login

<!—处理这个Tag的相应的类的名称-->

</tagclass>

   <info>

      <!—对本标记符的描述-->

   </info>

<attribute>

<!—开始定义标记的属性-->

    <name>height</name>

       <!—属性的名称-->

    <required>true</required>

       <!—表示这个属性是不是必须的-->

    <rtexprvalue>true</rtexprvalue>

<!—表示这个属性是否可以用JSP的程序段的结果输出-->

   </attribute>

<attribute>

    <name>width</name>

    <required>true</required>

    <rtexprvalue>true</rtexprvalue>

   </attribute>

</tag>

</taglib>

在这个TLD文件中定义了只有一个标记符的标记符库,这个名为login的标记符会调用一个Applet以验证用户的合法性。

处理这个标记的类就是 tagclass.login.login。

width、height是这个标记的两个属性。

属性是在使用标记符时作为参数发送的值。

我们可以在上面的示例中增加几个标记,也可以为每个标记添加几个属性。

我们开发标记符库时不一定非要从头开始,自己编写一个全新TLD。

我们可以使用某个集成的开发的环境,也可以修改上面的例子。

TagLib指令 那么当JSP服务器在解析一个标记符时,它是如何定义一个标记库的呢?这就是TagLib指令的主要责任。

Taglib 指令

定义一个标记库以及其自定义标记的前缀.

JSP 语法

<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>

例子 <%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>

<html>

 <head>

<title>login</title>

 </head>

 <body>

   <tagclass:login width="200" height= "100" >

</tagclass:login>

 </body>

</html>

描述

<% @ taglib %>指令声明此JSP文件使用了自定义的标记,同时引用标记库,

也指定了他们的标记的前缀。

你必须在使用自定义标记之前使用<% @ taglib %>指令。

属性

uri="URIToTagLibrary" :Uniform Resource Identifier (URI)根据标记的前缀对自定义的标记进行唯一的命名,URI可以是一个相对或绝对的路径。

  prefix="tagPrefix":在自定义标记之前的前缀。

如上例中的</tagclass:login>

标记符的处理程序(Tag handle) 我们还是以一个例子来看下如何实现一个Tag handle。

首先是看一下它的类图:

让我们再看一下它的代码:

package tagclass.login;

import javax.servlet.jsp.tagext.TagSupport;

import javax.servlet.jsp.*;

import java.io.*;

public class login extends TagSupport

{

public login()

{

super();

}

public int doStartTag() throws JspTagException

{

JspWriter out = pageContext.getOut();

try

{

out.println("<APPLET CODEBASE=applet/login/ CODE=login.class width=200 height=100 > </APPLET>");

}

catch(Exception e)

{

}

return SKIP_BODY;

}

int doEndTag()throws JsptagException

{

return EVAL_PAGE;

}

public void release()

{

super.release();

}

public void setWidth(String language)

{

this.width = width;

}

public String getWidth()

{

return this.width;

}

public void setHeight(String height)

{

this.height=height;

}

public String getHeight()

{

return this.height;

}

private String width;

private String height;

}

从以上我们可以看出,实现一个简单的标记符处理程序有几个要求:①增加一个类,使之继承 java.Servlet.jsp.tagext.TagSupport类。

这个类提供了java.Servlet.jsp.tagext.Tag接口所要求的所有的方法。

另外,还需要使用一些基本的API,使JSP容器能够调用我们自己提供的标记符处理程序。

②必须为每个标记符属性分别创建一个 get<attribute>和set<attribute>方法,JSP容器需要使用这些方法处理程序传递参数。

③要为标记符处理程序创建一个构造器和自毁器。

JSP需要使用构造器启动处理程序。

自毁器是在realease()方法中定义的。

在处理程序的生命周期结束时,需要调用自毁器释放所占用的资源。

④创建两个名为doStartTag()和doEndTag()的方法,执行具体的处理和输出动作。

这两个方法是在处理自定义标记符的起始位置和结束位置调用的。

它们的返回值是在Tag Interface里定义的静态int,这几个静态值分别是:

SKIP_BODY隐含0 :跳过了开始和结束标签之间的代码。

EVAL_BODY_INCLUDE隐含1:将body的内容输出到存在的输出流中

SKIP_PAGE隐含5 : 忽略剩下的页面。

EVAL_PAGE隐含6:继续执行下面的页

  当然标记符也有它自己的缺点。

很不方便的封装过程,有限的功能。

对于一些不太复杂和功能单一的逻辑描述,需要传递的参数要求不高时,使用JSP标记,要方便的多。

对于大多数的商业逻辑应用,还是使用bean要好的多,也宜于servlet控制。

附录:文章中所用示例的完整代码 JSP代码:login.jsp <%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>

<html>

<head>

<title></title>

</head>

<body>

<tagclass:login width="200" height= "100" >

</tagclass:login>

</body>

</html>

标记符描述库:taglib.tld <?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE taglib

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

 " /j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>

<tlibversion>1.0</tlibversion>

<jspversion>1.1</jspversion>

 <shortname>tagclass</shortname>

<tag>

   <name>login</name>

<tagclass>

tagclass.login.login

</tagclass>

   <info>

    </info>

<attribute>

    <name>height</name>

    <required>true</required>

    <rtexprvalue>true</rtexprvalue>

   </attribute>

<attribute>

    <name>width</name>

    <required>true</required>

    <rtexprvalue>true</rtexprvalue>

   </attribute>

</tag>

</taglib>

标记符处理程序:login.java package tagclass.login;

import javax.servlet.jsp.tagext.TagSupport;

import javax.servlet.jsp.*;

import java.io.*;

public class login extends TagSupport

{

public login()

{

super();

}

public int doStartTag() throws JspTagException

{

JspWriter out = pageContext.getOut();

try

{

out.println("<APPLET CODEBASE=applet/login/ CODE=login.class width=200 height=100 > </APPLET>");

}

catch(Exception e)

{

}

return SKIP_BODY;

}

int doEndTag()throws JsptagException

{

return EVAL_PAGE;

}

public void release()

{

super.release();

}

public void setWidth(String language)

{

this.width = width;

}

public String getWidth()

{

return this.width;

}

public void setHeight(String height)

{

this.height=height;

}

public String getHeight()

{

return this.height;

}

private String width;

private String height;

}

标记符处理程序中所使用的Applet : login.java import java.awt.*;

import java.awt.event.*;

import java.applet.*;

public class login extends Applet implements ActionListener

{

private String s_username;

private String s_userpassword;

private Button b_ok;

private Button b_register;

private Label l_username;

private Label l_userpassword;

private TextField t_username;

private TextField t_userpassword;

private GridLayout g_gridlayout;

public void init()

{

b_ok=new Button("ok");

b_register=new Button("register");

l_username= new Label("name");

l_userpassword=new Label("password");

t_username=new TextField();

t_userpassword=new TextField();

b_ok.addActionListener(this);

b_register.addActionListener(this);

g_gridlayout=new GridLayout(3,2,10,10);

this.setLayout(g_gridlayout);

//this.setBackground(Color.blue);

add(l_username);

add(t_username);

add(l_userpassword);

add(t_userpassword);

add(b_ok);

add(b_register);

}

public void actionPerformed(ActionEvent ev)

{

String s_label=ev.getActionCommand();

if (s_label.equals("ok"))

{

t_username.setText("name");

}

if (s_label.equals("register"))

{

t_userpassword.setText("password");

}

}

public void paint(Graphics g)

{

}

}

自定义标签技术叫什么

一般我们说自定义标签是指JSP自定义标签。

自定义标签在功能上逻辑上与javaBean 类似,都封装Java 代码。

自定义标签是可重用的组件代码,并且允许开发人员为复杂的操作提供逻辑名称。

JSP开发人员使用标签库创建标签.标签库是按照功能或实现进行分组的自定义标签的集合。

网络上常见的CMS内容管理系统都是采用模板的形式来实现,基本上所有的CMS系统都有一套自己的模板标签书写方法,简称自定义标签。

1.标签(Tag): 标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。

由于标签是XML元素,所以它的名称和属性都是大小写敏感的 2.标签库(Tag library): 由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。

3.标签库描述文件(Tag Library Descriptor): 标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。

它是一个配置文件,和web.xml是类似的。

4.标签处理类(Tag Handle Class): 标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能

jsp自定义标签用得多吗

在我们开发中,界面和程序代码是分开做的美工做界面但是美工不懂得Java语言如果我们把Java代码写在jsp文件中,会影响美工工作如果我们使用自定义标签,到时再jsp中我们只需要加入一段引用标签代码就好了不会影响美工工作此外jsp文件简单,方便我们以后修改

易速互联月付299元,美国独立服务器促销,加州地区,BGP直连线路,10G防御

易速互联怎么样?易速互联是国人老牌主机商家,至今已经成立9年,商家销售虚拟主机、VPS及独立服务器,目前商家针对美国加州萨克拉门托RH数据中心进行促销,线路采用BGP直连线路,自带10G防御,美国加州地区,100M带宽不限流量,月付299元起,有需要美国不限流量独立服务器的朋友可以看看。点击进入:易速互联官方网站美国独立服务器优惠套餐:RH数据中心位于美国加州、配置丰富性价比高、10G DDOS免...

Linode($5/月),新用户注册送100美元,11个数据中心云服务器

关于Linode,这是一家运营超过18年的VPS云主机商家,产品支持随时删除(按小时计费),可选包括美国、英国、新加坡、日本、印度、加拿大、德国等全球十多个数据中心,最低每月费用5美元($0.0075/小时)起。目前,注册Linode的新用户添加付款方式后可以获得100美元赠送,有效期为60天,让更多新朋友可以体验Linode的产品和服务。Linode的云主机产品分为几类,下面分别列出几款套餐配置...

Hostodo(年付$34.99), 8TB月流量 3个机房可选

Hostodo 算是比较小众的海外主机商,这次九月份开学季有提供促销活动。不过如果我们有熟悉的朋友应该知道,这个服务商家也是比较时间久的,而且商家推进活动比较稳,每个月都有部分活动。目前有提供机房可选斯波坎、拉斯维加斯和迈阿密。从机房的地理位置和实际的速度,中文业务速度应该不是优化直连的,但是有需要海外业务的话一般有人选择。以前一直也持有他们家的年付12美元的机器,后来用不到就取消未续约。第一、开...

tagsupport为你推荐
csonline2反恐精英online2什么时候出oa办公系统下载免费oa办公软件哪里可以下载到?拜托各位大神网络审计网络安全审计系统的背景vga接口定义VGA接口通常用来连接哪些设备,各个脚代表什么意思,它的连线是如何焊接的?assemblyinfo关于ASP.NET中使用log4net记录日志文本框透明word文本框的背景图片怎样调透明度activitygroupactivityGroup子activity跳转的问题移动硬盘文件或目录损坏且无法读取移动硬盘文件或目录损坏且无法读取怎么办??点心os移动OMS系统跟点心OS系统,他两不是都基于Android改造出来的么?差别在哪?软件开发技术文档软件开发文档重要吗?
河南虚拟主机 vps是什么 vps优惠码cnyvps 紫田 服务器cpu性能排行 qq数据库 牛人与腾讯客服对话 最好的免费空间 phpmyadmin配置 服务器合租 申请网页 中国电信宽带测速器 腾讯总部在哪 海外空间 河南移动梦网 上海电信测速 电信网络测速器 lamp怎么读 杭州电信宽带优惠 国外网页代理 更多