您的位置:首页 > Web前端 > JavaScript

看jstl标签做个类似 的 自定义jsp 页面标签

2012-06-07 18:50 411 查看
-----------------------------------------------------

package com.danan.test;

import java.io.IOException;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

public class ParentTag extends TagSupport {

private static final long serialVersionUID = 1L;

private Map<String,String> map = new HashMap<String,String>();

//标签属性id

private String id ;

public String getId(){

return id;

}

public void setId(String id){

this.id = id;

}

//该方法在子标签中调用,给父标签中的map赋值

public void addValue(String key,String value){

map.put(key,value);

}

/**

* doStartTag()方法返回一个整数值,用来决定程序的后续流程。

* A.Tag.SKIP_BODY:表示标签之间的内容被忽略

* B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行

*/

public int doStartTag() throws JspException {

JspWriter out = pageContext.getOut();

try {

Set<String> keySet = map.keySet();

Iterator<String> it = keySet.iterator();

while(it.hasNext()){

String key = it.next();

String value = map.get(key);

out.write(key +": <input type='text' name="+key+" value="+value+" /><br>");

}

} catch (IOException e) {

e.printStackTrace();

}

return EVAL_BODY_INCLUDE;

}

/**

* doEndTag:当JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。

   * A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。

   * B.Tag.EVAL_PAGE:表示按照正常的流程继续执行JSP网页

*/

public int doEndTag() throws JspException {

return EVAL_PAGE;

}

}

-----------------------------------------------------

package com.danan.test;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.TagSupport;

public class ChildTag extends TagSupport {

private static final long serialVersionUID = 1L;

//定义标签属性key,value

private String key;

private String value;

public String getKey(){

return key;

}

public void setKey(String key){

this.key = key;

}

public String getValue(){

return value;

}

public void setValue(String value){

this.value = value;

}

public int doStartTag() throws JspException {

ParentTag pTag = (ParentTag) this.getParent();

//调用父标签的addValue方法,给父标签中的map赋值

pTag.addValue(key,value);

return EVAL_BODY_INCLUDE;

}

public int doEndTag() throws JspException {

return EVAL_PAGE;

}

}

----------------2.编写nested.tld文件与web.xm在一个目录下-------------------------------------

<?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>2.0</jsp-version>

<short-name>nest</short-name>

<uri>/nests/nested.tld</uri>

<!-- 父标签 -->

<tag>

<name>parent</name>

<tag-class>com.danan.test.ParentTag</tag-class>

<!-- scriptless 主体可以有内容, 而jsp容器会去处理里面的jsp元素, 换句话就是可以是文本, EL表达式,

标准动作甚至另一个自定义标记. -->

<body-content>scriptless</body-content>

<attribute>

<name>id</name>

<required>true</required>

<!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->

<rtexprvalue>false</rtexprvalue>

</attribute>

</tag>

<!-- 子标签 -->

<tag>

<name>child</name>

<tag-class>com.danan.test.ChildTag</tag-class>

<body-content>empty</body-content>

<attribute>

<name>key</name>

<required>true</required>

<!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->

<rtexprvalue>true</rtexprvalue>

</attribute>

<attribute>

<name>value</name>

<required>true</required>

<!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>

----------------3.配置web.xml-------------------------------------

<jsp-config>

<taglib>

<taglib-uri>/nest-tag</taglib-uri>

<taglib-location>/WEB-INF/tlds/nested.tld</taglib-location>

</taglib>

</jsp-config>

-------------------4.编写测试网页----------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="nest" uri="/WEB-INF/tlds/nested.tld" %>

<%@ taglib prefix="n" uri="/nests/nested.tld" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<nest:parent id="1">

<nest:child key="key1" value="value1"/>

<nest:child key="key2" value="value2"/>

</nest:parent>

<n:parent id="2">

<n:child key="key3" value="value3"/>

<n:child key="key4" value="value4"/>

</n:parent> 

</body>

</html>

-----------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: