mehrnaz bayaki
mehrnaz bayaki

Reputation: 69

spring boot jsp file can not be viewed

I'm using spring boot application. I have set the MvcConfig class for it and added tomcat-embed-jasper and jstl dependencies to pom.xml. However, I can not view my jsp file in the 'WEB-INF' folder, I will get 404 error (Whitelabel Error Page).I have set the Application.properties. here is my application.properties:

#
## View resolver
#
spring.view.prefix: /WEB-INF/jsp/
spring.view.suffix: .jsp

Here is my MvcConfig class:

package com.goodvideotutorials.spring.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

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

}

Here is my home.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Up and running with Spring Framework quickly</title>
</head>
<body>
    <h2>Hello, world!</h2>
</body>
</html>

it is inserted inside src > main > webapp > WEB-INF > jsp > home.jsp

I have added these dependencies to pom.xml:

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

this is my Application.java class:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer {
       public static void main(String[] args)  {
           ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }
}

and my controller class:

@Controller
public class RootController {

//  @RequestMapping("/")
//  public String home() {
//
//  return "home";
//  
//  }

}

Any way if I make the code commented in the controller and don't use MvcConfig, it doesn't work. If I comment that code and use MvcConfig class, it doesn't work as well. This is the url : localhost:8080

I just tested many things , but it shows "Whitelabel Error Page" instead of JSP. I also have Tomcat server installed in the JEE environment. Could that cause problem?

Upvotes: 5

Views: 7412

Answers (5)

Fatiq Hussnain
Fatiq Hussnain

Reputation: 181

In application.properties file put this code

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

Also add following dependencies:

<dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>10.1.30</version>
    </dependency>

    <dependency>
        <groupId>jakarta.servlet.jsp.jstl</groupId>
        <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    </dependency>

    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    </dependency>

Folder Structure should look like this

Upvotes: 0

Nomade
Nomade

Reputation: 1748

The problem is caused by the <scope> of the org.apache.tomcat.embed dependency. To resolve the <scope>provided</scope> line. So, the dependency looks like :

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>

The scope provided is only available on the compilation and test classpath not at the runtime. It is not transitive as default scope compile.

Upvotes: 0

varunsinghal65
varunsinghal65

Reputation: 556

just my 2 cents.

For me i received the following warning in server logs :

WARN  : ResourceHttpRequestHandler : Path with "WEB-INF" or "META-INF": [WEB-INF/jsp/welcome.jsp]

and the white label error page was displayed, to fix it i modifed my JSP location

from

src/main/webapp/WEB-INF/jsp/welcome.jsp

to

src/main/webapp/templates/jsp/welcome.jsp

Why it worked for me ?

Spring documentation clearly states that ResourceHttpRequestHandler will reject any URL that contains either WEB-INF or META-INF.

ResourceHttpRequestHandler doc link

From DOCS: Identifies invalid resource paths. By default rejects: Paths that contain "WEB-INF" or "META-INF"

Hence as soon as i replaced the WEB-INF folder name with templates, it started working.

Note : I also had my internal view resolver configured with required prefix and suffix. I am using spring-boot-starter-parent - 2.1.2.RELEASE

Upvotes: 3

Jeet Singh Parmar
Jeet Singh Parmar

Reputation: 727

Follow below steps

1 - tomcat-embed-jasper dependency

<dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
      <scope>provided</scope>
</dependency>

2 - Add below configuration is application.properties

spring.mvc.view.prefix: /
spring.mvc.view.suffix: .jsp

3 - whatever JSP page you want to show so for that add below code in controller

@RequestMapping("/")
public String welcome(Model model) {
    model.addAttribute("message", "Hello World !!!");
    return "welcome";
}

so based on above code it will look for welcome.jsp file in webapps/welcome.jsp

That's it still have some doubt then check it out below link

Spring Boot and JSP Integration

Upvotes: 0

codeaholicguy
codeaholicguy

Reputation: 1691

Spring boot help you automatically by:

Add file src/main/resources/application.properties:

spring.view.prefix: /WEB-INF/jsp/ 
spring.view.suffix: .jsp

And dependency:

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
</dependency>

Or You should add configuration for view resolver like:

@Configuration
@EnableWebMvc
public class MvcConfiguration 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();
    }    
}

Change your Application like:

public class Application extends SpringBootServletInitializer {

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

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

Upvotes: 0

Related Questions