0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SpringBoot備忘録

Posted at

SpringBoot備忘録

はじめに

現在、フリーランスエンジニアとして働いていて、新しい現場では 使わないので備忘録として残しておきたいと考え、今回記事を書いています。

画面遷移

@GetMapping

    @GetMapping("/index")
    public String index(){
        return /index;
    }

用途はブラウザからのアクセスがGETリクエストと呼ばれるもので
ページ内に何も入力しない時の新しいページの読み込みやリンクによる画面遷移に
使用します。理由としてはURLに画面入力値が表示されるため、セキュリティ的に好ましくありません。 また、ログアウト処理にも@GetMappingは使用せず、後述する@PostMappingを使用します。

@PostMapping

    @PoatMapping("/index")
    public String index(){
        return /index;
    }

こちらはPOSTリクエストと呼ばれるもので画面入力値がURLに表示されません。 このため、フォームに入力した内容をサーバーに送信する際に使用します。

@PutMapping

    @PutMapping("/insert")
    public String insert(){
        return /insert;
    }

データ登録の際に使用します。

@DeleteMapping

    @DeleteMapping("/delete")
    public String delete(){
        return /delete;
    }

データ削除の際に使用します。

@RequestMapping

    @RequestMapping(value="/index", method=RequestMethod.POST)
    public String index(){
        return /index;
    }

@RequestMappingの属性

  • value 遷移先のURLを指定します。
  • method リクエストの形式を指定します。
  • @Pathvariable

@GetMapping("/index")
public String index(@Pathvariable int id){
    return "/index";
}

画面遷移時にリクエストパラメーターに含まれるidの数値によって処理を分けたい場合に使用します。

Dependency Injection

DIの基礎

@Autowired private SampleClass sampleClass;

簡潔に何をしているかですが、SampleClassというクラスのインスタンスを生成して sampleClassというフィールドの代入しています。これにより下記のようにnewキーワードを用いてインスタンスを生成 するよりもコードがすっきりします。

SampleClass sampleClass = new SampleClass();

DIの応用

@Configuration
public class ApplicationConfig {
public JavaMailSender mailSender;

@Bean
@Primary
public ApplicationService beanConfig() {
	return new ApplicationServiceImpl();
}

@Bean
@Primary
public CustomerServiceImpl customerServiceConfig() {
	return new CustomerServiceImpl(mailSender);
}

@Bean
public JavaMailSender javaMailSenderSetup() {
	return new JavaMailSenderImpl();
}

上記は私が開発したアプリのApplicationConfig.javaというクラスです。 @Autoworedを使用した時に、実行時エラーが発生することがありますので、上記のようなBeanを 定義すると解消できます。あと、後述する@Componentや、@Service @Controller @Repositoryを付けるのも基本です。 複数のアノテーションを使用していますので一つずつ説明します。

@Configuration Springの設定クラスを表すアノテーションです。主にBeanの設定情報を記載します。
@Bean Beanを定義します。
@Primary 複数のBeanが同じ型を実装している場合に、どのBeanを優先的に使用するか指定するためのアノテーション

コントローラー

@Controller

@Controller
class SampleController{}

ブラウザからのリクエストをサーバーが受け取り、@Controllerを付与しているクラスに制御が移り 開きたいパスが書いているハンドラメソッドを動かしてHTMLをレスポンスとして返します。

@RestController

@RestController
class SampleRestController{}

基本的には@Controllerと同じですが、RestAPI開発時しか使用しないアノテーションです。

Lombok

@Data

@Data
class LombokSample{
    int age;
    String name;
}

@Dataはゲッターとセッターを自動生成してくれます。これによりコードがすっきりしますし、コーディングの作業時間を短縮できます。 ※ソースコード上にはゲッターとセッターは表示されません。

@NoArgsConstructor

@Data
@NoArgsConstructor
class LombokSample{
    int age;
    String name;
}

@NoArgsConstructorを定義しておけば、自動で引数無しのコンストラクターを作成してくれます。

※こちらも@Dataと同様ソースコード上にはゲッターとセッターは表示されません。

@AllArgsConstructor

@Data
@NoArgsConstructor
@AllArgsConstructor
class LombokSample{
    int age;
    String name;
}

@NoArgsConstructorと似ていますが、こちらは全てのフィールドを引数を持つコンストラクターを自動生成 してくれます。

※こちらも@Dataと同様ソースコード上にはゲッターとセッターは表示されません。

RequiredConstructor

@RequiredConstructor @Data
class Sample{
    private final String args;
}

finalを付与したフィールドと@NonNullのフィールドを対象にしたコンストラクタを生成します。

画面側との値の受け渡し

Model
@GetMapping("/index")
public String index(Model model){
    Account account = new Account();
    model.addAttribute("account", account);
    return "/index";
}

Modelはバックエンドとフロントエンドの橋渡しをしてくれるインターフェースです。 上記の例ではAccount型のaccountをmodel.addAttributeをしていますが、これは画面側にaccount を渡す役割を持っています。HTMLで受け取ったデータをどのように表示するのかは下記の通りです。 ※下記はThymeleafを使用しています。

xmlns:th="http://www.thymeleaf.org"

th:object="${Account}

span th:text="*{userId}">ユーザーID>

HTMLタグ内に①を記載し、divタグなどに②を記載して③のようにth:textを使用することによって画面に表示できます。

@ModelAttribute

@RequestMapping(value="index", method=RequestMethod.POST)
public String index(@ModelAttribute Account account, Model model){
    String password = account.getPassword();
    model.addAttribute("password", password);
    return "/index";
}

リクエストパラメーターをオブジェクト化して画面側に渡すことが出来ます。

@RequestParam
@GetMapping("/index")
public String index(@RequestParam("int id"), Model model){
    model.addAttribute("id", id);
    return "/index";
}

リクエスト(クエリ)パラメーターや、リクエストボディを受け取ることが出来ます。 このアノテーションは属性を設定できます。

name またはvalue リクエストパラメーターを受け取る変数を指定
required パラメーターはデフォルトでは必須のため、パラメーター指定を任意にする場合、falseを指定
defaultValue リクエストで値を受け取るか、判らない場合に付与

Spring Bootエラー内容

TemplateInputException

thymeleafを使用していると起きるエラーで、不明なことが多く対処に時間が掛かることがあります。

  • 変数名の間違い
  • thymeleafの文法エラーが起因している。*{}を ${}にしているなど。
  • ThymeleafのエラーはHTMLファイルや、Javaソースコードに問題ないのに起きることがある。解決法は時間を置けば治るのか?
  • ディレクトリ構成が原因の場合もある。HTMLファイルを違うフォルダに格納しているなど。
  • コントローラクラスのハンドラメソッドにreturn文にHTMLファイルの親フォルダを記述していないと発生
  • コントローラクラスのハンドラメソッドにModelのmodel.addAttributeがない場合に発生
  • コントローラークラスのHTMLファイル名に誤字があった

さいごに

ここまで沢山述べましたが、まだまだSpringのセッション管理やバリデーションなど知らないことが多いので 今後も継続して学習に努めたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?