Spring MVC 将 jsp 作为文本/纯内容类型返回

标签 spring spring-mvc spring-boot

我对 Spring MVC 和 jsp 网页有问题。

当我请求一个网页时,它默认以文本/纯文本形式返回。我尝试在 HttpServletResponse 手动将内容类型设置为 text/html Controller ,Web 浏览器对其进行重新配置,正确显示它,但在正文中对 jsp 标签进行编码。例子:

JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Error 405 ******* </title>
    </head>
    <body> asdasdsasad </body>
</html>

浏览器接收:
<html>
   <body>&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%&gt;

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Title</title>

    </body>
</html>

我正在使用 Spring Boot 和基于 java web 的注释进行配置。另外,我正在使用 @EnableAutoConfiguration ,我发现问题是通过将sevlet从“/*”映射到“/”来解决的。

由于java注释,我不得不覆盖dispatchedServlet( https://github.com/spring-projects/spring-boot/issues/91#issuecomment-27626036 ),配置类是:
@Configuration
public class DispatcherConfiguration {

@Bean
public ServletRegistrationBean dispatcherRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet());
    registration.addUrlMappings("/");
    registration.setLoadOnStartup(1);

    System.out.println("~~~~~~~ Servlet regristated " + registration.getServletName());
    return registration;

}

@Bean
public DispatcherServlet dispatcherServlet() {
    return new DispatcherServlet();
}

请注意,我使用的是 @Bean注解跟不上前面的评论链接,因为如果没有,Spring boot 会抛出异常。但即使不使用 bean 注释,并且使用 xml,主要问题仍然存在)。

这是 Spring MVC 配置文件:
@Configuration
@EnableWebMvc
@ComponentScan("es.sfacut")
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/login").setViewName("login"); 
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}

// Maps resources path to webapp/resources
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    registry.addResourceHandler("/images/**").addResourceLocations("/resources/images/");
    registry.addResourceHandler("/imgs/**")
        .addResourceLocations(Constant.RESOURCE_IMAGES_PATH);
}

@Bean
public UrlBasedViewResolver setupViewResolver() {
    UrlBasedViewResolver resolver = new UrlBasedViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
// resolver.setContentType("text/html");
    resolver.setViewClass(JstlView.class);

    return resolver;
}

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

@Bean
public MultipartResolver multipartResolver() {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    // Size in bytes
    resolver.setMaxUploadSize(1752300);
    return resolver;
}

}

主要类:
@EnableAutoConfiguration
@ComponentScan("es.sfacut")
@EnableJpaRepositories
public class TelocomproMain {

    public static void main(String[] args) {
        SpringApplication.run(TelocomproMain.class, args);
    }

}

Controller :
@RestController
@RequestMapping(value = "/api/")  
public class CategoryController {
    @RequestMapping(value="test4", method = RequestMethod.GET, produces = "text/plain;charset=UTF-8")
    public ModelAndView pageTest4(HttpServletResponse response) {

        ModelAndView model = new ModelAndView("elovendo/index");
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");
        return model;
    }
}

应用程序属性:
#View resolver
spring.view.prefix= /WEB-INF/views/
spring.view.suffix= .jsp

不确定我是否遗漏了什么,我会发布你需要的一切。

先感谢您。

最佳答案

您的 Controller 应该是 @Controller不是 @RestController ,否则响应将作为您观察到的字符串返回。

正如评论中已经提到的,您根本不需要自定义配置,您可以查看 Spring boot 提供的示例。团队 https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp .

关于Spring MVC 将 jsp 作为文本/纯内容类型返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24952507/

相关文章:

Spring AspectJ,方法执行之前的切入点,其中注释了方法或类

java - hibernate映射中可以映射多少个表?

java - 如何在 Spring Security 登录中获取自定义用户实体以进行自定义身份验证?

Spring 3 MVC 和 Apache Tiles 2 集成错误

java - Spring MVC 中数字数据不绑定(bind)

spring - 忽略 Jackson OnDemand 中的嵌套属性

java - Tomcat 7.0 : Error creating bean with name 'org. springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor

java - 为什么 hibernate 返回一个代理对象?

mysql - 使用 maria DB、JPA 和 Spring Boot 1.5.4 基于架构的 Multi-Tenancy

Spring Consul - 禁用单元测试