自定义标签主要用于移除Jsp页面中的java代码。
要使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤:
1.编写一个实现Tag接口的java类,把页面java代码移到这个java类中(标签处理器类)。
2.编写标签库描述(tld)文件,在tld文件中把标签处理器类描述成一个标签。
我们接下来写一个小例子来对自定义标签的开发做一个入门了解
快速入门:使用标签输出客户机IP
我们在MyEclipse中创建一个名为JspTest的Web project,然后改写它的index.jsp,来实现输出客户机IP。
如果我们不使用标签的话,我们免不了使用脚本代码来实现我们的功能:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> 您的ip为: <% String ip = request.getRemoteAddr(); out.print(ip); %> </body> </html>
将JspTest工程部署到tomcat运行之后效果:
但是这里直接写了java代码,不符合我们的mvc规范,所以我们要移除java代码,用简单的标签来替代它。
我们上面说了开发自定义标签库的步骤,我们按照那个步骤来开发一个显示用户ip的标签。
jsp技术中有一个tag接口,下面有如下的方法:
doEndTag()执行开始标签执行的方法(如<c:foreach>)
doStartTag()执行结束标签执行的方法(如</c:foreach>)
getParent()得到标签的父标签(包裹本标签的上一级标签)
release()释放资源的方法,标签结束时执行,会释放标签运行的时候所占用的资源。
setPageContext(PageContext pc)把页面的PageContext传递过来(最重要的方法,它会把页面的所有数据传递过来,包括Servlet的八大隐式对象,这样我们就可以做我们想处理的任何事)
以上就是整个tag接口的说明文档。
我们开发标签的主要逻辑就要写在doStartTag()和doEndTag()方法。
但是如果我们实现了tag接口,就不单单要实现doStartTag()和doEndTag()方法,其它的方法也要去实现,那么这个时候我们不想改变原有方法的内容,这个时候sun公司给我们提供了tag默认的实现类供我们使用,有以下方法:
BodtTagSupport/TagAdapter/TagSupport
我们下面常用的就是TagSupport
我们接下来做开发, 来移除我们刚刚写的获取用户ip的代码。
我们创建一个类,去集成实现了Tag接口的TagSupport类:
package org.zyg.web.tag; import javax.servlet.jsp.tagext.TagSupport; public class ViewIPTag extends TagSupport { }
然后我们实现其中的doStartTag()方法,然后将显示用户ip的逻辑写进去:
package org.zyg.web.tag; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class ViewIPTag extends TagSupport { @Override public int doStartTag() throws JspException { //Tag接口的setPageContext方法已经将PageContext从页面拿过来 //我们在这里获取PageContext HttpServletRequest request=(HttpServletRequest)this.pageContext.getRequest(); //获取JspWriter对象 JspWriter out=this.pageContext.getOut(); String ip = request.getRemoteAddr(); try { out.print(ip); } catch (IOException e) { throw new RuntimeException(e); } return super.doStartTag(); } }
现在我们就已经成功的页面的java代码成功的移到一个标签处理类中了,jsp类中就不需要出现这段java代码了。
接下来就是我们要为这个标签处理类定义一个标签名了。
我们要创建一个tld文件,我们在WEB-INF/lib下新建一个zyg.tld文件。
内容我们不知道怎么写?可以查看tomcat给我们的规范,在tomcat的apache-tomcat-6.0.24\webapps\examples\WEB-INF\jsp2文件夹下,有一个jsp2-example-taglib.tld文件,我们将它的头和尾抄过来:
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> </taglib>
接下来我们将我们的标签处理类包装成一个标签:
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>zyg</short-name> <uri>http://blog.csdn.net/acmman</uri> <tag> <name>viewIP</name><!-- 标签名 --> <tag-class>org.zyg.web.tag.ViewIPTag</tag-class> <body-content>empty</body-content><!-- 有无标签体(单标签还是成对标签) --> </tag> </taglib>
接下来我们在页面使用这个标签,在使用标签前,首先在jsp页面中导入标签:
<%@taglib uri="http://blog.csdn.net/acmman" prefix="zyg" %>
然后我们写一个“<zyg”,按一下Alt+/就可以看到自动提示,这个时候我们的标签成功引入了:
代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib uri="http://blog.csdn.net/acmman" prefix="zyg" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> 您的ip为: <zyg:viewIP/> </body> </html>
我们重新发布一下web工程,在浏览器中访问:
我们虽然看到和以前一样的效果,但是内部的技术全都换了。至此我们阐述了一个简单的自定义标签的开发过程。
转载请注明出处:http://blog.csdn.net/acmman/article/details/51065439