java taglib 的使用

本文探讨了Java TLD(Tag Library Descriptor)的使用,包括required参数、rtexprvalue属性的影响,以及在不同Servlet版本中对EL表达式的支持。通过实例展示了TLD中的TEI-CLASS和validator的作用,并分享了解决特定问题的过程,强调了遇到问题时自我学习和解决问题的重要性。
摘要由CSDN通过智能技术生成

以前一哥们跟我说  他项目经理写的自定义标签可以 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>
    &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值