简单标签的开发

之前写了一篇自定义标签的开发,现在再说说JSP2.0之后支持的简单标签的开发。其中还是有很大的区别的。

还是一样,先看一个例子,再分析吧。

JSP页面:

<%@taglib prefix="my" uri="/mytag"%>
<html>
	<head>
		<title>simplehello</title>
	</head>
	<body>
		<my:simplehello name="chen">haha</my:simplehello>
	</body>
</html>

自定义了一个simplehello标签,标签体不为空。输出是:

hello chen

HAHA

也就是对属性和标签体进行了处理。

web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                version="3.0" 
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
                http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">	
   
  <init-param>
  	<param-name>enablePooling</param-name>
  	<param-value>false</param-value>
  </init-param>
	
  <jsp-config>
    <taglib>
    	<taglib-uri>/mytag</taglib-uri>      
      <taglib-location>/WEB-INF/mytags.tld</taglib-location>
    </taglib>  
  </jsp-config>	
	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

就是文件的映射了,没什么特别的。

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"
                version="3.0" 
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

  <tlib-version>1.0</tlib-version>
  <short-name>chen</short-name>
  <display-name>my tag</display-name>
  <description>this is from mr.chen</description>
  
  <tag>
    <name>simplehello</name>  
    <tag-class>simple.HelloSimpleTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>

</taglib>

ok,接下来就是最重要的标签类了:

package simple;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;

public class HelloSimpleTag implements SimpleTag{
	private JspTag parent;
	private JspFragment body;
	private JspContext context;
	
	private String name;
	public void setName(String s){
		this.name = s;
	}
	
	@Override
	public void setParent(JspTag jt){
		this.parent = jt;
	}
	
	@Override
	public JspTag getParent(){
		return parent;
	}
	
	@Override
	public void setJspBody(JspFragment jf){
		this.body = jf;
	}
	
	@Override
	public void setJspContext(JspContext pc){
		this.context = pc;
	}
	
	@Override
	public void doTag(){
		try {
			context.getOut().write("hello,"+name+"<br/>");
			StringWriter out = new StringWriter();
			body.invoke(out);
			String s = out.toString();
			context.getOut().write(s.toUpperCase());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JspException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

挺容易的。

接下来就是细细的分析了。

简单标签只有一个接口SimpleTag,不像传统标签有三个接口。SimpleTag定义了5个方法:

setJspContext(JspContext pc) JspContext是PageContext的父类

setParent(JspTag jt)如果没有父标签就不调用这个方法了,这是和传统标签不同的。

getParent()

setJspBody(JspFragment jf) 将标签体封装成JspFragment对象

doTage()完成所有的标签逻辑


其中,JspFragment类有两个方法:

getJspContext()

invoke(Writer out):这个方法是一个很奇妙的方法,在父标签类中调用该方法可以获得其子标签的输出。也就是说,在父标签类中通过获得参数out就可以得到子标签的输出了。


另外,SimpleTag同样有一个简单的实现,SimpleTagSupport类,只要继承该类可以省做很多的事。只要重写doTag()就可以了。

你可能感兴趣的:(简单标签)