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

标签之后

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,930评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 9,246评论 0 11
  • 一、 自定义标签简介 自定义标签主要用于移除jsp页面中的java代码。工程(tag) 使用自定义标签移除jsp页...
    yjaal阅读 4,191评论 1 4
  • EL表达式 EL作用 jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %> 以后开发jsp的原则...
    奋斗的老王阅读 7,180评论 1 51
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 10,166评论 1 114