简单自定义标签

来源:互联网 发布:德淘宝宝辅食 编辑:程序博客网 时间:2024/06/03 19:18
1、简单标签:SimpleTag
doTag方法可以完成 输出、迭代、修改标签体内容等。
(1)setJspContext方法 将pageContext对象传递给标签处理器对象
(2)自动调用setParent  将父标签传递给标签体对象
(3)如果设置了属性,容器将调用每个属性对应的setter方法,把属性值传递给biaoqianchuliqiduixiang
(4)invoke(out对象)  将标签体的内容输出到页面中


2、简单标签的使用
(1)使用自定义标签控制页面内容(标签体)是否输出
public void doTag() throws JspException, IOException {
//得到标签体对象//脚本元素不能包含
JspFragment jf=this.getJspBody();
//输出标签体的内容
jf.invoke(this.getJspContext().getOut());
} //等价于 jf.invoke(null);
(2)简单标签控制该自定义标签后的JSP内容是否执行
创建一个标签处理器
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspFragment jf=this.getJspBody();
jf.invoke(null);
//停止执行jsp页面后续内容。抛出异常
throw new SkipPageException();
tld文件进行描述
早DoTag()抛出一个异常,则可停止执行jsp后续内容:throw new SkipPageException();
(3)简单标签控制迭代
public void doTag() throws JspException, IOException {
//setter getter
// TODO Auto-generated method stub
JspFragment jf=this.getJspBody();
for(int i=0;i<count;i++){
jf.invoke(null);
}
}


(4)在标签内设置属性
在标签处理器中,增加成员变量,名字相同,增加setter方法命名规范
在tld中<tag>标签中增加属性的描述
<attribute>
  <name>count</name>
  <required>true</required>//是必须有的
  <rtexprvalue>true</rtexprvalue> //是否支持运算 如 EL表达式
  </attribute>
(5)修改标签体的内容
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspFragment jf=this.getJspBody();

//定义流对象, 来获取标签体内容 将标签体内容存储进去
StringWriter sw=new StringWriter();
jf.invoke(sw);
String str=sw.toString();
String result=str.toUpperCase();
//得到输出流对象,并输出到页面中
this.getJspContext().getOut().println(result);
}
3、开发带属性的标签
<csdn:demo8 count="${5+1}"></csdn:demo8>
注意:标签处理器中一定也得包含一个私有的属性count和setter方法
doTage()包含业务逻辑代码


tld文件中:
<tag>
<name></name>
<tag-class></tag-class>
<body-content></body-content>
<attribute>
<name></name>
<required>true|false</required>  属性是否是必须的。
<rtexprvalue>true|false</rtexprvalue>  是否可以用表达式
</attribute>
</tag>


属性是日期类型
<csdn:demo10 date="<%=new java.util.Date()%>"/>
<attribute>
  <name>date</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  <type>java.util.Date</type>
</attribute>




SimpleTagDemo10:
Date date setDate(Date d)

4、案例  防盗链
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspContext jc=this.getJspContext();
//得到pageContext对象
PageContext pc=(PageContext)jc;
//得到请求对象
HttpServletRequest request=(HttpServletRequest)pc.getRequest();
//获取请求消息头
String referer=request.getHeader("referer");
//获取应答对象,以便完成重定向
HttpServletResponse response=(HttpServletResponse)pc.getResponse();
if(referer==null || !referer.startsWith(site)){
//跳转到首页上去
//response.sendRedirect(request.getContextPath()+"/"+page);
//判断是否以/test开头
if(page.startsWith(request.getContextPath())){
response.sendRedirect(page);
//判断是否页面前面是否加“/”
}else if(page.startsWith("/")){
response.sendRedirect(request.getContextPath()+page);
}else{
//只是一个相对路径
response.sendRedirect(request.getContextPath()+"/"+page);
}
//不往下执行
throw new SkipPageException();
}
}
原创粉丝点击