您的位置:首页 > Web前端 > JavaScript

jsp2的自定义标签基本用法

2018-03-21 17:27 369 查看
jsp规范的1.1版中增加了自定义标签库规范,自定义标签库是一种非常优秀的表现层组件技术.通过使用自定义标签库么可以在简单的标签中封装复杂的功能. jsp标签库的作用:主要为了取代丑陋的jsp脚本.在HTML页面中插入jsp脚本有如下坏处:jsp脚本非常丑陋,难以阅读.jsp脚本和html代码混杂,维护成本高.html页面中嵌入jsp脚本,导致美工人员难以参与开发. 为了能够解决上述三点,需要一种可以在页面中使用的标签,这种标签具有和HTML标签类似的语法.但又可以完成jsp脚本的功能-这种标签就是jsp自定义标签. 在jsp2中开发标签库只需要如下步骤:1.开发自定义标签处理类2. 建立一个.tld文件.每个*.tld文件对应一个标签库,每个标签库可包含多个标签3.在jsp文件中使用自定义标签.
开发自定义标签类 在jsp页面使用一个简单的标签时,底层实际上由标签处理类提供支持,从而可以通过简单的标签来封装复杂的功能,从而使团队更好地协作开发自定义标签类应该继承一个父类:javax.sevlet.jsp.tegext.tagetxt.SimpleTagSupport.除此之外,jsp自定义标签类还有如下要求:1.如果标签类包含属性,每个属性都有对应地getter和setter方法.2.重写doTag()方法,这个方法负责生成页面内容.
建立TLD文件 TLD标签库定义,文件地后缀使tld,每个TLD文件对应一个标签,一个标签中可包含多个标签.TLD文件也称为标签库定义文件. 标签库定义文件地根元素使taglib,可以包含多个tag子元素,每个tag子元素都定义一个标签.通常我们可以到wEB容器下复制一个标签库定义文件,并在此基础上进行修改即可.
<?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>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>

<short-name>mytaglib</short-name>
<uri>http://www.crazyit.org/mytaglib</uri>
<tag>
<name>helloWorld</name>
<tag-class>demo.HelloWorldTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>

上面地标签库定义文件也是一个标准的XML文件,该XML文件的根元素是taglib元素,因此我们每次编写标签库定义文件时都直接添加该元素即可.taglib的子元素:tlib-version: 指定该标签库实现的版本,这是一个作为表示的内部版本号,对程序没有太大的作用.short-name:该标签库的默认短名,该名称通常也没有太大的用处uri:这个属性很重要,它指定该标签库的URL,相当于指定该标签库的唯一标识,jsp页面中使用标签库文件时就是根据该URL属性来定位标签库的.除此之外,taglib元素下可以包含多个tag元素,每个tag元素定义一个标签,tag元素下允许出现的的子元素.name:该标签库的名称,这个子元素很重要,jsp页面中就是根据该名称来使用标签的.tag-class:指定标签的处理类,毋庸置疑,这个子元素非常重要,它指定了标签由那个标签处理类来处理.body-content:这个子元素也很重要.它指定标签体内容.该子元素的值可以是如下几个:empty:指定该标签只能作为空标签使用.tagdependent:指定标签处理类自己负责处理标签体scriptless:指定该标签的标签体可以是静态HTML元素,表达式语言,但不允许出现jsp脚本.dynamic-attribute:指定该标签是否支持动态属性.只有当定义动态属性标签时,才需要该子元素 jsp2规范不再推荐使用jsp,所以JSP2自定义标签的标签体中不能包含jsp脚本.所以,实际上body-content元素的值不可以时jsp. 定义了上面的标签库定义文件后,将标签库文件放在web应用的WEB-INF路径或任意子路径下,javaweb规范自动加载该文件,则该文件定义的标签库也将生效. 使用标签库在jsp页面中确定指定的标签需要亮点1.标签库URL:确定使用哪个标签库.2.标签名:确定使用哪个标签使用标签库分为以下两个步骤:1.导入标签库:使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来2.使用标签:在jsp页面中使用自定义标签.
<%@taglib uri="" prefix=""%>
uri:确定标签库的URLprefix:指定标签库前缀,即所有使用该前缀的标签将由此标签库处理案例:使用自定义标签输出"hello World",并显示当前时间.如下图:



helloWorldTag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>标签库的内容</h2>
<mytag:helloWorld/><br>
</body>
</html>
mytaglib.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_0.xsd" version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>mytaglib</short-name>
<uri>http://www.crazyit.org/mytaglib</uri>
<tag>
<name>helloWorld</name>
<tag-class>demo.HelloWorldTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>

HelloWorldTag.java
package demo;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class HelloWorldTag extends SimpleTagSupport{

@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
getJspContext().getOut().write("hello World  "+new java.util.Date());
}

}
如下图:

从实例代码中可以看出:jsp中没有了jsp脚本,jsp脚本已经被自定义标签取代了.代码看起来更简洁,明了.分工更加明确.
带属性的标签:前面的属性标签既没有属性,也没有标签体,用法,功能都比较简单.实际上还有如下两种常用的标签:1.带属性的标签 带属性标签必须为每个属性提供对应的setter和getter方法.2.带标签体的标签案例:连接数据库,使用自定义标签输出数据库中所有的信息.如下图:

queryTag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://www.crazyit.org/taglib" prefix="tag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<tag:QueryTag url="jdbc:mysql://localhost:3306/date" user="root"
pass="123456" driver="com.mysql.jdbc.Driver" sql="select *from student" />
</body>
</html>
taglib.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_0.xsd" version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>taglib</short-name>
<uri>http://www.crazyit.org/taglib</uri>
<tag>
<name>QueryTag</name>
<tag-class>demo.QueryTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>driver</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>user</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<!-- 设置该属性名,子元素的值是字符串内容 -->
<name>pass</name>
<!-- 设置该属性是否为必需属性,该元素的值
bc3a
true或者false -->
<required>true</required>
<!--设置该属性是否支持jsp,表达式等动态内容,子元素的值是true或者false -->
<fragment>true</fragment>
</attribute>
<attribute>
<name>sql</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
</taglib>

QueryTag.java(这个自定义标签,说来也奇怪,分明是让jsp脚本不跟html混淆在一起,现在又把HTML跟java一起?应该还有另一种更好的解决方式....)QueryTag.java
package demo;

import java.io.IOException;
import java.io.Writer;
import java.sql.DriverManager;
import java.sql.ResultSet;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class QueryTag extends SimpleTagSupport {

public String getDriver() {
return driver;
}

public void setDriver(String driver) {
this.driver = driver;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getUser() {
return user;
}

public void setUser(String user) {
this.user = user;
}

public String getPass() {
return pass;
}

public void setPass(String pass) {
this.pass = pass;
}

public String getSql() {
return sql;
}

public void setSql(String sql) {
this.sql = sql;
}

private String driver;
private String url;
private String user;
private String pass;
private String sql;

@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
try {
Class.forName(driver);
java.sql.Connection connection = DriverManager.getConnection(url, user, pass);
java.sql.Statement statement = connection.createStatement();
ResultSet rSet = statement.executeQuery(sql);
Writer out = getJspContext().getOut();
out.write("<table border='1' cellspacing='0'>");
while (rSet.next()) {
out.write("<tr><td>");
out.write(rSet.getString(1));
out.write("</td><td>");
out.write(rSet.getString(2));
out.write("</td></tr>");
}
out.write("</table>");

} catch (ClassNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

}

运行后,如下图:

数据库中:


在jsp页面中只需要使用简单的标签,即可完成"复杂"的功能:执行数据库查询,并将查询结果在页面上以表格形式显示. 自定义标签的目的:以简单的标签,隐藏复杂的逻辑.标签是表现层组件,不应该包含任何业务实现代码,更不应该执行数据库访问,它只负责显示逻辑.
案例:动态属性标签有时候.属性的个数是不明确的,这时候,就需要借助动态属性的标签了.动态属性标签比普通标签多了如下两个额外请求:1.标签处理类还需要实现DynamicAttributes接口.2.配置标签时通过<dynamic-attribute>一元素指定该标签支持动态属性.如下图:动态添加属性名和属性值并显示在页面上

dyAtt.jsp(页面显示)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://www.crazyit.org/Dytaglib"  prefix="mytag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<mytag:DynaTag name="crazyit" url="crazyit.org"/>
<mytag:DynaTag 书名="jsp" 介格="99.0" 出版时间 = "2008" 描述="java"/>
</body>
</html>

Dytglib.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_0.xsd" version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>Dytaglib</short-name>
<uri>http://www.crazyit.org/Dytaglib</uri>
<tag>
<name>DynaTag</name>
<tag-class>demo.DynaTag</tag-class>
<body-content>empty</body-content>
<dynamic-attributes>true</dynamic-attributes>
</tag>

</taglib>
DynaTag.java(自定义动态标签)
package demo;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.DynamicAttributes;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class DynaTag extends SimpleTagSupport implements DynamicAttributes {
private ArrayList<String> keys = new ArrayList<String>();
private ArrayList<Object> values = new ArrayList<Object>();

@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspWriter out = getJspContext().getOut();
out.println("<ol>");
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
Object value = values.get(i);
out.println("<li>" + key + "=" + value + "</li>");
}
out.println("</ol>");
}

@Override
public void setDynamicAttribute(String url, String loca, Object value) throws JspException {
// TODO Auto-generated method stub
keys.add(loca);
values.add(value);
}

}
关于自定义标签还有以下两种情况(后续补充):

1.带标签体的标签
2.以页面片段作为属性的标签
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: