Jstl自定义标签:
自定义标签主要用于移除JSP页面中的Java代码。Jsp页面主要是用来显示给前台的,如果里面有过多的java代码的话,会显得很乱,但是没有java代码也无法获取相关数据或完成相关操作。那么这时候我们就可以自己定义一个标签,来完成需要用java代码完成的事情,这样Jsp页面就会清洁很多,可读性也更强。JSP中使用自定义标签移除只需要完成以下两个步骤:
1)编写一个实现Tag接口的java类(标签处理类);
2)编写标签库描述符(tld)文件,在tld文件中对标签处理类进行描述。
自定义标签可以定义一个或多个属性,这样在JSP页面中应用自定义标签时就可以设置这些属性的值,通过这些属性为标签处理器传递参数信息,从而提供标签的灵活性和复用性。想要让一个自定义标签具有属性,通常需要完成两个任务即可:
1)在标签处理器中编写每个属性对应的setter方法
2)在tld文件中描述标签的属性
为自定义标签定义属性时,每个属性都必须按照javaBean的属性命名方式,在标签处理器中定义属性名对应的setter方法,用来接收JSP页面调用自定义标签时传递进来的属性值。例如属性url,在标签处理器类中就要定义相应的setUrl(Stringurl)方法。在标签处理器中定义相应的set方法后,JSP引擎在解析执行开始标签前,也就是调用doStartTag方法前,会调用set属性方法,为标签设置属性。我们看下面的例子:
防盗链: 我们来用自定义JSTL标签开发一个防盗链的标签:如果客户端直接访问http://localhost:8888/jstl/test.jsp,会被阻止,先跳转到主页index.jsp,再访问1.jsp
Index.jsp
Java文件
package jstl;
import java.io.IOException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
importjavax.servlet.jsp.tagext.SimpleTagSupport;
public class RefererTag extendsSimpleTagSupport {
private String site;
private String page;
public void setSite(String site) {
this.site = site;
}
public void setPage(String page) {
this.page = page;
}
@Override
public void doTag() throws JspException,IOException {
//看来访者是从哪个页面来的
PageContext pageContext =(PageContext)this.getJspContext();
HttpServletRequest request =(HttpServletRequest)pageContext.getRequest();
String referer =request.getHeader("referer");//得到是从哪个页面来的
//判断是否从自己的主页过来的
if(referer == null ||!referer.startsWith(site)) {
HttpServletResponse response =(HttpServletResponse)pageContext.getResponse();
String webroot =request.getContextPath(); //example
if(page.startsWith(webroot))
response.sendRedirect(page);
else
response.sendRedirect(webroot +page);
//重定向后,控制保护的页面不要执行
throw new SkipPageException();
}
}
}
dlt文件
Test.jsp