自定义标签总汇
自定义标签
生命周期
标签语言特点:
<开始标签 属性="属性值">
标签体 空标签
<开始标签>
<开始标签 />
开始标签>
开始标签>
标签具体分为以下几类:
- ui标签(没有标签体,也能展示内容的标签)
- 控制标签(可控制标签内容展示的标签)
- 数据标签(数据标签就是用来存储数据的)
标签开发及使用步骤
自定义标签的开发及使用步骤:
- 1、创建一个标签助手类(继承BodyTagSupport) 标签属性必须助手类的属性对应、且要提供对应get/set方法
- 2、创建标签库描述文件(tld),添加自定义标签的配置
注意:tld文件必须保存到WEB-INF目录或其子目录
- 3、在JSP通过taglib指令导入标签库,并通过指定后缀,访问自定义标签
调用doStartTag、doAfterBody、doEndTag三种方法的情况:
- 1、默认情况,如果jsp里面有标签体,三个方法都执行 顺序:doStartTag、doAfterBody、doEndTag
- 2、如果没有标签体,doAfterBody方法不会执行 顺序:doStartTag、doEndTag
- 3、人为改变默认设置 return的值:
① 若jsp上有标签体,将doStartTag的返回值改为SKIP_BODY,则doAfterBody不执行,jsp页面主体内容显示
② 若改变doAfterBody返回值为EVAL_BODY_AGAIN,则doAfterBody会反复执行
标签的生命周期:
- 1、实例化标签助手类->doStartTag()——(SKIP_BODY)——->doEndTag() —主要用开发简单标签
- 2、实例化标签助手类->doStartTag()——(EVAL_BODY_INCLUDE)——->doAfterBody–
——(SKIP_BODY/EVAL_BODY_AGAIN)——–>doEndTag()…

补充:
SKIP_BODY: 跳过主体 EVAL_BODY_INCLUDE: 计算标签主体内容并[输出] EVAL_BODY_BUFFERED: 计算标签主体内容并[缓存] EVAL_PAGE: 计算页面的后续部分 SKIP_PAGE: 跳过页面的后续部分 EVAL_BODY_AGAIN: 再计算主体一次
自定义标签开发实例
一、UI标签
1、定义 out 标签
思路:
在标签属性中的数据,通过JspWriter对象输出
核心代码如下:
out标签助手类:
private Object value; public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();//输出流 try {
out.print(value.toString()); } catch (IOException e) {
e.printStackTrace(); } return SKIP_BODY;//跳过主体 } }
2、定义 select 标签
思路:
自定义select标签加入数据源自动加载数据源,生成select、option标签代码
核心代码如下:
select 标签助手类:
/ * 1、值的传递 id/name * 2、数据源 items * 3、展示列与数据存储列与实体类的对应关系 textKey/textVal; * 4、数据回显 selectedVal * 5、可能设置下拉框默认值(头标签) headerTextKey/headerTextVal * @author 86182 */ private String id;// select的id private String name;// select的name private List<Object> items = new ArrayList<>();// 数据源 private String textKey;// option中的value private String textVal;// option中的text文本 private String selectedVal;// 目前选中值 private String headerTextKey;// 默认的option值 private String headerTextVal;// 默认的option的文本 private String toHTML() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
StringBuffer sb = new StringBuffer(); sb.append("); if(!(headerTextKey == null || "".equals(headerTextVal) || headerTextKey == null || "".equals(headerTextVal))) {
sb.append("+headerTextVal+""); } String value;
String html; for (Object o : items) {
Field f = o.getClass().getDeclaredField(textKey); f.setAccessible(true); value = (String) f.get(o);
html = (String) PropertyUtils.getProperty(o, textVal); if(value.equals(selectedVal)) {
sb.append("+html+""); }else {
sb.append("+html+""); } } sb.append(""); return sb.toString(); }
3、定义 checkbox 标签
代码如下:
checkbox标签助手类:
private String[] items; private String name; StringBuffer sb = new StringBuffer(); for (String it : items){
sb.append("+it+"" name=""+name+"">"+it+" "); }
二、控制标签
1、定义 if 标签
思路:
得到标签属性值做判断,页面上的标签主体部分视情况输出
核心代码如下:
if标签助手类:
private boolean test; public int doStartTag() throws JspException {
return test ? EVAL_BODY_INCLUDE : SKIP_BODY; }
2、定义 foreach 标签
思路
得到标签属性,将集合遍历,遍历出的对象反复保存到page作用域中输出
核心代码如下:
foreach标签助手类:
private String var;//保存当前元素到page作用域的一个key(键) private List<Object> items = new ArrayList<>();//数据源 / * 执行完该方法的时候,var所代表的指针一定要向下移一位 * @return * @throws JspException */ public int doStartTag() throws JspException {
if(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()); pageContext.setAttribute("it", it);//移动 return EVAL_BODY_AGAIN;//再计算主体一次 } return EVAL_PAGE;//计算页面的后续部分 } }
三、数据标签
1、定义 set 标签
代码如下:
set标签助手类:
private String var; private Object value; public int doStartTag() throws JspException {
pageContext.setAttribute(var, value); return SKIP_BODY;//跳过主体 } public int doEndTag() throws JspException {
return super.doEndTag(); }
补充:
PropertyUtils.getProperty(bean, name);返回Object BeanUtils.getProperty(bean, name);返回String
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213620.html原文链接:https://javaforall.net
