今天学习了一下jsp的tag的自制方面的内容,现分享给大家,希望对大家有帮助
jsp提供自制标记(custon tag)的功能,使用自定义标签可以降低jsp的编写难度,让不懂技术的人更好的使用。关于tab,我也是刚刚开始学习,可能部分理解不见得是正确的,请各位老大批评指正。
jsp中为了实现自定义tag,包括3部分
1。web程序中有一个标记库描述文件(tld)定义。(一般把此类文件放在应用的/WEB-INF目录下)
2。对应的java类文件
3。在jsp中使用对应的标记
一、定义对应的tld文件
编辑文件hello.tld文件,内容如下,并将该文件放在对应应用的/WEB-INF目录下
<!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>hello</shortname>
<tag>
<name>hello</name>
<tagclass>mytab.hello</tagclass>
<bodycontent>empty</bodycontent>
</tag>
</taglib>
注意:在myeclipse5.1版本下没有直接编辑tld文件的专用编辑脚本,可以在myeclise下使用File->new->file的方式新增对应的文件。
在本例中的hello.tld中的
<!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>hello</shortname>
对于任何自定义tag都一样。
但对于tag段对于每个标签都不同,name是指在jsp中使用的name,本例中的名称为hello,tagclass是指对应的class文件,在本例中是mytab.hello,bodycontent是比较高级的属性,在本例中不使用,可以用empty值
二、编辑对应的java类
在myeclipse环境下,可以在file->new->class下定义,在定义页,如下属性需要填写:
package:mytab;name:hello;在interface的add中写入tag,并选择对应的“tag-javax.servlet.jsp.tagext”,其它的选择缺省。
注:对应的mytab,hello,是与对应的hello的对应mytab.hello是对应的,如果你想增加其它的类。
然后单击finish。
产生的内容如下
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class hello implements Tag {
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return 0;
}
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
return 0;
}
public Tag getParent() {
// TODO Auto-generated method stub
return null;
}
public void release() {
// TODO Auto-generated method stub
}
public void setPageContext(PageContext arg0) {
// TODO Auto-generated method stub
}
public void setParent(Tag arg0) {
// TODO Auto-generated method stub
}
}
本例的目的比较简单就是一个打印一个hello,world。
处理方式如下,首先定义一个私有的PageContext变量,在hello这个类中的setPageContext中将页面的PageContext变量赋值到类中,并在doStartTag中实现打印一个“hello,world”(注:在doStartTag中需要抛出IOException异常,否则报错,并需要import个 java.io.IOException),
修改后的hello.java如下
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
import java.io.IOException;//需要自己添加,在doStartTag需要抛出对应的异常,必须定义
public class hello implements Tag {
private PageContext pageContext;//定义一个私有的PageContext
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return 0;
}
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
//需要新增的内容
//begin
try{
pageContext.getOut().print("hello,world");
}
catch(IOException e)
{
throw new JspException("TimeTag Error:" + e.getMessage());
}
//end
return 0;
}
public Tag getParent() {
// TODO Auto-generated method stub
return null;
}
public void release() {
// TODO Auto-generated method stub
}
public void setPageContext(PageContext arg0) {
// TODO Auto-generated method stub
this.pageContext=arg0;//新增内容,将对应的页面的Pagecontext传进来
}
public void setParent(Tag arg0) {
// TODO Auto-generated method stub
}
}
三、在新增的jsp中使用tag
通过file->new->folder来定义一个目录test,然后定义个jsp,名称叫helloTag.jsp。
将文件中的pageEncoding修改为gbk,并删除无用信息,将head修改为helloTag,修改后的jsp如下
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
HelloTag
</head>
<body>
This is my JSP page. <br>
</body>
</html>
展示一下,看是否有问题(有问题,可不是tag的问题哦)
并在头部定义一个
在body中内容修改为 “在tag中定义的内容为<mytab:hello/>”
修改后的Hellotag.jsp如下
<%@ taglib uri ="/WEB-INF/hello.tld" prefix="mytab" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
HelloTag
</head>
<body>
在tag中定义的内容为<mytab:hello/> <br>
</body>
</html>
看看,是不是出来了,呵呵,搞定耶。
当然,这是初步,建议大家在此基础上修改一下打印的东西像什么当前时间之类的,应该还是挺简单的,这里就不说了。