原文链接:https://blog.csdn.net/qq_40369435/article/details/81081697
第三章我们遇见了一个JSP标签,为了让接下来的学习能更清晰地认识标签,故做了以下hello.jsp中的hello标签与web.xml标签中的<taglib>元素,mytaglib.tld文件中的<tag>元素,以及HelloTag.class文件之前的对应关系
1.1认识JSP标签
标签编程在实际工作的开发中并不是很常见,也就是说自己开发标签的情况基本上是不存在的。因为这个与开发环境所限制,自己开发后的标签没有通用性。所有在实际中都是大量使用以及开发号的标签。例如JSTL或者Struts中都有标签。在这里学习自定义标签是为了建立一个完整的知识体系,更好的学习后边的内容。
在JSP开发中就是在HTML代码中嵌入了大量的Java代码,这样一来使JSP页面充满了Java程序,维护起来非常不方便,那么此时就可以通过标签来完成。
如果用户想要定义一个标签的话,直接继承TagSupport类
定义标签支持类:HelloTag.java
package org.lxh.tagdemo ; import javax.servlet.jsp.* ; import javax.servlet.jsp.tagext.* ; public class HelloTag extends TagSupport{ public int doStartTag() throws JspException{ JspWriter out = super.pageContext.getOut() ; try{ out.println("<h1>Hello World!!!</h1>") ; }catch(Exception e){} return TagSupport.SKIP_BODY ; } }
在标签开发之中最麻烦的就是返回值,下面给出一个返回值,由于现在定义的是一个没有标签体的标签,所有该返回值表示标签的其他内容不再执行。(导入jsp-api.jar包)
只靠一个标签的支持类是无法完成全部功能的。下面还需要定义一个标签的描述文件,标签的描述文件的后缀“tld”,
<?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_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>firsttag</short-name> <tag> <name>hello</name> <tag-class>org.lxh.tagdemo.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
之后是JSP中的用法: <%@ page contentType="text/html" pageEncoding="GBK"%> <%@ taglib prefix="mytag" uri="mldn_hello"%> <html> <head><title>www.baidu.com</title></head> <body> <h1><mytag:hello/></h1> </body> </html> 也可以在XML文件中进行设置映射: <taglib> <taglib-uri>mldn_hello</taglib-uri> <taglib-location>/WEB-INF/hellotag.tld</taglib-location> </taglib> 在一个JSP文件中,基本功能:判断,输出。所有需要学更多的标签操作。
1.2定义有属性的标签
对于属性:<jsp:forward page=""/>,下载也可以自己定义属性。
下面定义一个可以完成日期格式化显示的操作,希望用户可以输入自己的日期的格式化的模板,根据此模板完成当前日期的显示操作。
标签处理类;
package org.lxh.tagdemo ; import java.text.* ; import java.util.* ; import javax.servlet.jsp.* ; import javax.servlet.jsp.tagext.* ; public class DateTag extends TagSupport { private String format ; // 当设置属性的时候可以通过setter完成 public int doStartTag() throws JspException{ SimpleDateFormat sdf = new SimpleDateFormat(this.format) ; // 表示进行格式化的日期显示操作 try{ super.pageContext.getOut().write(sdf.format(new Date())) ; }catch(Exception e){ e.printStackTrace() ; // 异常处理操作 } return TagSupport.SKIP_BODY ; } public void setFormat(String format){ this.format = format ; } public String getFormat(){ return this.format ; } }
之后编写“tld”文件
<?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_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>datetag</short-name> <tag> <name>date</name> <tag-class>org.lxh.tagdemo.DateTag</tag-class> <body-content>empty</body-content> <attribute> <name>format</name> <required>true</required><!--此属性必须设置--> <rtexprvalue>true</rtexprvalue><!--支持表达式输出--> </attribute> </tag> </taglib>
在xml文件中设置tld文件的路径
<jsp-config>
<taglib>
<taglib-uri>mldn_date</taglib-uri>
<taglib-location>/WEB-INF/datetag.tld</taglib-location>
</taglib>
</jsp-config>
在JSP文件中进行操作:
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ taglib prefix="mytag" uri="mldn_date"%> <html> <head><title>www.mldnjava.cn</title></head> <body> <h1><mytag:date format="yyyy-MM-dd HH:mm:ss.SSS"/></h1> </body> </html>
此处的format就是标签操作中所需的属性,而此属性操作时,必须有响应的setter()和getter()方法进行接收。
1.3TagSupport类
标签的实现都需要继承TagSupport这个类,所以TagSupport类是整个标签编程的核心类。