javaWebJavaweb

JAVAWEB自定义标签开发

2015-10-04  本文已影响109人  newdolphintime

传统标签技术复杂

写一个类实现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

标签之后

上一篇下一篇

猜你喜欢

热点阅读