欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义JSP标签01

程序员文章站 2022-05-30 21:26:03
...

第三章我们遇见了一个JSP标签,为了让接下来的学习能更清晰地认识标签,故做了以下hello.jsp中的hello标签与web.xml标签中的<taglib>元素,mytaglib.tld文件中的<tag>元素,以及HelloTag.class文件之前的对应关系

自定义JSP标签01

12.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标签01

之后是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文件中,基本功能:判断,输出。所有需要学更多的标签操作。

12.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()方法进行接收。

12.3TagSupport类

标签的实现都需要继承TagSupport这个类,所以TagSupport类是整个标签编程的核心类。

自定义JSP标签01

自定义JSP标签01

自定义JSP标签01

首先标签定义完成之后将执行doStartTag()方法,之后判断方法的返回值,如果是返回EVAL_BODY_INCLUDE则表示要执行标签体:(doAfterTag()),如果返回的SKIP_BODY,表示标签准备结束了。

自定义JSP标签01

下面为了进一步巩固来定义一个有标签体的标签库。

本程序完成一个判断的操作,判断在某一属性范围内,是否存在指定的属性名称,若存在则输出。

支持标签类:

package org.lxh.tagdemo ;
import java.io.* ;
import javax.servlet.jsp.* ;
import javax.servlet.jsp.tagext.* ;

public class AttributeTag extends TagSupport {
	private String name ;	// 接收属性的名称
	private String scope ;	// 接收属性的范围
	
	public int doStartTag()
               throws JspException{	// 是判断属性是否存在
		Object value = null ;
		if("page".equals(this.scope)){	// 是否是page范围
			value = super.pageContext.getAttribute(this.name,PageContext.PAGE_SCOPE) ;
		}
		if("request".equals(this.scope)){	// 是否是request范围
			value = super.pageContext.getAttribute(this.name,PageContext.REQUEST_SCOPE) ;
		}
		if("session".equals(this.scope)){	// 是否是session范围
			value = super.pageContext.getAttribute(this.name,PageContext.SESSION_SCOPE) ;
		}
		if("application".equals(this.scope)){	// 是否是request范围
			value = super.pageContext.getAttribute(this.name,PageContext.APPLICATION_SCOPE) ;
		}
		if(value == null){	// 表示现在根本就没有此属性
			return TagSupport.SKIP_BODY ;	// 没有属性不执行标签体
		} else {
			return TagSupport.EVAL_BODY_INCLUDE ;	// 执行标签体
		}
	}

	public void setName(String name){
		this.name = name ;
	}
	public void setScope(String scope){
		this.scope = scope ;
	}
	public String getName(){
		return this.name ;
	}
	public String getScope(){
		return this.scope ;
	}
}

需要定义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>mldntag</short-name>
    <tag>
	<name>present</name>
	<tag-class>org.lxh.tagdemo.AttributeTag</tag-class>
	<body-content>JSP</body-content>
	<attribute>
		<name>name</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
	<attribute>
		<name>scope</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
    </tag>
</taglib>

定义tld路径映射的xml文件:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
	<jsp-config>
		<taglib>
			<taglib-uri>mldn_date</taglib-uri>
			<taglib-location>/WEB-INF/datetag.tld</taglib-location>
		</taglib>
		<taglib>
			<taglib-uri>mldn</taglib-uri>
			<taglib-location>/WEB-INF/mldntag.tld</taglib-location>
		</taglib>
	</jsp-config>
	<resource-ref>
		<res-ref-name>jdbc/mldn</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>
</web-app>

完成JSP文件:

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="mytag" uri="mldn"%>
<html>
<head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
<body>
	<%
		String scope = "session" ;	// 假设现在判断的是session范围
		session.setAttribute("username","李兴华") ;
	%>
	<mytag:present name="username" scope="<%=scope%>">
		<h2><%=scope%>范围存在属性,内容是:“${sessionScope.username}”</h2>
	</mytag:present>
	<mytag:present name="allusers" scope="request">
		<h2>request范围存在属性,内容是:“${requestScope.allusers}”</h2>
	</mytag:present>
</body>
</html>

关于自定义标签的学习看书实在费劲,而且涉及的类比较多,所以我选择看视频,然后和通过笔记进行学习。我所选择的是李兴华老师的视频讲解,讲得很详细,推荐大家去学习李兴华老师的课程。

                                                                                                                                                             2018 07 17