2016-04-19 3 views
1

У меня есть приложение Spring загрузки, где я хочу использовать JspПроблем с рендерингом JSP весной ботинке

Вот моя зависимость в pom.xml

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.0.M2</version> 
    <relativePath/> <!-- lookup parent from repository --> 
</parent> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 
</properties> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.jsoup</groupId> 
     <artifactId>jsoup</artifactId> 
     <version>1.8.3</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.mail</groupId> 
     <artifactId>mail</artifactId> 
     <version>1.5.0-b01</version> 
    </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> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-mail</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

При попытке загрузить JSP-страницу, которая имеет

то страница частично показан правильно, но не в полной мере - например

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ page contentType="text/html;charset=UTF-8" language="java" 
    pageEncoding="UTF-8"%> 
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> 

отображается на экране.

Когда я удаляю <!Doctype html> - тогда я вижу только простой html, без представления.

Я пытался добавлять и удалять зависимости и, если добавить или удалить

<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> 
    <dependency> 
     <groupId>org.apache.tomcat.embed</groupId> 
     <artifactId>tomcat-embed-el</artifactId> 
     <scope>provided</scope> 
    </dependency> 

ничего действительно меняется - я до сих пор получить либо простой HTML или частично видимые JSP.

У меня такая же проблема, как, когда я запускаю его в IntellijIdea и когда я бегу скомпилирован банку

Я застрял здесь, и он чувствует, как я никогда не буду делать это :(Я смотрел на огромное количество учебных пособий и столько же вопросов на StackOverflow, как я мог бы нашел без помощи.

Любые советы очень высоко ценится!

UPDATE Когда я использую pom.xml из https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-web-jsp/pom.xml я получаю эту ошибку

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [name.valch.SeasonvarApplication]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.context.web.SpringBootServletInitializer 
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:182) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:321) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at name.valch.SeasonvarApplication.main(SeasonvarApplication.java:23) [classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65] 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) [idea_rt.jar:na] 
Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.context.web.SpringBootServletInitializer 
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:163) ~[spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:292) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:232) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:168) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 17 common frames omitted 
Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext 
    at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_65] 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_65] 
    at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_65] 
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152) ~[spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 21 common frames omitted 
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_65] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_65] 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_65] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_65] 
    ... 25 common frames omitted 
+0

вы читали/следовали [это] (http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle /) (особенно упомянутый [образец] (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-web-jsp/pom.xml)) –

ответ

2

Попробуйте добавить эти свойства application.properties (src/main/resources/):

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

Положите в JSP-страницы /WEB-INF/jsp/

в контроллере возврата, например, "индекс" вы должны иметь index.jsp в этом папка /WEB-INF/jsp/

Убедитесь, что ваша конфигурация подобна этой и присутствует @EnableWebMvc.

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
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.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 

    @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(); 
     } 
    } 

ОБНОВЛЕНИЕ Удалить объем предусмотренного этих зависимостей:

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

СПЯ затем будет корректно отображать; jsp rendered correctly

+0

Извините, что не публиковал это на мой вопрос. У меня есть такая настройка на основе аннотаций в моей конфигурации @Bean public ViewResolver getViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix ("/ WEB-INF/jsp /"); resolver.setSuffix (". Jsp"); return resolver; } И мой jsp находится в/WEB-INF/jsp/folder – lenach87

+0

Я вижу, этот класс аннотируется с @Configuration? он сканируется? попробуйте добавить некоторый след к этому методу getViewResolver(). –

+0

Он отмечен символом @Configuration. Метод getViewResolver введен, но когда я пытаюсь выполнить запись resolver.getApplicationContext(), я получаю сообщение об ошибке - экземпляр ApplicationObjectSupport [or[email protected]7c71c889] не запускается в ApplicationContext – lenach87

2

Вы когда-нибудь решали проблему? Я предполагаю, что большинство из вышеперечисленных парней пытались работать над проектом с помощью IDE. Его очень разные, когда вы запускаете проект как банку.

Наши JSP находятся в // проект // src/main/resources/META-INF/resources/WEB-INF/jsp/index.jsp Все, что у вас есть, это то же самое, что и у нас. Однако я обнаружил, что Spring boot 1.4.3 и выше останавливает поддержку встроенных JSP, возможно, они хотят заставить нас использовать thymeleaf;) Я только что вернулся к Spring boot 1.4.1, и JSP отлично работают с баночка.

+0

Я также изучаю, как обслуживать JSP из JAR с помощью SpringBoot (1.5 .Икс). Я столкнулся с несколькими примерами, в которых утверждается, что подача JSP в src/main/resources/META-INF/resources/и предоставление надлежащих префиксов и суффикс JSP могут быть поданы. Я сделал то же самое и смог заставить его работать из IDE, но не из упакованного JAR. Как вы уже упоминали, возможно, Springboot удалил поддержку для JSP из JAR. Я искал официальную декларацию/объявление для этого, но не смог найти. У вас есть такая ссылка из весеннего сообщества? –

0

Это, как я добавил поддержку JSP в моем SpringBoot приложение, которое использует встроенный сервер Tomcat (упаковка => баночку):

1) Добавление необходимых зависимостей в вашем pom.xml:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jstl</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
</dependency> 
<dependency><!-- Optional, use this only when you need spring security taglibs --> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-taglibs</artifactId> 
</dependency> 

2) Добавить вид префиксы в свойствах приложения (пример YAML ниже)

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

3) Настройка вид распознаватель:

@EnableWebMvc 
@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

@Value("${spring.mvc.view.prefix}") 
private String prefix; 

@Value("${spring.mvc.view.suffix}") 
private String suffix; 

/** 
* Configures view resolver for jsp views. 
*/ 
@Bean 
public InternalResourceViewResolver setupViewResolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
    resolver.setPrefix(prefix); 
    resolver.setSuffix(suffix); 
    resolver.setViewClass(JstlView.class); 
    return resolver; 
} 
} 

4) Создайте представления jsp в каталоге src/main/webapp/WEB-INF /.

Вы можете найти полный рабочий пример на моем GitHub: https://github.com/luwojtaszek/springboot-jsp

Смежные вопросы