前言
|ू・ω・` )
在前面的一章中已经给大家讲了下,标签是可以自己制作的。
简单回顾下,如果要自作标签:
- 重写c.tld文件,
- 并且对每个对应的标签写个标签助手类
欧克,今天主要是要写比较复杂的标签:
- c:set
- c:out
- c:foreach
- c:if
- c:select
数据标签
z:set
今天的第一个来了
我们要做一个数据标签:z:set
在原有的c标签库里是:c:set
所谓数据标签:就是操作数据进行存储:
至于相关属性:我们可以参考:c标签
<c:set value="存储内容" var="存储名"> </c:out>
我们也是要制作一样的结果;
首先我们还是一样的配置好z.tld
注意:看有什么属性;
<tag>
<name>set</name>
<tag-class>com.liwangwang.jsp2.SetTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>var</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
就是value和var属性;
那么在一个标签助手类里要写一个value 的属性哦,接下来就不讲这个了
private Object value;
private String var
如果这个弄好了;
就可以写实现bodyTagSypport类下的方法:
- doStartTag();
- doAfterTag();
- doEndTag();
下面不会啰嗦了
比如思考咱们这个标签有没有用到body里面去
这个的路线:
doStartTag()---->doEndTag()
直接跳过body;
哎,还是把这个摆出来把
嗯,具体路线,看自己要自作的jsp标签而定。
控制标签
z:if标签
再说一次,当你需要写那个标签的时候,要把它的属性,思路给想清楚哦
1,这个标签的属性:test;
然后就配置;
主要在助手类中:doStartTag();
不懂什么是 EVAL_BODY_INCLUDE (进入计算标签主体内容 ),SKIP_BODY (跳过主体)
,可以看看我上篇文章
z:foreach标签
1,这个标签的属性:
private String var;
private List<Object> items = new ArrayList<>();
@Override
public int doStartTag() throws JspException {
if(items.size()!=0) {
Iterator<Object> it = items.iterator();
pageContext.setAttribute(var, it.next());//如果有的话就进入到这里面
pageContext.setAttribute("it", it);//将剩下的集合放入it中
return EVAL_BODY_INCLUDE;
}
else {
return SKIP_BODY;
}
}
@Override
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);//将剩下的集合放入it中
return EVAL_BODY_AGAIN;
}
else {
return EVAL_PAGE;
}
}
UI标签
z:out标签
1,这个的属性:
private Object value;
代码:
这个里面的重要代码为
JspWriter out = pageContext.getOut();
可以实列化一个out对象;
out.print(value.toString());
然后输出到jsp界面上
select 标签
1,这个的属性:
private String id;//值的传递 : id name
private String name;//值的传递 : id name
private List<Object> items = new ArrayList<>();//数据源 : items
private String textKey;//展示列与数据存储列与实体类的对应关系: textKey textVal
private String textVal;//展示列与数据存储列与实体类的对应关系: textKey textVal
private String selectedVal;//数据回显 selectedVal
private String headerTextKey;//可能下拉框默认值(头标签)headerTextKey headerTextVal
private String headerTextval;//可能下拉框默认值(头标签)headerTextKey headerTextVal
这个就比较的多了,其实这个也涉及到数据字典的概念;
当然,如果认真的去思考一个下拉框有什么,也可以想出来的。
比如:
<select id = "" name ="">
<option value="001">小李</option>
<option value="002">小王</option>
</select>
还是那个方法:doStartTag();
看到这个toHtml()没有,主要就是输出一个StringBuffer 的字符串;
这个方法虽然很多东西,但是并不难
认真看的话,也不怎么难的
然后这个的总的思想的话,也就是将你所从数据库里调出来的数据,加入到助手类中,然后进行操作。
这么说吧,就是你只要写好了这个标签,并且将数据源传了过去,就可以自动的帮你写好jsp代码,然后通过:JspWriter out = pageContext.getOut();
输出到页面上
怎么传呢
<z:select textVal="name" items="${list }" textKey="id"></z:select>
这个可以简单解决很多事情;
checkbox标签
在很多地方,多可以用到复选框的选项,如果那可以以自己传一个数组过去,那他就给你打好jsp代码,那不会很happy嘛
我们先分析一下checkbox的代码属性有哪些:
input type=“checkbox” name="" value="" >
那么就这些:
private String[] items;
private String name;
配置好z.tld文件后,就可以处理助手类文件了
同样的doStartTag方法;也是ui标签
所以、
这个比select简单些
操作:
这样就可以直接打出checkbox了:
是不是相对于之前而言方便了许多;
总结
在要制作的过程中:
重点在于,把那个助手类的pageContext看做是引用的.jsp界面的;
也用到了迭代器,反射中获取属性;
是暂时知识得到了融合
Thanks♪(・ω・)ノ希望大家有所收获