简介
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
- 很高级的样子