因为回家面试的原因,很久没有更新博客了,ε=(´ο`*)))唉,等待最终结果的日子真是漫长,希望快点给我结果吧,在等待中希望能够好好多学点知识,如果能通过面试,就能够轻松上手工作了。
闲话不多说,这次视频讲了自定义标签的使用,分别讲了传统标签与简单标签,自定义标签主要用于移除jsp页面中的java代码,实现步骤为编写一个实现tag接口的java类,编写标签库描述符(tld)文件,在tld文件中对标签处理器类进行描述。
(前排提示,传统标签已经过时)
首先我们先做一个demo快速入门:
在实现功能之前,我们先来讲讲传统标签的执行过程,首先ie发送请求到web服务器,web服务器调用servlet(jsp),这时servlet创建标签处理器类的实例对象,之后调用setPageContext()方法将jsp页面的pageContext对象传递给标签处理器,调用setParent方法把父标签传递进去,然后依次执行开始标签,调用doStartTag方法,执行结束标签,调用doEndTag方法,最后调用release方法释放标签所占用资源。
例:使用自定义标签输出客户机ip地址
1、编写一个实现tag接口的标签处理器类
package cn.itcast.tag;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class ViewIPTag implements Tag {
private PageContext pageContext;
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return 0;
}
@Override
public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
JspWriter out = pageContext.getOut();
String ip = request.getRemoteAddr();
try {
out.write(ip);
} catch (IOException e) {
throw new RuntimeException(e);
}
return 0;
}
@Override
public Tag getParent() {
// TODO Auto-generated method stub
return null;
}
@Override
public void release() {
// TODO Auto-generated method stub
}
//获取PageContext
@Override
public void setPageContext(PageContext arg0) {
this.pageContext = arg0;
}
@Override
public void setParent(Tag arg0) {
// TODO Auto-generated method stub
}
}
2、在web-inf/目录下新建tld文件,在tld文件中对标签处理器进行描述
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/itcast</uri>
<tag>
<name>viewIP</name> <!-- 为标签处理器类配一个标签名 -->
<tag-class>cn.itcast.web.tag.ViewIPTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3、在jsp页面中导入并使用自定义标签
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/itcast" prefix="itcast" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>输出客户机的IP</title>
</head>
<body>
您的IP是:<itcast:viewIP/>
</body>
</html>
是不是很简单呢?
(由于浏览器崩溃,之前写的传统标签实现下方功能的内容都没了,反正也被淘汰了,就不重复写了)
接下来就是一些拓展功能,使用简单标签分别实现
1、控制jsp页面某一部分内容是否执行。
package cn.itcast.simpletag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo1 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//得到代表标签体的JspFragment
JspFragment jf = this.getJspBody();
//PageContext pageContext = (PageContext) this.getJspContext();
//jf.invoke(pageContext.getOut());
jf.invoke(null);
}
}
2、控制整个jsp页面是否执行。
package cn.itcast.simpletag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo3 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
throw new SkipPageException();
}
}
3、控制jsp页面内容重复执行。
package cn.itcast.simpletag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
for(int i=0;i<5;i++){
jf.invoke(null);
}
}
}
4、修改jsp页面内容输出。
package cn.itcast.simpletag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo4 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspFragment jf = this.getJspBody();
StringWriter writer = new StringWriter();
jf.invoke(writer);
String content = writer.getBuffer().toString();
content = content.toUpperCase();
this.getJspContext().getOut().write(content);
}
}
5.通过属性控制循环输出。
package cn.itcast.simpletag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo5 extends SimpleTagSupport {
private int count;
public void setCount(int count) {
this.count = count;
}
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
for(int i=0;i<count;i++){
this.getJspBody().invoke(null);
}
}
}
配置文件写法:
<tag>
<name>simpleTagDemo5</name> <!-- 为标签处理器类配一个标签名 -->
<tag-class>cn.itcast.simpletag.SimpleTagDemo5</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>count</name>
<required>true</required> <!-- 指示属性的值是否是必须的 -->
<rtexprvalue>true</rtexprvalue> <!-- 指示属性的值是否可以为一个表达式 -->
</attribute>
</tag>
over!!