JAVAWEB自定义标签开发
传统标签技术复杂
写一个类实现Tag接口
写一个tld文件,描述写好的类
在JSP页面引入tld文件,就可以在JSP文件使用自定义标签了
生命周期传统标签处理类在标签被第一次使用时创建实例,从此驻留内存为后续请求提供服务,其中每次标签执行都会依次执行setPageContext(PageContext pc) 、setParent(Tag t) 、doStartTag() 、doEndTag() 、~在服务器停止之前调用release()
tld文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">//修改此路径才能智能提示
1.0
MyTag
http://www.itheima.com/MyTag
showip
com.itheima.tag.ShowIpTag
empty//标签体内容JSP表示任意jsp内容,empty代表只能为空、scriptless带表不能包含脚本内容、tagdependent代表其中的内容是用来给服务器用的,不是输出到浏览器的内容
Demo1
com.itheima.tag.Demo1Tag
JSP
SimpleShowIp类
package com.itheima.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class ShowIpTag implements Tag {
private PageContext pc = null;
public intdoEndTag()throws JspException {
//EVAL_PAGE -- 结束标签之后的剩余页面需要去执行
//SKIP_PAGE -- 结束标签之后的剩余页面不要去执行
return 0;
}
public intdoStartTag()throws JspException {
try {
String ip = pc.getRequest().getRemoteAddr();
pc.getOut().write(ip);
} catch (IOException e) {
e.printStackTrace();
}
//Eval_Body_Include -- 开始标签之后的标签体需要执行
//Skip_Body -- 开始标签之后的标签体不需要执行
return 0;
}
public Tag getParent() {
return null;
}
public void release() {
}
public voidsetPageContext(PageContext pc) {
this.pc = pc;
}
public void setParent(Tag t) {
}
}
在JSP页面使用
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.itheima.com/MyTag" prefix="MyTag" %>
java输出的ip:<%=request.getRemoteAddr() %>
标签输出的ip:
简单标签输出的ip:
简单标签技术
写一个类继承SimpleTag接口(或者继承SimpleTag默认实现类)
写一个tld文件,描述写好的类
在JSP页面引入tld文件,就可以在JSP文件使用自定义标签了
生命周期 setJspContext(JspContext pc) 、setParent(JspTag parent) 如果没有父标签就不调用、如果有属性就调用对应的setXXX方法如果有el表达式,则计算结果后传入、如果有标签体调用setJspBody(JspFragment jspBody) 、doTag() 执行标签体处理.每次访问该标签时都创建简单标签实例,每次使用后销毁该实例。
SimpleShowIp类
package com.itheima.simletag;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;
public class SimpleShowIp implements SimpleTag {
private JspContext pc = null;
public void doTag() throws JspException, IOException {
PageContext pcx = (PageContext) pc; //需要强转
String ip = pcx.getRequest().getRemoteAddr();
pcx.getOut().write(ip);
}
public JspTag getParent() {
return null;
}
public void setJspBody(JspFragment jspBody) {
}
public void setJspContext(JspContext pc) {//是PageContext的父亲
this.pc = pc;
}
public void setParent(JspTag parent) {
}
}
tld文件
//定义TAG
simpleshowip
com.itheima.simletag.SimpleShowIp//所使用的类
empty//标签体内容JSP表示任意jsp内容,empty代表只能为空、scriptless带表不能包含脚本内容、tagdependent代表其中的内容是用来给服务器用的,不是输出到浏览器的内容
SimpleDemo1类
package com.itheima.simletag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleDemo1 extends SimpleTagSupport {
private int times;
public void setTimes(int times) {
this.times = times;
}
@Override
public void doTag() throws JspException, IOException {
//--控制标签体是否执行
//----控制标签体不执行,什么都不做标签体就不会执行
//----控制标签体执行,只要调用封装着标签体的JSPFragment对象的invoke方法就可以执行标签体
//JspFragment fragment = getJspBody();
//fragment.invoke(getJspContext().getOut());
//fragment.invoke(null);
//--控制标签之后的内容是否执行
//----控制标签之后的内容执行:什么都不做,标签之后的内容就会执行
//----控制标签之后的内容不执行:抛出SkipPageException这样的一个异常就可以控制标签之后的内容不执行
//throw new SkipPageException();
//--控制标签体重复执行
for(int i=0;i
getJspBody().invoke(null);
//--修改标签体后进行输出
//StringWriter writer = new StringWriter();
//JspFragment fragment = getJspBody();
//fragment.invoke(writer);
//String str = writer.toString();
//str = str.toUpperCase();
//getJspContext().getOut().write(str);
}
}
tld文件
simpleDemo1
com.itheima.simletag.SimpleDemo1
scriptless //标签体内容JSP表示任意jsp内容,empty代表只能为空、scriptless带表不能包含脚本内容、tagdependent代表其中的内容是用来给服务器用的,不是输出到浏览器的内容
times
true//是否为必须
true//是否支持EL表达式
int//属性的JAVA类型
用法
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.itheima.com/MyTag" prefix="MyTag"%>
标签之前
x
标签之后