J2EE之jsp自定义标签01
前言
自定义标签可以轻松地为不同的应用程序应用于不同的JSP页面,从而提高JSP页面的可重用性和可维护性。所以今天由我来分享一些有关jsp自定义标签相关的知识,让我们根据下面的思维导图一起来了解吧。
1 了解jsp自定义标签
1.1 概念:
JSP自定义标签是一种自定义的JSP标签,它允许开发人员将Java代码片段封装成一个可复用的标签,从而在JSP页面上实现更复杂的逻辑和功能。JSP页面中的自定义标签可以和HTML标签或其他JavaServer Pages (JSP) 标签混合使用。
1.2 作用:
- 提高代码的可重用性和可维护性。通过JSP自定义标签,可以将页面分离为视图、控制器等模块,简化JSP页面的代码结构,减少代码重复,提高代码的可维护性。
- 实现更复杂的逻辑和功能。JSP自定义标签可以封装Java代码,实现更复杂的逻辑和功能,同时提高JSP页面的灵活性和扩展性。
- 简化JSP页面的开发和维护。使用JSP自定义标签可以把逻辑代码从JSP页面中移出,从而简化JSP页面的开发和维护,提高代码的可读性和可维护性。
- 提高页面的可扩展性。通过自定义标签,可以方便地扩展页面的功能,为后续开发提供了更好的扩展的基础。
- 降低了耦合度。通过自定义标签,不同的代码模块可以通过标签处理类之间进行数据传递和交互,从而降低了应用程序代码间的耦合度,使代码更具有可重用性和可维护性。
1.3 特点:
- 可扩展性:JSP自定义标签是一种可扩展标签,它允许开发人员将Java代码片段封装成一个可复用的标签,从而实现更复杂的逻辑和功能。
- 可扩展性:JSP自定义标签是一种可扩展标签,它允许开发人员将Java代码片段封装成一个可复用的标签,从而实现更复杂的逻辑和功能。
- 灵活性:JSP自定义标签的使用方式非常灵活,可以与HTML标签或其他JSP标签混合使用,且其标识符可以自定义。
- 解耦合性:通过JSP自定义标签,不同的代码模块可以通过标签处理类之间进行数据传递和交互,从而降低了应用程序代码间的耦合度。
- 可维护性:JSP自定义标签的使用,可以降低程序的复杂度和代码的冗余程度,便于开发人员进行程序的维护和修改。
1.4 jsp自定义标签分类
标签类 | 实例 |
空标签 | 例如:br、hr |
ui标签 | 例如:input、table |
控制标签 | 例如:if、foreach |
数据标签 | 例如:out标签 |
1.5 标签的书写格式
<开始标签 属性="属性值">标签体</结束标签>
2. jsp自定义标签的开发和使用步骤
2.1 jsp开发自定义标签的步骤:
- 创建Java包:在Servlet容器的 /WEB-INF/classes 目录中创建一个Java包。包名应该与你的标签描述文件的uri属性的值相匹配。
- 创建标签处理类:在刚才创建的Java包中创建一个类,类名应该与标签描述文件中定义的标签名称相同。该类必须扩展TagSupport类并实现doStartTag()、doEndTag()和doAfterBody()方法之一或全部。
- 创建标签描述符文件:在 WEB-INF 目录下创建一个 XML 文件,该文件应该包含完整的自定义标签描述符定义,包括标签名称、映射URI、属性和标签处理类等信息。
- 在 JSP 页面中使用标签:在 JSP 页面中包含刚刚创建的标签描述符,并调用你自定义的标签名称并设置标签属性。当 JSP 页面被处理时,自定义标签处理类中的相应方法将被调用。
- 安装自定义标签库:将标签描述符文件复制到 WEB-INF/tlds 目录下,并且在 JSP 页面中包含标签描述符文件。
- 发布应用程序并测试:部署你的应用程序并运行它以确保标签库已经正确安装并在 JSP 页面中正常运行。
2.2 jsp自定义标签的使用:
1.导入标签库:在 JSP 页面中的 <%@ page %>
指令中导入标签库。指令的格式如下:
<%@ taglib prefix="prefixName" uri="tagLibraryURI" %>
其中,prefixName 是前缀名,tagLibraryURI 是库的 URL。
2.使用自定义标签:在 JSP 页面中调用自定义标签,格式如下:
<prefixName:tagName attribute1="value1" attribute2="value2">
其中,prefixName 是前缀名,tagName 是自定义标签的名称,attribute1 和 attribute2 是自定义标签的属性名,value1 和 value2 是自定义标签的属性值。
3.关闭标签:在 JSP 页面中使用 </prefixName:tagName>
语法来关闭标签。示例如下:
<prefixName:tagName attribute1="value1" attribute2="value2"></prefixName:tagName>
4.显示结果:自定义标签的结果将在 JSP 页面中显示。
总之,要使用自定义标签,你需要知道自定义标签库的前缀和 URL。然后,你可以使用标签名称和属性来调用标签,并在 JSP 页面中显示标签的结果。
2.3 案例展示(y:out标签)
2.3.1 创建一个标签助手类(OuutTag.java)
package com.YX.JSP.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; /*** * 自定义标签助手类 继承BodyTagSupport类说明此类是jsp自定义标签的助手类 * * @author 86158 * */ public class OuutTag extends BodyTagSupport { private String val; private String defaultVal; // 分别获取两个属性的get和set的方法 public String getVal() { return val; } public void setVal(String val) { this.val = val; } public String getDefaultVal() { return defaultVal; } public void setDefaultVal(String defaultVal) { this.defaultVal = defaultVal; } @Override // 用于和对方法是否编写的和继承的父类一致 public int doStartTag() throws JspException {// 抛出异常处理 // 实例化回显工具类,将指定的数值输出到页面上 // pageContext是页面上下文对象,用户和jsp共享数据 JspWriter out = this.pageContext.getOut(); try { if (this.val == null || this.val.equals("")) {// 判断传输到页面的值是否为空,为空则输出默认值到页面上 // 利用JspWriter对象将默认值输出到页面上 out.println(this.defaultVal); } else { // 利用JspWriter对象将传输值输出到页面上 out.println(this.val); } } catch (IOException e) { // 如果异常,在控制台抛出异常提示 throw new JspException("out标签异常", e); } return SKIP_BODY;// 返回SKIP_BODY } }
2.3.2 编写 tld文件,(必须放在 WEB-INF同目录或WebContext目录下)(示例YXmvc.tld)
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <!-- 标签库描述符 --> <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Simple Tags</short-name> <uri>/YX</uri> <tag> <!-- 标签名 --> <name>ouut</name> <!--标签助手类 --> <tag-class>com.YX.JSP.OuutTag</tag-class> <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 --> <body-content>empty</body-content> <!-- 定义属性 --> <attribute> <!--属性名 OutTag类中的val属性相匹配 --> <name>val</name> <!--表示该属性为必要的属性 --> <required>true</required> <!-- 该属性可以接受EL表示式的值 --> <rtexprvalue>true</rtexprvalue> <!-- 标签描述,用于说明标签的作用 --> <description>out标签val属性,用于输出val的值</description> </attribute> <attribute> <!-- 属性名, OutTag类中的defaultVal属性相匹配 --> <name>defaultVal</name> <!-- 表示该属性为必要的属性 --> <required>false</required> <!-- 该属性可以接受EL表示式的值 --> <rtexprvalue>false</rtexprvalue> <!-- 标签描述,用于说明标签的作用 --> <description>out标签,如val属性值为空,则输出该默认值</description> </attribute> </tag> </taglib>
2.3.3 新建一个jsp文件引入所写的标签
<%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="yx" uri="/YX"%> <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>自定义标签</title> </head> <body> <!--自定义out标签输出 --> <yx:ouut val="你好我是自定义标签out,val属性输出" /> <!--自定义out标签EL表达式使用 --> <% request.setAttribute("name", "我是在作用域的文件,利用EL表达式获取"); %> <yx:ouut val="${name }" /> </body> </html> </body> </html>
页面显示结果
3. jsp自定义标签生命周期
3.1 图解:
3.2 阶段:
1.加载阶段(Loading Phase):当JSP页面被请求时,容器会读取该页面对应的标签库文件,检查其中所有的自定义标签,并将它们编译成Java类。这个过程只会在第一次请求时执行一次。
2.初始化阶段(Initialization Phase):在加载完所有的标签类后,容器会对这些类进行初始化,根据标签的不同实现类的初始化也会不同。
3.执行阶段(Execution Phase):当页面请求需要执行自定义标签时,容器会使用相应的标签处理器,通过调用标签处理器的相应方法来执行标签。
4.销毁阶段(Destroy Phase):当JSP页面的请求完成后,容器会销毁所有与该页面相关的资源,包括初始化过的标签类。在这个阶段,可以对自定义标签的属性和内部对象进行清理操作,以释放系统资源。
3.3 返回值
返回值 | 返回值说明 |
SKIP_BODY | 跳过主体 |
EVAL_BODY_INCLUDE | 计算标签主体内容并输出 |
EVAL_BODY_AGAIN | 再计算主题一次 |
EVAL_PAGE | 计算页面的后续部分 |
SKIP_PAGE | 跳过页面的后续部分 |
3.4 开发场景
如图示
doStartTag()----->doEndTag()场景一般用于像上面的out标签
doStartTag()------->doAfterBody()场景一般用于像if标签----------->doEndTag()
doStartTag()------->doAfterBody(循环)----------->doEndTag()场景一般用于像foreach的标签。
4. 自定义的if标签
4.1 编写if自定义标签助手类
package com.YX.JSP.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; /** * 标签助手类(if标签) * @author 86158 * */ public class IfTag extends BodyTagSupport{ private boolean test;//定义一个属性代表if标签判断的结果 // 获取set的方法 public void setTest(boolean test) { this.test = test; } // 编写doStartTag方法 @Override public int doStartTag() throws JspException { System.out.println("=========doStartTag======"); if (this.test) {//结果为true就执行计算后面的语句体 return EVAL_BODY_INCLUDE; } return SKIP_BODY; } //后面的方法方便看到if标签的一个生命周期 @Override public int doAfterBody() throws JspException { System.out.println("=========doAfterBody======"); return super.doAfterBody(); } @Override public int doEndTag() throws JspException { System.out.println("=========doAfterBody======"); return super.doEndTag(); } }
4.2 在.tld文件中添加if标签
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <!-- 标签库描述符 --> <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Simple Tags</short-name> <!--设置导入的路径名 --> <uri>/YX</uri> <tag> <!-- 添加if标签 --> <name>if</name> <!--设置标签助手类 --> <tag-class>com.YX.JSP.tag.IfTag</tag-class> <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 --> <body-content>JSP</body-content> <!--设置属性名 --> <attribute> <name>test</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
4.3 在jsp页面中引入if标签
![if标签控制台输出](C:\Users\86158\Desktop\截图\jsp自定义标签01\if标签控制台输出.png)<%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="yx" uri="/YX"%> <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>自定义标签</title> </head> <body> <!-- 自定义if标签的使用 --> <yx:if test="${100==100}"> 测试text结果是为true </yx:if> <br> <yx:if test="${100!=100}"> 测试text结果是为true </yx:if> </body> </html> </body> </html>
页面输出结果
控制台输出结果
5. 自定义set标签和out标签
out标签2.3案例演示中包含了
5.1 新建一个set标签助手类和out标签助手类
set标签助手类
package com.YX.JSP.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; /** * Set标签助手类 * 数据标签,存储数据 * 作用:page.Context,request,session,application * * 要存储数据以键值对的形式存储,分析得来两个标签属性 * @author 君易--鑨 * */ public class SetTag extends BodyTagSupport{ private String var;//set标签要存入的属性名 private Object value;//set标签要存入的属性值 // 获取set、get方法 public String getVal() { return var; } public void setVal(String val) { this.var = val; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } @Override public int doStartTag() throws JspException { pageContext.setAttribute(var, value); return super.doStartTag(); } }
out标签助手类
package com.YX.JSP.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; /** * out标签助手类 * @author 君易--鑨 * */ public class OutTag extends BodyTagSupport{ private Object value;//页面要输出的值 // 获取set和get方法 public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } // 编写doStartTag方法 @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(); } }
5.2 在后缀名.tld中添加set和out标签
<taglib> <!-- 添加set标签 --> <tag> <name>set</name> <!--设置标签助手类 --> <tag-class>com.YX.JSP.tag.SetTag</tag-class> <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 --> <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> <!--添加out标签 --> <tag> <!--标签名 --> <name>out</name> <!-- 标签助手类 --> <tag-class>com.YX.JSP.tag.OutTag</tag-class> <body-content>JSP</body-content> <!--设置属性名 --> <attribute> <name>value</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
5.3 在jsp页面中运用
<%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="yx" uri="/YX"%> <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>自定义标签</title> </head> <body> <!-- set与out --> <%-- <yx:set var="name" value="君易--鑨"></yx:set> --%> <yx:set var="name" value="君易--鑨"></yx:set> <yx:out value="${name }"></yx:out> </body> </html> </body> </html>
页面输出结果