自定义标签:移除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 进行分割