簡體   English   中英

Spring Boot - 放置 jsp 文件的位置

[英]Spring Boot - where to place the jsp files

我正在嘗試使用 MVC 開發一個新的 Spring boot 應用程序,作為將我現有的 Spring MVC 應用程序移動到 Spring boot 的第一步。

但是,我遇到了 jsp 文件映射的問題。

無法解析名稱為“dispatcherServlet”的 servlet 中名稱為“hello”的視圖

我在 SO 中准備了很多答案,但似乎沒有一個能解決我的問題——我不打算使用任何模板引擎,因為我將有很多 jsps 需要考慮——這可能是設置 spring boot 后的一個計划。

我有一個項目結構如下:

MyFirstApp
  --src/main/java
    --uk.co.company
      --MainApplication.java
      --ServletInitializer.java
    --uk.co.company.web
      --HelloController.java
  --src/main/resources
    --static
    --templates
    --application.properties
 --src
   --main
     --webapp
       --WEB-INF
         --jsp
           --hello.jsp
  --pom.xml

將代碼放在下面:

MyFirstAppApplication.java

 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, 
 HibernateJpaAutoConfiguration.class })
 @EnableWebMvc
 public class MyFirstAppApplication extends SpringBootServletInitializer {
     public static void main(String[] args) {
    SpringApplication.run(MyFirstAppApplication.class, args);
  }
}

ServletInitializer.java

  public class ServletInitializer extends SpringBootServletInitializer {

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

你好控制器.java

@Controller
public class HelloController {  
@RequestMapping("/hello")
public String sayHello() {      
    return "hello";
}   
}

你好.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hello</title>
</head>
<body>
hellooo
</body>
</html>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>uk.co.company</groupId>
<artifactId>MyFirstApp</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>

<name>MyFirstApp</name>
<description>Demo project for Spring Boot</description>

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

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

應用程序屬性

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

我創建了一個正在渲染 jsp 的演示項目

Git 網址: https : //github.com/rksharma1401/spring-boot-war

結帳然后 mvn package java -jar target\\simple-web-app-tomcat-0.0.1-SNAPSHOT.war URL : http://localhost:8081/w

我走了完全一樣的路。 將基於 jsp、基於 xml 的 spring 應用程序升級到 spring boot 2。遷移時需要考慮以下幾點:

首先刪除@EnableWebMvc。

其次,您需要在 MyFirstAppApplication 類之上使用 @ComponentScan。

嘗試閱讀這篇文章,它對我幫助很大https://htr3n.github.io/2018/12/jsp-spring-boot/

第三,您還需要與 embed-jasper 一起使用此依賴項:

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.22</version>
</dependency>

最后但並非最不重要的是,這是在 java 中創建視圖處理程序的快捷方式

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

據我所知,它只適用於 spring boot 2。你可以用 Java 實現來代替並調試它,看看它是否曾經達到過。

@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/jsp/");
    resolver.setSuffix(".jsp");       
    registry.viewResolver(resolver);
}

因為在我的例子中,我什至不需要特定的或默認的解析器。 我必須在 xml/bean 中定義每個控制器並在每個類中注入不同的解析器。

從 Spring Boot 類中刪除 @EnableWebMvc 注釋。 默認情況下,@SpringBootApplication 將您的應用程序啟用為 Web 應用程序。 明確聲明 @EnableWebMvc 將禁用自動配置,並且自動設置 DispatcherServlet 將被覆蓋,這會導致您出現問題。

問題在於 jar spring-boot-starter-parent 出於某種原因,這不適用於1.5.3 RELEASE版本。 它一直工作到版本1.5.2 RELEASE

我已經更新了pom.xml的父標簽如下:

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

為什么有兩個單獨的 java 類(MyFirstAppApplication,ServletInitializer)擴展 SpringBootServletInitializer 類?

刪除 ServletInitializer.java 並將配置方法從 ServletInitializer 移動到 MyFirstAppApplication。

我面臨同樣的問題,我通過以下更改消除了這個問題:

@SpringBootApplication
public class MyFirstAppApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(MyFirstAppApplication.class, args);
    }
}

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(MyFirstAppApplication.class);
}

無需使ServletInitializer新類。

如果您想通過 jar 包進行部署,不鼓勵使用目錄 src/main/webapp/WEB-INF/jsp/..。

“如果您的應用程序將被打包為 jar,請不要使用 src/main/webapp 文件夾。 雖然這個文件夾是一個通用標准,但它只適用於 war 打包,如果你生成一個 jar,它會被大多數構建工具默默地忽略。”

參考: https : //docs.spring.io/spring-boot/docs/1.1.4.RELEASE/reference/htmlsingle/#using-boot-structuring-your-code

由於 Spring boot 不知道如何將 JSP 轉換為 Servlet,因此需要包含一個依賴項。 所以,

  1. 檢查您的 tomcat-embed-core- 的版本 。罐。

  2. 轉到https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper上的相應版本發布

  3. 復制依賴項,它看起來像-

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

這里的版本需要根據您的 tomcat-embed-core jar 版本進行更新

  1. 更新 Maven 項目,以便它可以從 repo 下載 jar。

現在你可以開始你的項目了。

謝謝。

以下步驟為我解決了問題。

  1. pom中將包裝更改為 war :

    <packaging>war</packaging>

  2. application.properties ,添加:

    spring.mvc.view.prefix=/WEB-INF/views/

    spring.mvc.view.suffix=.jsp

    spring.main.web-application-type=SERVLET

(或者視圖解析器的 java 配置也對我有用)

  1. pom ,添加這些額外的依賴項:

     <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
  2. 以 uber jar 運行war

    java -jar warfilename.war

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM