`
igogogo9
  • 浏览: 250832 次
  • 性别: Icon_minigender_1
  • 来自: 海口市
社区版块
存档分类
最新评论

JSP中自定义标记符的使用

阅读更多
摘要
   在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"

     "http://java.sun.com/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;

}

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"

     "http://java.sun.com/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;

}

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自定义标记

    JSP自定义标记(Tag Libraries)通常由两部分组成:标记库描述符(TLD, Tag Library Descriptor)和标记处理类(Tag Handler Class)。TLD是XML文档,用于定义标记的元数据,如标记名称、属性、行为等。而标记处理类...

    自定义标记实现银行系统的数字大小写转换

    在实际应用中,这个自定义标记可以方便地嵌入到JSP页面中,通过简单的标签语法就能完成数字转换。例如: ```jsp ``` 这行代码会将数字1234567890转换为银行格式的汉字数字,并显示在页面上。 通过这种方式,自定义...

    掌握自定义JSP标签(html).

    2. JSP自定义标签的组成部分: - 标签库描述符文件(TLD, Tag Library Descriptor):TLD文件是XML格式的,它定义了标签库的元数据,包括标签的名字、属性、行为等。 - 标签处理类(Tag Handler Class):这是实现...

    创建JSP自定义标签.doc

    本篇将详细介绍如何创建JSP自定义标签。 首先,了解自定义标签的基本结构。一个自定义标签其实是一个Java类,这个类需要继承自`TagSupport`或`BodyTagSupport`。这两个类由JSP容器提供,它们包含处理JSP页面与...

    jsp期末复习资料总结

    JSP标记分为指令标记(如%@ page属性%&gt;)、动作标记(如&lt;jsp:include&gt;)和自定义标记(自定义的JSP标签库)。 以上内容涵盖了JSP的基础知识,包括其原理、配置、页面结构、工作流程以及常用元素和对象。这些知识点...

    jsp程序设计ppt

    **第6章 JSP中使用数据库** JDBC(Java Database Connectivity)是Java连接数据库的标准接口,JSP通过JDBC可以方便地访问数据库。这一章将讲解如何在JSP中配置数据源、执行SQL语句以及处理结果集。 **第7章 JSP与...

    构建NetBeans的JSP开发环境

    通过上述步骤,我们可以在项目中使用自定义标记,以提高开发效率和代码可读性。 综上所述,构建NetBeans的JSP开发环境涉及到多个方面的配置与设置,从基础环境的搭建到具体项目的创建与配置,每一步都至关重要。...

    jsp表达式语言

    JSTL是一组自定义标记库,它将常见的JSP应用程序功能封装成易于使用的标记,减少了对JSP scriptlets和表达式的依赖。最初,EL仅限于在JSTL标记中使用。然而,在JSP 2.0版本中,EL被正式集成到JSP核心规范中,并且...

    自定义tag学习

    在编程领域,自定义标签(Tag)是一种常见的技术,特别是在Java服务器端开发中,例如JSP自定义标签库(Custom Tags)或者Spring MVC中的自定义注解。自定义标签允许开发者扩展HTML或XML标记语言,以实现特定的功能,...

    Java自定义注解与spring BeanPostProcessor详解

    Java自定义注解和Spring的BeanPostProcessor是Java企业级开发中的两个重要概念,它们在构建灵活、可扩展的应用程序中发挥着关键作用。本文将深入探讨这两个话题,并结合源码分析,帮助开发者更好地理解和应用。 ...

    抽奖jsp系统,新手学习

    在开发过程中,要注意配置Web应用的部署描述符(web.xml),定义Servlet映射,以及设置JSP的编译和错误处理。 对于初学者来说,理解JSP的工作原理和生命周期是至关重要的。JSP的生命周期包括加载、初始化、服务、...

    JSP两本经典书籍

    **JSP(JavaServer Pages)**是Java平台上用于构建动态Web应用程序的一种技术,它允许开发者在HTML、XML或其他标记语言中嵌入Java代码,从而实现服务器端的数据处理和业务逻辑。JSP技术由Sun Microsystems(现已被...

    JSP taglib 精讲

    它允许开发者创建自定义的HTML或XML标签,这些标签可以封装复杂的Java代码逻辑,并在JSP页面中像普通HTML标签一样被使用。TagLib的核心思想在于将业务逻辑与表现层进行分离,从而让前端开发者能够更加专注地进行页面...

    Tema 2b - Etiquetas Personalizadas JSP (JSP Custom…….ppt

    接着,在`web.xml`中添加TLD引用,最后在`SimplePage.jsp`中使用新定义的标签。完成以上步骤后,重启服务器,自定义标签就能在JSP页面上正常工作了。 通过使用自定义标签,开发者可以创建出更加模块化、易于理解的...

    jsp/servlet帮助文档

    在JSP页面中,有一些预定义的对象可以直接使用,例如request、response、session、application等,它们对应于Servlet API中的特定对象,方便开发者直接操作请求、响应、会话和全局应用程序数据。 **EL(Expression ...

    jsp2.0 学习笔记+完整源码

    - **自定义标签开发**:创建自定义标签涉及编写标签处理类、定义TLD文件,并在JSP页面中使用。 - **异常处理**:JSP 2.0支持使用`&lt;error-page&gt;`标签进行错误页面的指定,以及使用`&lt;error-page&gt;`和`&lt;error-code&gt;`...

    jsp编码规范

    【JSP编码规范】是Java Web开发中的一个重要组成部分,它旨在提高代码的可读性、可维护性和团队协作效率。以下是一些关键的规范要点: 1. **文件命名规范**: - **文件后缀**:不同的文件类型应遵循特定的后缀。如...

    JSP帮助文档

    4. **声明式属性**:JSP2.0允许开发者在页面头部声明Java类的实例,这样可以在整个页面生命周期中使用,提高了代码复用。 5. **分离的编译过程**:JSP2.0规范要求JSP页面在首次请求时被编译为Servlet,然后由...

    精通JSP-Web开发技术与典型应用

    7. **JSP自定义标签**:学习如何创建和使用自定义标签,增强JSP的可扩展性。 8. **安全性**:了解JSP和Web应用的安全问题,如SQL注入、跨站脚本攻击(XSS)等,以及相应的防护措施。 9. **性能优化**:学习如何...

    jsp宝典(用于给初学JSP的同学学习)

    **JSP(Java Server Pages)** 是一种动态网页技术,由Sun Microsystems开发,它允许开发者在HTML、XML或其他标记语言中嵌入Java代码,从而实现服务器端的动态内容生成。本压缩包“JSP宝典”是专为初学者设计的学习...

Global site tag (gtag.js) - Google Analytics