JSP файл не отображается в Spring Загрузочном веб-приложении - программирование
Подтвердить что ты не робот

JSP файл не отображается в Spring Загрузочном веб-приложении

У меня есть веб-приложение загрузки Spring и запускается с использованием встроенного Tomcat (по умолчанию). Когда он обслуживает файлы JSP как часть рендеринга представления, указанного в моем контроллере, JSP не отображаются как таковые и вместо этого распечатывают содержимое. Например:

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="en">
    <head></head>
    <body>Test</body>
</html>

Когда представление отображается в браузерах, отображается содержимое выше, а не ожидаемое содержимое:

Test
4b9b3361

Ответ 1

Убедитесь, что ваш pom.xml указывает зависимость JSP от Tomcat следующим образом:

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

Кажется, что встроенный Tomcat обрабатывает JSP-рендеринг как необязательный.

Как упоминалось ниже, этот JAR иногда также необходим:

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

(я добавил, поскольку этот JAR должен быть включен в контейнер сервлета.

Ответ 2

Для этого вам понадобится не одна, а две зависимости (jasper и jstl) в вашем pom.xml.

   <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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>
</dependencies>

Ответ 3

Я работал так же, как сказал Дэн. Удаление области при условии.

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

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

Спасибо, парень!

Ответ 4

Работал для меня тоже, но мне пришлось удалить

<scope>provided</scope>

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

Ответ 5

Лучше вы можете использовать gradle (который догоняет Maven). Используйте эту зависимость в файле build.gradle.

//Требуемая зависимость для JSP

providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'

Ответ 6

Я думаю, вы пропустили какую-то конфигурацию, потому что легко интегрировать JSP, просто следуйте нижеуказанным шагам.

1 - зависимость от tomcat-embad-jasper

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

2 - Добавить ниже конфигурацию - application.properties

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

Что у него все еще есть некоторые сомнения, тогда проверьте его ниже ссылки

Spring Загрузка и JSP-интеграция

Ответ 7

Я решил свою проблему, когда в дополнение к описанному ранее:

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

added ViewResolver:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan
@EnableWebMvc
public class SpringServletConfig {
    @Bean
    public InternalResourceViewResolver resolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setPrefix("/WEB-INF/jsps/");
        vr.setSuffix(".jsp");
        return vr;
    }
}

from: Почему Spring MVC отвечает 404 и сообщает "Не найдено сопоставление для HTTP-запроса с URI [...] в DispatcherServlet"?

Ответ 8

Просто измените зависимость

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

к

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

    </dependency>

Ответ 9

Полная настройка gradle для Spring -Boot с помощью Spring -MVC и со встроенным сервером Tomcat:

build.gradle

buildscript {
    ext {
        springBootVersion = '1.5.8.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}


apply plugin: 'java'
apply plugin: 'org.springframework.boot'


//WEB-MVC
compile 'org.springframework.boot:spring-boot-starter-web:1.5.8.RELEASE'
compile 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.1'
compile 'javax.servlet:jstl:1.2'

App.class

@SpringBootApplication
public final class App {

    public static void main(final String[] args) {
        new SpringApplicationBuilder(App.class)
                .build(args)
                .run();
    }
    @Bean
    public ViewResolver viewResolver() {
         final InternalResourceViewResolver r = new InternalResourceViewResolver();
         r.setPrefix("/WEB-INF/jsp/");
         r.setSuffix(".jsp");
         return r;
    }

}

Ответ 10

Иногда tomcat-embed-jasper недоступен, поэтому вам необходимо удалить предоставленную из maven зависимость tomcat-embed-jasper.

например.

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

Ответ 11

Если вы хотите использовать 1.5.8.RELEASE или аналогичный, тогда приведенный пример и его объяснение здесь https://www.surasint.com/spring-boot-jsp/

Вам просто нужно это в pom.xml

http://maven.apache.org/xsd/maven-4.0.0.xsd" >   4.0.0          org.springframework.boot        spring -boot-стартер-родитель       1.5.8.RELEASE   

<groupId>com.surasint.example</groupId>
<artifactId>spring-boot-02</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- JSP -->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    <!-- jstl for jsp -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

И это в application.properties

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

Затем вы сохраняете свой jsp в папке /WEB -INF/jsp/.

Это контроллер.

package com.surasint.example.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Date;
import java.util.Map;

@Controller
public class TestController {

    @GetMapping("/testjsp")
    public String list(Map<String, Object> model) {
        model.put("this_time",new Date().toString());
        return "testjsp-view";
    }
}

Ответ 12

Причина в том, что вы используете аннотацию @RestController вместо @Controller

Когда вы аннотируете класс с помощью RestController, все методы, аннотированные с помощью @RequestMapping, принимают семантику @ResponseBody по умолчанию. Другими словами, ваш метод #index сериализует String/webapp/WEB-INF/index.jsp как JSON, а не отображает его значение в представление.

Как упоминалось в одном из ответов, оно должно быть

@Controller открытый класс YourController {...}

Ответ 13

Я столкнулся с проблемой, например, напечатал имя файла jsp в браузере вместо его содержимого.

Добавив нижеприведенный фрагмент для рендеринга страницы jsp в pom.xml, он отображается правильно.

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

Ответ 14

<servlet>
  <servlet-name>appServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherSe rvlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>appServlet</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

  I took the * off so it was just  from web.xml


<servlet>
  <servlet-name>appServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherSe rvlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>appServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

Ответ 15

У меня была эта проблема и, наконец, она решена!

Моя проблема заключалась в том, что я /WEB-INF/index.jsp код JSP на мою страницу /WEB-INF/index.jsp. Однако эта страница обслуживается напрямую, без обработки каким-либо сервлетом или контроллером. Поэтому у него не было шансов быть скомпилированным.

enter image description here

Мое решение:

  1. Переместите index.jsp в подпапку с именем views.

    enter image description here

  2. Отредактируйте web.xml так, чтобы он передавал управление корневым каталогом сервлету диспетчера.

    <!-- WEB-INF/web.xml -->
    
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
      <display-name>18-655_lab_1</display-name>
    
        <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>
    
    </web-app>
    
  3. Редактировать dispatcher-servlet.xml, чтобы убедиться, что он смотрит в views каталог для файлов, заканчивающихся в .jsp.

    <!-- WEB-INF/dispatcher-servlet.xml -->
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans     
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd">
    
        <mvc:annotation-driven />
        <context:component-scan
            base-package="com.app.controller" />
        <mvc:default-servlet-handler />
    
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix">
                <value>/WEB-INF/views/</value>
            </property>
    
            <property name="suffix">
                <value>.jsp</value>
            </property>
        </bean>
    
    </beans>
    
  4. Используя тот же путь base-package который указан в dispatcher-servlet.xml, создайте контроллер, который будет возвращать ModelAndView.

    enter image description here

    package com.app.controller;
    
    @Controller
    @RequestMapping(value = "/")
    public class RootController {
    
        @RequestMapping(method = RequestMethod.GET)
        public ModelAndView homeGet() {
    
            return new ModelAndView("index", "message", "IT WORKS!!!");
        }
    
    }
    
  5. Синтаксис new ModelAndView("index", "message", "IT WORKS!!!") означает, что
    • dispatcher-servlet ищет файл с именем "/WEB-INF/views/" + "index" + ".jsp".
    • Он компилирует файл jsp, заменяя все экземпляры ${message} на IT WORKS!!! ,

Поэтому последнее, что нужно сделать, это поместить ${message} где-нибудь в наш файл index.jsp.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
    <h1>${message}</h1>
</body>
</html>
  1. Загрузите проект на сервер Tomcat, запустите его и перейдите по http://localhost:8080/[project name]/.

    enter image description here

Ответ 16

Для меня с Spring Boot версии 1.5.10.RELEASE, он работал над добавлением ниже зависимостей maven.

Примечание: работал только на том, чтобы не предоставлять <scope> для этих двух.

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

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <!--<scope>provided</scope>-->
</dependency>

И приведенная ниже конфигурация в файле application.properties file

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

Ответ 17

Пожалуйста, примите во внимание, что существуют некоторые ограничения JSP. Вы не можете установить packaging вашего pom на jar. Прочитайте это ограничения JSP