2016-07-23 87 views
0

面對試圖創建自定義jsp標記的問題。我想問題是在我的jsps路徑中的某處,但無法解決這個問題。我嘗試了另一個jsp頁面(jsp:useBean GregorianCalendar),沒有自定義標籤,它工作。自定義jsp標記創建

TimeTag.java

package pack; 

import java.io.IOException; 
import java.util.GregorianCalendar; 
import java.util.Locale; 
import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.JspWriter; 
import javax.servlet.jsp.tagext.TagSupport; 
public class TimeTag extends TagSupport { 
    @Override 
    public int doStartTag() throws JspException { 
     GregorianCalendar gc = new GregorianCalendar(); 
     String time = "<hr/>Time : <b> " + gc.getTime() + " </b><hr/>"; 
     String locale = "Locale : <b> " + Locale.getDefault() + " </b><hr/> "; 
     try { 
      JspWriter out = pageContext.getOut(); 
      out.write(time + locale); 
     } catch (IOException e) { 
      throw new JspException(e.getMessage()); 
     } 
     return SKIP_BODY; 
    } 

    @Override 
    public int doEndTag() throws JspException { 
     return EVAL_PAGE; 
    } 
} 

custom.tld

<?xml version="1.0" encoding="ISO-8859-1"?> 

<taglib> 

    <tlib-version>2.1</tlib-version> 
    <short-name>ctg</short-name> 
    <tag> 
     <name>info-time</name> 
     <tag-class>pack.TimeTag</tag-class> 
     <body-content>empty</body-content> 
    </tag> 
</taglib> 

info.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> 
<%@ taglib prefix="ctg" uri="/custom.tld" %> 
<html> 
<head><title>Info</title> 
    Time & Locale info 
</head> 
<body> 
<ctg:info-time/> 
</body> 
</html> 

的index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> 
<html> 
<head><title>Index</title></head> 
<body> 
<br/> 
Time-tag 
<jsp:include page="info.jsp"/> 
</body> 
</html> 

project structure

,我也得到:

type Exception report 

message An exception occurred processing JSP page /index.jsp at line 7 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 
org.apache.jasper.JasperException: An exception occurred processing JSP page /index.jsp at line 7 

4: <body> 
5: <br/> 
6: Time-tag 
7: <jsp:include page="info.jsp"/> 
8: </body> 
9: </html> 


Stacktrace: 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 


root cause 
org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.info_jsp 
    org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:176) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:380) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:945) 
    org.apache.jsp.index_jsp._jspService(index_jsp.java:115) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 


root cause 
java.lang.ClassNotFoundException: org.apache.jsp.info_jsp 
    java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    java.security.AccessController.doPrivileged(Native Method) 
    java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:129) 
    org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:60) 
    org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:171) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:380) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:945) 
    org.apache.jsp.index_jsp._jspService(index_jsp.java:115) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

回答

0

我嘗試運行在Tomcat中7.x的代碼,並得到以下錯誤:

 
org.apache.jasper.JasperException: Mandatory TLD element jsp-version missing or empty in TLD /custom.tld 
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:56) 
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:445) 
... 

您可以通過添加在jsp-version元素解決問題custom.tld

<?xml version="1.0" encoding="ISO-8859-1"?> 
<taglib> 
    <tlib-version>2.1</tlib-version> 
    <jsp-version>2.1</jsp-version> 
    <short-name>ctg</short-name> 
    <tag> 
     <name>info-time</name> 
     <tag-class>pack.TimeTag</tag-class> 
     <body-content>empty</body-content> 
    </tag> 
</taglib> 
+0

這對我沒有必要,我的呃ror放置了custom.tld,我將它移到了web/WEB-INF/custom.tld中,它工作正常,但thx無論如何都是響應。 – MolecularMan

+0

什麼是您的Tomcat版本?我懷疑問題是.tld在一開始的位置。但是,當將.tld和.jsp放在WAR的根文件夾中時,Tomcat 7.x/6.x確實找到.tld文件。 –

+0

我只是在Tomcat 8.0.33中測試它,例外是'org.apache.jasper.JasperException:無法爲JSP編譯類...',根本原因是java.lang.NullPointerException \t org.apache。 jasper.compiler.TldCache.getTaglibXml'。 –