当前位置: 首页 > 图文教程 > 网络编程 > JSP > JSP/Servlet/JSF:自定义标签

JSP
GET 方式提交的含有特殊字符的参数
java big5到gb2312的编码转换
java Lucene 中自定义排序的实现
hibernate中的增删改查实现代码
jsp 定制标签(Custom Tag)
jsp基础速成精华讲解
IE cache缓存 所带来的问题收藏
关于JSP的一点疑问小结
JSP 多条SQL语句同时执行的方法
jsp include文件时的一个乱码解决方法
在JSTL EL中处理java.util.Map,及嵌套List的情况
jsp 页面显示的一些用法
根据Hibernte的cfg文件生成sql文件
五种 JSP页面跳转方法详解
JSP 防范SQL注入攻击分析
JSP 连接MySQL配置与使用
java eclipse 启动参数
jsp 页面上图片分行输出小技巧
解决jsp开发中不支持EL问题
JSP 页面中使用FCKeditor控件(js用法)

JSP/Servlet/JSF:自定义标签


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 66 ::
收藏到网摘: n/a

jsp自定义标签的定义步骤:

创建标记处理器
创建TLD文件
编辑web.xml
在JSP页面中使用此标签

在此我们主要讨论和学习的不是如何开发自定义标签,所以具体的开发事例百度或google一下就可以找到,在此不再赘述。

我们用到过自定义标签的人,也许最大的体会是他的复杂性,但是下面这种用法,却让我们对他的认知有所改变(事例介绍采用struts版本)

在一个web应用中,将数据库查询结果集ResultSet rs保存至session或者reueest范围内,再传递给jsp页面来显示。这本身是没问题的,但是当同时查询的用户非常多时,服务器的压力就非常大。如果我们使用自定义标签,将结果集返回到jsp页面,情况就不一样了。具体实现如下:

Datatag .java

以下为引用的内容:
-----------------------------------------------------------------
package getdata;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.sql.*;

public class Datatag extends TagSupport
{

    public int doStartTag()throws JspException
    {

        
        ResultSet rs=(ResultSet)this.pageContext.getSession().getAttribute("resultSet");
           try{
           JspWriter out=pageContext.popBody();
              while(rs.next())
              {
                  out.println("< tr>");
                  out.println("< form>");
                    out.println("< td align='center'> < input type='checkbox' name='checkbox' value='checkbox'> < /td>");
                      out.println("< td>"+ rs.getString("receiver") +"< /td>");
                      out.println("< td>< a href=showdatail.jsp>"+ rs.getString("title") +"< /a>< /td>");
                      out.println("< td>< a href=upload/"+rs.getString("annex")+"> "+ rs.getString("annex") +"< /a>< /td>");
                      out.println("< td>"+ rs.getString("date") +"< /td>");
               out.println("< /form>");
                  out.println("< /tr>");
              }
        }
           catch(Exception ex)
           {
                  ex.printStackTrace();
           }
           return SKIP_BODY;
    }
    public int doEndTag() throws JspException
    {
        return EVAL_PAGE;

    }
}

 data.tld

以下为引用的内容:

--------------------------------------------------------------------
< ?xml version="1.0" encoding="UTF-8"?>
 < !DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
 "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

< taglib>
  < tlib-version>1.0< /tlib-version>
  < jsp-version>1.1< /jsp-version>

    < tag>
        < name>result< /name>
        < tag-class>getdata.Datatag< /tag-class>
        < body-content>jsp< /body-content>
    < /tag>
< /taglib>

web.xml
---------------------------------------------------------------
添加以下内容:

以下为引用的内容:
  < taglib>
    < taglib-uri>/WEB-INF/data.tld< /taglib-uri>
    < taglib-location>/WEB-INF/data.tld< /taglib-location>
  < /taglib>

displayAction.do

以下为引用的内容:
------------------------------------------------------------------
    String strSql=new String("select * from yonghu");
    HttpSession session=httpServletRequest.getSession();
    session.setAttribute("strSql",strSql) ;
    return actionMapping.findForward("success") ;

如果不是用的struts,可以通过其他方法,实现这步!

display.jsp

以下为引用的内容:
-----------------------------------------------------------------
< %@ page contentType="text/html; charset=GBK" %>
< %@ taglib uri="/WEB-INF/data.tld" prefix="app" %>
< html>
< head>
< title>
display
< /title>
< /head>
< body bgcolor="#ffffff">
< app:result />
< /body>
< /html> 

这样,在你的每一个jsp中,只要想输出查询结果,就只需要调用< app:result/>就可以了!

以上代码不一定完全正确,但其中的思想已经非常清晰了!在大的项目中,这种模式非常被推崇!它体现了java 代码重用的思想,并且也使结果集的相关操作不直接暴露与用户,也实现了安全。