【问题标题】:Spring Boot not render JSP viewSpring Boot 不渲染 JSP 视图
【发布时间】:2017-05-02 00:43:54
【问题描述】:

我使用 Spring Boot 1.5.3.RELEASE。这是课程MvcConfiguration

package hello;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import java.util.Locale;

@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter {

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

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");
        logger.info("Register ViewResolver success.");
        return resolver;
    }

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

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.US);
        return slr;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("locale");
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
        super.addInterceptors(registry);
    }

}

控制器:

package hello;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping(path = "/")
public class HomeController {

    @RequestMapping(method = RequestMethod.GET)
    public String home(){
        return "currency";
    }

}

调试应用时,我会看到日志

2017-05-02 07:41:48.970  INFO 3333 --- [           main] hello.MvcConfiguration                   : Register ViewResolver success.

但是 webapp 返回纯 JSP 文本:

我在build.gradle 添加了必要的依赖项。我更喜欢在独立的 Tomcat 上运行 Web 应用程序。如何解决?

【问题讨论】:

标签: java spring jsp spring-mvc spring-boot


【解决方案1】:

根据 Spring Boot 文档:

应尽可能避免使用 JSP,将它们与嵌入式 servlet 容器一起使用时存在一些已知限制。

这是链接:

http://docs.spring.io/spring-boot/docs/1.5.3.RELEASE/reference/htmlsingle/#boot-features-spring-mvc-template-engines

【讨论】:

    【解决方案2】:

    您需要为tomcat-embed-jasper 添加依赖项。 build.gradle 文件中的依赖项应如下所示。

    dependencies {
        compile("org.springframework.boot:spring-boot-starter-web")
        // JPA Data (We are going to use Repositories, Entities, Hibernate, etc...)
        compile 'org.springframework.boot:spring-boot-starter-data-jpa'
        compile 'mysql:mysql-connector-java'
        compile 'javax.servlet:jstl:1.2'
        providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
    

    现在您可以像下面那样运行您的 Spring Boot 应用程序了。

    gradle bootRun
    

    如果你想在独立的 tomcat 中部署,那么不要添加 tomcat-embed-jasper 依赖项。你的战争文件中需要jstl jar。

    gradle build
    

    【讨论】: