1.传统标签
a.自定义标签:
用户自定义的一种jsp标记 。当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,
tag标签被转化成了对一个称为 标签处理类 的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后,
实际上tag标签被转化为了对tag处理类的操作。
Tag接口:定义了JSP页面与标签处理器类之间的通信规则
b.自定义标签的功能:是否执行标签体内容
是否重复执行标签体内容
是否修改标签体部分的执行结果后再输出
是否忽略JSP页面中标签后面的内容
c.执行顺序:实例化
setPageContext
setParent
setters
doStartTag
doEndTag
release 被垃圾回收器回收之前调用release
d.案例:防盗链,传入属性
String referrer = request.getHeader("referer"); //得到来访者是通过哪个超链接点击过来的
String sitePath = "http://"+request.getServeltName();//得到当前应用的名称
通过超链接访问,referer有值,
直接在浏览器中输入地址,referer为null
通过Servlet跳转,重定向了?
在tld中描述标签属性:<attribute>
name //属性的名字
required //是否是必须的
rtexprvalue //是否可以放$等 运行时表达式
e.案例:<c:if test=""></c>
属性值可以是各种类型,不一定就是string
如结合${} 可以是boolean ,int 等
f.案例:<jsp:useBean ></jsp:useBean>
通过反射,new一个实例,将这个对象设置到域中
2.简单标签
a.主要方法:
setJspContext JspContext是pageContext的父类
setParent 嵌套用的
getParent
setJspBody 将标签体封装成JspFragment对象传递给标签处理器对象
在传统标签中,是通过doStartTag 或 doEndTag的return this.XXX返回值来决定是否执行
那么JspFragment 一定有执行或不执行的方法
doTag
标签体:输出,迭代,修改
标签后面的内容:doTag中抛异常 余下的JSP代码就不执行了,throw new SkipPageException(...)
b.执行顺序:
setJspContext 将代表JSP的pageContext对象传递过去
setParent 有父标签就调用这个方法
setters 设置属性
setJspBody 将标签体封装成一个JspFragment对象,传递给这个方法,如果标签体为空就不调用这个方法
doTag
c.JspFragment
不能包含JSP脚本代码(Java代码),scripless
getJspContext
invoke(Writer out)
如果没有调用JspFragment.invoke 忽略
重复调用 迭代
写到容器 修改
d.案例:<c:forEach var="" items=""></c>
将数据放到JspContext域中 键和值:键是var
由于JspContext是那个页面的
e.案例:修改标签体
<c:htmlFilter>
<c:readFile file="" />
</c:htmlFilter>
浏览器看到<>就解析了,所有我们就将<>转义
3.JSTL标签库
1)核心标签库
<c:out>
<c:set>
<c:remove>
<c:catch>
<c:if>
<c:choose>
<c:forEach>
<c:param>
<c:url>
<c:redirect>
2)国际化标签
3)JSTL函数