一、如何自定义标签:
自定义标签功能要求在后台必须有一个相关的JAVA类的支持,但并不是任意编写一个JAVA类就能处理JSP标签,这个类也必须实现指定的规范才能用于支持JSP标签,这些规范表现形式也是接口和类,他们在 javax.serviet.jsp.tagext包中声明,主要接口/类描述如下:
javax.servlet.jsp.tagext.Tag接口,所有处理JSP标签的类必须实现该接口。该接口中声明了6个方法,如果直接从该接口生成类则必须实现所有的6个方法,通常不会直接通过该接口生成标签的处理类。
javax.servlet.jsp.tagext.TagSupport 类 该类实现了 Tag 接口,用于创建不带标记体的自结束标签,这些标签中可以带属性。 javax.servlet.jsp.tagext.BodyTagSupport 类 该类继承了 TagSupport 类,用于创建带标记体的标签。
TagSupport 类中有一个重要的成员: pageContext ,该成员的功能与 JSP 的内置对象 pageContex 完全相同。通过该对象可以得到其他几个 JSP 对象的引用。这样,我们就可以在 JAVA 类中与JSP 进行交互了。如JspWriter out=pageContext.getOut(); 这一语句可以得到 JSP 内置对象out 的引用,通过 out 我们就可以向客户端浏览器中输出内容了。要使用其他几个 JSP 对象原理与此相同。
通常我们自定义的标签,编写处理程序时使用TagSupport 和BodyTagSupport 即可,不需要涉及到标签体的,继承TagSupport,需要用标签体的继承BodyTagSupport
二、开发例子:1. 开发标签,知道这个标签用于干什么的。设计好模板。并设计好该标签显示的值的来源。
class="java" name="code">package com.piedra.tag;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
public class HelloWorldTag extends TagSupport{
private static final long serialVersionUID = 1L;
@Override
public int doStartTag() throws JspException {
try {
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
String name = (String)request.getAttribute("name" );
pageContext.getOut().write( "<font style='color:red;'>Hello World !_" + name + "</font>");//标签占的坑 要显示这些值
} catch (IOException ex) {
throw new JspTagException( "错误");
}
return EVAL_PAGE;
}
}
2. 编写标签类的tld文件,指明要编写的标签类可以传入什么内容,等
如果要学习如何向标签类传入属性值,设置
<attribute></attribute>
比如:
< attribute>
< name> num2 </name >
< required> true </required >
< rtexprvalue> true </rtexprvalue >
</ attribute>
tld文件如下:
<?xml version= "1.0" encoding ="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" >
<taglib>
<tlib-version >1.0 </tlib-version>
<jsp-version >1.2 </jsp-version>
<short-name >myTag_HW </short-name>
<tag >
<name >helloworld</name>
<tag-class >com.piedra.tag.HelloWorldTag</ tag-class>
<body-content >empty </body-content>
</tag >
</taglib>
3. 在web.xml中配置标签的信息 taglib-uri 和 tld描述文件的地址 taglib-location
<jsp-config >
<taglib >
<taglib-uri >/ tlds/hw </taglib-uri>
<taglib-location >/WEB-INF/ tlds/helloworld.tld</taglib-location >
</taglib >
</jsp-config >
4. 之后就能够在jsp引入该标签和使用该标签
<%@ page language ="java" import="java.util.*" pageEncoding="UTF-8" %>
<%@ taglib prefix ="piedra" uri="/tlds/hw" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head >
</head >
<body >
This is my JSP page. <br >
<hr />
<piedra:helloworld />
<hr />
zzzzzzzzzzzzzzzzzzzzzzzzz
</body >
</html>
备注: 在上面的例子中还调用了Struts2实现的TagAction,在TagAction中我们在request域中设置了key为name的属性值。然后就直接返回并跳转到我们的jsp页面
package com.piedra.action.tag;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class TagAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public String execute(){
TagAction. setRequestAttribute("name","yourname");
return "success";
}
public static void setRequestAttribute(String key,Object obj){
ServletActionContext. getRequest().setAttribute(key, obj);
}
}
action对应的配置:
<action name ="tagAction" class= "com.piedra.action.tag.TagAction" >
<result name ="success">/tag_1.jsp</result >
</action >
备注:如果你没有使用struts,用servlet也是一样的,只需要在doGet或者doPost方法中写上request域的设置值的情况也可以。
效果图如下:
【引用:】http://blog.csdn.net/liangbinny/article/details/6309893
- 大小: 27.1 KB