`
iwebcode
  • 浏览: 2010484 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

jsp自定义标签库(2012.07.31)

 
阅读更多

标签库是非常重要的技术,希望成为高级程序员或者希望开发通用框架,就需要自己大量的开发自定义标签。

稍微对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>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics