二、JSP自定义标签
1.自定义标签的基本用法
jsp中支持自定义标签,自定义标签是为了简化代码,使用自定义标签替换一个Java代码片段,完成相同的功能
2.自定义最简单的标签
显示ip地址的j页面
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.baidu.com/jsp/tag" prefix="myTag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<%-- 需求:定义一个标签,实现以下功能 --%>
<%
//获取客户端的ip
String ip = request.getRemoteAddr();
out.print("ip = " + ip);
%>
<br>
<myTag:clientIp/>
</body>
</html>
实现标签方法的类
package Servlet;
import java.io.IOException;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//继承SimpleTagSupport
//实现获取客户端ip的功能
//标签需要在tld文件里注册
public class IPTag extends SimpleTagSupport
{
//重写doTag()方法
public void doTag() throws JspException, IOException
{
//获取PageContext对象
PageContext pc = (PageContext)this.getJspContext();
//获取请求对象
ServletRequest request = pc.getRequest();
//获取客户端ip
String ip = request.getRemoteAddr();
//获取标准输出流
JspWriter out = pc.getOut();
//将客户端ip写入到输出流中
out.print("ip = " + ip);
}
}
配置标签的的myTag.tal文件如下
<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加头部信息 -->
<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">
<!-- 定义标签库信息 -->
<tlib-version>1.0</tlib-version>
<short-name>myTag</short-name>
<uri>http://www.baidu.com/jsp/tag</uri>
<!-- 注册标签 -->
<tag>
<name>clientIp</name>
<tag-class>Servlet.IPTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3.定义有标签体的标签
<body-content>
中的4个选项及其意义
empty:表示当前标签没有标签体
scriptless:表示当前标签具有标签体,但标签体中不能出现java脚本,但可以出现EL表达式
jsp:已过时,表示当前标签具有标签体。将标签体内容原样显示到浏览器
tagdependent:表示当前标签具有标签体,并将标签体内容原样显示到浏览器,即使标签体中写的是EL,也不会对EL进行计算
4.定义带属性的标签
在<tag>
标签中要同时注册属性
<attribute>
<name>XX</name>
<!--该属性是否必须-->
<required>true<required>
<!--runtime expression value 若为true,则该属性的值支持EL与JSP表达式-->
<rtexprvalue>true</rtexprvalue>
</attribute>