满意答案

clonecd035

2013.03.16

采纳率:58%    等级:12

已帮助:5871人

在JSP中有一种机制,可以让你在JSP页面中插入与HTML类似的标记。本文介绍JSP定制标记的基本概念和构成,以及如何开发和应用JSP定制标记。 关键字

JSP,XML,TLD,标记符什么是标记

使用HTML语言我们可以这样去编辑我们的网页:     

HELLO WORLD HELLO WORLD在这里我们把,,称为标记。HTML 标记( HTML Markup)是HTML文档的控制语言,用于指定浏览器显示和打印文档的方式.它是用小于号""括起来的短语和符号,如 、等。许多HTMl标记以成对的方式出现,如< /TITLE>、 等。在JSP中我们也可以定制自己的标记,以供JSP页面使用,如下例所示   login          在上例中就是一个JSP定制标记符。widtht、height是这个标记的属性。是一个标记库定义指令,在稍后我们将会讨论。在JSP中定制标记符,实质上就是以标记的形式封装了一个俱有独立功能的Java类。标记的使用减少了直接嵌入JSP页面的Java代码,方便了页面的布局,并且有利于代码的复用,提高了开发的效率。JSP服务器解析标记的过程

那么当一个标记被嵌入JSP页面后,JSP服务器是如何对这个标记进行解析的呢?各对象的含义如下所示:Client: 表示客户端。JSP-Server:JSP服务器。JSP-Page:JSP页面。TLD:  标记库描述文件,定义标记和标记的各种属性和处理文件等。TagClass 标记处理程序当一个用户访问一个JSP页面时,这个请求被发送到JSP服务器,JSP服务器会根据这个请求去调用相应的页面,如果这个页面中有自定义的标记, JSP服务就会根据页面指令去访问TLD得到处理程序的相关信息,接着调用该处理程序的构造器方法,启动标记符处理程序,并读取标记符的属性和相应值。对每个没有设置属性的,调用相应的set方法。当标记符第一次使用时,它的任何属性都不会做过设置,因此对每个属性都调用set方法。属性设置完以后,JSP服务器调用处理程序的doStartTag(),然后再调用doEndTag()方法。最后JSP服务器会继续处理剩下的页面,在页面结尾调用release ()方法,清理占用的所有资源。TLD文件

TLD(TLD:Tag Library Descriptor标记库描述符)文件,标准的XML格式的标记定义文件,被用来存放标记符的信息,下面就是一个典型的TLD文件。<?xml version="1.0" encoding="ISO-8859-1" ?>" http://java.***.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">1.0  1.1  tagclass     login    tagclass.login.login                   height            true            true         width     true     true    在这个TLD文件中定义了只有一个标记符的标记符库,这个名为login的标记符会调用一个Applet以验证用户的合法性。处理这个标记的类就是 tagclass.login.login。width、height是这个标记的两个属性。属性是在使用标记符时作为参数发送的值。我们可以在上面的示例中增加几个标记,也可以为每个标记添加几个属性。我们开发标记符库时不一定非要从头开始,自己编写一个全新TLD。我们可以使用某个集成的开发的环境,也可以修改上面的例子。TagLib指令

那么当JSP服务器在解析一个标记符时,它是如何定义一个标记库的呢?这就是TagLib指令的主要责任。Taglib 指令 定义一个标记库以及其自定义标记的前缀. JSP 语法 例子

login           描述指令声明此JSP文件使用了自定义的标记,同时引用标记库,也指定了他们的标记的前缀。 你必须在使用自定义标记之前使用指令。 属性uri="URIToTagLibrary" :Uniform Resource Identifier (URI)根据标记的前缀对自定义的标记进行唯一的命名,URI可以是一个相对或绝对的路径。

prefix="tagPrefix":在自定义标记之前的前缀。如上例中的标记符的处理程序(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(" ");} 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和set方法,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.tld

<?xml version="1.0" encoding="ISO-8859-1" ?>" http://java.***.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">1.01.1 tagclass    logintagclass.login.login             height     true     true         width     true     true    标记符处理程序: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(" ");} 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) { }}

06分享举报

在HTML5中true是什么意思,自定义标签中requiredtrue/requiredrtexprvaluetrue/rtexprvalue分别代表什么含义?...相关推荐

  1. R语言ggplot2可视化:通过在element_text函数中设置ifelse判断条件自定义标签文本的显示格式:例如、粗体、斜体等

    R语言ggplot2可视化:通过在element_text函数中设置ifelse判断条件自定义标签文本的显示格式:例如.粗体.斜体等 目录

  2. python xpath定位 嵌套标签_python爬虫中使用Xpath方法定位a标签中所有的子标签的方法...

    老板扔给了我一个陈年语料,让我通过文章标题回原网址爬取一下对应的doi号,文章很好定位,但是在解析标题的时候遇到了问题,a标签中混合了i.sub.sup标签,在使用xpath时不能直接使用text方法 ...

  3. 自定义JSP中的Taglib标签之四自定义标签中的Function函数

    转自http://www.cnblogs.com/edwardlauxh/archive/2010/05/19/1918589.html 之前例子已经写好了,由于时间关系一直没有发布,这次带来的是关于 ...

  4. jsp页面中的判断是否相等(c标签中的if)

    在用<c:if>时,记得导入c标签<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c ...

  5. html中属性的作用,html的标签中 unselectable=on 属性的作用

    在IE浏览器中,当input获得焦点时,点击有unselectable="on"属性的标签时,不会触发onblur事件. 加上该属性的元素不能被选中. < !DOCTYPE ...

  6. 后端返回数据中的换行符,在标签中不显示换行的解决方法

    后端返回的的数据 在Chrome浏览器上 页面显示: 如果使用 let text = "后端返回字符串" text.replace(/\n/g,"<br/>& ...

  7. react和vue中自定义标签的原理在这里

    文章目录 前言 一.自定义元素是什么 1 乱写的标签 二.使用步骤 1 自定义标签 2 添加web组件内容 3结合template模板标签使用 4 自定义元素的生命周期方法 三, 反射自定义属性 总结 ...

  8. jsp tag 自定义标签实现按钮的显示

    前些天在一个项目中做了一个最基本的权限管理(标准的权限结构,用户-角色-菜单),后来需要精确地控制到按钮就想到了使用自定义标签(jsp tag)来处理按钮的显示与隐藏. 下面是我参考网上的资料自己写的 ...

  9. chrome自定义背景_Android Chrome自定义标签

    chrome自定义背景 In this tutorial, we'll be discussing and implementing Chrome Custom Tabs in our Android ...

最新文章

  1. Word查找的通配符和特殊字符!
  2. 使用Docker-Compose,如何执行多个命令
  3. SylixOS普通定时器精度分析
  4. Django L6 编写你的第一个Django应用
  5. 李宏毅线性代数笔记9:对角化
  6. mysql client 未开启_Django+mysqlclient未关闭数据库连接
  7. matlab ode45三体问题,“毕达哥拉斯3Body Proxblem”ODE解算器测试的下一步
  8. mongodb java 单例_JAVA单例MongoDB工具类详解
  9. json同一个参数不同类型_js基础之变量类型
  10. 利润从‮而何‬来?​‎
  11. Java中的资源文件加载方式
  12. shell脚本-监控系统资源并通过短信报警
  13. 失焦事件触发_JavaScript event 事件详解
  14. html倾斜变形,深入理解CSS变形transform(2d)_html/css_WEB-ITnose
  15. 分享一款代码生成工具,可自定义模板生成不同的代码
  16. 微信好友数目限制突破5000人? 这点钉钉、BTchat链语早就做到了
  17. 过河问题(贪心算法)(python)
  18. 夺命雷公狗—玩转SEO---52---浅谈人工智能在SEO中的应用之机器学习,内链布局篇...
  19. Centos7分部骤编译单文件执行程序
  20. 微信在线答题小程序的应用场景有哪些

热门文章

  1. 如何在PDF里添加页码,添加页码的步骤
  2. android 使用阿里百川电商SDK的问题
  3. linux下编译dbus源码,ubuntu安装dbus
  4. linux 内存 cma,【原创】(十六)Linux内存管理之CMA
  5. docker笔记 - container name 冲突
  6. 从contiki中下载程序到TelosB节点
  7. 德州仪器推出支持以太网Powerlink协议的处理器平台
  8. 苹果屏蔽更新_iOS 13终于可以一键屏蔽系统更新了,完美
  9. 计算机视觉在无人驾驶中的应用_一文了解计算机视觉的八大应用
  10. VSCODE使用打开ipynb文件的问题