自定义标签

自定义标签:移除JSP页面中的java代码

 步骤

1、 编写一个实现Tag接口的Java类,把页面Java代码移到这个java类中(标签处理器类)

2、编写标签库描述符(tld)文件,在tld文件中把标签处理器类描述成一个标签。 tld文件放在WEB-INF下面,文件的内容从E:\Tomcat\apache-tomcat-7.0.79\webapps\examples\WEB-INF\jsp2这里面去复制

 比如获取IP地址    代码:

package com.cn.web.tag;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

//继承TagSupport方法
public class ViewIpTag extends TagSupport {
	// 重写doStargTag()
	@Override
	public int doStartTag() throws JspException {
		HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
		JspWriter out = this.pageContext.getOut();
		//获取IP地址
		String ip = request.getRemoteAddr();
		try {
			out.print(ip);
		} catch (IOException e) {
			throw new RuntimeException();
		}

		return super.doStartTag();
	}
} 
<?xml version="1.0" encoding="UTF-8" ?>                这个文件的文件名是cnblogs
<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>cnblogs</short-name>
	<!--定义此标签库的uri路径,用于唯一标识该数据库,便于页面的引用,这里我是随便写的 -->
	<uri>https://www.cnblogs.com/</uri>

	<tag>
		<!-- 标签的名称 -->
		<name>viewip</name>
		<!-- 标签处理器类的全路径 -->
		<tag-class>com.cn.web.tag.ViewIpTag</tag-class>
		<body-content>empty</body-content>
	</tag>
</taglib>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="https://www.cnblogs.com/" prefix="cnblogs" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'ViewIp.jsp' starting page</title>
  </head>
  <body>
   你的IP地址是:<cnblogs:viewip/>
  </body>
</html>

  

功能扩展:(因为自定义标签里面放的是JAVA内容,所以才有这些)  这些都是传统标签,现在开发很少用,但是以前的框架会用到,所以得知道

*** 注意在tld文件中<body-content>后面要改成JSP 必须是大写的

1、 控制JSP页面某一部分内容是否执行    

重写doStartTag    如果要执行,return Tag.Eval_Body_Include   不想执行的话那么就return Tag.Skip_Body

2、 控制整个JSP页面是否执行

重写doEndTag    如果要执行,return Tag.Eval_Page  不想执行的话return Tag.Skip_Page

3、 控制JSP页面内容重复执行

重写doStartTag和doAfterBody   doStartTag这个return Tag.Eval_Body_Include,doAfterBody这个重复执行,判断重复执行的次数,如果次数不够的话就return IterationTag. Eval_Body_Again;如果次数够了的话就return IterationTag.Skip_Body

4、 修改JSP页面内容输出

继承BodyTagSupport,重写doStartTag,然后return BodyTag.Eval_Body_Buffered;重写doEndTag,得到标签体this.getBodyContent,然后看要修改什么东西,return Tag.Eval_Page

 

       简单标签

   SimpleTag 继承SimpleTagSupport 

 *** 注意如果有方法体的话,要在tld文件中<body-content>后面要改成scriptless   没有的话就empty

1、控制JSP页面某一部分内容是否执行

控制整个JSP页面是否执行

控制JSP页面内容重复执行

   重写doTag,然后获取标签体:this.getJspBody,如果想要获取让页面显示的话,那么就 invoke(null),如果不想让页面显示的话剩下的就不用谢了。

2、修改JSP页面内容输出

  重写doTag,然后获取标签体:this.getJspBody,想要修改的话用new一下StringWriter这个方法,然后invoke,接着把StringWriter转换成字符串toString,最后用this.getJspContext.getOut.write输出

3、 控制标签余下的JSP不执行

重写doTag,直接抛出throw new SkipPageException

 

带属性的自定义标签

1、 在标签处理器类中编写每个属性对应的setter方法,生成setter方法

2、 在tld文件中描述标签的属性

在Tag标签下  

  <attribute>

    <name>随便写</name>

  <required>true</required>

   <rtexprvalue>true</rtexprvalue>

</attribute>

 

核心标签库  *************

<c:out>  属性:value、escapeXml、defaullt

<c:set>  属性 value、var、scope、target、property

<c:forEach>  属性:var、varStatus、items、begin、end、step

            var:关键字  varStatus可以用来设置表格的间色

<c:url>  属性:value、var、scope   构造url地址

<c:param> 在url地址后面附加参数,可以对参数值进行url编码

<c:forTokens> 属性:var、items、delims   进行分割

转载于:https://www.cnblogs.com/zengjiao/p/7512267.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值