If you like me followed https://spring.io/guides/gs/spring-boot/ and not able to open a web page hosted by Spring Boot , then this post may help you.
Let's say you are using Spring Boot 1.5.3.RELEASE and have a controller defined as below :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.cn.junjun.spring.sample.web.controller; | |
import org.springframework.stereotype.Controller; | |
import org.springframework.web.bind.annotation.RequestMapping; | |
import org.springframework.web.bind.annotation.RequestMethod; | |
@Controller | |
public class AuthController { | |
@RequestMapping(value = "/login", method = RequestMethod.GET) | |
public String displayLoginPage() { | |
return "login"; | |
} | |
@RequestMapping(value = "/login", method = RequestMethod.POST) | |
public String login() { | |
return "forward:/rest/todo/list"; | |
} | |
@RequestMapping(value = "/logout", method = RequestMethod.POST) | |
public String logout() { | |
return "/login"; | |
} | |
} |
When you put http://localhost:8080/login in the browser, it would end up below error :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2017-05-12 13:33:58.342 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/login] | |
2017-05-12 13:33:58.344 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /login | |
2017-05-12 13:33:58.345 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [java.lang.String YourController.login()] | |
2017-05-12 13:33:58.345 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'yourController' | |
2017-05-12 13:33:58.345 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/login] is: -1 | |
2017-05-12 13:33:58.352 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Requested media types are [text/html, application/xhtml+xml, image/webp, application/xml;q=0.9, */*;q=0.8] based on Accept header types and producible media types [*/*]) | |
2017-05-12 13:33:58.352 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.servlet.view.BeanNameViewResolver : No matching bean found for view name 'login' | |
2017-05-12 13:33:58.354 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Invoking afterPropertiesSet() on bean with name 'login' | |
2017-05-12 13:33:58.354 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Returning [org.springframework.web.servlet.view.InternalResourceView: name 'boot/init'; URL [/WEB-INF/jsp/login.jsp]] based on requested media type 'text/html' | |
2017-05-12 13:33:58.354 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Rendering view [org.springframework.web.servlet.view.InternalResourceView: name 'boot/init'; URL [/WEB-INF/jsp/login.jsp]] in DispatcherServlet with name 'dispatcherServlet' | |
2017-05-12 13:33:58.356 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.servlet.view.InternalResourceView : Forwarding to resource [/WEB-INF/jsp/boot/init.jsp] in InternalResourceView 'login' | |
2017-05-12 13:33:58.358 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/WEB-INF/jsp/login.jsp] | |
2017-05-12 13:33:58.358 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /WEB-INF/jsp/login.jsp | |
2017-05-12 13:33:58.362 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/WEB-INF/jsp/login.jsp] | |
2017-05-12 13:33:58.362 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/WEB-INF/jsp/login.jsp] are [/**] | |
2017-05-12 13:33:58.362 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/WEB-INF/jsp/login.jsp] are {} | |
2017-05-12 13:33:58.362 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/WEB-INF/jsp/login.jsp] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@ca27722]]] and 1 interceptor | |
2017-05-12 13:33:58.363 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/WEB-INF/jsp/login.jsp] is: -1 | |
2017-05-12 13:33:58.363 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling | |
2017-05-12 13:33:58.363 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Successfully completed request | |
2017-05-12 13:33:58.363 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Successfully completed request | |
2017-05-12 13:33:58.364 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@2508c551 | |
2017-05-12 13:33:58.364 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/error] | |
2017-05-12 13:33:58.364 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error | |
2017-05-12 13:33:58.365 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)] | |
2017-05-12 13:33:58.365 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'basicErrorController' | |
2017-05-12 13:33:58.365 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/error] is: -1 | |
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Requested media types are [text/html, text/html;q=0.8] based on Accept header types and producible media types [text/html]) | |
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'error' | |
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Invoking afterPropertiesSet() on bean with name 'error' | |
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Returning [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@4f63ed4b] based on requested media type 'text/html' | |
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Rendering view [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@4f63ed4b] in DispatcherServlet with name 'dispatcherServlet' | |
2017-05-12 13:33:58.388 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Successfully completed request |
From the console error log we can tell that request reached controller then system should load the resource login.jsp accordingly , but login.jsp is considered as a request since no controller is listening on login.jsp then it becomes NOT FOUND.
How to resolve it ?
STEP 1 : add below dependency to POM
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
STEP 2 : define below class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Configuration | |
@EnableWebMvc | |
public class WebConfig extends WebMvcConfigurerAdapter { | |
@Bean | |
public ViewResolver getViewResolver(){ | |
InternalResourceViewResolver resolver = new InternalResourceViewResolver(); | |
resolver.setPrefix("/WEB-INF/jsp/"); | |
resolver.setSuffix(".jsp"); | |
return resolver; | |
} | |
@Override | |
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){ | |
configurer.enable(); | |
} | |
} |
DONE
No comments:
Post a Comment