jsp自定义标签
JSP自定义标签(JSP Custom Tag)是JSP技术中一个重要的扩展。它可以将一些常见的HTML或Java代码重复使用封装成标签,这样可以简化JSP页面的编写,提高代码的复用性和可维护性。
JSP自定义标签可分为两类:
标签处理程序(Tag Handler)类标签,开发者编写Java类实现,可以使用Java代码处理标签体内容及标签属性。
标记文件(Taglib)标签,需要在标签库(Tag库)中定义标签信息,标签体内容可以使用EL表达式等JSP技术实现。
使用JSP自定义标签可以降低页面跨度和提高可读性,使得JSP页面开发更加简洁、灵活。同时,JSP自定义标签也可以增强JSP的功能,实现一些复杂的逻辑处理、数据查询等功能,提高开发效率。
二、自定义标签的特点
1.通过调用页面实现传递定制.
2.访问所有对JSP页面可能的对象.
3.修改调用页面生成的响应.
4.自定义标签之间可以互相通信.
5.在同一个JSP页面中对标签嵌套可以实现复杂交互.
out,if,foreach标签
<?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">
<description>JSTL 1.1 core library</description>
<display-name>JSTL core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>k</short-name>
<uri>/Java2EE_jsp/WebContent/WEB-INF/kun.tld</uri>
<validator>
<description>
Provides core validation features for JSTL tags.
</description>
<validator-class>
org.apache.taglibs.standard.tlv.JstlCoreTLV
</validator-class>
</validator>
<tag>
<!-- 标签库的名字 -->
<name>demo1</name>
<!-- 该标签对应的助手类 -->
<tag-class>com.xuayhui.tag.DemoTag</tag-class>
<!-- 代表是一个JSP标签 -->
<body-content>JSP</body-content>
<attribute>
<!-- 该自定义JSP标签的属性名称 -->
<name>var</name>
<!-- 该属性是否必填 -->
<required>false</required>
<!-- 该属性值是否支持表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<tag>
<name>if</name>
<tag-class>com.xuayhui.tag.Iftag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>set</name>
<tag-class>com.xuayhui.tag.SetTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>out</name>
<tag-class>com.xuayhui.tag.OutTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
out助手类
package wenhao;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* servlet中后台代码前台输出内容: out.print
* 将数据输出到前台,首先拿到输出流
*
*
*/
public class OutTag extends BodyTagSupport{
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.print(value);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return super.doStartTag();
}
}
if助手类
package wenhao;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* if标签:
* 如果满足条件,就打印标签体,dostarttag的返回值eval_body_include
*
* 如果不满足条件,就不输出标签体,dostarttag的返回值skip_body
*
* 需要获取到是否满足条件的结果值,那么标签就有一个属性,属性值是boolean
*
*
*/
public class Iftag extends BodyTagSupport{
private boolean test;
public boolean isTest() {
return test;
}
public void setTest(boolean test) {
this.test = test;
}
@Override
public int doStartTag() throws JspException {
// 如果满足条件,就打印标签体,dostarttag的返回值eval_body_include
// 如果不满足条件,就不输出标签体,dostarttag的返回值skip_body
return test ? EVAL_BODY_INCLUDE : SKIP_BODY;
}
}
jsp界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
了解标签结构
<c:if test="true"> 开始标签
true 标签体
</c:if> 结束标签
标签分类:控制标签、数据标签、UI标签
没有标签体也能在网页中输出类容的标签,称为UI标签
通过点击c:if标签,可以链接跳到c.tld文件中,而.tld文件就是C标签库的定义配置文件
-->
<c:if test="true">true</c:if>
<c:if test="false">false</c:if>
<c:set var="name" value="kunkun"></c:set>
<c:out value="${name }"></c:out>
</body>
</html>