分享
 
 
 

菜鸟学jsp(三)

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

虽然jsp中使用scriplet及JavaBean可以完成很多动态操作如:访问数据库,实现E-mail,BBS等等。诚然直接使用scriplet在jsp中插入java代码是方便快洁的,但是这也给日后的维护带来了一定的困难。做为一种替代方案jsp提供了一种叫做定制标(custom tag)的机制,使用这种机制你可以按你的需要扩展jsp,用自己定义的标记封装常用的功能,使jsp页面更加简洁,更易开发与维护。

一旦你定制好了你的标记,你就可以象使用SUN给你提供的标记一样使用它们开发了。其语法是一样的都是<prefix:tag></prefix:tag>

既然有这么多达的好处我们就来看看到底什么是custom tag吧。

按SUN的定义custom tag就是由用户定义的jsp标记(is a user-defined JSP language element)。

并且有如下一些特点:

1。由请求页面处取得参数。

2。可以访问一切jsp页可以访问的对象。

3。可以修改请求页面生成的response。

4。可以互相交互。你可以在使一个tag建立一个JavaBean,而在另一个tag中使用它。

5。可互相嵌套。(就是<Html><head></head></html>的意思)

下面我们就从一个简单的例子入手一步步的了解jsp tag.

要使用tag,你必须首先完成以下两件事:

1。声明一个标记库(tag library)。

2。实现声明的标记库。

要声明标记库先要建立一个tld(tag library descriptor)文件,这是一个XML文件,但是以tld为扩展名,比如database.tld。建立好的tld文件一般放在WEB-INF(在前两次的文章中提到过这个目录)目录下。

好了现在我们在WEB-INF下来建立一个tld文件,比如就是database.tld。然后将下面代码copy到tld文件的开头:

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

<!DOCTYPE taglib

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

"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

code 3

以上就是每个tld文件在最开始必不可少的东东了。至于web-jsptaglibrary_1_2.dtd这个文件你可以在tomcat4或更新的版本中在%CATALINA_HOME%\common\lib的servlet.jar中找到(有兴趣的话可以打开看看,如果没有不看也罢),具体位置是 servlet.jar\javax\servlet\jsp\resources,并且在这个文件夹下你还会找到一个老的版本:web-jsptaglibrary_1_1.dtd。但是SUN的文档建议尽可能的使用新的版本。(以后所有出现的tld文件如不声明都假定在开头以添加了上面的code 3)。

*****************************************************************************

(在这我要特别说明我在学习过程中还发现了

另一种开头:

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

<!DOCTYPE taglib

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

"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

如果用以上做开头编译后会告诉你找不到外部文件http file://java.sun.com/j2ee/dtd/

web-jsptaglibrary_1_2.dtd,我想可能是上述URI用于企业版里,而我没有安装j2ee所造 成的。如果我说的不对请大虾们指正,我的E-mail:flyhelleryuanwei@yahoo.com.cn。

******************************************************************************

有了以上的基础我们可以向刚刚建立的文档中添加内容了。

<taglib>

<tlib-version>1.0</tlib-version>

<jsp-version>1.2</jsp-version>

<uri>heller.database</uri>

<description>

A simple tab library for the database

</description>

... ...

</taglib>

code 4

在code4中taglib是tld文档的根(root)元素(只能有一个)。tlib-version指明标记库的版本,同样jsp-version指明了jsp的版本。uri给出了一个唯一的URI来定位标记库。description是对标记库的一个简短描述。(还有一些可选项感兴趣的人可以参考SUN的文档http://java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html)。

在code4中有省略号的地方可以插入一个或多个tag元素。比如我们加入如下:

... ...

<tag>

<name>simtag</name>

<tag-class> temp.simtag </tag-class>

<body-content> JSP </body-content>

</tag>

... ...

code 5

以上在tag元素中的name为你定义的tag指定了一个唯一的名字,tag-class是用来指出处理此标记的class名。body-content指出在<prefix:tag></prefix:tag>之间允许出现的内容类型。一般来说用JSP就可以了。因为这个选项并不影响处理tag的class对tag内容的处理,所以其实只是在使用某些开发工具是描述才会有用。

以下就是完成后的tld文档:

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

<!DOCTYPE taglib

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

"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

<tlib-version>1.0</tlib-version>

<jsp-version>1.2</jsp-version>

<uri>heller.database</uri>

<description>

A simple tab library for the database

</description>

<tag>

<name>simtag</name>

<tag-class> temp.simtag </tag-class>

<body-content> JSP </body-content>

</tag>

</taglib>

下面我们来实现在以上定义的temp.simtag类。

package temp;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

public class simtag extends TagSupport {

private static int guestNum = 0;

public int doStartTag() throws JspException {

try {

guestNum++;

pageContext.getOut().println("Hello!");

pageContext.getOut().println("You are the " + guestNum + "st guset!");

} catch (Exception ex) {

throw new JspTagException("SimpleTag: " +

ex.getMessage());

}

return SKIP_BODY;

}

public int doEndTag() {

return EVAL_PAGE;

}

}

code 5

也许你以下子看不太懂,没关系,我们先来看看结果。编译上代码,而后在第一偏文章中提到的WEB-INF文件夹中建立一个名为classes的文件夹,而后将编译生成的temp文件夹copy到classes文件夹下,在将以下代码添加到在第一篇文章中建立的web.xml改写成如下:

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

<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<taglib>

<taglib-uri>/database.tld</taglib-uri>

<taglib-location>

/WEB-INF/database.tld

</taglib-location>

</taglib>

</web-app>

code 6

这是为了使服务器知道如何由taglib-uri定义的逻辑名找到你的database.tld(记得吗?你将它放在了WEB-INF下)。以后你就可以用“/database.tld”这个逻辑名引用database.tld了。

好了马上就大工告成了,将你原来写的hello.jsp改写成如下:

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

<%@ page contentType="text/html; charset=GBK" %>

<%@ page import="java.io.*" %>

<html>

<head>

<title>

hello

</title>

</head>

<body bgcolor="#00ffff">

<h1>

<database:simtag>

</database:simtag>

</h1>

</body>

</html>

code 7

OK!现在你的home目录应是以下的状态:

home

jsp

hello.jsp

WEB-INF

classes

temp

simtag.class

web.xml

database.tld

好了,run你的tomcat(方法见第一篇文章),在127.0.0.1:8080/home/jsp/hello.jsp你就可以看到成果了。

你会发现其结果与第二篇文章中最后完成的jsp是一样的,只是页面清爽了一些。在下一偏文章中我们将进一步学习custom tag,到时code5中代码的意思也就显而易见了。

bill-转自:csdn (出处:http://www.knowsky.com)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有