当前位置: 代码迷 >> JavaScript >> Jsp tag file例证以及说明
  详细解决方案

Jsp tag file例证以及说明

热度:513   发布时间:2012-12-28 10:29:04.0
Jsp tag file例子以及说明

简介

Jsp2.0后,实现tag的方式除了taglib(TLD)的方式外,还可以通过定义tag文件来代替taglib类。tag file一般放在/WEB-INF/tags目录或者其子目录,需要在jsp文件中指定uri。


参考

  例子来源

  • http://today.java.net/pub/a/today/2003/11/14/tagfiles.html
  • http://today.java.net/pub/a/today/2003/11/25/tagfiles.html


说明

注:jsp和tag file在Tomcat7下编译。


例子1 将tag file作为内容直接引入

       firstTagTest.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
Today is <easy:firstTag/> //包含tag,没有参数传递


firstTag.tag

//直接被firstTagTest.jsp引入编译为java/class文件
<%@ tag import="java.util.Date" import="java.text.DateFormat"%>
<%
  DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
  Date now = new Date(System.currentTimeMillis());
  out.println(dateFormat.format(now));
%>

     编译后的代码

     firstTag_tag.java

     

public void doTag() throws javax.servlet.jsp.JspException, java.io.IOException {
    javax.servlet.jsp.PageContext _jspx_page_context = (javax.servlet.jsp.PageContext)jspContext;
    javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) _jspx_page_context.getRequest();
    javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse) _jspx_page_context.getResponse();
    javax.servlet.http.HttpSession session = _jspx_page_context.getSession();
    javax.servlet.ServletContext application = _jspx_page_context.getServletContext();
    javax.servlet.ServletConfig config = _jspx_page_context.getServletConfig();
    javax.servlet.jsp.JspWriter out = jspContext.getOut();
    _jspInit(config);
    jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,jspContext);

    try {
      out.write('\r');
      out.write('\n');

  DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
  Date now = new Date(System.currentTimeMillis());
  out.println(dateFormat.format(now));

      out.write('\r');
      out.write('\n');
    } catch( java.lang.Throwable t ) {
      if( t instanceof javax.servlet.jsp.SkipPageException )
          throw (javax.servlet.jsp.SkipPageException) t;
      if( t instanceof java.io.IOException )
          throw (java.io.IOException) t;
      if( t instanceof java.lang.IllegalStateException )
          throw (java.lang.IllegalStateException) t;
      if( t instanceof javax.servlet.jsp.JspException )
          throw (javax.servlet.jsp.JspException) t;
      throw new javax.servlet.jsp.JspException(t);
    } finally {
      jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,super.getJspContext());
      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
    }
  }

firstTagTest_jsp.java

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("\r\n");
      out.write("Today is ");
      if (_jspx_meth_easy_005ffirstTag_005f0(_jspx_page_context))//调用tag类处理方法
        return;
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }

  private boolean _jspx_meth_easy_005ffirstTag_005f0(javax.servlet.jsp.PageContext _jspx_page_context)
          throws java.lang.Throwable {
    javax.servlet.jsp.PageContext pageContext = _jspx_page_context;
    javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut();
    //  easy:firstTag
    org.apache.jsp.tag.web.firstTag_tag _jspx_th_easy_005ffirstTag_005f0 = (new org.apache.jsp.tag.web.firstTag_tag());//构造tag类
    _jsp_instancemanager.newInstance(_jspx_th_easy_005ffirstTag_005f0);
    _jspx_th_easy_005ffirstTag_005f0.setJspContext(_jspx_page_context);
    _jspx_th_easy_005ffirstTag_005f0.doTag();//开始执行dotTag方法,和标准的tag lib类似.
    _jsp_instancemanager.destroyInstance(_jspx_th_easy_005ffirstTag_005f0);
    return false;
  }

例子2 在jsp引入tag file,并传递参数给tag file

encodeTagTest.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
//引入tag,传入参数input,值为"<br/> means changing line"
<easy:encode input="<br/> means changing line"/>

encode.tag

<%@ attribute name="input" required="true" %>
<%!
  //定义方法
  private String encodeHtmlTag(String tag) {
    if (tag==null)
      return null;
    int length = tag.length();
    StringBuffer encodedTag = new StringBuffer(2 * length);
    for (int i=0; i<length; i++) {
      char c = tag.charAt(i);
      if (c=='<')
        encodedTag.append("<");
      else if (c=='>')
        encodedTag.append(">");
      else if (c=='&')
        encodedTag.append("&");
      else if (c=='"')
        encodedTag.append(""");  
      else if (c==' ')
        encodedTag.append(" ");
      else
        encodedTag.append(c);

    }
    return encodedTag.toString();
  }
%>
<%=encodeHtmlTag(input)%>//根据传入的参数input调用方法encodeHtmlTag

编译后的代码

encode_tag.java

public final class encode_tag
    extends javax.servlet.jsp.tagext.SimpleTagSupport
    implements org.apache.jasper.runtime.JspSourceDependent {



  private String encodeHtmlTag(String tag) {
    if (tag==null)
      return null;
    int length = tag.length();
    StringBuffer encodedTag = new StringBuffer(2 * length);
    for (int i=0; i<length; i++) {
      char c = tag.charAt(i);
      if (c=='<')
        encodedTag.append("<");
      else if (c=='>')
        encodedTag.append(">");
      else if (c=='&')
        encodedTag.append("&");
      else if (c=='"')
        encodedTag.append(""");  
      else if (c==' ')
        encodedTag.append(" ");
      else
        encodedTag.append(c);

    }
    return encodedTag.toString();
  }

  ....
  private java.lang.String input;

  public java.lang.String getInput() {
    return this.input;
  }

  public void setInput(java.lang.String input) {
    this.input = input;
    jspContext.setAttribute("input", input);
  }

  ......

  public void doTag() throws javax.servlet.jsp.JspException, java.io.IOException {
    javax.servlet.jsp.PageContext _jspx_page_context = (javax.servlet.jsp.PageContext)jspContext;
    javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) _jspx_page_context.getRequest();
    javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse) _jspx_page_context.getResponse();
    javax.servlet.http.HttpSession session = _jspx_page_context.getSession();
    javax.servlet.ServletContext application = _jspx_page_context.getServletContext();
    javax.servlet.ServletConfig config = _jspx_page_context.getServletConfig();
    javax.servlet.jsp.JspWriter out = jspContext.getOut();
    _jspInit(config);
    jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,jspContext);
    if( getInput() != null ) 
      _jspx_page_context.setAttribute("input", getInput());

    try {
      out.write('\r');
      out.write('\n');
      out.write('\r');
      out.write('\n');
      out.print(encodeHtmlTag(input));//根据传入参数调用方法
      out.write("\r\n");
      out.write("\r\n");
    } catch( java.lang.Throwable t ) {
      if( t instanceof javax.servlet.jsp.SkipPageException )
          throw (javax.servlet.jsp.SkipPageException) t;
      if( t instanceof java.io.IOException )
          throw (java.io.IOException) t;
      if( t instanceof java.lang.IllegalStateException )
          throw (java.lang.IllegalStateException) t;
      if( t instanceof javax.servlet.jsp.JspException )
          throw (javax.servlet.jsp.JspException) t;
      throw new javax.servlet.jsp.JspException(t);
    } finally {
      jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,super.getJspContext());
      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
    }
  }
}

encodeTagTest_jsp.java

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("\r\n");
      if (_jspx_meth_easy_005fencode_005f0(_jspx_page_context))//调用处理tag file的方法
        return;
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }

  private boolean _jspx_meth_easy_005fencode_005f0(javax.servlet.jsp.PageContext _jspx_page_context)
          throws java.lang.Throwable {
    javax.servlet.jsp.PageContext pageContext = _jspx_page_context;
    javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut();
    //  easy:encode
    org.apache.jsp.tag.web.encode_tag _jspx_th_easy_005fencode_005f0 = (new org.apache.jsp.tag.web.encode_tag());
    _jsp_instancemanager.newInstance(_jspx_th_easy_005fencode_005f0);
    _jspx_th_easy_005fencode_005f0.setJspContext(_jspx_page_context);
    // /encodeTagTest.jsp(3,0) name = input type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
    _jspx_th_easy_005fencode_005f0.setInput("<br/> means changing line");//传入参数
    _jspx_th_easy_005fencode_005f0.doTag();//调用doTag方法
    _jsp_instancemanager.destroyInstance(_jspx_th_easy_005fencode_005f0);
    return false;
  }


例子3 在tag file中引入html和tagf文件

includeDemoTagTest.jsp

<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
<easy:includeDemoTag/>


includeDemoTag.tag

This tag file shows the use of the include directive. 
The first include directive demonstrates how you can include
a static resource called included.html.
<br/>
Here is the content of included.html:
<%@ include file="included.html" %>
<br/>
<br/>
The second include directive includes another dynamic resource: included.tagf.
<br/>
<%@ include file="included.tagf" %>


included.tagf

<%
  out.print("Hello from included.tagf");
%>


included.html

<table>
<tr>
  <td><b>Menu</b></td>
</tr>
<tr>
  <td>CDs</td>
</tr>
<tr>
  <td>DVDs</td>
</tr>
<tr>
  <td>Others</td>
</tr>
</table>


编译后的代码
includeDemoTag_tag.java

 public void doTag() throws javax.servlet.jsp.JspException, java.io.IOException {
    javax.servlet.jsp.PageContext _jspx_page_context = (javax.servlet.jsp.PageContext)jspContext;
    javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) _jspx_page_context.getRequest();
    javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse) _jspx_page_context.getResponse();
    javax.servlet.http.HttpSession session = _jspx_page_context.getSession();
    javax.servlet.ServletContext application = _jspx_page_context.getServletContext();
    javax.servlet.ServletConfig config = _jspx_page_context.getServletConfig();
    javax.servlet.jsp.JspWriter out = jspContext.getOut();
    _jspInit(config);
    jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,jspContext);

    try {
      out.write("This tag file shows the use of the include directive. \r\n");
      out.write("The first include directive demonstrates how you can include\r\n");
      out.write("a static resource called included.html.\r\n");
      out.write("<br/>\r\n");
      out.write("Here is the content of included.html:\r\n");
      out.write("<table>\r\n");//直接把included.html编译到此类
      out.write("<tr>\r\n");
      out.write("  <td><b>Menu</b></td>\r\n");
      out.write("</tr>\r\n");
      out.write("<tr>\r\n");
      out.write("  <td>CDs</td>\r\n");
      out.write("</tr>\r\n");
      out.write("<tr>\r\n");
      out.write("  <td>DVDs</td>\r\n");
      out.write("</tr>\r\n");
      out.write("<tr>\r\n");
      out.write("  <td>Others</td>\r\n");
      out.write("</tr>\r\n");
      out.write("</table>");
      out.write("\r\n");
      out.write("<br/>\r\n");
      out.write("<br/>\r\n");
      out.write("The second include directive includes another dynamic resource: included.tagf.\r\n");
      out.write("<br/>\r\n");

       out.print("Hello from
          included.tagf");//直接把included.tagf的内容编译到此类

      out.write('\r');
      out.write('\n');
    } catch( java.lang.Throwable t ) {
      if( t instanceof javax.servlet.jsp.SkipPageException )
          throw (javax.servlet.jsp.SkipPageException) t;
      if( t instanceof java.io.IOException )
          throw (java.io.IOException) t;
      if( t instanceof java.lang.IllegalStateException )
          throw (java.lang.IllegalStateException) t;
      if( t instanceof javax.servlet.jsp.JspException )
          throw (javax.servlet.jsp.JspException) t;
      throw new javax.servlet.jsp.JspException(t);
    } finally {
      jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,super.getJspContext());
      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
    }
  }

includeDemoTagTest_jsp.java

  

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {


    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;




    try {
      response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;


      out.write('\r');
      out.write('\n');
      if (_jspx_meth_easy_005fincludeDemoTag_005f0(_jspx_page_context))//调用tag file处理方法
        return;
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }


  private boolean _jspx_meth_easy_005fincludeDemoTag_005f0(javax.servlet.jsp.PageContext _jspx_page_context)
          throws java.lang.Throwable {
    javax.servlet.jsp.PageContext pageContext = _jspx_page_context;
    javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut();
    //  easy:includeDemoTag
    org.apache.jsp.tag.web.includeDemoTag_tag _jspx_th_easy_005fincludeDemoTag_005f0 = (new org.apache.jsp.tag.web.includeDemoTag_tag());
    _jsp_instancemanager.newInstance(_jspx_th_easy_005fincludeDemoTag_005f0);
    _jspx_th_easy_005fincludeDemoTag_005f0.setJspContext(_jspx_page_context);
    _jspx_th_easy_005fincludeDemoTag_005f0.doTag();
    _jsp_instancemanager.destroyInstance(_jspx_th_easy_005fincludeDemoTag_005f0);
    return false;
  }



例子4  在jsp页面中调用tag file中的属性

invokeTest.jsp

<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
<html>
<head>
<title>Product Details</title>
</head>
<body>
<easy:invokeDemo>
  <jsp:attribute name="productDetails">
    <table width="220" border="1">
    <tr>
      <td><b>Product Name</b></td>
      <td>${productName}</td>
    </tr>
    <tr>
      <td><b>Description</b></td>
      <td>${description}</td>
    </tr>
    <tr>
      <td><b>Price</b></td>
      <td>${price}</td>
    </tr>
    </table>
  </jsp:attribute>
</easy:invokeDemo>
</body>
</html>


invokeDemo.tag

//定义属性以及包含的变量
<%@ attribute name="productDetails" fragment="true" %>
<%@ variable name-given="productName" %>
<%@ variable name-given="description" %>
<%@ variable name-given="price" %>
<%
  jspContext.setAttribute("productName", "Pelesonic DVD Player");
  jspContext.setAttribute("description", 
    "Dolby Digital output through coaxial digital-audio jack," + 
    " 500 lines horizontal resolution-image digest viewing");
  jspContext.setAttribute("price", "65");
%>
<jsp:invoke fragment="productDetails"/>//指明要在dotag()时调用 javax.servlet.jsp.tagext.JspFragment.invoke方法,回调机制


编译后的代码


invokeTest_jsp.java

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<title>Product Details</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      //  easy:invokeDemo
      org.apache.jsp.tag.web.invokeDemo_tag _jspx_th_easy_005finvokeDemo_005f0 = (new org.apache.jsp.tag.web.invokeDemo_tag());
      _jsp_instancemanager.newInstance(_jspx_th_easy_005finvokeDemo_005f0);
      _jspx_th_easy_005finvokeDemo_005f0.setJspContext(_jspx_page_context);
      javax.servlet.jsp.tagext.JspFragment _jspx_temp0 = new Helper( 0, _jspx_page_context, _jspx_th_easy_005finvokeDemo_005f0, null);// 构造JspFragment类,设置到tag类中,供tag类invoke回调
      // /invokeTest.jsp(7,0) null
      _jspx_th_easy_005finvokeDemo_005f0.setProductDetails(_jspx_temp0);
      _jspx_th_easy_005finvokeDemo_005f0.doTag();
      _jsp_instancemanager.destroyInstance(_jspx_th_easy_005finvokeDemo_005f0);
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }

  //在jsp类中定义JspFragment类
  private class Helper
      extends org.apache.jasper.runtime.JspFragmentHelper
  {
    private javax.servlet.jsp.tagext.JspTag _jspx_parent;
    private int[] _jspx_push_body_count;

    public Helper( int discriminator, javax.servlet.jsp.JspContext jspContext, javax.servlet.jsp.tagext.JspTag _jspx_parent, int[] _jspx_push_body_count ) {
      super( discriminator, jspContext, _jspx_parent );
      this._jspx_parent = _jspx_parent;
      this._jspx_push_body_count = _jspx_push_body_count;
    }
    public void invoke0( javax.servlet.jsp.JspWriter out ) 
      throws java.lang.Throwable
    {
      out.write("<table width=\"220\" border=\"1\">\r\n");
      out.write("    <tr>\r\n");
      out.write("      <td><b>Product Name</b></td>\r\n");
      out.write("      <td>");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${productName}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("</td>\r\n");
      out.write("    </tr>\r\n");
      out.write("    <tr>\r\n");
      out.write("      <td><b>Description</b></td>\r\n");
      out.write("      <td>");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${description}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("</td>\r\n");
      out.write("    </tr>\r\n");
      out.write("    <tr>\r\n");
      out.write("      <td><b>Price</b></td>\r\n");
      out.write("      <td>");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${price}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("</td>\r\n");
      out.write("    </tr>\r\n");
      out.write("    </table>");
      return;
    }
    public void invoke( java.io.Writer writer )
      throws javax.servlet.jsp.JspException
    {
      javax.servlet.jsp.JspWriter out = null;
      if( writer != null ) {
        out = this.jspContext.pushBody(writer);
      } else {
        out = this.jspContext.getOut();
      }
      try {
        this.jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,this.jspContext);
        switch( this.discriminator ) {
          case 0:
            invoke0( out );
            break;
        }
      }
      catch( java.lang.Throwable e ) {
        if (e instanceof javax.servlet.jsp.SkipPageException)
            throw (javax.servlet.jsp.SkipPageException) e;
        throw new javax.servlet.jsp.JspException( e );
      }
      finally {
        if( writer != null ) {
          this.jspContext.popBody();
        }
      }
    }
  }


invokeDemo_tag.java

private javax.servlet.jsp.tagext.JspFragment productDetails;

  public javax.servlet.jsp.tagext.JspFragment getProductDetails() {
    return this.productDetails;
  }

  public void setProductDetails(javax.servlet.jsp.tagext.JspFragment productDetails) {
    this.productDetails = productDetails;
    jspContext.setAttribute("productDetails", productDetails);
  }

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  ......

  public void doTag() throws javax.servlet.jsp.JspException, java.io.IOException {
    javax.servlet.jsp.PageContext _jspx_page_context = (javax.servlet.jsp.PageContext)jspContext;
    javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) _jspx_page_context.getRequest();
    javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse) _jspx_page_context.getResponse();
    javax.servlet.http.HttpSession session = _jspx_page_context.getSession();
    javax.servlet.ServletContext application = _jspx_page_context.getServletContext();
    javax.servlet.ServletConfig config = _jspx_page_context.getServletConfig();
    javax.servlet.jsp.JspWriter out = jspContext.getOut();
    _jspInit(config);
    jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,jspContext);
    if( getProductDetails() != null ) 
      _jspx_page_context.setAttribute("productDetails", getProductDetails());

    try {
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
	//设置属性包含的变量
  jspContext.setAttribute("productName", "Pelesonic DVD Player");
  jspContext.setAttribute("description", 
    "Dolby Digital output through coaxial digital-audio jack," + 
    " 500 lines horizontal resolution-image digest viewing");
  jspContext.setAttribute("price", "65");

      out.write('\r');
      out.write('\n');
      ((org.apache.jasper.runtime.JspContextWrapper) this.jspContext).syncBeforeInvoke();
      _jspx_sout = null;
      if (getProductDetails() != null) {
        getProductDetails().invoke(_jspx_sout);//在dotag中回调invoke方法
      }
      jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,getJspContext());
      out.write('\r');
      out.write('\n');
    } catch( java.lang.Throwable t ) {
      if( t instanceof javax.servlet.jsp.SkipPageException )
          throw (javax.servlet.jsp.SkipPageException) t;
      if( t instanceof java.io.IOException )
          throw (java.io.IOException) t;
      if( t instanceof java.lang.IllegalStateException )
          throw (java.lang.IllegalStateException) t;
      if( t instanceof javax.servlet.jsp.JspException )
          throw (javax.servlet.jsp.JspException) t;
      throw new javax.servlet.jsp.JspException(t);
    } finally {
      jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,super.getJspContext());
      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
    }
  }


例子5 将页面内容传入tag file 的作为参数.

searchEngine.html

Please click <a href="main.jsp">here</a>\\访问此页面生成header.referer

main.jsp

<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
Your referer header:
${header.referer}//从http协议中header获取referer,上一个http地址(从这里跳转到当前的地址)
<br/>
<tags:doBodyDemo>   //设置jspFragment为tag helper类
  ${header.referer}//将header.referer的值通过jspFragment的dotag,在dotag回调invoke(out),放入到jspFragment(tag编译后的类)指定的变量
</tags:doBodyDemo>
<a href="viewReferer.jsp">View</a> the referer as a Session attribute.

doBodyDemo.tag

<jsp:doBody var="referer"
scope="session"/>//转换out.tostring保存在session变量referer中



viewReferer.jsp

The Referer header of the previous page is
${sessionScope.referer}//这是session中有referer变量,直接可以展示


例子6 调用tag file并传入参数

powerTagTest.jsp

//自定义标签,通过传入参数调用jspFragment.dotag
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
2^3=<easy:power number="2" power="3"/>

power.tag

<%-- Shows how to use attributes in a tag file --%> 
<%@ attribute name="number" required="true" description="base" %>
<%@ attribute name="power" required="true" description="exponent" %>
<%=Math.pow(Double.parseDouble(number),
        Double.parseDouble(power))%>//通过传入的参数计算

编译后的代码

powerTagTest_jsp.java

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("2^3=");
      if (_jspx_meth_easy_005fpower_005f0(_jspx_page_context))//调用tag file处理方法
        return;
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }

  private boolean _jspx_meth_easy_005fpower_005f0(javax.servlet.jsp.PageContext _jspx_page_context)
          throws java.lang.Throwable {
    javax.servlet.jsp.PageContext pageContext = _jspx_page_context;
    javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut();
    //  easy:power
    org.apache.jsp.tag.web.power_tag _jspx_th_easy_005fpower_005f0 = (new org.apache.jsp.tag.web.power_tag());
    _jsp_instancemanager.newInstance(_jspx_th_easy_005fpower_005f0);
    _jspx_th_easy_005fpower_005f0.setJspContext(_jspx_page_context);
    // /powerTagTest.jsp(2,4) name = number type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
    _jspx_th_easy_005fpower_005f0.setNumber("2"); //设置tag参数
    // /powerTagTest.jsp(2,4) name = power type = java.lang.String reqTime = true required = true fragment = false deferredValue = false expectedTypeName = java.lang.String deferredMethod = false methodSignature = null
    _jspx_th_easy_005fpower_005f0.setPower("3");//设置tag参数

    _jspx_th_easy_005fpower_005f0.doTag();
    _jsp_instancemanager.destroyInstance(_jspx_th_easy_005fpower_005f0);
    return false;
  }

power_tag.java

private java.lang.String number;//根据atrribute生成
  private java.lang.String power;//根据attribute生成

  public java.lang.String getNumber() {
    return this.number;
  }

  public void setNumber(java.lang.String number) {
    this.number = number;
    jspContext.setAttribute("number", number);
  }

  public java.lang.String getPower() {
    return this.power;
  }

  public void setPower(java.lang.String power) {
    this.power = power;
    jspContext.setAttribute("power", power);
  }

......

  public void doTag() throws javax.servlet.jsp.JspException, java.io.IOException {
    javax.servlet.jsp.PageContext _jspx_page_context = (javax.servlet.jsp.PageContext)jspContext;
    javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) _jspx_page_context.getRequest();
    javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse) _jspx_page_context.getResponse();
    javax.servlet.http.HttpSession session = _jspx_page_context.getSession();
    javax.servlet.ServletContext application = _jspx_page_context.getServletContext();
    javax.servlet.ServletConfig config = _jspx_page_context.getServletConfig();
    javax.servlet.jsp.JspWriter out = jspContext.getOut();
    _jspInit(config);
    jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,jspContext);
    if( getNumber() != null ) 
      _jspx_page_context.setAttribute("number", getNumber());
    if( getPower() != null ) 
      _jspx_page_context.setAttribute("power", getPower());

    try {
      out.write(" \r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.print(Math.pow(Double.parseDouble(number), Double.parseDouble(power)));
    } catch( java.lang.Throwable t ) {
      if( t instanceof javax.servlet.jsp.SkipPageException )
          throw (javax.servlet.jsp.SkipPageException) t;
      if( t instanceof java.io.IOException )
          throw (java.io.IOException) t;
      if( t instanceof java.lang.IllegalStateException )
          throw (java.lang.IllegalStateException) t;
      if( t instanceof javax.servlet.jsp.JspException )
          throw (javax.servlet.jsp.JspException) t;
      throw new javax.servlet.jsp.JspException(t);
    } finally {
      jspContext.getELContext().putContext(javax.servlet.jsp.JspContext.class,super.getJspContext());
      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
    }
  }

例子7 嵌套引入tag file

taglibDemoTest.jsp

<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
<easy:taglibDemo/>//引入tag

tagliDemo.tag
<%@ taglib prefix="simple" tagdir="/WEB-INF/tags" %>
The server's date: <simple:firstTag>//继续嵌套引入tag\

firstTag.tag
<%@ tag import="java.util.Date" import="java.text.DateFormat"%>
<%
  DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
  Date now = new Date(System.currentTimeMillis());
  out.println(dateFormat.format(now));
%>


例子8 调用tag file的变量

varDemoTest.jsp

<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
Today's date:
<br/>
<tags:varDemo>
In long format: ${longDate}
<br/>
In short format: ${shortDate}
</tags:varDemo>

varDemo.tag
<%@ tag import="java.util.Date" import="java.text.DateFormat"%>
<%@ variable name-given="longDate" %>
<%@ variable name-given="shortDate" %>
<%
  Date now = new Date(System.currentTimeMillis());
  DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG);
  DateFormat shortFormat = DateFormat.getDateInstance(DateFormat.SHORT);
  jspContext.setAttribute("longDate", longFormat.format(now));
  jspContext.setAttribute("shortDate", shortFormat.format(now));
%>
<jsp:doBody/>//说明要让jsp编译的java类回调,所以jsp编译的java类有Helper类封装JspFragment(即tag编译后的java类)




1楼liu332355559昨天 23:14
很高级的样子
  相关解决方案