1. 程式人生 > >java自定義標籤異常

java自定義標籤異常

嚴重: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: /WEB-INF/pages/svg/doc-svg/index.jsp(198,5) According to TLD or attribute directive in tag file, attribute key does not accept any expressions
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
    at org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1174)
    at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:821)
    at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1530)
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361)
    at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2411)
    at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:840)
    at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1530)
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361)
    at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2411)
    at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2417)
    at org.apache.jasper.compiler.Node$Root.accept(Node.java:495)
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2361)
    at org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1736)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:183)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:332)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at com.fj.bsfra.web.DpoActionImp.include(DpoActionImp.java:599)
    at com.fj.bsfra.web.HandlerJsp.process(HandlerJsp.java:12)
    at com.fj.bsfra.web.Handler.doProcess(Handler.java:13)
    at com.fj.bsfra.web.ActionProxy.doAction(ActionProxy.java:110)
    at com.fj.bsfra.web.ActionProxy.execute(ActionProxy.java:55)
    at com.fj.bsfra.web.ActionFilter.doFilter(ActionFilter.java:32)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:595)
    
    
    
    
錯誤原因:自定義標籤不接收任何表示式

修改方法:
自定義標籤中讓標籤屬性正確接收EL表示式物件 Apache .

如何在Java自定義標籤中讓自定義的標籤屬性正確接收EL表示式物件

     我們在專案開發中為了更方便靈活的使用Java自定義標籤,往往需要讓自定義的標籤屬性接收一些EL表示式物件,所幸的是apache為我們提供了簡單的實現方式。
需要的jar包:
jstl.jar
standard.jar
    其實這兩個包就是我們在使用jstl時所需的兩個包。
    要接收EL表示式物件,首先得在標籤的實現類檔案中將這個屬性的物件型別設定為Object型別,在set、get方法中,set方法需要引入apache的類:
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
    這個類中有一個evaluate 方法,當el表示式作為引數傳入時,呼叫這個方法,在tag內即可自動把el表示式轉化成所需要的物件。
    你只需在set方法裡如下呼叫:
 public void setValue(Object value)throws JspException
 {
  this.value = ExpressionEvaluatorManager.evaluate(
            "value", value.toString(), Object.class, this, pageContext);
 }
 
 ExpressionEvaluatorManager.evaluate有四個引數。
 第一個表示tag的名字,在取el表示式出錯時使用。一般和屬性名字相同。
 第二個要求字串,通常簡單呼叫輸入物件的toString方法。
 第三個是類,通常用Object.class。
 第四個用this即可,
 第五個是pageContext變數。

 在tld檔案中該標籤屬性的rtexprvalue得設定為true,表示是否支援執行時表示式取值。

 

 OK啦!可以用啦!