JSP自定义标签入门学习
本文为大家分享了jsp自定义标签入门学习教程,希望大家喜欢。
1.jsp自定义标签:
自定义标签是用户定义的jsp语言元素。当jsp页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时web container调用那些操作。jsp标签扩展可以让你创建新的标签并且可以直接插入到一个jsp页面。 jsp 2.0规范中引入simple tag handlers来编写这些自定义标记。你可以继承simpletagsupport类并重写的dotag()方法来开发一个最简单的自定义标签。
2.开发自定义标签
下面的步骤建立一个自定义标签用于战术客户端的ip地址:
编写一个普通的java类,继承simpletagsupport类,
public class showip extends simpletagsupport { /** * 以下屏蔽的代码在simpletagsupport代码中已经做了!这里不需要重复再做! */ /*private jspcontext context; *//** * 传入pagecontext *//* @override public void setjspcontext(jspcontext pc) { this.context = pc; }*/ @override public void dotag() throws jspexception, ioexception { pagecontext pagecontext=(pagecontext)this.getjspcontext(); servletrequest request = pagecontext.getrequest(); string ip=request.getremotehost(); jspwriter out = pagecontext.getout(); out.write("使用自定义标签展示客户ip地址"+ip); list<string> a=null; } }
在web项目的web-inf目录下建立mytaglib.tld文件,这个tld叫标签库的声明文件。(参考核心标签库的tld文件)
<?xml version="1.0" encoding="utf-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <description>a tag library exercising simpletag handlers.</description> <!-- 标签库的版本 --> <tlib-version>1.0</tlib-version> <!-- 标签库前缀 --> <short-name>rlovep</short-name> <!-- tld文件的唯一标记 --> <uri>http://rlovep.com</uri> <!-- 定义标签,标签要放在方法前面 --> <tag> <!-- 标签名 --> <name>showip</name> <!-- 标签处理类 --> <tag-class>com.rlovep.tags.showip</tag-class> <body-content>empty</body-content> </tag> <tag> </taglib>
在jsp页面的头部导入自定义标签库:url为你在tld中写的url,前缀也是你在tld文件中定义的
<%@ taglib uri="http://rlovep.com" prefix="rlovep" %>
在jsp中使用自定义标签
<%-- 测试简单的自定义标签,标签体(我是你)不显示 --%> <rlovep:showip>我是你 </rlovep:showip>
3.自定义标签的执行过程
当访问:http://localhost:8080/stujsp/hellotags.jsp 时;要重启tomcat使服务器启动时,加载每个web应用的web-inf目录下的所有文件!!!例如。web.xml, tld文件!!!
步骤如下:
- 检查jsp文件的taglib指令,是否存在一个url为http://rlovep.com的tld文件。如果没有,则报错。
- 执行jsp文件的转化:把jsp文件翻译成java源文件->编译class->构造类对象->调用_jspservice()方法
- 读到到mytaglib.tld文件中查询是否存在为showip的标签
- 找到对应的标签,则读到内容,得到com.rlovep.tags.showip
- 构造showip对象,然后调用showip里面的方法:dotag方法;
4.访问标签体
你可以像标准标签库一样在标签中包含消息内容。如我们要在我们自定义的中包含内容
格式如下:
<rlovep:showip>我是你 </rlovep:showip>
但要文字显示需要修改处理类和tld文件:
修改处理类在dotag方法中增加如下内容:
jspcontext jspcontext2 = this.getjspcontext(); //显示标签体的两种方法 //方法1直接调用 //jspbody.invoke(null); //方法2通过输出到out //jspbody.invoke(jspcontext2.getout());
修改tld文件:
<tag> <!-- 标签名 --> <name>showip</name> <!-- 标签处理类 --> <tag-class>com.rlovep.tags.showip</tag-class> <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 --> <body-content>scriptless</body-content> </tag>
现在你可以将标签体的内容显示了;
<%-- 标签提会显示 --%> <rlovep:showip>我是你 </rlovep:showip>
输出标签体的内容格式:
jsp: 在传统标签中使用的。可以写和执行jsp的java代码。
scriptless: 标签体不可以写jsp的java代码
empty: 必须是空标签。
tagdependent : 标签体内容可以写jsp的java代码,但不会执
5.给标签体带属性:
你可以在自定义标准中设置各种属性,要接收属性,值自定义标签类必须实现setter方法;
格式如下:
<!-- 测试带属性的标签,标签体显示通过类处理 --> <rlovep:attributetags name="peace" value="12345
定义属性步骤如下:
编写处理类:attributetags extends simpletagsupport
添加俩个属性: //声明属性的成员变量 private integer value; private string name; 并为两个成员属性写setter方法; public void setvalue(integer value) public void setname(string name)
在标签库文件tld注明此标签和属性:
<!-- 标签名 --> <name>attributetags</name> <!-- 标签处理类 --> <tag-class>com.rlovep.tags.attributetags</tag-class> <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 --> <body-content>scriptless</body-content> <!-- 配置属性name --> <attribute> <name>name</name> <!-- 是否必填 --> <required>true</required> <!-- 是否支持el表达式 --> <rtexprvalue>true</rtexprvalue> </attribute> <!-- 配置属性value --> <attribute> <name>value</name> <!-- 是否必填 --> <required>true</required> <!-- 是否支持el表达式 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
现在就可以用带属性的标签了
在tld配置属性时你可以配置下面的属性:
6.带有子标签的自定义标签:
就像核心标签库的choose标签一样我们也可以定义嵌套的自定义标签,这部分我们主要讲解自己创建一个类似核心标签库的choose标签。步骤如下:
建立处理类,处理类还是与前面一样的方法。需要介绍的是用到了一个getparent()方法,从名字上就可以知道是为了获得父标签,对就是获得父标签类;
建立三个处理类文件: choosetag,otherwisetag,whentag
//choosetag类: public class choosetag extends simpletagsupport{ //此去时变量不是标签属性,由when标签更改;othewise获得; private boolean flag; public boolean isflag() { return flag; } public void setflag(boolean flag) { this.flag = flag; } @override public void dotag() throws jspexception, ioexception { // choose标签作用显示标签体,以及作为其他两个标签的父标签; getjspbody().invoke(null); } } //whentag类 public class whentag extends simpletagsupport{ //增加test属性 private boolean test; public boolean istest() { return test; } public void settest(boolean test) { this.test = test; } @override public void dotag() throws jspexception, ioexception { //如果标签属性为true,显示标签体 if(test){ getjspbody().invoke(null); } //设置父标签给otherwise用 choosetag parent=null; if(getparent() instanceof choosetag){ parent=(choosetag)getparent(); parent.setflag(test); } } } //otherwisetag类: public class otherwisetag extends simpletagsupport { @override public void dotag() throws jspexception, ioexception { boolean test=true; //获取父标签的test,由他的上一个when设置 if(getparent() instanceof choosetag) { //获取父标签的test,由他的上一个when设置 choosetag parent=(choosetag)getparent(); test=parent.isflag(); } if(!test){ getjspbody().invoke(null); } } }
编写tld文件:与其他的标签定义一模一样
<!-- 定义标签,choose--> <tag> <!-- 标签名 --> <name>choose</name> <!-- 标签处理类 --> <tag-class>com.rlovep.tags.choosetag</tag-class> <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 --> <body-content>scriptless</body-content> </tag> <!-- 定义标签,when--> <tag> <!-- 标签名 when --> <name>when</name> <!-- 标签处理类 --> <tag-class>com.rlovep.tags.whentag</tag-class> <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 --> <body-content>scriptless</body-content> <!-- 配置属性name --> <attribute> <name>test</name> <!-- 是否必填 --> <required>true</required> <!-- 是否支持el表达式 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <!-- 定义标签,otherwise--> <tag> <!-- 标签名 --> <name>otherwise</name> <!-- 标签处理类 --> <tag-class>com.rlovep.tags.otherwisetag</tag-class> <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 --> <body-content>scriptless</body-content> </tag>
使用带子标签的标签:与使用其他标签稍微有些不同,需要嵌套
<!-- 测试choose --> <rlovep:choose> <rlovep:when test="${10<5 }"> 条件成立执行when </rlovep:when> <rlovep:otherwise> 条件不成立执行otherwise </rlovep:otherwise> </rlovep:choose>
自定义标签就介绍到这里;
404页面,505页面,错误页面配置方法:
可以在web.xml中给你的网站配置全局的404页面,505页面,错误页面;配置方法如下:记得建立相应的跳转文件。
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="webapp_id" version="3.0"> <!-- 配置空指针异常 --> <error-page> <exception-type>java.lang.nullpointerexception</exception-type> <location>/error.jsp</location> </error-page> <!-- 配置505错误页面 --> <error-page> <error-code>500</error-code> <location>/common/500.jsp</location> </error-page> <!-- 配置404错误页面 --> <error-page> <error-code>404</error-code> <location>/common/404.html</location> </error-page> </web-app>
jsp入门就介绍到这里,希望对大家的学习有所帮助。
上一篇: servlet+JSP+mysql实现文件上传的方法
下一篇: jsp中变量及方法的声明与使用