Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 未在Spring Boot web应用程序中呈现JSP文件_Spring Boot - Fatal编程技术网

Spring boot 未在Spring Boot web应用程序中呈现JSP文件

Spring boot 未在Spring Boot web应用程序中呈现JSP文件,spring-boot,Spring Boot,我有一个SpringBootWeb应用程序,它使用嵌入式Tomcat(默认设置)启动并运行。当它提供JSP文件作为呈现我在控制器中指定的视图的一部分时,JSP并不是这样呈现的,而是打印出内容。例如: index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html lang="en">

我有一个SpringBootWeb应用程序,它使用嵌入式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>

确保您的
pom.xml
指定Tomcat JSP依赖项,如下所示:

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

org.apache.tomcat.embed
汤姆卡特·贾斯珀
假如
嵌入式Tomcat似乎将JSP呈现视为可选的

如下所述,这个罐子有时也是必要的:

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

javax.servlet
jstl
假如

(我添加了这个JAR,因为它应该包含在servlet容器中。

pom.xml
中,您需要的不是一个依赖项,而是两个依赖项(jasper和jstl)

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

org.springframework.boot
SpringBootStarterWeb
org.apache.tomcat.embed
汤姆卡特·贾斯珀
假如
javax.servlet
jstl
您可以更好地使用gradle(它正在追赶Maven)。在build.gradle文件中使用此依赖项

//JSP所需的依赖项


也为我工作,但我不得不搬走

<scope>provided</scope>

<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
已提供
org.apache.tomcat.embed
汤姆卡特·贾斯珀

对于我来说,工作方式与Dan提到的相同。删除提供的范围

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

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

org.apache.tomcat.embed
汤姆卡特·贾斯珀
javax.servlet
jstl

感谢guy的!

除了前面描述的以外,我还解决了我的问题:

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

from:

我面临的问题是在浏览器中打印jsp文件名而不是其内容

通过在pom.xml中添加下面用于jsp页面呈现的代码片段,它可以正确呈现

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

org.apache.tomcat.embed
汤姆卡特·贾斯珀

我认为您错过了一些配置,因为集成JSP很容易,只需遵循以下步骤即可

1-tomcat embad jasper依赖项

<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>
        <scope>provided</scope>
    </dependency>
这是它仍然有一些疑问,然后查看下面的链接


只需更改依赖项即可

<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>
        <scope>provided</scope>
    </dependency>

org.apache.tomcat.embed
汤姆卡特·贾斯珀
假如


org.apache.tomcat.embed
汤姆卡特·贾斯珀

使用Spring MVC和嵌入式Tomcat服务器进行Spring引导的完整渐变设置:

格雷德尔先生

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'
应用程序类

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

}

有时tomcat嵌入jasper不可用,因此需要从tomcat嵌入jasper的maven依赖项中删除提供的

例如


org.apache.tomcat.embed
汤姆卡特·贾斯珀

如果您想使用1.5.8.RELEASE或类似版本,那么这里有一个可运行示例及其说明

您只需要在pom.xml中使用它

http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot spring启动程序父级 1.5.8.1发布

然后将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";
    }
}
package com.surasint.example.web.controller;
导入org.springframework.stereotype.Controller;
导入org.springframework.web.bind.annotation.GetMapping;
导入java.util.Date;
导入java.util.Map;
@控制器
公共类测试控制器{
@GetMapping(“/testjsp”)
公共字符串列表(映射模型){
model.put(“这次”,新日期().toString());
返回“testjsp视图”;
}
}

appServlet
org.springframework.web.servlet.DispatcherSe rvlet
1.
appServlet
/*
我去掉了*所以它只是来自web.xml
appServlet
org.springframework.web.servlet.DispatcherSe rvlet
1.
appServlet
/

原因是您正在使用注释@RestController而不是@Controller

当您使用RestController注释类时,默认情况下,所有使用@RequestMapping注释的方法都采用@ResponseBody语义。换句话说,您的方法#索引将字符串/webapp/WEB-INF/index.jsp序列化为JSON,而不是将其值映射到视图

就像在其中一个答案中提到的,它必须是

@控制器 公共类控制器{ ...
}我遇到了这个问题,最后解决了

我的问题是,我一直在我的
/WEB-INF/index.JSP
页面中放置JSP代码。但是,该页面直接提供服务,没有任何servlet或控制器进行处理。因此,它没有被编译的机会

我的解决方案:

  • index.jsp
    移动到名为
    views
    的子文件夹中

  • 编辑
    web.xml
    ,以便它将根目录的控制权传递给DispatcherServlet

    <!-- 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>
    
  • 使用与
    dispatcher servlet.xml
    中指定的相同
    基本包
    路径,创建将返回ModelAndView的控制器

  • 语法
    newmodelandview(“index”、“message”、“IT WORKS!!!”)
    意味着
    • DispatcherServlet
      查找名为
      “/WEB-INF/views/“+”索引“+”.jsp”
    • 它编译jsp文件,将
      ${message}
      的所有实例替换为
      它可以工作!!!
  • 因此,最后要做的事情是将
    ${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>
    
    
    ${message}
    
  • 将项目加载到Tomcat服务器中,启动它,然后转到
    http://localhost:8080/[项目名称]/


  • 对于我来说,使用SpringBootVersion1.5.10.RELEASE,它可以添加以下maven依赖项

    注意:仅用于不为这两个项目提供

    
    org.apache.tomcat.embed
    汤姆卡特·贾斯珀
    javax.servlet
    jstl
    
    并在application.properties中提供以下配置
    <dependency>
       <groupId>org.apache.tomcat.embed</groupId>
       <artifactId>tomcat-embed-jasper</artifactId>
       <!--scope>provided</scope-->
    </dependency>
    
    <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>
    
    spring.mvc.view.prefix: /WEB-INF/jsp/
    spring.mvc.view.suffix: .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";
        }
    }
    
    <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>
    
    <!-- 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>
    
    <!-- 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>
    
    package com.app.controller;
    
    @Controller
    @RequestMapping(value = "/")
    public class RootController {
    
        @RequestMapping(method = RequestMethod.GET)
        public ModelAndView homeGet() {
    
            return new ModelAndView("index", "message", "IT WORKS!!!");
        }
    
    }
    
    <%@ 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>
    
    <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>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jasper</artifactId>
            <version>9.0.1</version>
    </dependency> 
    
    @Controller
    public class IndexController {
    
        @RequestMapping("/index")
        public String index(Model model) {
            model.addAttribute("name", "jancsi");
            return "index";
        }
    }
    
    @Configuration
    @EnableWebMvc
    @ComponentScan
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/views/", ".jsp");
        }
    
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    }