博客信息

mvc之自定义标签库

发布时间:『 2019-01-27 10:09』  博客类别:自定义mvc  阅读(984)

生命周期

1. 标签语言特点

   <开始标签 属性="属性值">标签体</结束标签>

 

   空标签

   <br/><hr/>

   <开始标签></结束标签>

   <开始标签/>

 

 

2. 自定义标签的开发及使用步骤

  2.1 创建一个标签助手类(继承BodyTagSupport)

      标签属性必须助手类的属性对应、且要提供对应get/set方法

      rtexprvalue

 

  2.2 创建标签库描述文件(tld),添加自定义标签的配置

      注:tld文件必须保存到WEB-INF目录或其子目录

  2.3 JSP通过taglib指令导入标签库,并通过指定后缀

      访问自定义标签

 

3. 标签生命周期

                                      SKIP_BODY

  3.1  实例化标签助手类->doStartTag()------------->doEndTag()

       //主要用开发简单标签

 

                                      EVAL_BODY_INCLUDE        SKIP_BODY

  3.2  实例化标签助手类->doStartTag()------------->doAfterBody---------------->doEndTag()...

                                                              EVAL_BODY_AGAIN

 

 

  3.3  .....

 

 

  SKIP_BODY:跳过主体

  EVAL_BODY_INCLUDE:计算标签主体内容并[输出]

  EVAL_BODY_BUFFERED:计算标签主体内容并[缓存]

  EVAL_PAGE:计算页面的后续部分

  SKIP_PAGE:跳过页面的后续部分

  EVAL_BODY_AGAIN:再计算主体一次


小李飞刀_MVC


62、自定义标签实战

UI标签

Out标签

思路:

在标签属性中的数据,通过JspWriter对象输出

核心代码


private String value;

public int doStartTag(){

JspWriter out = pageContext.getOut();

try {

out.println(value);

return EVAL_BODY_INCLUDE;

} catch (Exception e) {

throw new RuntimeException(e);

}

}
Select标签 

思路

传统的select标签加载数据除了后台代码,还需要大量的js代码动态添加option

自定义select标签加入数据源自动加载数据源,生成selectoption标签代码

核心代码

// select的id

private String id;

// select的name用来向后台传递参数所用

private String name;

// 数据源

private List<Object> dataList;

// option中的value

private String textKey;

// option中的text文本

private String textVal;

// 默认的option值

private String headerTextKey;

// 默认的option的文本

private String headerTextVal;

// 目前选中值

private String selectedTextKey;

 

//	通过类属性名获取属性值

String value = (String) PropertyUtils.getProperty(obj, textKey);

String text = (String) PropertyUtils.getProperty(obj, textVal);

select标签完整代码
/**
 * 1、值的传递	id、name
 * 2、数据源	items
 * 3、展示列与数据存储列与实体类的对应关系	textKey	textVal
 * 4、数据回显	selectedVal
 * 5、可能下拉框默认值(头标签)	headerTextKey	headerTextVal
 * @author Administrator
 *
 */
public class SelectTag extends BodyTagSupport {

	private static final long serialVersionUID = 5375902073989817712L;
	private String id;
	private String name;
	private List<Object> items = new ArrayList<Object>();
	private String textKey;// textKey=id
	private String textVal;
	private String selectedVal;
	private String headerTextKey;
	private String headerTextVal;
	
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			try {
				out.print(toHTML());
			} catch (NoSuchFieldException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	
	private String toHTML() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		StringBuffer sb = new StringBuffer();
		sb.append("<select id='"+id+"' name='"+name+"'>");
		
		if(!(headerTextKey == null || "".equals(headerTextKey) ||
				headerTextVal == null || "".equals(headerTextVal))) {
			sb.append("<option selected value='"+headerTextKey+"'>"+headerTextVal+"</option>");
		}
		
		String value;
		String html;
		for (Object obj : items) {
//			<option value=''></option>
			Field textKeyField = obj.getClass().getDeclaredField(textKey);
			textKeyField.setAccessible(true);
			value = (String) textKeyField.get(obj);
			html = (String) PropertyUtils.getProperty(obj, textVal);
			if(value.equals(selectedVal)) {
				sb.append("<option selected value='"+value+"'>"+html+"</option>");
			}else {
				sb.append("<option value='"+value+"'>"+html+"</option>");
			}
			
		}
		
		sb.append("</select>");
		return sb.toString();
	}

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List<Object> getItems() {
		return items;
	}
	public void setItems(List<Object> items) {
		this.items = items;
	}
	public String getTextKey() {
		return textKey;
	}
	public void setTextKey(String textKey) {
		this.textKey = textKey;
	}
	public String getTextVal() {
		return textVal;
	}
	public void setTextVal(String textVal) {
		this.textVal = textVal;
	}
	public String getSelectedVal() {
		return selectedVal;
	}
	public void setSelectedVal(String selectedVal) {
		this.selectedVal = selectedVal;
	}
	public String getHeaderTextKey() {
		return headerTextKey;
	}
	public void setHeaderTextKey(String headerTextKey) {
		this.headerTextKey = headerTextKey;
	}
	public String getHeaderTextVal() {
		return headerTextVal;
	}
	public void setHeaderTextVal(String headerTextVal) {
		this.headerTextVal = headerTextVal;
	}
	

}

控制标签
 

If标签

思路

得到标签属性值做判断,页面上的标签主体部分视情况输出

核心代码


private boolean test;

 

public int doStartTag() throws JspException {

return test ? EVAL_BODY_INCLUDE :  SKIP_BODY;

}
Foreach标签 

思路

得到标签属性,将集合遍历,遍历出的对象反复保存到page作用域中输出

核心代码


//	保存当前元素到page作用域的一个key

private String var;

//	数据源

private List<Object> items;

 

public int doStartTag() throws JspException {

if(null == items || items.size() == 0) {

return SKIP_BODY;

}else {

Iterator<Object> it = items.iterator();

pageContext.setAttribute(var, it.next());

pageContext.setAttribute("it", it);

return EVAL_BODY_INCLUDE;

}

}

 

public int doAfterBody() throws JspException {

Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");

if(it.hasNext()) {

pageContext.setAttribute(var, it.next());

return EVAL_BODY_AGAIN;

}else {

return SKIP_BODY;

}

}

 
数据标签 

Data标签

思路

将数据库中的查出的值放入pagecontext作用域中,作用域的键就是标签传递过来的属性值var

核心代码

private String var;

 

public int doStartTag() throws JspException {

pageContext.setAttribute(var, new DataItemDao().findAll());

return SKIP_BODY;

}

关键字:     自定义JSP标签库  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有