[SOLVED] how to use both thymeleaf and jsp in same spring boot project

Issue

This Content is from Stack Overflow. Question asked by Alex

I know that this question duplicates these questions.

https://techhelpnotes.com/java-how-to-use-both-thymeleaf-and-jsp-in-same-spring-boot-project/

how to use both thymeleaf and jsp in same spring boot project

https://stackoom.com/en/question/2hMVq

But none of these sources helped me.

Following one of the previous guides, I added a configuration class. After that, the controller began to see the files, but about calling a file with the extension from the browser .jsp error appears.

here is the project code:

@EnableWebMvc
public class ViewConfiguration implements WebMvcConfigurer {
 @Autowired
 WebApplicationContext webApplicationContext;

 @Bean
 public SpringResourceTemplateResolver thymeleafTemplateResolver(){
     SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
     templateResolver.setApplicationContext(webApplicationContext);
     templateResolver.setOrder(9);
     templateResolver.setPrefix("/WEB-INF/views/");
     templateResolver.setSuffix("");
     return templateResolver;
 }

 @Bean
 public SpringTemplateEngine templateEngine() {
     SpringTemplateEngine springTemplateEngine= new SpringTemplateEngine();
     springTemplateEngine.setTemplateResolver(thymeleafTemplateResolver());
     springTemplateEngine.setEnableSpringELCompiler(true);
     return springTemplateEngine;
 }

 @Bean
 public ThymeleafViewResolver thymeleafViewResolver(){
     final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
     viewResolver.setViewNames(new String[] {"*.html"});
     viewResolver.setExcludedViewNames(new String[] {"*.jsp"});
     viewResolver.setTemplateEngine(templateEngine());
     viewResolver.setCharacterEncoding("UTF-8");
     return viewResolver;
 }

 @Bean
 public InternalResourceViewResolver jspViewResolver(){
     final InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
     viewResolver.setOrder(10);
     viewResolver.setViewClass(JstlView.class);
     viewResolver.setPrefix("/WEB-INF/views/");
     viewResolver.setSuffix("");
     viewResolver.setViewNames("*.jsp");
     return viewResolver;
 }
}

MyController.java

@Controller
public class MyController {
 

    @GetMapping("/1")
    public String jsp() {
        return "jj.jsp";
    }

    @GetMapping("/2")
    public String html() {
        return "hh.html";
    }
}

JspAndThymeleafApplication.java

@SpringBootApplication
public class JspAndThymeleafApplication {

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

}

ServletInitializer.java

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(JspAndThymeleafApplication.class);
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>jspAndThymeleaf</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>jspAndThymeleaf</name>
    <description>jspAndThymeleaf</description>
    <properties>
        <java.version>11</java.version>
    </properties>


    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

project structure:

enter image description here

При вызове http://localhost:8090/1

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sun Sep 18 15:05:38 MSK 2022
There was an unexpected error (type=Internal Server Error, status=500).
javax/servlet/jsp/jstl/core/Config
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
    at org.springframework.web.servlet.support.JstlUtils.exposeLocalizationContext(JstlUtils.java:103)
    at org.springframework.web.servlet.view.JstlView.exposeHelpers(JstlView.java:137)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:145)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1404)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1148)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 38 more

In the files.jj.jsp and hh.html simple hello world projects



Solution

Put below code in @configuration class. I can able to access both jsp and html files now.

@Autowired
WebApplicationContext webApplicationContext;

@Bean
public SpringResourceTemplateResolver thymeleafTemplateResolver(){
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setApplicationContext(webApplicationContext);
    templateResolver.setOrder(9);
    templateResolver.setPrefix("/WEB-INF/views/");
    templateResolver.setSuffix("");
    return templateResolver;
}

@Bean
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine springTemplateEngine= new SpringTemplateEngine();
    springTemplateEngine.setTemplateResolver(thymeleafTemplateResolver());
    springTemplateEngine.setEnableSpringELCompiler(true);
    return springTemplateEngine;
}

@Bean
public ThymeleafViewResolver thymeleafViewResolver(){
    final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setViewNames(new String[] {"*.html"});
    viewResolver.setExcludedViewNames(new String[] {"*.jsp"});
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setCharacterEncoding("UTF-8");
    return viewResolver;
}

@Bean
public InternalResourceViewResolver jspViewResolver(){
    final InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setOrder(10);
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix("");
    viewResolver.setViewNames("*.jsp");
    return viewResolver;
}

enter image description here

enter image description here


This Question was asked in StackOverflow by Prabagaran Sellamuthu and Answered by Prabagaran Sellamuthu It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?