【问题标题】:Unable to view JSP content, getting "an unexpected error (type=Not Found, status=404)"无法查看 JSP 内容,出现“意外错误(类型=未找到,状态=404)”
【发布时间】:2020-01-12 03:18:02
【问题描述】:

我刚刚开始 Spring Boot 应用程序开发。我试图用Netbeans 11.1 创建的默认jsp 文件显示简单的jsp 页面。我在网上搜索了这个错误,在网上找到了很多我目前尝试过的问题和答案。
大多数答案都说此错误是由于controller file 与其他java文件不在同一目录中引起的。但这不是我的情况。首先在下面查看我的文件结构。

我尝试直接从 webapp 文件夹加载 home.jsp 文件,而不是从 webapp/WEB-INF 文件夹和 webapp/WEB-INF/jsp 文件夹加载,因为我从 Github 的演示应用程序中看到了这个结构。

我在 .pom 文件中添加了 jasper 依赖项,该文件负责加载 .jsp 内容。

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

这是我的 AppContoller 类代码

@Controller
public class HomeController {
    @RequestMapping("home")
    public String home(){
        System.out.println("HomeController is running!!!"); //showing this output
        return "home.jsp";
    }
}

注意:这个类显示“HomeController is running!!!”当我输入locathost:8080/home时输出这意味着控制器配置正确,错误不是因为路径不同。

我的 MyWebAppApplication 类只有默认的 main 方法。 这是我在浏览器中得到的。

白标错误页面
此应用程序没有明确的映射 /error,因此您将其视为后备。

2019 年 9 月 10 日星期二 15:38:44 PKT
出现意外错误(type=Not 找到,状态=404)。 /home.jsp

如果我有任何其他问题,请告诉我。

我正在使用

  • 窗口 10
  • Netbeans 11.1
  • Java 版本 8
  • 使用 Maven 的 Spring Boot
  • 嵌入式 Tomcat 服务器

【问题讨论】:

    标签: java spring maven jsp netbeans


    【解决方案1】:

    您需要添加以下属性:

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

    return "home.jsp"; 替换为return "home";

    您还应该添加一些配置属性和依赖项:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.3.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
    </dependencies>
    

    更新: 使用以下类来运行应用程序:

    @SpringBootApplication
    public class MyWebAppApplication extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(DemoMvcApplication.class);
        }
        public static void main(String[] args) {
            SpringApplication.run(MyWebAppApplication.class, args);
        }
    }
    

    【讨论】:

    • 试过这些东西,但在控制台和浏览器中仍然得到相同的输出,最后一行显示/WEB-INF/home.jsp而不是/home.jsp
    • 抱歉错过了路径:spring.mvc.view.prefix=/WEB-INF/ 替换为spring.mvc.view.prefix=/WEB-INF/jsp
    • 得到这个/WEB-INF/jsphome.jsp。我认为jsp路径的末尾应该有/
    • with /WEB-INF/jsphome.jsp/ 我得到“绝对 uri:[java.sun.com/jsf/core] 无法在 web.xml 或使用此应用程序部署的 jar 文件中解析”
    • 在末尾添加“/” "spring.mvc.view.prefix=/WEB-INF/jsp" 不需要将此jar部署到tomcat。 Spring Boot 已经嵌入了 tomcat。
    【解决方案2】:

    默认Netbeans 11.1用这两行生成jsp文件

    <%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
    <%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
    

    这里的前缀是f,uri 是http://java.sun.com/jsf/core。当我将此标记库替换为

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>   //here prefix is `c` 
                                                                      & uri is from jsp/jstl instead of jsf
    

    并从默认 jsp 文件中注释掉第二个 taglib,它对我有用 :)。
    我认为这些依赖项应该可以完成工作,但我们也必须在 jsp 页面中指定正确的 tablib。

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

    另外,现在我在控制器中返回 home,而不是 i.bondarenko 在他的回答中建议的 home.jsp
    希望这会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2015-11-01
      • 2016-07-28
      • 2020-10-18
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多