|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C#是盗用了Java的源代码,仿照开发的,原因是Java是开源的啊,盗了也白盗,还有一点,开发C#语言的团队是就是开发Java语言的团队,是微软重金挖过去的啊js择要
在JSP中有一种机制,可让你在JSP页面中拔出与HTML相似的标志。本文先容JSP定制标志的基础观点和组成,和怎样开辟和使用JSP定制标志。
关头字
JSP,XML,TLD,标志符
甚么是标志
利用HTML言语我们能够如许往编纂我们的网页:
<HTML>
<HEAD>
<TITLE>
HELLOWORLD
</TITLE>
</HEAD>
<BODY>
HELLOWORLD
</BODY>
</HTML>
在这里我们把</HEAD>,<TITLE>,<BODY>称为标志。HTML标志(HTMLMarkup)是HTML文档的把持言语,用于指定扫瞄器显现和打印文档的体例.它是用小于号"<"和年夜于号">"括起来的短语和标记,如<Html>、</Body>等。很多HTMl标志以成对的体例呈现,如<TITLE></TITLE>、<Body></Body>等。在JSP中我们也能够定制本人的标志,以供JSP页面利用,以下例所示
<!―login.jsp-->
<%@tagliburi="/tlds/taglib.tld"prefix="tagclass"%>
<html>
<head>
<title>login</title>
</head>
<body>
<tagclass:loginwidth="200"height="100">
</tagclass:login>
</body>
</html>
在上例中</tagclass:login>就是一个JSP定制标志符。widtht、height是这个标志的属性。<%@tagliburi="/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:TagLibraryDescriptor标志库形貌符)文件,尺度的XML格局的标志界说文件,被用来寄存标志符的信息,上面就是一个典范的TLD文件。
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<!―XML的版本及其字符集-->
<!DOCTYPEtaglib
PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.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语法
<%@tagliburi="URIToTagLibrary"prefix="tagPrefix"%>
例子
<%@tagliburi="/tlds/taglib.tld"prefix="tagclass"%>
<html>
<head>
<title>login</title>
</head>
<body>
<tagclass:loginwidth="200"height="100">
</tagclass:login>
</body>
</html>
形貌
<%@taglib%>指令声明此JSP文件利用了自界说的标志,同时援用标志库,
也指定了他们的标志的前缀。你必需在利用自界说标志之前利用<%@taglib%>指令。
属性
uri="URIToTagLibrary":UniformResourceIdentifier(URI)依据标志的前缀对自界说的标志举行独一的定名,URI能够是一个绝对或相对的路径。
prefix="tagPrefix":在自界说标志之前的前缀。如上例中的</tagclass:login>
标志符的处置程序(Taghandle)
我们仍是以一个例子来看下怎样完成一个Taghandle。起首是看一下它的类图:
让我们再看一下它的代码:
packagetagclass.login;
importjavax.servlet.jsp.tagext.TagSupport;
importjavax.servlet.jsp.*;
importjava.io.*;
publicclassloginextendsTagSupport
{
publiclogin()
{
super();
}
publicintdoStartTag()throwsJspTagException
{
JspWriterout=pageContext.getOut();
try
{
out.println("<APPLETCODEBASE=applet/login/CODE=login.classwidth=200height=100></APPLET>");
}
catch(Exceptione)
{
}
returnSKIP_BODY;
}
publiccintdoEndTag()throwsJsptagException
{
returnEVAL_PAGE;
}
publicvoidrelease()
{
super.release();
}
publicvoidsetWidth(Stringlanguage)
{
this.width=width;
}
publicStringgetWidth()
{
returnthis.width;
}
publicvoidsetHeight(Stringheight)
{
this.height=height;
}
publicStringgetHeight()
{
returnthis.height;
}
privateStringwidth;
privateStringheight;
}
从以上我们能够看出,完成一个复杂的标志符处置程序有几个请求:①增添一个类,使之承继java.Servlet.jsp.tagext.TagSupport类。这个类供应了java.Servlet.jsp.tagext.Tag接口所请求的一切的办法。别的,还必要利用一些基础的API,使JSP容器可以挪用我们本人供应的标志符处置程序。②必需为每一个标志符属性分离创立一个get<attribute>和set<attribute>办法,JSP容器必要利用这些办法处置程序传送参数。③要为标志符处置程序创立一个机关器和自毁器。JSP必要利用机关器启动处置程序。自毁器是在realease()办法中界说的。在处置程序的性命周期停止时,必要挪用自毁器开释所占用的资本。④创立两个名为doStartTag()和doEndTag()的办法,实行详细的处置和输入举措。这两个办法是在处置自界说标志符的肇端地位和停止地位挪用的。它们的前往值是在TagInterface里界说的静态int,这几个静态值分离是:
SKIP_BODY隐含0:跳过了入手下手和停止标签之间的代码。
EVAL_BODY_INCLUDE隐含1:将body的内容输入到存在的输入流中
SKIP_PAGE隐含5:疏忽剩下的页面。
EVAL_PAGE隐含6:持续实行上面的页
固然标志符也有它本人的弱点。很不便利的封装历程,无限的功效。关于一些不太庞大和功效单一的逻辑形貌,必要传送的参数请求不高时,利用JSP标志,要便利的多。关于年夜多半的贸易逻辑使用,仍是利用bean要好的多,也宜于servlet把持。
附录:文章中所用示例的完全代码
JSP代码:login.jsp
<%@tagliburi="/tlds/taglib.tld"prefix="tagclass"%>
<html>
<head>
<title></title>
</head>
<body>
<tagclass:loginwidth="200"height="100">
</tagclass:login>
</body>
</html>
标志符形貌库:taglib.tld
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<!DOCTYPEtaglib
PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.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
packagetagclass.login;
importjavax.servlet.jsp.tagext.TagSupport;
importjavax.servlet.jsp.*;
importjava.io.*;
publicclassloginextendsTagSupport
{
publiclogin()
{
super();
}
publicintdoStartTag()throwsJspTagException
{
JspWriterout=pageContext.getOut();
try
{
out.println("<APPLETCODEBASE=applet/login/CODE=login.classwidth=200height=100></APPLET>");
}
catch(Exceptione)
{
}
returnSKIP_BODY;
}
publiccintdoEndTag()throwsJsptagException
{
returnEVAL_PAGE;
}
publicvoidrelease()
{
super.release();
}
publicvoidsetWidth(Stringlanguage)
{
this.width=width;
}
publicStringgetWidth()
{
returnthis.width;
}
publicvoidsetHeight(Stringheight)
{
this.height=height;
}
publicStringgetHeight()
{
returnthis.height;
}
privateStringwidth;
privateStringheight;
}
标志符处置程序中所利用的Applet:login.java
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
publicclassloginextendsAppletimplementsActionListener
{
privateStrings_username;
privateStrings_userpassword;
privateButtonb_ok;
privateButtonb_register;
privateLabell_username;
privateLabell_userpassword;
privateTextFieldt_username;
privateTextFieldt_userpassword;
privateGridLayoutg_gridlayout;
publicvoidinit()
{
b_ok=newButton("ok");
b_register=newButton("register");
l_username=newLabel("name");
l_userpassword=newLabel("password");
t_username=newTextField();
t_userpassword=newTextField();
b_ok.addActionListener(this);
b_register.addActionListener(this);
g_gridlayout=newGridLayout(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);
}
publicvoidactionPerformed(ActionEventev)
{
Strings_label=ev.getActionCommand();
if(s_label.equals("ok"))
{
t_username.setText("name");
}
if(s_label.equals("register"))
{
t_userpassword.setText("password");
}
}
publicvoidpaint(Graphicsg)
{
}
}
C#是盗用了Java的源代码,仿照开发的,原因是Java是开源的啊,盗了也白盗,还有一点,开发C#语言的团队是就是开发Java语言的团队,是微软重金挖过去的啊 |
|