今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

Springboot 加载jsp 404

 

项目结构

    

springmvc 配置  

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
访问页面时任然404,报如下错误,从日志中看出其实已经正确获取了jsp的路径,通过搜索引擎查找解决方式需要一个jasper依赖

providedRuntime group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper'

 

DEBUG o.s.web.servlet.DispatcherServlet - GET "/zlennon/index", parameters={}
DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to com.zlennon.web.controller.website.MainController#index()
DEBUG o.s.w.s.v.ContentNegotiatingViewResolver - Selected 'text/html' given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.9, */*;q=0.8]
DEBUG o.s.web.servlet.view.JstlView - View name '/website/index', model {}
DEBUG o.s.web.servlet.view.JstlView - Forwarding to [/WEB-INF/views//website/index.jsp]
DEBUG o.s.web.servlet.DispatcherServlet - "FORWARD" dispatch for GET "/zlennon/WEB-INF/views//website/index.jsp", parameters={}
DEBUG o.s.w.s.h.SimpleUrlHandlerMapping - Mapped to ResourceHttpRequestHandler ["classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", "/"]
WARN  o.s.w.s.r.ResourceHttpRequestHandler - Path with "WEB-INF" or "META-INF": [WEB-INF/views/website/index.jsp]
DEBUG o.s.w.s.r.ResourceHttpRequestHandler - Resource not found
DEBUG o.s.web.servlet.DispatcherServlet - Exiting from "FORWARD" dispatch, status 404
DEBUG o.s.web.servlet.DispatcherServlet - Completed 404 NOT_FOUND
DEBUG o.s.web.servlet.DispatcherServlet - "ERROR" dispatch for GET "/zlennon/error", parameters={}
DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
DEBUG o.s.w.s.v.ContentNegotiatingViewResolver - Selected 'text/html' given [text/html, text/html;q=0.8]
DEBUG o.s.web.servlet.DispatcherServlet - Exiting from "ERROR" dispatch, status 404

加上依赖后任然是404,然后试着增加版本,项目springboot版本为2.3.3,加入上面依赖后从项目依赖树中发现tomcat-embed-jasper是9.0.37,访问项目发现任然是404。然后试着更换版本吃泡面个 9.0.* ->8.*.*,最终发现下面这个版本成。原因不是很清楚。

providedRuntime group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version:'8.5.47'

 另一个问题,在不出现404问题后又出现了下面的问题,从错误栈中注意到HttpServletRequest没有这个方法getHttpServletMapping(),查看HttpServletRequest类发现有两个,一个在

embed的tomcat中  另一个在javax.servlet-api-3.1.0.jar 二在javax.servlet-api-3.1.0.jar中的HttpServletRequest确实没有getHttpServletMapping

那就是说项目启动后使用了javax.servlet-api-3.1.0.jar的类。其实内嵌的tomcat已经包含了所有启动需要的东西,所以我们不在需要依赖额外的servlet-api包。去掉该依赖,页面访问正常。

java.lang.NoSuchMethodError: 'javax.servlet.http.HttpServletMapping javax.servlet.http.HttpServletRequest.getHttpServletMapping()'
	at org.apache.catalina.core.ApplicationHttpRequest.setRequest(ApplicationHttpRequest.java:709)
	at org.apache.catalina.core.ApplicationHttpRequest.<init>(ApplicationHttpRequest.java:115)
	at org.apache.catalina.core.ApplicationDispatcher.wrapRequest(ApplicationDispatcher.java:911)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:358)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
	at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394)
	at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253)
	at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:832)

 

分享到:

专栏

类型标签

网站访问总量