SpringBoot は JSP、Thymeleaf、Freemark を統合します。詳細な手順

1. SpringBoot は JSP を統合します

1. jsp 依存関係を導入する

SpringBoot はデフォルトでは JSP をサポートしていないため、使用する場合は次の依存関係を導入する必要があります

     <!-- 添加servlet依赖模块 -->
     <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>javax.servlet-api</artifactId>
     </dependency>
     <!-- 添加jstl标签库依赖模块-->
     <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>jstl</artifactId>
     </dependency>
     <!-- 使用jsp引擎,springboot内置tomcat没有此依赖加上即可 -->
     <dependency>
         <groupId>org.apache.tomcat.embed</groupId>
         <artifactId>tomcat-embed-jasper</artifactId>
     </dependency>

2. webappディレクトリを追加します

SpringBoot は Web サイトのリソースをwebappディレクトリにデフォルト設定します。このディレクトリを手動で作成する必要がない場合は、ディレクトリ レベルが java の下にあることに注意してください。

ここに画像の説明を挿入します

テスト時にWeb アプリを右クリックすると、以下に示すように、JSP を作成するオプションがないことがわかりました。

ここに画像の説明を挿入します

この時点で、 を押すとcommand+;、以下に示すインターフェイスに入ることができます。

ここに画像の説明を挿入します

セットアップ後、webappファイル ディレクトリをクリックし、右クリックして JSP ファイルを作成できることを確認し、次に示すようにwebappファイル ディレクトリにWEB-INFディレクトリ (セキュリティ ディレクトリ) を作成します。

ここに画像の説明を挿入します

上記より、フォルダーのスタイルが変更され、JSP ファイルが作成できることがわかります。

3. JSPファイルの作成

新しい abc2.jsp ファイルをwebappディレクトリに作成し、abc3.jsp をWEB-INFフォルダーに作成します。コードは次のとおりです。

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

<h1>name===>${name}我是 abc2.jsp 测试页面hello jsp dispatcher.forward(path) Spring 只是告诉<br>
    Tomcat 它一个 path 路径,Tomcat 需要自己去动态编译 jsp 存储到 work 目录</h1>

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

<h1>name===>${name}我是 abc3.jsp 测试页面hello jsp dispatcher.forward(path) Spring 只是告诉<br>
    Tomcat 它一个 path 路径,Tomcat 需要自己去动态编译 jsp 存储到 work 目录</h1>

4. JSP ファイルに直接アクセスする

ファイルが作成されましたので、直接アクセスできるか確認してみましょう。 アクセスアドレス:http://localhost:9292/abc2.jsp効果は次のとおりです。

ここに画像の説明を挿入します

訪問中http://localhost:9292/abc3.jsp効果は次のとおりです。

ここに画像の説明を挿入します

abc3.jsp にアクセスできない理由は、Tomcat ではWEB-INF配下のリソースは安全なリソースであり、サーブレットまたはコントローラー経由でのみアクセスできるという制限があるため、アクセス用にToJspControllerが定義されています。

ここで、上記の設定を行ってもアクセス ページは 404 のままであることに注意してください。たとえば、マルチモジュール プロジェクトの場合は、次の設定を行うことができます。

ここに画像の説明を挿入します

Tomcat によってコンパイルされた JSP ソース コード ファイルも表示および保存したい場合は、次のように設定できます。

server:
  port: 9292
  tomcat:
    basedir: /Users/gongweiming/IdeaProjects/springcloud2022/cloud-redis-service9292

BaseDir は Tomcat の作業作業ディレクトリです。つまり、コンパイルされた Java ソース コード ファイルと JSP ページのコンパイルされたファイルはこのディレクトリに保存されます。

5. コントローラー経由で JSP ページにアクセスします

一般に、JSP ページへのアクセスにはデータを運ぶ必要があるため、ページにアクセスするためのコントローラーを定義することをお勧めしますが、WEB-INF下のリソースには直接アクセスできず、コントローラー ジャンプを通じてアクセスする必要があります。

@Controller
public class ToJspController {
    
    

    @RequestMapping("/toJsp")
    public ModelAndView toJsp(String cx) {
    
    
        ModelAndView view = new ModelAndView();
        System.out.println(">>>>>>toJsp...");
        System.out.println("hnhds");
        view.addObject("name", "gwm");
        view.setViewName(cx);
        return view;
    }
}

次に、コントローラー経由で abc2.jsp にアクセスします。パスは次のとおりです。http://localhost:9292/toJsp?cx=abc2、効果は次のとおりです。

ここに画像の説明を挿入します

これは、SpringBoot がなく、デフォルトのInternalResourceViewResolverパーサーが構成のプレフィックスとサフィックスを読み取らないためです

ここに画像の説明を挿入します

この設定はapplication.ymlファイルに追加するだけで済み、構成は次のようになります。

server:
  port: 9292

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

その後、abc2.jsp ページにアクセスできます。abc3.jsp にアクセスする必要がある場合は、以下に示すように yml ファイルを変更する必要があります。

server:
  port: 9292

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

次にアドレスにアクセスしますhttp://localhost:9292/toJsp?cx=abc3、効果は次のとおりです。

ここに画像の説明を挿入します

6. SpringBoot による静的リソースへのアクセス

SpringBoot は、デフォルトで静的ページを静的ディレクトリに保存し、動的ページをテンプレートに保存します。静的リソースを以下に示します。

ここに画像の説明を挿入します

yml の場所を使用して場所を変更することもできます。以下の a.html ページは、静的フォルダーではなく、html フォルダーにあります。構成は次のとおりです。

spring:
  mvc:
    view:
      suffix: .jsp
      prefix: /WEB-INF/
    # 访问静态资源时需要加上前缀 /boot 
    static-path-pattern: /boot/**
  resources:
  	# 访问的静态资源在以下文件夹仲可以找到
    static-locations: classpath:/META-INF/resources/,classpath:/resources/, classpath:/static/, classpath:/public/, classpath:/html/

/ブート/**静的リソースにアクセスするときに、この /boot プレフィックスを付ける必要があることを示します。

たとえば、abc2.html に静的にアクセスすると、アクセスパス名は次のようになります。http://localhost:9292/boot/abc2.html
たとえば、text.txt に静的にアクセスすると、アクセスパス名は次のようになります。http://localhost:9292/boot/text.txt
例えば、html以下のa.htmlにアクセスした場合、アクセスパス名はhttp://localhost:9292/boot/a.html

/コンパイルされたパスの保存場所を表す classpath クラス パスを表します。classes はクラスパスのルート パスと等しいため、html の下の静的リソースにアクセスするには、次のように設定できます。/html/設定ではなくアクセスします/リソース/html/、コンパイルされたパスは次のようになります。

ここに画像の説明を挿入します

そこで設定を追加しますクラスパス:/html/htmlフォルダー配下の静的リソースa.htmlにアクセスできます。アクセスパスは次のとおりです。http://localhost:9292/boot/a.html

7. @EnableWebMvc アノテーションを手動で有効にします (ニーズに応じて)

SpringBoot フレームワークで@EnableWebMvcアノテーションを有効にしたい場合は、SpringMVC の機能を完全に引き継ぎたいことを意味します。SpringBoot は SpringMVC を管理しません。ソースコードは次のとおりです。

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({
    
     Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({
    
     DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
    
    

}

SpringBoot が WebMvcAutoConfiguration 自動クラスをロードしていることから、条件付きで制約されていることがわかります。@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)この構成クラスをロードするには、WebMvcConfigurationSupportクラスがSpring コンテナーに存在してはいけないことを示します。

振り返ってみると、 @EnableWebMvcアノテーションが手動でオンになっていました。ソース コードは次のとおりです。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
    
    
}

@Configuration(proxyBeanMethods = false)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    
    
}

ここで、 WebMvcConfigurationSupportクラスが @Import アノテーションを介してインポートされていることがわかります。これにより、WebMvcConfigurationSupportインスタンス Bean が Spring コンテナーに存在し、WebMvcAutoConfigurationが自動的にアセンブルされなくなります。したがって、SpringBoot でこのアノテーションを開くときは注意してください。

@EnableWebMvc一部のコンポーネントには、ビュー リゾルバーInternalResourceViewResolverspring-webmvcなど、モジュール内にデフォルト構成があることに注意してください。ソース コードは次のとおりです。

public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {
    
    

	@Bean
	public ViewResolver mvcViewResolver(
			@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager) {
    
    
		ViewResolverRegistry registry =
				new ViewResolverRegistry(contentNegotiationManager, this.applicationContext);
		configureViewResolvers(registry);

		if (registry.getViewResolvers().isEmpty() && this.applicationContext != null) {
    
    
			String[] names = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
					this.applicationContext, ViewResolver.class, true, false);
			if (names.length == 1) {
    
    
				registry.getViewResolvers().add(new InternalResourceViewResolver());
			}
		}
		return composite;
	}
}

上記のソースコードからわかるように、InternalResourceViewResolver ビューリゾルバーは Spring コンテナーに ViewResolver インターフェース実装がある場合にのみデフォルトでロードされ、2 つある場合はロードされません。Spring Boot にはエラー ページを処理するためのビュー リゾルバーがあるため、InternalResourceViewResolver はロードされません。ここで、このエラー ページ プロセッサをオフにし、yml を通じて設定できます。設定は次のとおりです。

server:
  error:
    whitelabel:
      enabled: false

ただし、これはロードされたビュー パーサーにすぎず、プレフィックスサフィックスは指定されていません。そのため、アクセスする際にはプレフィックスとサフィックスの形式を自分で持ってくる必要があります。

たとえば、上記の abc2.jsp ページにアクセスする場合、アクセス パスは次のようになります。http://localhost:9292/toJsp?cx=abc2.jspサフィックスとサフィックスはそれぞれ です/ .jsp。abc3.jsp ページにアクセスするためのアクセス パスは次のとおりです。http://localhost:9292/toJsp?cx=/WEB-INF/abc3.jsp接尾辞と接尾辞はそれぞれ です/WEB-INF/ .jsp通常、アクセスはこの方法では行われないため、構成をカスタマイズし、ビュー パーサーのプレフィックスサフィックスを自分で指定する必要があります

7.1. WebMvcConfigurer インターフェイスを実装して、カスタム設定を実装するための設定を追加します (ニーズに応じて)

以前のバージョンでは WebMvcConfigurerAdapter クラスが実装されていましたが、現在は有効期限が切れています。WebMvcConfigurerインターフェイスを使用することをお勧めします。不足している機能がある場合は、対応する機能を追加してください。

MvcConfig構成クラスは次のとおりです。

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
    
    
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
    
    
        registry.jsp().suffix(".jsp").prefix("/");
    }
    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
    
    
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/", "classpath:/public/","classpath:/html/" };

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    

        registry.addResourceHandler("/**").addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
    }
}

ここでは 2 つのコンポーネントがカスタマイズされています。1 つはビュー パーサー コンポーネント、もう 1 つは静的リソース解析コンポーネントです。@EnableWebMvcアノテーションはデフォルトでは静的リソースの解析を有効にしません。手動で有効にする必要があり、解析する必要がある静的リソースは addResourceHandlers() メソッドを通じて追加されます。

つまり/**、静的リソースにアクセスする場合、階層ディレクトリへのアクセスは制限されません。一般的には以下のような構成となっており、リソースファイルは以下のようにアクセスパスで区切られています。

Spring Boot の /** へのデフォルトのアクセスは、クラスパスの下の 4 つの静的リソース ディレクトリ内のファイルに直接アクセスすることです。

  • クラスパス:/public/
  • クラスパス:/リソース/
  • クラスパス:/static/
  • クラスパス:/META-INFO/resources/
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    
	
		registry.addResourceHandler("/dist/**").addResourceLocations("classpath:/static/dist/");
		registry.addResourceHandler("/theme/**").addResourceLocations("classpath:/static/theme/");
		registry.addResourceHandler("/boot/*").addResourceLocations("classpath:/static/");
		// registry.addResourceHandler("/boot/**").addResourceLocations("classpath:/static/");
		// registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
	}

2. SpringBoot は Thymeleaf を統合します

軽量のテンプレート エンジン (ロジック ビジネスを担当する人にはお勧めできません。DOM または XML の解析には大量のメモリが消費されます) をブラウザで直接開くと、テンプレート ページが正しく表示され、最後に html で直接終了します。

1. 依存関係を導入する

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

2.ymlファイルの設定

spring:
  freemarker:
    suffix: .ftlh
    enabled: true
    prefix: /

3. テンプレートの下に新しい HTML ページを作成します

テンプレート フォルダーの下に新しい HTML ページを作成し、ドメイン名解決がhttp://www.thymeleaf.orgこれにより、Thymeleaf タグをページ内で使用して有効にすることができます。最も一般的に使用されるth:タグは次のとおりです。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"> </meta>
    <title>Thymeleaf project</title>
</head>
<body>
<h1>thymeleaf 页面</h1><h1 th:text="${name}"></h1>
</body>
</html>

ここに画像の説明を挿入します

4. コントローラー経由のアクセス

@Controller
public class ToJspController {
    
    

    @RequestMapping("/toJsp")
    public ModelAndView toJsp(String cx) {
    
    
        ModelAndView view = new ModelAndView();
        System.out.println(">>>>>>toJsp...");
        System.out.println("hnhds");
        view.addObject("name", "gwm");
        view.setViewName(cx);
        return view;
    }
}

アクセスパスは次のとおりです。http://localhost:9292/toJsp?cx=abc3ページ効果は次のとおりです。

ここに画像の説明を挿入します

コントローラーによってカプセル化されたモデルの名前の値を見つけることができます。これは、Thymeleaf が提供するタグでth:実行できることです。

次に、静的リソースとしてアクセスしてみます。パスは次のとおりです。http://localhost:9292/boot/abc3.html効果は次のとおりです。

ここに画像の説明を挿入します

abc3.htmlブラウザに直接write()ロードされている、つまり静的リソースとして出力されていることがわかります。

3. SpringBoot は Freemark を統合します

FreeMarker テンプレート言語ファイルは通常、xxx.ftlh または xxx.ftl として保存され、MVC モードに厳密に依存し、サーブレット コンテナの組み込み関数には依存しません (JVM メモリを占有しません)。

1. 依存関係を導入する

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

        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
            <version>1.9.22</version>
        </dependency>

2. テンプレートファイルを作成する

一般に、thymeleaf のデフォルト.htmlfreemark のデフォルトは.ftl、リソース (デフォルトのアクセス パス) の下のテンプレート ディレクトリです。

ここに画像の説明を挿入します

3. コントローラー層のコードを書く

public class Users {
    
    
    private String username;
    private String usersex;
    private String userage;

    public Users(String username, String usersex, String userage) {
    
    
        this.username = username;
        this.usersex = usersex;
        this.userage = userage;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getUsersex() {
    
    
        return usersex;
    }

    public void setUsersex(String usersex) {
    
    
        this.usersex = usersex;
    }

    public String getUserage() {
    
    
        return userage;
    }

    public void setUserage(String userage) {
    
    
        this.userage = userage;
    }
}
@Controller
public class TestController {
    
    

    @RequestMapping("/myfreemarker")
    public String showUsers(Model model) {
    
    
        List<Users> list = new ArrayList<>();
        list.add(new Users("aa", "F", "21"));
        list.add(new Users("bb", "M", "20"));
        list.add(new Users("cc", "F", "22"));
        model.addAttribute("list", list);

        return "myfreemarker";
    }
}

4.エフェクト表示

住所:http://localhost:9292/myfreemarker

ここに画像の説明を挿入します

4. まとめ

1. 上記の JSP、Thymeleaf、Freemark がすべて共存する場合、SpringBoot はデフォルトでそれらをソートし、静的ファイル リソースを優先し、最後に JSP リソースを優先します。Spring の JSP は実際にファイルが存在するかどうかを判断せず、Tomcat に判断自体の処理を任せるためです。Thymeleaf と Freemark の 2 つのバックエンド テンプレート エンジンは、最初にファイルの保存場所を直接決定します。それらの優先順位は、以下に示すように、ソース コードから確認できます。

ここに画像の説明を挿入します

2. JSP は最近ではほとんど使用されませんが、Thymeleaf と Freemark のどちらが優れているかを見てみましょう。

Thymeleaf を選択した場合、Thymeleaf が 2 年間更新されていないのは非常に残念です。Velocity は 7 年間更新が停止しているのではないかと思います。何年も前に、誰かが Velocity と Freemark のどちらを選択するかを尋ねました。Velocity は Apache によってサポートされています。しかし、freemarker が常に賢明な選択であることが時間の経過とともに証明されました。過去 20 年間、Freemark は 4 回の再構築と長期的な更新の反復を経て、下位互換性を可能な限り維持してきました。JSP タグ、JSON 形式を十分にサポートしています。データ、XML を使用すると、Java 拡張機能を簡単に実装できます。文字列、数値、シーケンス、ハッシュ テーブルなどの完全なデータ処理メソッドがあり、html、url、js、json などを安全にエスケープできます。あらゆるテンプレートで使用可能 エンジンは、国際的なソリューションが組み込まれたシナリオに適用可能 明確な例外ログ (エラー原因、エラーの場所、エラー プロンプト、テンプレート スタック、および Java スタックを含む) により、エラーを見つけることができますテンプレートをすぐに使用できます。非常に強力です。新しい動的言語を作成することは完全に可能ですが、テンプレート エンジンの境界に厳密に準拠します。そのパワー、完全性、およびセキュリティは、Java に限定されないあらゆるテンプレート エンジンを超えることができます。言語。

おすすめ

転載: blog.csdn.net/qq_35971258/article/details/128736203