由于之前学习JSP时只是了解可以自定义JSP标签,但从没自己定义和使用过,具体怎么定义和使用不太清楚。最近,在项目过程中遇到一些问题,比如页面中接收或传递的某个值需要进行其他处理,而这样的处理在JSP页面写代码又不太适合,在后台处理再返回前台又比较麻烦,于是想到了使用JSP的自定义标签来解决这样的问题,然后对JSP自定义标签进行了简单学习,在此做下记录,并附上自己做的简单示例,希望对有需要的朋友有所帮助。
下面简单说一下具体步骤:
1.不用多说都知道,创建Web工程,我的工程命名为Tag;
2.创建JavaBean实体类Userinfo.java,代码如下:
package com.util.bean; public class Userinfo { private String userName; private int age; private String email; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
3.创建Tag.java类继承TagSupport类,用于自定义标签,代码如下:
package com.util.taglib; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import com.util.bean.Userinfo; public class Tag extends TagSupport{ private Userinfo user; //一般情况下我们只需重写doStartTag(),doEndTag()即可 //在开始标签属性设置后调用,如果返回SKIP_BODY则忽略标签之中的内容,如果返回EVAL_BODY_INCLUDE则将标签体的内容进行输出 public int doStartTag() throws JspException{ try{ JspWriter out = this.pageContext.getOut(); if(user == null){ out.println("NO Userinfo Found..."); return SKIP_BODY; } out.println("<table width='500px' border='1' align='center'>"); out.println("<tr>"); out.println("<td width='20%'>Username:</td>"); out.println("<td>" + user.getUserName() + "</td>"); out.println("</tr>"); out.println("<tr>"); out.println("<td>Age:</td>"); out.println("<td>" + user.getAge() + "</td>"); out.println("</tr>"); out.println("<tr>"); out.println("<td>Email:</td>"); out.println("<td>" + user.getEmail() + "</td>"); out.println("</tr>"); out.println("</table>"); }catch(Exception e){ System.out.println("出错啦!"); throw new JspException(e.getMessage()); } return SKIP_BODY; } @Override //在结束标签之前调用,返回SKIP_PAGE跳过整个jsp页面后面的输出,返回EVAL_PAGE执行页面余下部分 public int doEndTag() throws JspException { return EVAL_PAGE; } @Override //生命周期结束时调用 public void release() { super.release(); this.user = null; } //getter and setter public Userinfo getUser(){ return user; } //setPageContext() 将所在jsp页面的pageContext注入进来,目的是为了在后面的方法中可以访问到jsp页面对象的pageContext属性 //setParent() 设置此标签的父标签 //setAttribute() 将标签中的属性注入到此class的属性,不需要自己实现但要提供属性的get与set方法 public void setUser(Userinfo user){ this.user = user; } }
4.创建Taguti.java类,用于自定义标签功能(函数),代码如下:
package com.util.taglib; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import com.util.bean.Userinfo; public class Tag extends TagSupport{ private Userinfo user; //一般情况下我们只需重写doStartTag(),doEndTag()即可 //在开始标签属性设置后调用,如果返回SKIP_BODY则忽略标签之中的内容,如果返回EVAL_BODY_INCLUDE则将标签体的内容进行输出 public int doStartTag() throws JspException{ try{ JspWriter out = this.pageContext.getOut(); if(user == null){ out.println("NO Userinfo Found..."); return SKIP_BODY; } out.println("<table width='500px' border='1' align='center'>"); out.println("<tr>"); out.println("<td width='20%'>Username:</td>"); out.println("<td>" + user.getUserName() + "</td>"); out.println("</tr>"); out.println("<tr>"); out.println("<td>Age:</td>"); out.println("<td>" + user.getAge() + "</td>"); out.println("</tr>"); out.println("<tr>"); out.println("<td>Email:</td>"); out.println("<td>" + user.getEmail() + "</td>"); out.println("</tr>"); out.println("</table>"); }catch(Exception e){ System.out.println("出错啦!"); throw new JspException(e.getMessage()); } return SKIP_BODY; } @Override //在结束标签之前调用,返回SKIP_PAGE跳过整个jsp页面后面的输出,返回EVAL_PAGE执行页面余下部分 public int doEndTag() throws JspException { return EVAL_PAGE; } @Override //生命周期结束时调用 public void release() { super.release(); this.user = null; } //getter and setter public Userinfo getUser(){ return user; } //setPageContext() 将所在jsp页面的pageContext注入进来,目的是为了在后面的方法中可以访问到jsp页面对象的pageContext属性 //setParent() 设置此标签的父标签 //setAttribute() 将标签中的属性注入到此class的属性,不需要自己实现但要提供属性的get与set方法 public void setUser(Userinfo user){ this.user = user; } }
5.在WEB-INF目录下创建标签文件tag.tld,文件内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!-- <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 version="2.0" 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 web-jsptaglibrary_2_0.xsd"> <!-- 自定义自定义标签的版本 --> <tlib-version>1.0</tlib-version> <!-- 标签库要求的JSP规范版本 --> <jsp-version>2.0</jsp-version> <!-- JSP页面编写工具可以用来创建助记名的可选名字 --> <short-name>cc</short-name> <!-- 唯一标识该标签库的的URI(自定义) --> <uri>http://www.tag.mytag.com/</uri> <tag> <!-- 唯一标签名 --> <name>dispuserinfo</name> <!-- 标签类的完全限定名 --> <tag-class>com.util.taglib.Tag</tag-class> <!-- 正文内容类型:如果不需要标签体则设置empty,反之设定jsp --> <body-content>empty</body-content> <!-- 由工具显示的可选名 --> <display-name>disname</display-name> <!-- 可以由工具使用的小图标 --> <!-- <small-icon>aa</small-icon> --> <!-- 可以由工具使用的大图标 --> <!-- <large-icon>bb</large-icon> --> <!-- 可选的标签特定的信息 --> <!-- <description>descinfo</description> --> <!-- 可选的脚本变量信息 --> <!-- <variable>param</variable> --> <!-- 标签属性信息(如果有的话) --> <attribute> <!-- 指定标签名 --> <name>user</name> <!-- 是否是必须,如果非必须没设置则为空 --> <required>false</required> <!-- 是否可在属性中使用表达式 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <!-- Listener元素(标签库可以指定一些事件监听器类,Web容器将初始化监听器类并以类似在WAR级定义的监听器的方式注册它们,必须包含监听类的完全限定名) --> <!-- <listener> <listener-class>com.servlet.taglibServlet</listener-class> </listener> <listener> <listener-class>com.servlet.otherServlet</listener-class> </listener> --> <!-- 自定义的函数库 --> <function> <!-- 自定义标签函数功能名(与方法名称可以不同) --> <name>currentTime</name> <!-- 自定义标签函数所在的类全路径 --> <function-class>com.util.taglib.Tagutil</function-class> <!-- 自定义标签所在类方法名 --> <function-signature>java.lang.String curTime()</function-signature> </function> <function> <name>welcomeInfo</name> <function-class>com.util.taglib.Tagutil</function-class> <function-signature>java.lang.String welcomeInfo(java.lang.String)</function-signature> </function> </taglib>
6.在web.xml配置文件中配置自定义标签,配置代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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-app_2_5.xsd"> <!-- 自定义标签 --> <jsp-config> <taglib> <!-- 标签库的uri路径,即jsp头文件中声明<%@ taglib uri="http://www.tag.mytag.com/" prefix="cc"%>的uri --> <taglib-uri>http://www.tag.mytag.com/</taglib-uri> <!-- tld文件所在的位置 --> <taglib-location>/WEB-INF/tag.tld</taglib-location> </taglib> </jsp-config> <login-config> <auth-method>BASIC</auth-method> </login-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
7.在JSP页面中引入相关类及自定义标签,并为bean对象赋值,如下:
<%@ page language="java" import="java.util.*,com.util.bean.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.tag.mytag.com/" prefix="cc" %> <% Userinfo user = new Userinfo(); user.setUserName("花无影"); user.setAge(20); user.setEmail("[email protected]"); pageContext.setAttribute("userinfo",user); %>
8.使用自定义标签进行页面输出,如下:
<body> <center><h1>JSTL自定义标签</h1></center> <hr> <center><font color="red"><h2><b>1.自定义标签</b></h2></font></center> <cc:dispuserinfo user="${pageScope.userinfo}"/><br> <hr> <center><font color="red"><h2><b>2.自定义函数库</b></h2></font></center> 当前访问系统时间:${cc:currentTime() }<br> ${cc:welcomeInfo("花无影") } <hr> </body>
9.页面显示结果如图:
到此结束!
(注:由于本人水平有限,写的不好还望各位朋友见谅,欢迎各位提出宝贵意见)