首页主机tagsupport(自定义标签(TagSupport))

tagsupport(自定义标签(TagSupport))

编程之家2024-02-11107次浏览

一、如何创建使用jsp自定义标签

一.编写java类继承TagSupport或TagSupport

tagsupport(自定义标签(TagSupport))

1)提供属性的set方法,

此后这个属性就可以在jsp页面设置。以jstl标签为例

<c:out

value=""/>,这个value就是jsp数据到tag之间的入口。所以tag里面必须有一个setValue方法,具体的属性可以不叫value。例如setValue(String

data){this.data= data;}

这个“value”的名称是在tld里定义的。取什么名字都可以,只需tag里提供相应的set方法即可。

tagsupport(自定义标签(TagSupport))

2)处理 doStartTag或 doEndTag

这两个方法是

TagSupport提供的。还是以<c:out value=""/>为例,当jsp解析这个标签的时候,在“<”处触发 doStartTag

事件,在“>”时触发 doEndTag事件。通常在 doStartTag里进行逻辑操作,在 doEndTag里控制输出。

下面是一个简单的例子

Java代码

tagsupport(自定义标签(TagSupport))

package com.test.tag;

import java.io.IOException;

import javax.servlet.jsp.JspTagException;

import javax.servlet.jsp.tagext.BodyContent;

import javax.servlet.jsp.tagext.BodyTagSupport;

/**

* PermissionBodyTag根据是否有权限显示body内容

*/

public

class PermissionBodyTag

extends BodyTagSupport{

boolean permission;

public boolean isPermission(){

return permission;

}

public void setPermission(boolean permission){

this.permission= permission;

}

public int doStartTag()

throws JspTagException{

if(permission){

return EVAL_BODY_INCLUDE;

}

else{

return SKIP_BODY;

}

}

public int doEndTag()

throws JspTagException{

System.out.println("doEndTag");

try{

if(bodyContent!=

null){

bodyContent.writeOut(bodyContent.getEnclosingWriter());

}else{

}

}

catch(IOException e){

throw new JspTagException("IO ERROR:"+ e.getMessage());

}

return EVAL_PAGE;

}

public void doInitBody()

throws JspTagException{

}

public void setBodyContent(BodyContent bodyContent){

this.bodyContent= bodyContent;

}

}

通常你会发现自己绝大多数活动都集中在 doStartTag或 doEndTag方法里。确实如此,熟悉一些接口和类之后,写taglib很容易。正如《jsp设计》的作者所言:里面的逻辑稍微有点复杂,但毕竟没有火箭上天那么难。

二.编写tld文件

标签文件其实只是一个XML格式的说明文件,内容也很简单。

创建tagTest-html.tld文件在这个标签文件中,我们将我们创建的标签取名 tagTest,并声明了类型和参数(permission)。将该文件保存在/WEB-INF下面。

Java代码

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE taglib PUBLIC

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

"">

<taglib>

<tlibversion>1.2</tlibversion>

<jspversion>1.1</jspversion>

<shortname>tagTest</shortname>

<uri>/taiji</uri>

<tag>

<name>permission</name>

<tagclass>com.test.tag.PermissionBodyTag</tagclass>

<bodycontent>JSP</bodycontent>

<attribute>

<name>permission</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>

三.加到web.xml中

当然,我们还需要将我们自定义的标签添加到 web.xml中,否则还是无法使用。

Java代码

<taglib>

<taglib-uri>/tagTest</taglib-uri>

<taglib-location>/WEB-INF/tagTest-html.tld</taglib-location>

</taglib>

四.在jsp页面导入tld

Java代码

<%@ taglib uri="/tagTest" prefix="tagTest"%>

这样,你的jsp页面就可以使用自己的tag了。用这个标签就可以根据传人的boolean值来决定标签包的jsp内容是否输出

Java代码

<tagTest:permission permission="<% java code%>">

//需有权限输出,用户才能看到的内容

</tagTest:permission>

二、怎么样使用jsp中自定义标签

jsp自定义标签用法,供大家参考,具体如下:

什么是标记

使用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"

" ">

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

<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;

}

publicc 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"

" ">

<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;

}

publicc 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 内置标签,jstl标签库及自定义标签

学会怎样使用Jsp内置标签,jstl标签库及自定义标签

1

jsp自定义标签需要引入两个jar分别是

javax.servlet.jsp.jarjavax.servlet.jar

2

建立tld文件,建议目录为WEB-INF下,tld文件结构为下图,uri为整个标签库的名称,可以理解为java类,每一个tag分支,可以理解为java类中的每一个方法,我们在调用jsp自定义标签的时候就和调用java类一样,通过类找方法。tag分支重点要讲tag-class,该属性为该标签方法所指向的java类。attribute为参数,相信属性看步骤三附图。

3

关于tld文件属性的说明,可以参考下图

4

将tld文件引入web.xml中,建议名称与tld文件标签库名称一致

5

编写jsp自定义标签类,该类继承TagSupport类,我们需要做的就是重写doStartTag,我们可以通过JspWriter将后台处理的东西直接输出到jsp页面。当然了,输出的内容在实际操作中肯定经过了非常复杂的逻辑。

6

页面调用,首先需要引入标签,<%@ taglib uri="option" prefix="option"%> option为标签名定义在tld文件中,引用之后就可以在页面调用自定义标签了,简单的一行代码。即可实现一个grid的输出,且可以重复利用。

winrar注册码(WinRAR 3.51 注册码)导入mdf文件(解决SQL Server数据库恢复:导入MDF文件)