案例
问题的提出:现在要显示所有员工的资料,提出解决方案
传统方法:1. 在JSP里面写JDBC查询;2. 在JavaBean中写JDBC查询,在JSP中使用查询结果。
新的方法:能否使用一个标签(类似于html标签)嵌入到JSP文件中,让它自动显示这些信息?
答案:能。技术基础:XML。
标签种类
1. 空标签,没有属性,也没有体
例:<html:submit/>
2. 空体标签,有属性,没有体
<bean:write name=”student”/>
3. 有属性有体标签
<logic:iterate id=”book” name=”books”>
<bean:write name=”book”/>
</logic:iterate>
自定义标签的要素
1. 标签处理程序(一个java文件,已经被编译):使用不同的方法与对象来定义标签的行为i,即认识某属性的不同值能做不同的事情。
2. 标签库描述符(TLD)文件(一个XML格式文件):包含客户标签的描述性列表的XML文件,即识别不同的属性能做不同的事情。
3. JSP文件(为了嵌入自定义的标签):包含标签以及表示内容的HTML代码。
标签处理程序(一个java文件)
作用:包含类和方法的定义,定义标签的功能
对于空体标签,需要继承:javax.servlet.jsp.tagext.TagSupport
对于有体标签,需要继承:javax.servlet.jsp.tagext.BodyTagSupport
以上两个类都实现:Javax.servlet.jsp.tagext.Tag接口
Tag接口中的方法:
doStartTag():初始化标签的一些内容,如连数据库
doEndTag():作一些善后工作,如关数据库
release():释放这个标签对象
doAfterBody():完成标签体求值之后的调用
doBeforeBody():开始标签体求值之前调用
一般,无体标签doStartTag()返回SKIP_BODY,让标签不要对体求值,doEndTag()返回EVAL_PAGE,让标签后面的JSP继续执行;有体标签doStartTag()返回EVAL_BODY_TAG,让标签对体求值,doEndTag()返回EVAL_PAGE,让标签后面的JSP继续执行;对于标签里面的属性,类似于JavaBean中给它们编写get和set方法。
一般情况下的标签处理程序包含以下函数:
构造函数:用于进行这个标签解释时的初始化,如连接数据库
doStartTag():返回对这个标签的处理方法
doEndTag():做一些善后工作,如数据输出,关闭数据库等各种属性的get,set函数
最厉害的角色:pageContext保护成员。
标签库描述符(TLD)文件(一个XML文件)
TLD文件:为包含标签库描述的xml文件;包含库中所有客户标签的列表与描述。
实现空标签
新建MyTag项目,编写标签程序处理类DisplayAllTag,代码如下
编写EmployeeDao类,代码如下
编写Employee类,代码如下
编写emp.tld文件,一般是放在WEB-INF目录下面,系统自动识别到,代码如下
编写displayAll.jsp文件,代码如下
部署项目,启动服务器,运行页面,得到正确的结果。
实现空体标签(不显示所有员工,比如按部门显示)
编写标签程序处理类DisplayByJobIDTag,代码如下
在EmployeeDao中添加按JobID查询的方法,代码如下
在emp.tld中新增标签项,代码如下
编写displayByJobID.jsp文件,代码如下
部署项目,启动服务器,运行页面,得到正确的结果。