2015-04-21 21 views
18

Ich versuche, eine JSP-Seite in meinem Spring Boot-Dienst hinzuzufügen. Mein Problem ist, dass jedes Mal, wenn ich versuche, die Seite zu gehen, ich habe dies:Spring Boot JSP 404

Whitelabel Fehler Seite

Diese Anwendung hat keine explizite Zuordnung für/Fehler, so dass Sie diese als Ausweich sehen.

Di Apr 21 23:16:00 EEST 2015 Es gab einen unerwarteten Fehler (Typ = Nicht Gefunden, Status = 404). Keine Meldung vorhanden

ich das Präfix und sufix in meine application.properties hinzugefügt haben:

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

Das ist mein Controller-Klasse:

@Controller 
public class MarkerController { 
    @RequestMapping(value="/map") 
    public String trafficSpy() { 
     return "index"; 
    } 
} 

Meine Anwendungsklasse:

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 
    private static Logger logger = Logger.getLogger(Application.class.getName()); 

    public static void main(String[] args) { 
      logger.info("SPRING VERSION: " + SpringVersion.getVersion()); 
      SpringApplication.run(Application.class, args); 
     } 
} 

Und der index.jsp:

<!DOCTYPE html> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<html lang="en"> 

<body> 
    <h1>Hello, World!!!</h1> 


    <p>JSTL URL: ${url}</p> 
</body> 

</html> 

Und das ist die src Dateistruktur:

├── src 
│   ├── main 
│   │   ├── java 
│   │   │   └── com 
│   │   │    └── example 
│   │   │     └── internetprogramming 
│   │   │      └── myserver 
│   │   │       └── server 
│   │   │        ├── Application.java 
│   │   │        ├── config 
│   │   │        │   └── DatabaseConfig.java 
│   │   │        ├── controller 
│   │   │        │   └── MarkerController.java 
│   │   │        ├── dao 
│   │   │        │   ├── MarkerDaoImplementation.java 
│   │   │        │   └── MarkerDaoInterface.java 
│   │   │        ├── Marker.java 
│   │   │        └── service 
│   │   │         ├── MarkerServiceImplementation.java 
│   │   │         └── MarkerServiceInterface.java 
│   │   ├── resources 
│   │   │   └── application.properties 
│   │   └── webapp 
│   │    └── WEB-INF 
│   │     └── jsp 
│   │      └── index.jsp 
+0

Was die URL, die Sie zugreifen möchten, ist zu? – Andy

+1

localhost: 8080/map Ich habe einen Debug-Ausdruck in der Methode hinzugefügt und die Nachricht ausgedruckt, so dass die Methode aufgerufen wird. – definera

Antwort

20

Stellen Sie sicher, dass Sie Jaspis und jstl in der Liste der Abhängigkeiten:

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

Hier ist ein funktionierendes Starterprojekt - https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

+1

Das war es! Ich hatte die JSTL-Abhängigkeit, aber nicht den Jaspis. Es funktionierte nach dem Hinzufügen. Vielen Dank! – definera

+2

Auch! Für andere mit ähnlichen Problemen bei der Verwendung von Spring Boot 1.3.0 haben Sie wahrscheinlich übersehen, dass die Eigenschaften 'spring.view.prefix' und' spring.view.suffix' ihren Namen in 'spring.mvc.view.prefix' und' spring geändert haben. mvc.view.Präfix 'jeweils. [Mehr Infos hier] (https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3.0-M2-Release-Notes#property-renames). – worldsayshi

+4

Ich hatte das gleiche Problem. In meinem Fall musste ich den bereitgestellten Bereich auch aus der tomcat-embed-jasper-Abhängigkeit entfernen, bevor es funktionierte! – NickGreen

0

Spring MVC bietet keinen Standard (Fallback) Fehlerseite out-of-the-box. Die gebräuchlichste Art, eine Standardfehlerseite zu setzen, war immer die SimpleMappingExceptionResolver (seit Spring V1 in der Tat). Spring Boot bietet jedoch auch eine Fallback-Fehlerbehandlungsseite.

Beim Start versucht Spring Boot, eine Zuordnung für /error zu finden. Laut Konvention wird eine URL mit der Endung /error einer logischen Ansicht mit demselben Namen zugeordnet: error. Im Allgemeinen ist diese Ansicht wiederum mit der Thymeleaf-Vorlage error.html verknüpft. (Wenn JSP verwendet wird, würde es entsprechend der Konfiguration Ihres InternalResourceViewResolver auf error.jsp abgebildet).


Frühlings-Boot automatisch Thymeleaf wie die Ansicht Rendering-Engine, solange es auf dem Classpath verwenden und konfigurieren.

Thymeleaf mit Maven:

Stellen Sie sicher, Sie haben 3 Maven mit dem folgenden Befehl installiert: mvn -Version. Navigieren Sie zu dem Verzeichnis, das Sie Ihr Projekt in erstellen möchten, und führen Sie Maven archtetype:

mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=pl.codeleak.demos.sbt -DartifactId=spring-boot-thymeleaf -interactiveMode=false 

Der obige Befehl ein neues Verzeichnis Feder-boot-thymeleaf schaffen. Jetzt können Sie es in Ihre IDE importieren. Der nächste Schritt besteht darin, die Anwendung zu konfigurieren. Öffnen pom.xml und fügen Sie ein übergeordnetes Projekt:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.1.8.RELEASE</version> 
</parent> 

Werte aus dem übergeordneten Projekt wird der Standardwert für dieses Projekt sein, wenn sie nicht spezifiziert bleiben. Der nächste Schritt besteht darin, Webabhängigkeiten hinzuzufügen. Um dies zu tun, habe ich zuerst alle vorherigen Abhängigkeiten entfernt (junit 3.8.1 tatsächlich) und fügte hinzu, die unter Abhängigkeiten:

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

Nun warten Sie eine Sekunde, bis Maven die Abhängigkeiten und Lauf mvn Abhängigkeit Downloads: Baum zu sehen, welche Abhängigkeiten enthalten sind. Die nächste Sache ist eine Verpackungskonfiguration. Lassen Sie uns Frühlings-Boot Maven Plugin hinzufügen:

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

Thymeleaf mit Gradle:

Thymeleaf

compile("org.springframework.boot:spring-boot-starter-thymeleaf") 

in der gradle Build-Datei verwenden, auf dem Classpath setzen (mit der entsprechenden Maven Abhängigkeit ist einfach).

In Ihrem Fall, um die Ansicht index.jsp anzuzeigen (in Übereinstimmung mit dem Controller, den Sie verwenden), müssen Sie es unter src/main/resources/templates/ platzieren.


Wenn keine Zuordnung von/Fehlern auf einen Blick gefunden werden kann, definiert Frühling Stiefel seine eigene Fehlerseite Fall-Back - die so genannten Whitelabel Error Page (eine minimale Seite nur mit den HTTP-Statusinformationen und eventuellen Fehlerdetails wie die Nachricht von einer nicht abgefangenen Ausnahme).

+1

Vielen Dank für Ihre ausführliche Antwort, aber ich möchte nicht von/Fehler zuordnen. Ich will index.jsp zurückgegeben und gerendert werden, wenn /map – definera

3

Mein Problem war, dass ich mit @RestController statt @Controller als die Anmerkung in meiner Controller-Klasse. Hoffe, das kann jemandem helfen.

4

In neueren Versionen von Spring, folgenden Anforderungen in application.properties gesetzt wird Datei:

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

auch JSP-Dateien unter src/main/resources/META-INF/resources/WEB-INF/jsp

+0

Das hat es für mich behoben –

+0

sicher, aber das ist nur Konfiguration und während effektiv in den meisten gängigen Szenarien, spiegelt es nur den gewünschten Speicherort Ihrer jsps. Ich könnte diese auf 'spring.mvc.view.prefix =/WEB-INF/foo/bar/jsp' setzen und alle meine jsps dorthin legen, wenn ich wollte. – coderatchet

1

meine Frage gestellt werden müssen, wurde Frühling vesrion: ich fand, dass seit 1.4.3 Version und höher s Tops unterstützen die eingebetteten JSPs. Also ändere ich die Version auf 1.4.1, es funktioniert für mich.

eine andere Sache ausziehen:

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

es nicht mit ihm arbeiten.

1

Zusätzlich zu den Antworten über die Anwendung muss eingesetzt werden, wie Krieg statt jar

<groupId>com.igt</groupId> 
<artifactId>customer</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>war</packaging> 

java -jar customer-0.0.1-SNAPSHOT.war 

auch ausführen Wenn Sie Ihre Anwendung als Krieg beginnen oder Als ausführbare Anwendung müssen Sie die Anpassungen des Builders in einer Methode freigeben, die sowohl für den SpringBootServletInitializer-Rückruf als auch für die Hauptmethode verfügbar ist, z. B.

package com.igt.customer; 

import java.util.Arrays; 

import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.Bean; 



@SpringBootApplication 
public class CustomerApplication extends org.springframework.boot.web.support.SpringBootServletInitializer { 


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

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



    @Bean 
     public CommandLineRunner commandLineRunner(ApplicationContext ctx) { 
      return args -> { 

       System.out.println("Let's inspect the beans provided by Spring Boot:"); 

       String[] beanNames = ctx.getBeanDefinitionNames(); 
       Arrays.sort(beanNames); 
       for (String beanName : beanNames) { 
        System.out.println(beanName); 
       } 

      }; 
     } 


} 

Bitte sehen

this

-1

Versuchen und fügen Sie Ihre Fehler jsp Dateien unter Fehlerordner.

application.properties 
spring.mvc.view.prefix=/views/jsp/ 
spring.mvc.view.suffix=.jsp 

jsp files : 
/views/jsp/error/401.jsp 
/views/jsp/error/404.jsp - to display 404 instead of default whitelabel page 
+0

Und wo ist die Antwort für das oben beschriebene Problem? – Aditzu

0

Sie können mit jsp verwenden thymeleaf aber man muss schreiben:

spring.thymeleaf.excluded-view-names=#jsp file without extension 

in application.properties

0

Datei dies in pom.xml haben

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

Es vielleicht nicht genug.

Sie dürfen dies nicht verpassen.

<packaging>war</packaging> 

Andernfalls, wenn Sie das Paket erstellen, werden Sie als JAR-Datei erhalten und dass nicht über JSP noch den eingebetteten Kater.

Siehe fahrbare Beispiel und seine Erklärung hier https://www.surasint.com/spring-boot-jsp/

0

Sie würden in 2 Fällen diese Fehlermeldung erhalten:

Entweder Sie verpassen Abhängigkeiten hinzuzufügen jsp zu kompilieren:

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

ODER Sie paketieren Ihre Anwendung als jar anstelle von Krieg, derzeit gibt es Einschränkungen in Spring Boot für die Unterstützung von JSP innerhalb JAR-Datei (th Der View-Resolver würde nicht korrekt zugeordnet werden).

Sie können zur weiteren Erläuterung dieses komplettes Beispiel überprüfen: Spring Boot + JSP

Verwandte Themen