问题之HTTP Status 500 - Unable to compile class for JSP更优雅的解决方案

一上午的坑,终于找到合适的解决方案跳出来了,这个问题其实到现在为止还是Apache的一个未解决的bug,https://bz.apache.org/bugzilla/show_bug.cgi?id=57020

 不过,通过一上午的努力,在这有了更优雅的解决方案

 

[html] view plain copy
 
  1. HTTP Status 500 - Unable to compile class for JSP:  
  2.    
  3. type Exception report  
  4.    
  5. message Unable to compile class for JSP:  
  6.    
  7. description The server encountered an internal error that prevented it from fulfilling this request.  
  8.    
  9. exception  
  10.    
  11. org.apache.jasper.JasperException: Unable to compile class for JSP:   
  12.    
  13. An error occurred at line: [65] in the generated java file: [C:\zml\Tomcat 8.0\work\Catalina\localhost\DeveloperClubWeb\org\apache\jsp\index_jsp.java]  
  14. The method getDispatcherType() is undefined for the type HttpServletRequest  
  15.    
  16. Stacktrace:  
  17.     org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)  
  18.     org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:198)  
  19.     org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:450)  
  20.     org.apache.jasper.compiler.Compiler.compile(Compiler.java:361)  
  21.     org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)  
  22.     org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)  
  23.     org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:585)  
  24.     org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)  
  25.     org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)  
  26.     org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)  
  27.     javax.servlet.http.HttpServlet.service(HttpServlet.java:729)  
  28.     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)  
  29.     org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)  
  30.     org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)  
  31.     org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244)  
  32.     org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027)  
  33.     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)  
  34.     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)  
  35.     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)  
  36.     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)  
  37.     javax.servlet.http.HttpServlet.service(HttpServlet.java:622)  
  38.     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)  
  39.     javax.servlet.http.HttpServlet.service(HttpServlet.java:729)  
  40.     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)  
  41.     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)  
  42.     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)  
  43. note The full stack trace of the root cause is available in the Apache Tomcat/8.0.22 logs.  



 

产生问题分析:

使用maven对jar包进行管理,因此当使用SpringMVC框架的时候肯定会手动的配置 servlet-api.jar 、jsp-api.jar等jar包到项目中,否则一些jsp肯定会无情的报错(找不到对应jar包的),但是当配置了servlet-api.jar之后,就可能会与tomcat容器中的jar包冲突,导致出现以上问题,无法找到jsp,该问题在tomcat8即以上才会出现,在tomcat7即以下是没有问题的

那么如果使用tomcat8及更高版本的童鞋们就可能会用到以下解决方案了

解决方案:

  • 方案一:发布项目后,到webapps目录下把项目中引用的servlet-api-xxx.jar移除掉,重新启动tomcat,记得是重新启动tomcat,而不是重新发布项目
  • 方案二:直接在项目中添加 Server Library 

        在项目上右键-->build Path -->Add Library -->Server Library --> Apache Tomcat v8.0(前提是,已经将tomcat8及更高版本集成到Eclipse、或MyEclipse或使用的其他IDE中)

以上两种解决方案,对于使用maven项目总有点治标不治本,使用maven目的就是对jar包依赖完全控制,如果到时候,还需要手动添加jar或者删除jar,那在团队协作的时候,无疑是很麻烦的,所以在这再提供一种解决方案

 

  • 方案三:添加scope限制为provided
[html] view plain copy
 
  1. <dependency>  
  2.     <groupId>tomcat</groupId>  
  3.     <artifactId>servlet-api</artifactId>  
  4.     <version>5.5.23</version>  
  5.     <scope>provided</scope>  
  6. </dependency>  

 文章首次发布于个人博客之——吾勇士的博客  问题之HTTP Status 500 - Unable to compile class for JSP更优雅的解决方案

 

添加provided限制:

容器或JDK已提供范围,表示该依赖包已经由目标容器(如tomcat)和JDK提供,只在编译的classpath中加载和使用,打包的时候不会包含在目标包中。最常见的是j2ee规范相关的servlet-api和jsp-api等jar包,一般由servlet容器提供,无需在打包到war包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)

posted @ 2018-01-31 23:51  山里的小龙人  阅读(335)  评论(0)    收藏  举报