1.JSP标签介绍
1.1 指令标签
指令标签用于通知JSP引擎如何处理JSP页面或应包含哪些资源。通常包含page、include、taglib等标签。
1.2 声明标签
声明标签用于定义全局变量或方法。
1.3 表达式标签
表达式标签用于在JSP页面中嵌入表达式。
<%= %>标签可用于输出表达式的值。
1.4 注释标签
注释标签用于对JSP页面的部分进行注释说明。
<%-- --%>标签可以用于多行注释。
1.5 动作标签
动作标签用于JSP页面中的业务处理。
- jsp:forward标签用于将请求转发到其他页面。
- jsp:include标签用于在当前页面中包含其他页面。
- jsp:useBean标签用于在JSP页面中创建JavaBean对象。
- jsp:setProperty和jsp:getProperty标签分别用于设置和获取JavaBean对象的属性。
- jsp:scriptlet标签用于在JSP页面中嵌入Java代码。
- jsp:expression标签用于在JSP页面中嵌入 Java 表达式。
除了以上标签,JSP还支持自定义标签,开发者可以基于Java类和API的扩展,创建自己的标签库。自定义标签的好处是可以达到更好的模块化和抽象化,提高代码重用性和可维护性。同时,JSP也支持标签文件,可以把标签的定义和标签处理逻辑进行分离和聚合。
2.JSP标签语言特点
JSP标签语言的特点如下:
2.1 形式:
<开始标签 属性=“属性值”>标签体</结束标签>
2.2 灵活性
JSP标签语言能够让开发者使用基本的HTML标签和表达式标签,同时也可以灵活地添加其它标签,以满足各种程序的需要。
2.3 代码可重用性
JSP标签语言支持自定义标签,可以将复杂的业务逻辑封装到标签中,实现代码的重用性。
2.4 可维护性
JSP标签语言的模块化结构便于维护和扩展,标签的定义和标签处理逻辑进行分离和聚合,更容易复用和修改,提高了代码的可维护性。
2.5 交互性强
JSP标签语言内置动作标签,可以方便地与服务器进行交互,实现了服务器与客户端之间的数据交互。
动态性:JSP标签语言的表达式标签和动态脚本语言可以让开发者根据需要在页面中动态地生成html代码。这样可以根据页面的不同动态生成不同的HTML代码,给大家带来更好的用户体验。
3.自定义标签的开发及使用步骤
自定义标签是指根据开发者自身需求新建的标签。JSP自定义标签的开发步骤如下:
3.1 新建标签处理器类
开发者需要新建一个类,该类需要继承javax.servlet.jsp.tagext.TagSupport类或其子类,并实现对应的处理标签逻辑。
3.2 定义标签库描述文件
开发者需要创建一个TLD文件,对自定义标签进行描述,包括标签名称、描述、使用属性等。
3.3 引入标签库并使用自定义标签
在jsp页面中需要使用自定义标签时,需要在头部引入标签库描述文件,并使用该标签。
通过Web容器的部署管理工具将自定义标签和标签处理器类打成jar包,并放置在Web容器的LIB目录或WEB-INF/lib目录下。
package com.yuan.jsp; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; public class Demo1Tag extends BodyTagSupport{ @Override public int doStartTag() throws JspException { System.out.println("123"); return super.doStartTag(); } @Override public int doAfterBody() throws JspException { System.out.println(111); return super.doAfterBody(); } @Override public int doEndTag() throws JspException { System.out.println("321"); return super.doEndTag(); } } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26
<?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>y</short-name> <uri>http://java.yuan.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>catch</name> <tag-class>com.yuan.jsp.Demo1Tag</tag-class> <body-content>JSP</body-content> <attribute> <name>var</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26 • 27 • 28 • 29 • 30 • 31 • 32 • 33
4. 标签生命周期
以下是JSP标签的生命周期:
4.1 解析阶段
在解析阶段,标签指令被解析器识别、分离、分析和存储。JSP解析器会将所有的标签控制块解析成标签处理器节点,并建立它们之间的关系。
4.2 实例化阶段
在解析阶段之后,标签处理器会在JSP页面第一次运行时实例化。JSP容器会为每个标签处理器生成一个实例对象,并调用它的初始化方法,用于执行一些初始化操作。
4.3 设置标签属性阶段
在标签处理器实例化之后,JSP容器会根据标签中的属性值将标签属性设置到标签处理器实例中。这个过程会调用标签处理器的setter方法,并传递相应的属性值。
4.4 处理标签体阶段
如果标签包含主体内容,JSP容器会调用标签处理器的doAfterBody()方法重复处理标签主体内容,直到doAfterBody()方法返回SKIP_BODY。这个过程通常用于处理循环标签、条件标签等。
4.5 处理结束阶段
在标签主体和嵌套标签处理完后,JSP容器调用标签处理器的doEndTag()方法进行标签处理器的结束操作。这个方法通常用于清除资源,例如关闭连接、清空数据缓存等。
4.6 释放阶段
在标签处理器的doEndTag()方法执行完成后,JSP容器会调用标签处理器的release()方法释放资源。
<?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>y</short-name> <uri>http://java.yuan.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>catch</name> <tag-class>com.yuan.jsp.Demo1Tag</tag-class> <body-content>JSP</body-content> <attribute> <name>var</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> <tag> <name>if</name> <tag-class>com.yuan.jsp.IfTag</tag-class> <body-content>JSP</body-content> <attribute> <name>text</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>set</name> <tag-class>com.yuan.jsp.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.yuan.jsp.OutTag</tag-class> <body-content>JSP</body-content> <attribute> <name>value</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26 • 27 • 28 • 29 • 30 • 31 • 32 • 33 • 34 • 35 • 36 • 37 • 38 • 39 • 40 • 41 • 42 • 43 • 44 • 45 • 46 • 47 • 48 • 49 • 50 • 51 • 52 • 53 • 54 • 55 • 56 • 57 • 58 • 59 • 60 • 61 • 62 • 63 • 64 • 65 • 66 • 67 • 68 • 69 • 70 • 71 • 72 • 73 • 74
package com.yuan.jsp; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; public class IfTag extends BodyTagSupport{ private boolean text; public boolean isText() { return text; } public void setText(boolean text) { this.text = text; } @Override public int doStartTag() throws JspException { return text?EVAL_BODY_INCLUDE:SKIP_BODY; } } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26 • 27
package com.yuan.jsp; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; 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(); } } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26 • 27 • 28 • 29 • 30 • 31 • 32 • 33 • 34 • 35
package com.yuan.jsp; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; public class SetTag extends BodyTagSupport{ private String var; private Object value; public String getvar() { return var; } public void setvar(String var) { this.var = var; } 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(); } } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26 • 27 • 28 • 29 • 30 • 31 • 32 • 33 • 34 • 35 • 36 • 37 • 38 • 39 • 40
5.总结
JSP标签是JSP中的一种扩展功能,可以帮助用户将动态数据插入到JSP页面中。JSP标签分为内置标签和自定义标签两种类型。
内置标签是JSP提供的标准标签库,包括核心标签库、格式化标签库、SQL标签库、XML标签库等。它们提供了丰富的功能,如控制页面流程、格式化数据、操作数据库和生成XML文档等。
自定义标签是用户自己定义的标签,可以根据实际需要实现特定的功能。自定义标签分为标签文件和标签类两种形式。标签文件是一种基于XML的标记语言,类似于HTML,可以通过标签文件定义标签的属性、主体内容和处理逻辑。标签类则是一种Java类,实现了标签处理器的接口,并提供了标签的执行逻辑,可以通过Java代码编写标签的执行过程。
JSP标签可以帮助用户解决复杂的业务需求,并提高Web应用程序的灵活性和可维护性。使用内置标签可以方便地完成通用的操作,而自定义标签可以将业务逻辑集成到标签中,实现更高层次的抽象和封装。