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>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现公共底部的效果,你可以使用JSP的自定义标签。下面是实现的详细步骤: 步骤一:创建自定义标签处理类 1. 创建一个Java类,作为自定义标签的处理类,例如名为FooterTag.java。 2. 在该类中继承javax.servlet.jsp.tagext.TagSupport类,并重写doStartTag方法。 ```java import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; public class FooterTag extends TagSupport { @Override public int doStartTag() throws JspException { try { pageContext.include("/WEB-INF/views/common/footer.jsp"); } catch (Exception e) { e.printStackTrace(); } return SKIP_BODY; } } ``` 步骤二:创建标签描述文件 1. 在Web项目的WebContent目录下创建一个名为taglib.tld的XML文件,用于描述自定义标签。 2. 在taglib.tld文件中添加以下内容: ```xml <?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"> <tlib-version>1.0</tlib-version> <short-name>footer</short-name> <uri>http://example.com/footer</uri> <tag> <name>footer</name> <tag-class>com.example.FooterTag</tag-class> <body-content>empty</body-content> </tag> </taglib> ``` 步骤三:创建公共底部视图文件 1. 在Web项目的WEB-INF目录下创建一个名为views的文件夹。 2. 在views文件夹下创建一个名为common的文件夹。 3. 在common文件夹下创建一个名为footer.jspJSP文件,用于显示公共底部内容。 步骤四:引入自定义标签并使用 1. 在需要显示公共底部的JSP页面中,引入自定义标签。在页面的开头添加以下代码: ```jsp <%@ taglib prefix="footer" uri="http://example.com/footer" %> ``` 2. 在页面中使用自定义标签来显示公共底部。在需要显示底部的位置添加以下代码: ```jsp <footer:footer/> ``` 以上就是使用JSP定义标签实现公共底部的详细步骤。通过创建自定义标签处理类、标签描述文件,以及公共底部视图文件,然后在需要显示底部的JSP页面中引入标签并使用自定义标签,即可实现公共底部的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值