标签库是非常重要的技术,希望成为高级程序员或者希望开发通用框架,就需要自己大量的开发自定义标签。
稍微对jsp自定义标签库入门进行一下总结(以下内容来源于网络整理和自我理解,纯属看法):
一:编写一个java类:
1、自定义标签应该继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport。
2、如果标签类包含属性,每个属性都要都get与set方法对应。
3、重写doTag()方法,这个方法负责生成页面内容。
二:编写TLD文件:
注意:tld文件放在web-inf路径或一下路径
1、可以到tomcat的examples\web-inf\jsp2路径下面复制一个jsp2-example-taglib.tld文件进行修改。
2、taglib有三个子元素,tlib-version,short-name,uri(这个非常重要,他指定该标签库的uri,jsp页面就通过该url引用自定义的标签)。
3、taglib里面可以包括多个tag元素,每个tag元素定义一个标签。
允许出现如下常用子元素,name:jsp页面中根据该名称来使用标签,
tag-class:指定标签的处理类,
body-content:指定标签体内容(值可以为 :tagdependent(指定标签处理类自己负责处理标签体)empty(指定该标签只能作为空标签使用)
scriptless,jsp)。
处理中一些详细的类的介绍:
SimpleTag方法介绍
setJspContext方法
用于把JSP页面的pageContext对象传递给标签处理器对象
setParent方法
用于把父标签处理器对象传递给当前标签处理器对象
getParent方法
用于获得当前标签的父标签处理器对象
setJspBody方法
用于把代表标签体的JspFragment对象传递给标签处理器对象
doTag方法
用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。
JspFragment类
javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素。
WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。JspFragment类中只定义了两个方法,如下所示:
getJspContext方法
用于返回代表调用页面的JspContext对象.
public abstractvoid invoke(java.io.Writer out)
用于执行JspFragment对象所代表的JSP代码片段
参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中。(简而言之,可以理解为写给浏览器)
invoke方法详解
JspFragment.invoke方法可以说是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:
在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;
若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的。
列子:
【1】、简单的标签helloWorld(程序员技术的提升都是伴随着helloworld的开始的)
1)、写一个Tag处理类,HelloWorldTag.java
package com.cn.sunny;
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());
}
}
2)、jsp页面HelloWorld.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sunny.com/myTaglib" prefix="c"%>
<%
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 'helloWorldTag.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 bgcolor="#ffffc0">
<c:helloWorld/><br/>
</body>
</html>
【2】、带属性标签(通过自定义标签连接数据库进行查询并显示)
1)、QueryTag.java
package com.cn.sunny;
import java.io.IOException;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class QueryTag extends SimpleTagSupport{
private String driver;
private String url;
private String user;
private String pass;
private String sql;
private Connection connection = null;
private Statement stmt = null;
private ResultSet rs = null;
private ResultSetMetaData rsmData = null;
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
try {
Class.forName(driver);
connection = DriverManager.getConnection(url,user,pass);
stmt = connection.createStatement();
rs = stmt.executeQuery(sql);
rsmData = rs.getMetaData();
int columnCount = rsmData.getColumnCount();
Writer out = getJspContext().getOut();
out.write("<table border='1' bgColor='#9999cc' widht='400'>");
while(rs.next()){
out.write("<tr>");
for(int i=1;i<=columnCount;i++){
out.write("<td>");
out.write(rs.getString(i));
out.write("</td>");
}
out.write("</tr>");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
try {
if(rs != null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(connection != null){
connection.close();
}
} catch (Exception e2) {
// TODO: handle exception
}
}
}
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 getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public Statement getStmt() {
return stmt;
}
public void setStmt(Statement stmt) {
this.stmt = stmt;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
}
2)、queryTag.jsp
<%@ taglib uri="http://java.sunny.com/myTaglib" prefix="c"%>
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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 'queryTag.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>
<c:query user="root"
url="jdbc:mysql://127.0.0.1:3308/sunny"
pass="sunny"
driver="com.mysql.jdbc.Driver"
sql="select * from userinfo"/>
</body>
</html>
【以上两个列子都放在一个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://java.sunny.com/myTaglib</uri>
<tag>
<!-- 定义标签名 -->
<name>helloWorld</name>
<!-- 定义标签处理类 -->
<tag-class>com.cn.sunny.HelloWorldTag</tag-class>
<!-- 定义标签体为空 -->
<body-content>empty</body-content>
</tag>
<tag>
<name>query</name>
<tag-class>com.cn.sunny.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>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>sql</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
</taglib>
分享到:
相关推荐
JSP自定义标签-源码.rar
jsp自定义标签库问答集锦.
创建JSP自定义标签.doc 创建JSP自定义标签.doc 创建JSP自定义标签.doc
jsp自定义标签大全.rar
jsp自定义标签实例.doc
JSP自定义标签试验.chm
JSP应用开发-自定义标签的使用.pptx
jsp自定义标签库实现数据列表显示,包括代码,文档,希望对大家有帮助.
JSP自定义标签详细.doc
JSP标准标签库借鉴.pdf
jsp自定义标签之ifelse与遍历自定义标签示例.docx
jsp自定义标签[归纳].pdf
基于java的开发源码-Google地图JSP标签库.zip 基于java的开发源码-Google地图JSP标签库.zip 基于java的开发源码-Google地图JSP标签库.zip 基于java的开发源码-Google地图JSP标签库.zip 基于java的开发源码-Google...
JSP自定义标签。在自定义标签的起始和结束标签之间的部分为标签体...标签处理程序必须实现或扩展javax.servlet.jsp.tagext包中的类和接口.javax.servlet.jsp.tagext含有允许标签处理程序类与JSP容器通信的接口和类。
在网上学习jsp自定义标签的时候, 出现了异常, 在网上寻找了好久, 都没有找到合适的答案, 自己通过摸索最后成功, 分享给大家, 希望能够帮助到你, 自定义标签不能放在java Project中, 只能在java web Project中才可以.
这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和org.apache.struts2.components.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下...
掌握自定义JSP标签(html).实用易学,很强的引导性和参考性
非常简单明了的hellword jsp自定义标签讲解.
jsp定制标签库.pdf
JSP自定义标签是用户定义的JSP语言元素,可以看成是一种通过标签处理器生成基于XML脚本的方法。自定义标签在功能上和逻辑上都与JavaBean类似,都是一组可重用的组件代码。相较于JavaBean,自定义标签可以使Web开发者...