SpringBootシリーズ(4)---- Web開発(1)

準備オーケー

次に、SpringBootを使用してRESTfulアプリケーションを開発します。最初に、アイデア作成ウィザードを使用して、SpringBootアプリケーションを作成し、必要なモジュールを確認します。ここでは、Webシーンのみを確認してから、追加します。後で必要です。
ここに画像の説明を挿入します
SpringBootは、デフォルトでこれらのシナリオをすでに構成しています。実行する構成ファイルで少量の構成を指定するだけでよく、ビジネスコードに注意を払うだけで済みます。

静的リソース用のSpringBootのマッピング構成ルール

webjarを使用する

  • First SpringBootという名前の人はwebjars、すべて次でpom.xml紹介する静的リソース/webjars/**(これは、自動構成クラスの静的リソースにあります)によって作成されます。つまり、SpringBootは、静的リソースを再配布classpath:/META-INF/resources/webjars/するjar方法で、リソースやWebjarを自動的に検索します。パッケージリソース(つまりhttp://localhost:8080/webjars/xx、対応する静的リソースにすべてアクセスできます)
  • pom.xmlを介して静的リソースをインポートする方法は?私たちは、に行くことができるリソースライブラリwebjars見つけるために、静的リソースのための基本的にすべてのjarファイルをここで見つけることができます。プロジェクトに次の依存関係をインポートします。
<!--    引入jquery-webjar    -->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.4.1</version>
        </dependency>
  • JQueryを紹介した後、JQueryの依存関係パッケージの下で、webjarのコンテンツを確認できます。
    ここに画像の説明を挿入します
  • jQueryの静的リソースを紹介し、プロジェクトを開始して、対応するパスを介してアクセスしてみましょう。ここで使用したパスはhttp://localhost:8080/webjars/jquery/3.4.1/jquery.jsアクセスするときに、webjarの下にリソースの名前を書き込むだけでよいというものです。
    ここに画像の説明を挿入します

リソースを使用する

  • 独自の静的リソースを使用したいが、webjarを使用したくない場合はどうなりますか?"/**"現在のプロジェクトの任意のリソースにアクセスするには、(静的リソースフォルダー)に移動してマッピングをhttp://localhost:8080/xxx.js見つけます。つまり、静的リソースフォルダーにxxxがあります。構成しない場合は、次の場所に移動します。デフォルトのフォルダ検索場所
    • 「classpath:/ META‐INF / resources /」、
    • 「classpath:/ resources /」、
    • 「classpath:/ static /」、
    • 「クラスパス:/ public /」
    • 「/」:現在のプロジェクトのルートパス

つまり、“/**”アクセスされる静的リソースを介して、SpringBootは上記に移動し、SpringBootのデフォルトの静的リソースフォルダーであるリソースを検索します。

  • publicとresourcesの2つのフォルダーを作成して、静的リソースを保存し、再度デモンストレーションします。
    ここに画像の説明を挿入します
  • Chart.min.jsを3つのフォルダーのいずれかに配置するだけで、http://localhost:8080/Chart.min.js次の方法でアクセスできます。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

ウェルカムページマッピングを構成する

  • ウェルカムページ;静的リソースフォルダの下のすべてのindex.htmlページ;"/**"マップされています;
  • つまりhttp://localhost:8080/、静的リソースフォルダーに直接アクセスできます。index.htmlこれは以前のSpringMVCと同等index.jspです。3つの静的リソースフォルダーのいずれかの下に作成index.htmlして直接実行できます。ここではデモではありません。
  • すべて同じ/favicon.icoデフォルトが静的リソースの下にあります。もちろん、SpringBootのデフォルトの静的リソースフォルダーを使用したくない場合は、次のように構成ファイルで静的リソースのマッピングを定義することもできます
spring.web.resources.static-locations=classpath:/cz/,classpath:/hello/

spring.web.resources.static-locationsは配列と同等です。複数のフォルダーがある場合は、コンマを使用してそれらを区切ります。
静的リソースマッピングを自分で定義した場合、デフォルトのフォルダーは有効になりません。これは、元のアクセス方法が有効にならないのと同じです。

テンプレートエンジン

JSP、Velocity、Freemarker、Thymeleafなど、テンプレートエンジンの基本的な考え方は同じですが、構文はあまり一貫していません。たとえば、次の図に示すように、例としてfreemarkerを取り上げます。
ここに画像の説明を挿入します

  • SpringBootが推奨するThymeleafはJSPを使用しません。これは、Thymeleafの構文が単純で、関数が強力であるためです。インポート方法は、以下によって異なります。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  • ここで紹介するのは、SpringBootのデフォルトのThymeleaf依存関係バージョンです。バージョンを切り替える場合、切り替える方法は次のとおりであり、対応するバージョン番号が追加されています。
<properties>
<thymeleaf.version></thymeleaf.version>
<thymeleaf-layout-dialect.version></thymeleaf-layout-dialect.version>
</properties>

Thymeleaf構文を使用する

  • Thymeleaf文法を使用する前に、実験してみましょう。HTMLページをテンプレートディレクトリに配置するだけで、Thymeleaf自動的にレンダリングされます。
  • 書くHellocintroller
@Controller
public class HelloController {
    
    
    //查出数据在页面显示
    @RequestMapping("/success")
    public String success(Map<String, Object> map) {
    
    
        map.put("success", "你好");
        return "success";
    }
}
  • templates成功したページを書きますsuccess.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>成功</h1>
    <!--th:text 将div里面的文本内容设置为 -->
    <div th:text="${success}"></div>
</body>
</html>

xmlns:th="http://www.thymeleaf.org"導入された名前空間。コードを作成すると、アイデアにプロンプ​​トが表示されます。

  • 執筆後、プロジェクトを開始し、localhost:8080/success訪問してsuccess.htmlページアクセスすると、訪問後の結果は次のようになります。
    ここに画像の説明を挿入します

文法規則

Thymeleaf文法の具体的な使用法については、Thymeleafの公式ドキュメントを確認できます。一般的に使用されるものについてのみ説明します。

  • th:text;現在の要素のテキストコンテンツを変更します;
    - th:任意のhtml属性;元の属性の値を置き換えます

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

Simple expressions:(表达式语法)
    Variable Expressions: ${...}:获取变量值;OGNL;
    		1)、获取对象的属性、调用方法
    		2)、使用内置的基本对象:
    			#ctx : the context object.
    			#vars: the context variables.
                #locale : the context locale.
                #request : (only in Web Contexts) the HttpServletRequest object.
                #response : (only in Web Contexts) the HttpServletResponse object.
                #session : (only in Web Contexts) the HttpSession object.
                #servletContext : (only in Web Contexts) the ServletContext object.
                
                ${session.foo}
            3)、内置的一些工具对象:
#execInfo : information about the template being processed.
#messages : methods for obtaining externalized messages inside variables expressions, in the same way as they would be obtained using #{…} syntax.
#uris : methods for escaping parts of URLs/URIs
#conversions : methods for executing the configured conversion service (if any).
#dates : methods for java.util.Date objects: formatting, component extraction, etc.
#calendars : analogous to #dates , but for java.util.Calendar objects.
#numbers : methods for formatting numeric objects.
#strings : methods for String objects: contains, startsWith, prepending/appending, etc.
#objects : methods for objects in general.
#bools : methods for boolean evaluation.
#arrays : methods for arrays.
#lists : methods for lists.
#sets : methods for sets.
#maps : methods for maps.
#aggregates : methods for creating aggregates on arrays or collections.
#ids : methods for dealing with id attributes that might be repeated (for example, as a result of an iteration).

    Selection Variable Expressions: *{...}:选择表达式:和${}在功能上是一样;
    	补充:配合 th:object="${session.user}:
   <div th:object="${session.user}">
    <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
    <p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
    <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
    </div>
    
    Message Expressions: #{...}:获取国际化内容
    Link URL Expressions: @{...}:定义URL;
    		@{/order/process(execId=${execId},execType='FAST')}
    Fragment Expressions: ~{...}:片段引用表达式
    		<div th:insert="~{commons :: main}">...</div>
    		
Literals(字面量)
      Text literals: 'one text' , 'Another one!' ,…
      Number literals: 0 , 34 , 3.0 , 12.3 ,…
      Boolean literals: true , false
      Null literal: null
      Literal tokens: one , sometext , main ,…
Text operations:(文本操作)
    String concatenation: +
    Literal substitutions: |The name is ${name}|
Arithmetic operations:(数学运算)
    Binary operators: + , - , * , / , %
    Minus sign (unary operator): -
Boolean operations:(布尔运算)
    Binary operators: and , or
    Boolean negation (unary operator): ! , not
Comparisons and equality:(比较运算)
    Comparators: > , < , >= , <= ( gt , lt , ge , le )
    Equality operators: == , != ( eq , ne )
Conditional operators:条件运算(三元运算符)
    If-then: (if) ? (then)
    If-then-else: (if) ? (then) : (else)
    Default: (value) ?: (defaultvalue)
Special tokens:
    No-Operation: _ 

SpringMVC自動構成

  • SpringBootはSpringMVCを統合しているため、SpringMVC操作の基本的な依存関係が自動的に構成されます。SpringBootはSpringMVCの依存関係を導入しますか?ここでは、一般的な紹介をします。Spring Bootは、Spring MVCの自動構成を提供します。これは、ほとんどのアプリケーションで完全に機能します。あなたは見るために公式文書に行くことができます

以下は、SpringBootからSpringMVCへのデフォルト構成です。WebMvcAutoConfiguration

  • ContentNegotiatingViewResolverBeanNameViewResolver豆の包含

    • ViewResolverは自動的に構成されます(ビューリゾルバー:メソッドの戻り値に従ってビューオブジェクト(View)を取得し、ビューオブジェクトはレンダリング方法(転送、リダイレクト)を決定します)
    • ContentNegotiatingViewResolver:すべてのビューリゾルバーを結合します。
    • カスタマイズ方法:ビューリゾルバーをコンテナーに自分で追加できます。自動的に結合します。
  • WebJarsのサポートを含む静的リソースの提供のサポート(以下を参照)。静的リソースフォルダーパス、webjars

  • 静的index.htmlサポート。静的ホームページアクセス

  • カスタムFaviconサポート(以下を参照)。favicon.ico

  • 自動的に登録されたConverterGenericConverterFormatter豆の。

    • コンバーター:コンバーター; public String hello(ユーザーユーザー):型変換にコンバーターを使用
    • Formatterフォーマッター; 2021.01.01 ==日付;
      自分で追加したフォーマッターコンバーター、コンテナーに入れるだけです
		@Bean
		@ConditionalOnProperty(prefix = "spring.mvc", name = "date-format")//在文件中配置日期格式化的规则
		public Formatter<Date> dateFormatter() {
    
    
			return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件
		}
  • のサポートHttpMessageConverters(以下を参照)。

    • HttpMessageConverter:SpringMVCは、Http要求と応答を変換するために使用されます; User-Json;

    • HttpMessageConverters コンテナから決定されます;すべてのHttpMessageConverterを取得します;

      自分HttpMessageConverterコンテナに追加し、自分のコンポーネントをコンテナに登録するだけです(@Bean,@Component

  • の自動登録MessageCodesResolver(以下を参照)。エラーコード生成ルールを定義します。

  • ConfigurableWebBindingInitializerBeanの自動使用(以下を参照)。

    ConfigurableWebBindingInitializerデフォルトを置き換えるように構成できます;(コンテナーに追加)

WebDataBinderを初期化します;
データを要求します===== JavaBean;

org.springframework.boot.autoconfigure.web:Webのすべての自動シーン。

あなたは春ブーツMVCが特長維持したい、とあなただけの追加追加したい場合はMVCconfiguration(インターセプター、フォーマッタ、ビューコントローラなど)を自分の追加できる@ConfigurationタイプのクラスをWebMvcConfigurerAdapter、しかしなし @EnableWebMvcのカスタムインスタンスを提供する場合RequestMappingHandlerMappingRequestMappingHandlerAdapterまたはそのようなコンポーネントを提供ExceptionHandlerExceptionResolverするWebMvcRegistrationsAdapterインスタンスを宣言できます。


Spring MVCを完全に制御したい場合は、で@Configuration注釈を付けた独自の注釈を追加できます@EnableWebMvc

SpringMVCを拡張する

  • springmvc構成ファイルを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <mvc:view-controller path="/hello" view-name="success"></mvc:view-controller>
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/hello"/>
            <bean></bean>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>
  • configパッケージの下にMyMvcConfigクラスを作成しWebMvcConfigurerインターフェース実装すると、SpringBootでSpringMVC関連の構成を展開できます。WebMvcConfigurerSpringMVCの機能と、それに実装する必要のあるメソッドを拡張するために使用できます。たとえば、ビューコンバーターを次のように拡張できます。
@Configuration
public class MyMvcConfig implements WebMvcConfigurer{
    
    

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
    
    
        // super.addViewControllers(registry);
        //浏览器发送 /cz 请求来到 success
        registry.addViewController("/cz").setViewName("success");
    }
}

localhost:8080 / czにアクセスすると、成功ページにジャンプします。このページでは、元の構成が保持されるだけでなく、独自の方法で構成を拡張することもできます。

  • 原理:

    • WebMvcAutoConfigurationSpringMVCの自動構成クラスです
    • 他の自動構成を行うときにインポートされます@Import(**EnableWebMvcConfiguration**.class)
    • コンテナ内のすべてWebMvcConfigurerが連携して機能します。
    • 構成クラスも呼び出されます。
  • 効果:SpringMVCの自動構成と拡張構成の両方が機能します。

構成クラスに@EnableWebMvc注釈を追加すると、どういう意味ですか?つまり、SpringBootのSpringMVCの構成を引き継ぎます。SpringBootのSpringMVCのデフォルト構成はすべて無効になります。たとえば、次のように自分で構成する必要があります。上記。webjars静的リソースなどへのデフォルトのアクセスは失敗します

@EnableWebMvc
@Configuration
public class MyMvcConfig implements WebMvcConfigurer{
    
    
//....
}

@EnableWebMvc自動構成が失敗するのはなぜですか。分析してみましょう。

  • @EnableWebMvc
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
    
    
  • DelegatingWebMvcConfigurationカテゴリをクリックして表示します
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    
    
  • 次に、SpringMVCの自動構成クラスを確認します。
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({
    
     Servlet.class, DispatcherServlet.class,
		WebMvcConfigurerAdapter.class })
//容器中没有这个组件的时候,这个自动配置类才生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({
    
     DispatcherServletAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
    
    
  • コンポーネントがにインポートされ@EnableWebMvcいることがわかりますWebMvcConfigurationSupport
  • WebMvcConfigurationSupportSpringMVCの最も基本的な機能のみがインポートされます。

SpringBootのデフォルト設定を変更する方法

  • SpringBootが多くのコンポーネントを自動的に構成する場合、最初にコンテナーにユーザー構成があるかどうかを確認します(@Bean、@Component)ある場合はユーザー構成を使用し、ない場合は自動的に構成されます。一部のコンポーネントが複数の(ViewResolver)ユーザー構成を持つことができる場合は、自己構成の組み合わせ
  • SpringBootにxxxConfigurerは、構成を拡張するの役立つ多くのヘルプあります。
  • SpringBootにはxxxCustomizer、カスタム構成のための多くのヘルプがあります

おすすめ

転載: blog.csdn.net/weixin_43844418/article/details/114019081