您当前的位置: 首页 > 

Charge8

暂无认证

  • 1浏览

    0关注

    447博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JSP自定义简单标签

Charge8 发布时间:2018-12-26 15:55:14 ,浏览量:1

1、JSP自定义标签:

       当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签。

2、JDK为我们提供了自定义标签的接口:图来自网络

       

实现Tag接口的我们叫做传统式标签库开发,这种开发模式略显发复杂,

因此,为了简化标签开发的复杂度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。

一般来说,实现了SimpeTag接口的标签称之为简单标签,我们只要继承SimpleTagSupport类即可。

SimpleTagSupport类的执行顺序:

1)WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象

2)WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。【注意,只有在标签存在父标签的情况下,WEB容器才会调用这个方法】

3)如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象。如果标签的属性值是EL表达式或脚本表达式,则WEB容器首先计算表达式的值,然后把值传递给标签处理器对象。

4)如果简单标签有标签体,容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来

5)执行标签时:容器调用标签处理器的doTag()方法,开发人员在方法体内通过操作JspFragment对象,就可以实现是否执行、迭代、修改标签体的目的

 

3、自定义简单标签的开发步骤:

1)编写标签功能的java类(标签处理器)

2)编写标签库描述文件(.tld)

3)jsp页面中导入和使用自定义的标签库

 

一、自定义带属性的标签

1、java标签处理器类, 继承SimpleTagSupport类即可

package cn.jq.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class MaxTag extends SimpleTagSupport{
	private Integer num1;
	private int num2;
	
	@Override
	public void doTag() throws JspException, IOException {
		//getJspContext() 返回使用自定义标签的jsp页面的page域对象
		getJspContext().getOut().println(num1>num2 ? num1 : num2);
	}

	public Integer getNum1() {
		return num1;
	}

	public void setNum1(Integer num1) {
		this.num1 = num1;
	}

	public int getNum2() {
		return num2;
	}

	public void setNum2(int num2) {
		this.num2 = num2;
	}
}

2、编写标签库描述文件 jq-tags.tld

        创建jq-tags.tld文件。Tomcat服务器的webapps/examples/WEB-INF/jsp2中复制一个过来,删除标签内容,保留模板样式,自定义自己的标签内容,修改名字存放到项目中WEB-INF的任意子路径下。

        



    
    A tag library exercising SimpleTag handlers.
    
    1.0
    
    jq
    
    /jq-tags
    
    
    
        
        Max  
        
        max
        
        cn.jq.tag.MaxTag
        
        empty
        
        
            num1
            true
            true
        
        
            num2
            true
            true
        
    
  

3、jsp页面中导入和使用自定义的标签库

    
  
	
	最大值:

      

二、自定义带标签体的标签

      作为对比, 写了一个不带标签体和带标签体的简单标签。

1、java标签处理器类

        getJspBody()表示获取整个标签体的所有内容,返回的是一个fragment对象,这个对象的一个方法invoke就是用于输出整个内容到jsp页面,如果参数为null表示直接输出。

Datalist1Tag

public class Datalist1Tag extends SimpleTagSupport{
	private String sql ;
	
	@Override
	public void doTag() throws JspException, IOException {
		System.out.println(sql);
		
		//getJspContext() 返回使用自定义标签的jsp页面的page域对象
		PageContext pageContext = (PageContext) getJspContext();
		HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
		Map maps = (Map) request.getAttribute("map");
		for(String key : maps.keySet()) {
			pageContext.getOut().println("");
			pageContext.getOut().println("");
			pageContext.getOut().println("");
			pageContext.getOut().println(key);
			pageContext.getOut().println("");
			pageContext.getOut().println("");
			pageContext.getOut().println(maps.get(key));
			pageContext.getOut().println("");
			pageContext.getOut().println("");
			pageContext.getOut().println("");
		}
	}

	public String getSql() {
		return sql;
	}
	public void setSql(String sql) {
		this.sql = sql;
	}
}

Datalist2Tag

public class Datalist2Tag extends SimpleTagSupport{
	private String sql ;
	
	@Override
	public void doTag() throws JspException, IOException {
		System.out.println(sql);
		
		//getJspContext() 返回使用自定义标签的jsp页面的page域对象
		PageContext pageContext = (PageContext) getJspContext();
		HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
		//request 获取作用域中的数据
		Map maps = (Map) request.getAttribute("map");
		for(String key : maps.keySet()) {
			getJspContext().setAttribute("name", key);
			getJspContext().setAttribute("sex", maps.get(key));
			getJspBody().invoke(null); //直接写入
		}
	}

	public String getSql() {
		return sql;
	}
	public void setSql(String sql) {
		this.sql = sql;
	}
}

2、编写标签库描述文件 jq-tags.tld

    
        datalist1 Repeats 
        datalist1
        cn.jq.tag.Datalist1Tag
        empty
        
            sql
            true
            true
        
    
    
    
        datalist2 aa  
        datalist2
        cn.jq.tag.Datalist2Tag
        
        scriptless
        
            sql
            true
            true
        
    

3、jsp页面中导入和使用自定义的标签库


	自定义标签
	
	
	最大值:
	
	datalist1:
		  
	
	datalist2:
	
		  
			
				${name }
				${sex }
			
		
	

4、servlet类, 并在web.xml 中注入映射

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		Map map = new HashMap();
		map.put("张三", "女");
		map.put("李斯", "男");
		map.put("王武", "男");
		
		req.setAttribute("map", map);
		req.getRequestDispatcher("/mytag.jsp").forward(req, resp);
	}

访问:http://127.0.0.1/myservlet/tag

        

 总结:自定义标签形式很多,比如动态属性标签,有父标签的标签等,明白自定义标签的流程即可,需要时查文档。

参考文章:https://blog.csdn.net/java_3y/article/details/79276402

 

关注
打赏
1664721914
查看更多评论
立即登录/注册

微信扫码登录

0.0387s