web-dev-qa-db-ja.com

デフォルトでは、Spring Bootはビューの保存場所をどこに期待していますか?

私は、Spring Bootを使用して、構成の重いVanilla Spring MVCプロジェクトを書き直そうとしています。私は、Spring Boot Initiaizerを使用してIntelliJで新しいSpring Bootプロジェクトを開始し、Javaベースの最小限の構成のルートを進めています。多くのチュートリアルでは、生成されたデフォルトのメインクラスで十分であり、@SpringBootApplicationにはすべてが含まれています。サンプルを取得しましたRESTコントローラーが動作し、シリアル化されたオブジェクトをJSONとして返しますが、表示するビューを取得するのは難しいことがわかっています。私の構造は次のとおりです。作成したディレクトリ。

src
`-main
   `-Java
   `-resources
     `-static
     `-templates
   `-webapp
     `-WEB-INF
        `-home.jsp

コントローラーは単純です。

@Controller
public class ViewMaster {
    @RequestMapping("/home")
    public String home() {
        return "home";
    }
}

構成なしで、Spring Bootがビューの保存場所と拡張機能(html?)を期待する場所を知りたいです。また、application.propertiesそれでも404エラーが表示されます。リソース内でWEB-INFディレクトリまたはhtmlファイルだけを移動しても、役に立ちませんでした。

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

また、これらの依存関係をpom.xmlに効果なしで含めようとしました。

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

私はここで痛いほど明らかな何かを見逃しているに違いないので、誰かがそれを指摘できるかどうか感謝します!

19
ystan-

ソリューション

試行錯誤で答えを見つけましたが、かなり面倒でした。この結論が間違っている場合、誰かが私を修正できることを願っていますが、Spring Bootは文字列WEB-INFが好きではないようです。 WEB-INFディレクトリの名前をviewに変更し、application.propertiesを次のように変更すると、ビューが正常にロードされました。

spring.mvc.view.prefix=/view/
spring.mvc.view.suffix=.jsp

追加の調査結果

この演習の目的は、Javaベースの構成であるminimalの実用例を作成することでした。そのため、セットアップを最小限に抑えました。その後、複数のSOスレッドとフォーラムには多くのアドバイスが与えられていることがわかりました。 選択した埋め込みコンテナに依存する制限があるため、JSPは単にSpring Bootでうまく動作しません。それを念頭に置いて、JSPをThymeLeafテンプレートに置き換えることを決めました。

私の新しい作業構成は、これらの必要性を取り除きます:

  • application.propertiesを追加する必要はありません:spring.mvc.view.prefix + spring.mvc.view.suffix
  • パッケージの種類をjarからwarに変更する必要はありません
  • メインクラスを変更する必要はありません
  • のpom.xml依存関係を追加する必要はありません
    • org.springframework.boot / spring-boot-starter-Tomcat
    • org.springframework.boot / Tomcat-embed-jasper
    • javax.servlet / jstl

したがって、デフォルトのSpring Bootテンプレートと、ViewName.htmlという名前のビューがsrc/main/resources/templatesに配置された2つのThymeLeaf依存関係のみです。

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
</dependency>

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
</dependency>
16
ystan-

Spring Bootがビューを/ webapp内に格納することを想定していない場合、ビューページは.jspをビューページとして/ views /フォルダーに設定するapplication.properties設定(htmlまたはjspなど)に依存する任意の形式である場合があります

spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp //for .html change it to .html

tomcat jaspherを使用する必要があります。これを含めない場合、ページは解析されず、ファイルとしてダウンロードされます

spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp
4
Jasbin karki

最初に考えるのは、依存関係を以下のようにpour pomに挿入することです

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </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-web</artifactId>
        </dependency>

この依存関係では、埋め込みのTomcat依存関係が提供されると、スプリングブートで言います。これは、jarアプリ内でSpringアプリケーションにTomcat依存関係がないという効果があります。

2番目は、あなたがしていると思う、あなたのポンのpakagingプロパティをjarから以下のような戦争に変更することです

<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">
...
    <packaging>war</packaging>
    ....
</project>

3番目と最後は、以下のように標準のアプリケーションブートスターターをリファクタリングすることです。

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

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

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

アプリケーションプロパティの設定は問題ないかもしれませんが、jspを特定のフォルダーに配置し、WEB-INFだけでなく新しいパスを指すように設定をリファクタリングすることをお勧めしますが、これは単なるアドバイスです。

これがあなたのお役に立てば幸いです。

1
Valerio Vaudi

tys、plsは依存関係を追加しようとします:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-Tomcat</artifactId>
    <scope>provided</scope>
</dependency>

リファレンス: https://github.com/lenicliu/examples/tree/master/examples-spring-boot/examples-spring-boot-jsp

spring.mvc.view.prefixはwebappフォルダーの相対パスで、uにはjspファイルを入れることができます。

0
lenicliu

application.properties

削除:

spring.mvc.view.prefix=/view/
spring.mvc.view.suffix=.jsp

追加:

spring.thymeleaf.prefix= /WEB-INF/views/
spring.thymeleaf.suffix= .html

pom.xml

ジャスパーの依存関係を削除します。

<dependency>
    <groupId>org.Apache.Tomcat.embed</groupId>
    <artifactId>Tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

Thymeleaf依存関係を追加します。

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

詳細: jspの代わりにthymeleafを使用

0
Hassan Tareq