以前一哥们跟我说 他项目经理写的自定义标签可以 c:foreach 进行循环 感觉好高端的感觉啊 ! 呵呵呵~~ 当时觉得自己写的标签好像从来没有这种功能啊。。。
但是因为没有代码 我也不知道是怎么回事,也没有去细想! 今天忽然看 项目里面的代码 看到了 tld 就复习了下,百度了些资料! 发现知识得多复习啊,不用就忘了,也许是我学的不够好吧,呵呵,很多细节都不知道了! 比如今天翻开自己以前写的笔记,记录的是 enum跟Enum的关系, 一看根本没印象了 呵呵呵!
tld的 文章 很多 : 其实都差不多 因为tld的知识点就那么点 呵呵 因为大家都写了 我就不重复了 下面这个地址里面 写的很详细 http://blog.csdn.net/liaoxiaohua1981/article/details/6856307
这个文章也非常不错 特别详细:http://ar.newsmth.net/thread-5d499b1fbe9e50.html(这里有很多我们不知道,平时不会用到的细节知识,相当于taglib的文档)
我发现啊,很多时候还是太懒了,比如说现在,我看taglib的 文档 有些地方不是太清楚 他们文章上写的也有点不大好理解,其实只要自己写个例子就ok了~!
经过测试 发现
<required>false</required><!--是否是必填选项 -->
如果参数的 required 为 true的时候如果你不填这个参数的话 那么编译器会告诉你错误的!
如果rtexprvalue 为false的话
<attribute><!---这里表示的是这个tag的一个参数 -->
<name>test</name><!--这个参数的名字 -->
<required>true</required><!--是否是必填选项 -->
<rtexprvalue>false</rtexprvalue><!--这个参数的值是否可以写入,换句话说 就是这个参数是否可以动态赋值 -->
</attribute>
jsp中 这么写
<%
String str = "123";
%>
<test:test test="<%=str %>"/>
会爆如下错误:
org.apache.jasper.JasperException: /testTagLib.jsp (line: 14, column: 0) According to TLD or attribute directive in tag file, attribute test does not accept any expressions
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:408)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:149)
at org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1240)
at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:875)
at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1539)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)
at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2434)
at org.apache.jasper.compiler.Node$Root.accept(Node.java:475)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
at org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1795)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:217)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
说明 rtexprvalue 设置为false 表示不接受 表达式赋值 表达式 当然如下方式也不行
<%
String str = "123";
request.setAttribute("test", "112");
%>
<%-- <test:test test="<%=str %>"/> --%>
<test:test test="${test}"/>
接下来让我头疼的问题来了! 既然 如果 rtexprvalue 设置为 false 是不接受 EL表达式 或者 直接小脚本写java代码传值的 可是 我们现在的项目里面 把c.tld 给拿出来了,放在 /WEB-INF/tag/jstl/ 下面
而且配置的 也是指向这里的:
<%@ taglib uri="/WEB-INF/tag/jstl/c.tld" prefix="c" %>
可是为什么我用 EL表达式 却是可以的呢~?
<tag>
<name>forEach</name>
<tag-class>org.apache.taglibs.standard.tag.el.core.ForEachTag</tag-class>
&