来看看javaweb的自定义标签

2018-10-29 15:32:49来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

1.为什么需要自定义标签?

jsp的简单标签其实就是jsp的自定义标签,主要作用就是移除jsp页面中的java代码,使得jsp页面只有标签和EL表达式,而没有java代码。利用自定义标签,可以使软件开发人员和页面设计人员合理分工,页面设计人员可以把精力集中在使用标签(html,xml或jsp)创建网站上,而软件开发人员则可以将精力集中在实现底层功能上面。

2.什么是自定义标签?

用户定义的一种自定义的jsp标记。当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为标签处理类的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后实际上tag标签被转化成了对tag处理类的操作。

3.标签库API

标签库API定义在javax.servlet.jsp.tagext包中,

左边的三个接口Tag接口,IterationTag接口和BodyTag接口以及两个实现类TagSupport类和BodyTagSupport类为传统标签(导入传统标签,右击项目,Build Path->Add Libraries->MyEclipse Library->next->JSTL...Library),右边的一个接口SimpleTag接口和一个实现类SimpleTagSupport类为自定义标签。即所有标签处理器类实现了Tag接口的标签为传统标签,实现SimpleTag接口的标签为简单标签。简单标签可以实现传统标签的一切功能,而且开发起来更容易。开发自定义标签核心就是要编写处理器类,需要继承的就是SimpleTagSupport类。SimpleTagSupport类实现了SimpleTag接口。

标签的形式:

  • 空标签:<hello/>
  • 带有属性的空标签:<max num="3" num2="5"/>
  • 带有内容的标签:<greeting>hello</greeting>
  • 带有内容和属性的标签:<greeting name="Tom">hello</greeting>

4.自定义标签的开发与应用步骤

  • 编写完成标签功能的java类(标签处理器)
  • 编写标签库描述(tld)文件,在tld文件中对自定义标签进行描述
  • 在jsp页面中导入和使用自定义标签

示例如下:

编写完成标签功能的java类:

HelloSimpleTag.java

package com.javaweb.tag;

import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;

public class HelloSimpleTag implements SimpleTag {

	@Override
	public void doTag() throws JspException, IOException {
		// TODO Auto-generated method stub
		System.out.println("doTag");
	}

	@Override
	public JspTag getParent() {
		// TODO Auto-generated method stub
		System.out.println("getParent");
		return null;
	}

	@Override
	public void setJspBody(JspFragment arg0) {
		// TODO Auto-generated method stub
		System.out.println("setJspBody");
	}

	@Override
	public void setJspContext(JspContext arg0) {
		// TODO Auto-generated method stub
		System.out.println("setJspContext");
	}

	@Override
	public void setParent(JspTag arg0) {
		// TODO Auto-generated method stub
		System.out.println("setParent");
	}

}

 编写标签库描述(tld)文件,在tld文件中对自定义标签进行描述:

helloTag.tld

<?xml version="1.0" encoding="UTF-8"?>

<taglib 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-jsptaglibrary_2_1.xsd"
    version="2.1">
  <!-- 描述TLD文件 -->
  <description>MyTag 1.1 core library</description>
  <display-name>MyTag core</display-name>
  <tlib-version>1.1</tlib-version>
  <!-- 建议在jsp页面上使用的标签的前缀 -->
  <short-name>koala</short-name>
  <!-- 作为tld文件的id,用来唯一标识当前的TLD文件,多个TLD文件的URI不能重复,通过jsp页面的taglib标签的uri属性来引用 -->
  <uri>http://www.com.koala/jsp/jstl/core</uri>
  <!-- 描述自定义的HelloSimpleTag标签 -->
  <tag>
  <!-- 标签的名字 -->
  <name>hello</name>
  <!-- 标签所在的全类名(.java文件所在的全类名) -->
  <tag-class>com.javaweb.tag.HelloSimpleTag</tag-class>
  <!-- 标签体的类型 -->
  <body-content>empty</body-content>
  </tag>
</taglib>

 在jsp页面中导入和使用自定义标签:

simpletag.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 导入标签库(描述文件) -->
<%@taglib uri="http://www.com.koala/jsp/jstl/core" prefix="koala" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'simpletag.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <koala:hello/>
  </body>
</html>

在jsp中导入和使用自定义标签时需注意:

<%@taglib uri="http://www.com.koala/jsp/jstl/core" prefix="koala" %>对应于.tld文件中的<uri>http://www.com.koala/jsp/jstl/core</uri>和<short-name>koala</short-name>,<koala:hello/>对应于.tld文件中的<short-name>koala</short-name>和<name>hello</name>。

在上面的例子中,

①创建一个标签处理类,实现了SimpleTag接口

public class HelloSimpleTag implements SimpleTag {}

②在WEB-INF文件夹下新建一个.tld为扩展名的xml文件,并考入固定的部分,并对description,display-name,tlib-version,short-name,uri做出修改

  <description>MyTag 1.1 core library</description>
  <display-name>MyTag core</display-name>
  <tlib-version>1.1</tlib-version>
  <!-- 建议在jsp页面上使用的标签的前缀 -->
  <short-name>koala</short-name>
  <!-- 作为tld文件的id,用来唯一标识当前的TLD文件,多个TLD文件的URI不能重复,通过jsp页面的taglib标签的uri属性来引用 -->
  <uri>http://www.com.koala/jsp/jstl/core</uri>

③在tld文件中描述自定义标签

  <tag>
  <!-- 标签的名字 -->
  <name>hello</name>
  <!-- 标签所在的全类名(.java文件所在的全类名) -->
  <tag-class>com.javaweb.tag.HelloSimpleTag</tag-class>
  <!-- 标签体的类型 -->
  <body-content>empty</body-content>
  </tag>

⑤在jsp页面上使用自定义的标签

>使用taglib指令导入标签库描述文件:

<%@taglib uri="http://www.com.koala/jsp/jstl/core" prefix="koala" %>

>使用自定义的标签

<body>
   <koala:hello/>
</body>

 


 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Eureka介绍

下一篇:列表选择模式:单选、按shift、按shift或ctrl