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文件,该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页面中使用自定义标签.
![](//img-blog.csdn.net/20180321172328346)
![](//img-blog.csdn.net/20180321172348559)
helloWorldTag.jsp
HelloWorldTag.java
![](//img-blog.csdn.net/20180321172409356)
从实例代码中可以看出:jsp中没有了jsp脚本,jsp脚本已经被自定义标签取代了.代码看起来更简洁,明了.分工更加明确.
带属性的标签:前面的属性标签既没有属性,也没有标签体,用法,功能都比较简单.实际上还有如下两种常用的标签:1.带属性的标签 带属性标签必须为每个属性提供对应的setter和getter方法.2.带标签体的标签案例:连接数据库,使用自定义标签输出数据库中所有的信息.如下图:
![](//img-blog.csdn.net/20180321172425422)
queryTag.jsp
QueryTag.java(这个自定义标签,说来也奇怪,分明是让jsp脚本不跟html混淆在一起,现在又把HTML跟java一起?应该还有另一种更好的解决方式....)QueryTag.java
运行后,如下图:
![](//img-blog.csdn.net/20180321172450687)
数据库中:
![](//img-blog.csdn.net/20180321172506243)
在jsp页面中只需要使用简单的标签,即可完成"复杂"的功能:执行数据库查询,并将查询结果在页面上以表格形式显示. 自定义标签的目的:以简单的标签,隐藏复杂的逻辑.标签是表现层组件,不应该包含任何业务实现代码,更不应该执行数据库访问,它只负责显示逻辑.
案例:动态属性标签有时候.属性的个数是不明确的,这时候,就需要借助动态属性的标签了.动态属性标签比普通标签多了如下两个额外请求:1.标签处理类还需要实现DynamicAttributes接口.2.配置标签时通过<dynamic-attribute>一元素指定该标签支持动态属性.如下图:动态添加属性名和属性值并显示在页面上
![](//img-blog.csdn.net/20180321172536485)
dyAtt.jsp(页面显示)
Dytglib.tld(配置文件)
1.带标签体的标签
2.以页面片段作为属性的标签
开发自定义标签类 在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.以页面片段作为属性的标签
相关文章推荐
- 写自定义标签时标记attribute里rtexprvalue的用法
- 帝国cms自定义标签用法示例
- 关于<a>标签的基本用法和特殊用法
- 自定义标签jstl2.0以后的用法
- jsp2的自定义标签
- Java_JSP2如何进行自定义标签?
- 【html】html 的基本标签的用法
- tensorflow的contrib的基本用法和自定义模型
- 自定义View基础之——canvas,paint的基本用法
- 写自定义标签时标记attribute里rtexprvalue的用法
- OGNL, JSTL, STRUTS2标签中符号#,$,%的用法示例及 EL的基本用法
- 自定义标签jsp2格式
- Java自定义标签用法实例分析
- JSP/Servlet-----10、JSP2的自定义标签
- 记录一种自定义标签的用法
- JSP2的自定义标签
- htmlparser visitor用法 自定义标签 大文件快速读取,并分析,彻底解决 outofmemery错误
- JSP2的自定义标签
- Android基础--ActionBar的基本用法,自定义View,标题栏
- jsp2的自定义标签