Java Xiaobai実践マニュアル-フェーズ5-SpringBootフレームワーク(day01)

 


SpringBoot

1.SpringBootフレームワークの役割

SpringBootフレームワークは、より優れたSpringMVCフレームワークとして直接理解できます。

SpringBootフレームワークは、「コンベンションは構成よりも優れている」という考えに従います。これは、デフォルトでほとんどの一般的な構成を完了し(どのプロジェクトが作成されても、構成方法や構成値は変更されません)、それらのほとんどをデフォルトで統合します。一般的に使用される依存関係。

2.SpringBootプロジェクトを作成します

SpringBootプロジェクトを作成する方法は次のとおりです。

  • どの開発ツールでも、SpringBootを現在のプロジェクトの親プロジェクトとして設定します。

  • https://start.spring.ioWebサイトを開き、Webサイトに新しいプロジェクトの情報を入力し、プロジェクトの圧縮パッケージをダウンロードして、開発ツールを使用してダウンロードしたプロジェクトをインポートします。

  • 開発ツールで直接、作成ウィザードを使用してSpringBootプロジェクトを作成します。Eclipseを使用している場合は、SpringToolsプラグインをインストールする必要があります。

今回は、IntelliJIDEAを使用してSpringBootプロジェクトを作成します。IntelliJIDEAのメインインターフェイスで[CreateNew Project]を選択して、新しいプロジェクトの作成開始します。プロジェクトタイプインターフェイスで、左側の[ Spring Initializr]を選択し、次に進みます。設定します。プロジェクトを作成し、グループに自分自身を。作成プロセス中アーティファクト選択パッケージとしてwar、デフォルトでは、あなたが一時的に他の依存関係を追加することはできません。作成が成功すると、プロジェクトが自動的に依存関係の多数がダウンロードされます。中にプロセス全体で、現在のコンピューターがMavenサーバーに接続できることを確認する必要があります。

3.SpringBootプロジェクトを開始します

作成されたSpringBootプロジェクトでは、パッケージはデフォルトsrc / main / javaに存在しcn.tedu.demo(パッケージ名はプロジェクトの作成時に入力されたグループアーティファクトに関連しています)、DemoApplicationクラスはデフォルトでこのパッケージに存在します(クラス名前はプロジェクトの作成時に使用されます。入力されアーティファクトはApplication単語をつなぎ合わせることによって形成されます。このクラスにはmain()メソッドがありますmain()メソッドが実行されると、プロジェクト全体が開始されるため、これはプロジェクト起動クラスとも呼ばれます。

起動後、[実行]パネルが自動的に開き、起動ログにTomcat関連の単語が表示されます。実際、SpringBootプロジェクトにはTomcatが付属しています。プロジェクトが開始されると(スタートアップクラスのmain()メソッドが実行されると)、現在のプロジェクトは組み込みのTomcatに自動的にデプロイされます。

注:組み込みのTomcatはSpringBootプロジェクトの開始時に開始されるため、ポートが占有されていないことを確認してください。占有されていない場合、競合が発生し、プロジェクトを開始できません。

プロジェクトを正常に開始できれば、コアjarファイルが破損することはありません。

プロジェクトのsrc / test / java下には、デフォルトでcn.tedu.demoパッケージもあります。このパッケージDemoApplicationTestsには、デフォルトで単体テストクラスであるクラスがあり、このクラスには、デフォルトで空のテストメソッドがあります。このメソッドで使用します。次のような簡単な出力ステートメントを追加します。

void contextLoads() {
    System.err.println("DemoApplicationTests.contextLoads");
}

次に、単体テストを実行します。正常に実行できれば、テスト環境は正常です。

4.静的ページを表示する

SpringBootプロジェクトのsrc / main / resourcesには、デフォルトで静的フォルダーがあります。このフォルダーは静的リソースを格納するために使用されます。最終的にアクセスされると、ここのファイルはURLのルートパスの下にあるファイルになります。

静的リソース:ブラウザのアドレスバーにURLを入力することで直接アクセスできます。通常は.htmlファイル、.cssファイル、.jsファイル、画像ファイルなどです。

静的フォルダーのすぐ下にindex.html作成し、ページのコンテンツを自分でデザインできます。次に例を示します。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello, SpringBoot!!!</title>
</head>
<body>
<h1>欢迎使用SpringBoot框架!!!</h1>
</body>
</html>

完了したら、プロジェクトを開始し、ブラウザを開いて、Enterキーを押しhttp://localhost:8080/てページにアクセスします。

起動時に、次の情報が表示されます。

Tomcat started on port(s): 8080 (http) with context path ''

意味:Tomcatはポート8080で開始され、context path値が設定されている''ため、現在のプロジェクトにアクセスするとき、直接入力するだけhttp://localhost:8080/で、以前のようにURLにプロジェクト名を追加する必要はありません。

同時に、index.htmlがデフォルトのアクセスページであるため、アクセスされたリソースがURLで明示的に指定されていない場合、このページに自動的にアクセスされます。したがって、URLにファイルを追加する必要はありません。明示的に追加すると、アクセスも可能になります。

他のファイル静的に追加することもできます。アクセスするときは、URLにファイル名を明示的に追加する必要があります。

src / main / resourcesのには、デフォルトでapplication.propertiesファイルもあります。このファイルはSpringBootの構成ファイルです。プロジェクトが開始されるか、ユニットテストが実行されると、このファイルの構成情報がロードされます。一部の構成は、SpringBootの使用要件に応じて、現在のファイルに追加/変更できます。次に例を示します。

server.port=80

注:固定構成コンテンツの属性名は固定されています。スペルミスがあると構成は無効になりますが、現在のファイルではカスタム構成も可能であるため、スペルミスがあってもファイル自体はできません。エラーを報告してください!

上記の構成は、Tomcatが実行されているポート番号を変更することを意味し80ます。

以来80ポートは、HTTPプロトコルのデフォルトのポートがあり、明示的にポート番号を指定する必要はありませんURLときにアクセス。たとえば際に、上記アクセスのindex.htmlを、あなただけのアドレスバーに入力する必要がありますhttp://localhostアクセスするブラウザ

5.コントローラーを使用してリクエストを受信します

src / main / javaのには、元々cn.tedu.demoパッケージがあり、このパッケージの下にサブパッケージを作成しcontrollerてコントローラークラスを格納してから、このパッケージの下にHelloControllerコントローラーを作成します

package cn.tedu.demo.controller;
​
import org.springframework.stereotype.Controller;
​
@Controller
public class HelloController {
}

注:SpringBootプロジェクトは、デフォルトで作成されたcn.tedu.demoパッケージをコンポーネントスキャン用パッケージとして設定します。したがって、プロジェクトで作成されたすべてのコンポーネントクラスは、このパッケージまたはそのサブパッケージに配置する必要があります。

次に、コントローラークラスで要求を処理するための簡単なメソッドを追加します。

@GetMapping("hello")
@ResponseBody
public String hello() {
    return "SpringBoot真好用!!!";
}

注:SpringBootプロジェクトは、SpringMVCフレームワークによって処理される要求パス/*デフォルト*.do(前の演習でカスタマイズされた)に設定するため、現在のプロジェクトにアクセスするすべてのリソースはSpringMVCフレームワークによって処理されます。要求パスを構成するときは、不要.doリソース名のサフィックスとして使用してください

注:SpringBootプロジェクトは、デフォルトですべての文字エンコードをUTF-8に設定します。

書き込みが終了したら、プロジェクトを再起動し、ブラウザのアドレスバーhttp://localhost/helloにアクセスして、上記のコントローラにアクセスしてください。

6.データベースに接続します

デフォルトでは、SpringBootプロジェクトには独自のデータベース関連の依存関係がありません。データベースプログラミングを実装する必要がある場合は、接続データへの依存関係とデータベースプログラミングフレームワークへの依存関係を追加する必要があります。次に例を示します。

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>
​
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

SpringBootはすでにバージョン番号を設定しているため、一般的に使用される依存関係のほとんどでは、追加時にバージョン番号を指定する必要はありません。これは通常、より新しく安定したバージョンです。

もちろん、SpringBootで指定されたバージョンが現在の環境と一致しない可能性がある場合(たとえば、mysql-connector-javaのバージョンが高く、サーバーのMySQLデータベースのバージョンが低い場合、接続できません)。 、<version>ノードを追加して自分でバージョンを指定することもできます。現在指定されているバージョンが優先されます。

上記の依存関係を追加した後、プロジェクトの開始時にエラーが発生し、プロンプトメッセージは次のようになります。

***************************
APPLICATION FAILED TO START
***************************
​
Description:
​
Failed to configure a DataSource: 'url' attribute is not 
specified and no embedded datasource could be configured.
​
Reason: Failed to determine a suitable driver class

SpringBootプロジェクトの開始時に、現在のプロジェクトがデータベースへの接続に依存関係を追加すると、データベースに接続するための構成情報が自動的に読み込まれますが、構成は現在追加されていないため、情報の読み取りに失敗します。 、および上記のエラーが発生しました!

したがって、application.propertiesでデータベース接続するための構成を追加する必要があります

spring.datasource.url=jdbc:mysql://localhost:3306/tedu_ums?
useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

注:プロジェクトを開始すると、上記の構成情報のみが読み取られ、データベースは実際には接続されないため、上記の構成値が間違っていても、エラーは報告されません!

上記の構成情報が正しいかどうかを確認するためには、あなたができるテストcn.tedu.sample.SampleApplicationTestsのテストクラスのsrc /テスト/ javaの

@Test
void getConnection() throws SQLException {
    Connection connection = dataSource.getConnection();
    System.err.println(connection);
}

SpringBootプロジェクトでは、Springコンテナ呼び出し(通常のSpring / SpringMVCまたは他のSpringベースのプロジェクトを使用)によってgetBean()取得されたすべてのオブジェクトを自動アセンブリに変更できます。

7.ユーザー登録を実現する

7.1。永続層

登録時にデータを挿入する際にエラーが発生しないこと、および「ユーザー名が一意」のデータルールを確認するために、データを挿入する前にユーザー名が登録されているかどうかを確認する必要があります。 「登録」中に実装されるのは次のとおりです。

SELECT * FROM t_user WHERE username=?

INSERT INTO t_user (除了id以外字段列表) VALUES (匹配的值列表)

 

まず、ユーザーデータをカプセル化するためにcn.tedu.sample.entityUserパッケージのエンティティクラスを作成する必要があります。

package cn.tedu.sample.entity;
​
public class User {
​
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String phone;
    private String email;
    
    // Setters & Getters
    // toString()
    
}

次に、cn.tedu.sample.mapperパッケージの下にUserMapperインターフェースを作成して、永続層の抽象メソッドを定義します。

package cn.tedu.sample.mapper;
​
import cn.tedu.sample.entity.User;
​
public interface UserMapper {
    
    Integer insert(User user);
    
    User findByUsername(String username);
    
}

次に、MyBatisフレームワークがこのインターフェースの場所を認識できるように構成する必要があります。構成クラスの宣言の前に@MapperScan注釈を追加して、インターフェースが配置されているパッケージを構成できます。

SpringBootプロジェクトでは、スタートアップクラスは構成クラスでもあるため、構成用のスタートアップクラスを宣言する前に、次のアノテーションを追加できます。

package cn.tedu.sample;
​
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
@MapperScan("cn.tedu.sample.mapper")
@SpringBootApplication
public class SampleApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }
​
}

次に、上記の抽象メソッドによってマップされたSQLステートメントも構成する必要があります。まずsrc / main / resourcesの下にmappersフォルダーを作成して、SQLステートメントを構成するXMLファイルを格納します。そして、application.propertiesで使用されるXMLファイルの場所を構成ます

mybatis.mapper-locations=classpath:mappers/*.xml

その後、ペーストUserMapper.xmlのファイルをマッパーフォルダ、および上記インターフェースで抽象メソッドに対応するSQL文を設定します。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
​
<mapper namespace="cn.tedu.sample.mapper.UserMapper">
​
    <insert id="insert" useGeneratedKeys="true"
        keyProperty="id">
        INSERT INTO t_user (
            username, password, age, phone, email
        ) VALUES (
            #{username}, #{password}, #{age}, #{phone}, #{email}
        )
    </insert>
​
    <select id="findByUsername"
            resultType="cn.tedu.sample.entity.User">
        SELECT * FROM t_user WHERE username=#{username}
    </select>
​
</mapper>

次に、上記の関数を正しく実行できるかどうか、パッケージテストクラス作成するためのsrc / test / java、およびこのクラスの2つ以上のテストメソッドをテストして、ユニットをチェックする必要がありますcn.tedu.sample.mapperUserMapperTests

package cn.tedu.sample.mapper;
​
import cn.tedu.sample.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
​
@SpringBootTest
public class UserMapperTests {
​
    @Autowired(required=false)
    UserMapper userMapper;
​
    @Test
    void insert() {
        User user = new User();
        user.setUsername("boot");
        user.setPassword("1234");
        user.setAge(25);
        user.setPhone("13000130000");
        user.setEmail("[email protected]");
        Integer rows = userMapper.insert(user);
        System.err.println("rows=" + rows);
    }
​
    @Test
    void findByUsername() {
        String username = "boot";
        User user = userMapper.findByUsername(usernaUme);
        System.err.println(user);
    }
​
}

注:カスタム単体テストクラスもプロジェクトのルートパッケージcn.tedu.sample下にある必要があります。そうでない場合、正しく機能しません。同時に、クラスの宣言の前にコメントを追加する必要もあります(追加する特定のコメントについては、プロジェクトの作成時にすでに存在するSampleApplicationTestsテストクラスを参照してください)。

7.2。コントローラー

最初にcn.tedu.sample.utilパッケージJsonResult(カスタムクラス名)の下に作成し、クラスで2つの属性を宣言します。それぞれ、操作結果のステータスと情報を表します。

package cn.tedu.sample.util;
​
public class JsonResult {
​
    private Integer state;
    private String message;
    
    // Setters & Getters
    
}

cn.tedu.sample.controllerパッケージの下にUserControllerクラスを作成しクラス宣言の前@RestController@RequestMapping("user")注釈を付け、コントローラークラスでリクエストを処理するメソッドを追加します。今回は、上記で作成したJsonResult型がメソッドの戻り値型として使用されます。

package cn.tedu.sample.controller;
​
import cn.tedu.sample.entity.User;
import cn.tedu.sample.mapper.UserMapper;
import cn.tedu.sample.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
@RestController
@RequestMapping("user")
public class UserController {
​
    @Autowired(required = false)
    private UserMapper userMapper;
​
    // http://localhost:8080/user/reg?username=sample&password=8888&age=26&phone=13100131111&[email protected]
    @RequestMapping("reg")
    public JsonResult reg(User user) {
        System.err.println("UserController.reg"); // soutm
        System.err.println("user = " + user); // soutp
​
        String username = user.getUsername();
        User result = userMapper.findByUsername(username);
        // result.null
        JsonResult jsonResult = new JsonResult();
        if (result == null) {
            userMapper.insert(user);
            jsonResult.setState(1);
            jsonResult.setMessage("注册成功!");
        } else {
            jsonResult.setState(2);
            jsonResult.setMessage("注册失败!用户名已经被占用!");
        }
        return jsonResult;
    }
​
}

7.3SpringMVCフレームワークを介してJSONデータに応答する

SpringMVCフレームワーク(SpringBootフレームワークを含む)では@ResponseBody、コントローラークラスを使用するまたは使用する前に、要求を処理するメソッドを追加すると、要求を処理するメソッド@RestControllerの戻り値がクライアントへの応答データとして使用されます。

サーバーがクライアントにデータで応答すると、SpringMVCフレームワークは「コンバーター」を使用してメソッドの戻り値を変換し、応答を処理するときに応答ヘッダーを変換します。さまざまな戻り値タイプの場合、SpringMVCフレームワークさまざまなコンバーター使用されます。自動的に

(要求の処理方法の戻り値のタイプ)が応答データのタイプであるString場合StringHttpMessageConverter、コンバーターを自動的に使用し、コンバーター文字列は応答データとしてクライアントに自動的に返されます。また、最初のセットに応答します。 、デフォルトでは、Content-Typeプロパティは応答ヘッダーに設定され、その値はtext/html; charset=ISO-8859-1です。したがって、SpringMVCフレームワーク(SpringBootフレームワークを除く)では、応答Stringデフォルトで中国語をサポートしいません。

応答データ型がSpringMVCフレームワークがデフォルト認識しないであり、現在の開発環境がjackson-databind依存関係を追加する場合、SpringMVCフレームワークはプロセスでコンバーター自動的に使用しjackson-databind、コンバーターjackson-databindの作業方法は応答結果はJSON形式のデータになり、応答ヘッダーContent-Typeセットはapplication/json; charset=UTF-8!になります。

プロジェクトでは、jackson-databind依存関係が追加されていることを確認するだけでよく、追加の構成は必要ありません。また、フレームワークで特定のクラスを明示的に使用する必要もありません。

関連する構成にXMLを使用するSpringMVCプロジェクトの場合は、Spring構成ファイルでアノテーションドライバーを有効にする必要があります。つまり、構成ファイルに次のように追加します。

<アノテーション駆動型/>

一般に、JSON形式のデータに応答できるようにするためにSpringMVCフレームワークが必要な場合は、次のものが必要です。

  • 使用@RestControllerまたは@ResponseBodyコメント;

  • プロジェクトにjackson-databind依存関係を追加します;

  • リクエスト処理メソッドの戻り値タイプをカスタマイズします(カスタムタイプである限り、SpringMVCフレームワークがデフォルトで認識しないタイプである必要があります)

もちろん、特定のコントローラークラスでは、@RestControllerアノテーションが使用されている場合、「現在のコントローラークラスで処理されたすべてのリクエストがデータに応答する」ことを示し、転送またはリダイレクト操作は実行されません。転送を実行する必要がある場合またはリダイレクトするには、次のことができます。

  • @RestControllerアノテーションは使用しないでください。ただし、データに応答する必要がある各メソッドの前に、@ResponseBodyアノテーションを1つずつ追加してください

  • @RestController使用する場合は、転送またはリダイレクトする必要のあるメソッドの戻り値の型を型として宣言しますModelAndView

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body >
    <form id="from-login">
        <table border="1">
            <caption>用户登录</caption>
            <tr>
                <td>用户名:</td>
                <td><input name="username"><span>{
   
   {msg_err_username}}</span></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input name="password"><span>{
   
   {msg_err_password}}</span></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><input id="btn-login" type="button" value="登录"></td>
            </tr>
        </table>
    </form>
    <!--将jQuery 文件复制到当前HTML 文件相同的文件夹-->
    <!--将jQuery 文件的版没有要求-->
    <script src="jquery-3.4.1.min.js"></script>
    <script src="vue.js"></script>
    <!--必须将登录按钮 的类型设置为button 不可以使用submit-->
    <!--需要为 登录按钮添加id-->
    <!--需要为表单  添加id-->
    <!--需要为body 标签添加id-->
    <script>
        //Vue
        let app = new Vue({
            el:'#from-login',
            data:{
                msg_err_username : null,
                msg_err_password : null
            }
        });

        //选中按钮后 调用click()函数 为按钮绑定点击事件
        $("#btn-login").click(function () {
            // alert("准备提交登录....");
            /**
             * alert("准备提交登录……");
             * 关于$.ajax()中JSON对象的属性:
             * url:将请求提交到哪里去
             * data:请求参数
             * type:请求方式
             * dataType:服务器端响应的数据的类型,取值可以是text/xml/json……取值以服务器端响应时,响应头中的Content-Type为准
             * success:服务器端成功响应(HTTP响应码为2xx,例如200)时的回调函数,函数的参数就是服务器端口响应的数据对象
             *
             */
            app.msg_err_username = null;
            app.msg_err_password = null;
            $.ajax({
                "url":"/user/login",
                "data":$("#from-login").serialize(),
                "type" : "post",
                "dataType":"json",
                "success": function (jsonData) {
                    if(jsonData.state ==1){

                        alert("恭喜!登录成功!");
                    }else if (jsonData.state==2){
                        //alert(jsonData.message);
                        app.msg_err_username = jsonData.message
                    }else {
                        app.msg_err_password = jsonData.message
                    }
                }
            });
        });

    </script>
</body>

</html>

 

おすすめ

転載: blog.csdn.net/c202003/article/details/107290613