gpt4 book ai didi

java - Spring MVC Controller 返回请求

转载 作者:行者123 更新时间:2023-12-01 10:23:24 31 4
gpt4 key购买 nike

我正在使用 Spring Boot 构建 Spring MVC 应用程序。由于某种原因,每当我从 Controller 返回 ModelAndView 时,这只会发送另一个请求,而不是返回 JSP 页面。

日志显示了这个问题。

2016-02-17 14:24:47 DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcherServlet' processing GET request for [/login]
2016-02-17 14:24:47 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /login
2016-02-17 14:24:47 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Returning handler method [public org.springframework.web.servlet.ModelAndView com.locker.controller.LoginController.login()]
2016-02-17 14:24:47 DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'loginController'
2016-02-17 14:24:47 DEBUG o.s.web.servlet.DispatcherServlet - Last-Modified value for [/login] is: -1
2016-02-17 14:24:47 DEBUG o.s.w.s.view.BeanNameViewResolver - No matching bean found for view name 'login'
2016-02-17 14:24:47 DEBUG o.s.b.f.s.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name 'login'
2016-02-17 14:24:47 DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2016-02-17 14:24:47 DEBUG o.s.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'login'; URL [/WEB-INF/pages/login.jsp]] in DispatcherServlet with name 'dispatcherServlet'
2016-02-17 14:24:47 DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'requestDataValueProcessor'
2016-02-17 14:24:47 DEBUG o.s.web.servlet.view.JstlView - Forwarding to resource [/WEB-INF/pages/login.jsp] in InternalResourceView 'login'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 4 of 12 in additional filter chain; firing Filter: 'CsrfFilter'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 5 of 12 in additional filter chain; firing Filter: 'LogoutFilter'
2016-02-17 14:24:47 DEBUG o.s.s.w.u.m.AntPathRequestMatcher - Request 'GET /web-inf/pages/login.jsp' doesn't match 'POST /logout
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 6 of 12 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter'
2016-02-17 14:24:47 DEBUG o.s.s.w.u.m.AntPathRequestMatcher - Request 'GET /web-inf/pages/login.jsp' doesn't match 'POST /login
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 7 of 12 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 8 of 12 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
2016-02-17 14:24:47 DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - SecurityContextHolder not populated with anonymous token, as it already contained: 'org.springframework.security.authentication.AnonymousAuthenticationToken@9055c2bc: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 10 of 12 in additional filter chain; firing Filter: 'SessionManagementFilter'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 11 of 12 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp at position 12 of 12 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
2016-02-17 14:24:47 DEBUG o.s.security.web.FilterChainProxy - /WEB-INF/pages/login.jsp reached end of additional filter chain; proceeding with original chain
2016-02-17 14:24:47 DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcherServlet' processing GET request for [/WEB-INF/pages/login.jsp]
2016-02-17 14:24:47 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /WEB-INF/pages/login.jsp
2016-02-17 14:24:47 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Returning handler method [public java.lang.String com.locker.controller.LoginController.errorHandler()]
2016-02-17 14:24:47 DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'loginController'

为了测试这一点,我添加了一个额外的 RequestMapping 来处理新请求:

@RestController
public class LoginController {

private static final Logger logger =
LoggerFactory.getLogger(LoginController.class);

@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView login() {

logger.debug("welcome() is executed, value {}", "mkyong");

ModelAndView model = new ModelAndView("login");

return model;
// localhost:8080/WEB-INF/pages/login.jsp
}

@RequestMapping("WEB-INF/pages/login.jsp")
public String errorHandler() {
return "Yup, this happened.";
}
}

这是MvcConfig:

@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan(basePackages = { "com.locker"})
@PropertySource("classpath:application.properties")
public class MvcConfig extends WebMvcConfigurerAdapter {

@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("home");
registry.addViewController("/test").setViewName("test");
registry.addViewController("/login").setViewName("login");
}

@Bean
public InternalResourceViewResolver setupViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}

@Bean
public DefaultAnnotationHandlerMapping getDefaultAnnotationHandlerMapping() {
DefaultAnnotationHandlerMapping handlerMapping = new DefaultAnnotationHandlerMapping();
handlerMapping.setAlwaysUseFullPath(true);
handlerMapping.setDetectHandlersInAncestorContexts(true);
return handlerMapping;
}
}

web.xml:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

当然,login.jsp 添加到文件夹/WEB-INF/pages/

为什么它会发送另一个请求而不是返回 JSP 页面?

最佳答案

以 @JB Nizet 的评论为基础:

  • 嵌入式 Tomcat 和 Jetty servlet 容器不支持渲染 JSP
  • 如果您在 IDE 之外运行 Spring Boot 应用程序,那么它很可能是使用嵌入式 servlet 容器之一运行的
  • 如果您使用 spring-boot-web-starter 依赖项,则 Tomcat 是默认的嵌入式容器

如果您没有在使用 JSP 方面进行大量投资,则Thymeleaf template engine是使用 JSP 的绝佳替代方案,它可以非常轻松地与 Spring Boot 集成,如 [使用 Spring MVC 提供 Web 内容] 所示。由于 Thymeleaf 扩展了现有的 HTML 标签,因此您可以设计页面布局并在浏览器中查看它,而无需进行 JSP 编译。对于 Spring Boot,只需包含 spring-boot-thymeleaf-starter 依赖项就会导致 Spring Boot 自动配置 Thymeleaf View 解析器。

如果您在使用 JSP 方面确实投入了大量资金,那么您将需要按照 @Randyr 链接到的文档中的讨论生成一个 WAR 文件,并将其部署到独立的 servlet 容器。大多数现代 IDE 都通过附加配置支持这一点。

另一件事对我来说确实很突出 - 您在 Controller 上使用了 @RestController 注释,但这似乎不是 REST Web 服务,而是 Web 应用程序。使用 @RestController 可能会或可能不会让你感到胃灼热,但它会让你后面的人感到困惑 - 使用 @Controller 会更合适,因为你返回 ModelAndView 而不是要转换为适当媒体类型的请求正文。

关于java - Spring MVC Controller 返回请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35458349/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com