Spring Frameworkを使ってみる（６）

# Databaseとの接続を考慮したログイン処理の実装

phpMysqlAdminにて下記操作します。

テスト用のデータを挿入します。
INSERT INTO user (id,name) VALUES (1,'hoge');
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/c3ec5c24-a78c-255c-2ec5-4c1155e6ba2b.png)

レコードが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/c1dd7004-806c-eb2b-b212-771e2b5ffd5b.png)

# JPAプロジェクトに変更
プロジェクトをJPAプロジェクトに変更します。
プロジェクトを右クリック⇒「Configure」⇒「Convert to JPA Project…」

JPAがない場合、該当するEclipseのバージョンのリポジトリからインストールしてください。
http://download.eclipse.org/webtools/repository/photon/?d
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/b1acdfd1-f98f-bed7-8518-20b9f2787efe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/5bf1d6b5-d38b-ea43-f390-6de8743b52d2.png)

JPAが選択された状態を確認の上、「Finish」をクリックします。「Finish」が押下できない場合、次の画面にて、EclipseLinkをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/5cbf072f-7a0a-8542-e18a-149065c87dc5.png)

[Install EclipseLink JAR Files](https://javabeat.net/eclipselink-jpa-installation-configuration/)を参照すると、解決することができます。

# JPAを使用したEntityの作成
JPAを使用してテーブルからEntityを作成していきます。

プロジェクトを右クリック⇒「New」⇒「other…」を選択します。
開いたポップアップで「JPA」⇒「JPA Entities from Tables」を選択して「Next >」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/e756916f-b4f1-2e5b-6c96-5acb7699debf.png)

開いたポップアップで前回作成したConnectionを選択。
「Schema」が選択されるので、つなぎたいテーブルを「Tables」でチェックしていきます。
チェック後、「Next >」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/610b43f4-f2b9-43e8-6176-2e6c369bbea7.png)

「Next >」を押します。
「Package」に「com.example.HelloWorld.model」を指定します。指定後、「Finish」を押します。

modelパッケージの中にuser.javaが生成されました。
エラーが出ているので修正していきます。
エラーの原因は、「@Id」アノテーションがないからなのでIdに「@Id」アノテーションを付与します。

```java:user.java
package com.example.HelloWorld.model;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the user database table.
 * 
 */
@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	private int id;

	private String name;

	public User() {
	}

	public int getId() {
		return this.id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
```
これでEntityの作成は完了です。

# Repositoryの作成
「repository」パッケージを作成していきます。
作成した「repository」パッケージで右クリック⇒「New」⇒「Interface」を選択します。
userテーブルのリポジトリなので今回は「UserRepository」という名前でインターフェースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/e3ddf808-f1c2-4f78-d170-010cea643174.png)

「UserRepository」が作成されました。
「@Repository」を付与することと「JpaRepository<クラス名,String>」を継承します。

```java:UserRepository.java
package com.example.HelloWorld.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.HelloWorld.model.User;

    @Repository
    public interface UserRepository extends JpaRepository<User, String> {
	public List<User> findById(int id);
}

```

# データベース接続情報をapplication.propertiesへ追記

```properties:application.properties
server.port=8081
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/sampledb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true

```

# ログイン確認処理の実装
ログイン処理の実装として、全件取得してから入力された値と同じユーザIDが存在するか確認します。
/loginにPOSTでリクエストされたときの処理を変更します。
入力されたユーザIDを受け取って、その値が存在した場合は「top.jsp」へ、存在しない場合は「index.jsp」に遷移するようにします。
具体的な実装は、下記に「LoginController.java」の処理の抜粋を示します。

```java:LoginController.java
package com.example.HelloWorld;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;

import com.example.HelloWorld.model.User;
import com.example.HelloWorld.repository.UserRepository;
import com.example.HelloWorld.validation.CheckOrder;
 
@Controller
public class LoginController {
//    @Autowired
////    UserService userService;
	@Autowired
	UserRepository userRep;
	
	
	@RequestMapping(value = "/login", method = RequestMethod.POST)
		public String login(Model model, @Validated(CheckOrder.class) @ModelAttribute("loginForm") LoginForm loginForm, BindingResult result) {
			if(result.hasErrors()) {
				return "index";
			}
			
			List<User> userList = userRep.findById(loginForm.getUserId());
				if(userList.size() > 0) {
					model.addAttribute("userName", userList.get(0).getName());
						return "top";
				} else {
						return "index";
					}
			}
}
```
---

```java:LoginForm.java
package com.example.HelloWorld;
 
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

import com.example.HelloWorld.validation.CheckOrder1;
import com.example.HelloWorld.validation.CheckOrder2;
 
public class LoginForm {
	@NotNull(groups={CheckOrder1.class},message="ユーザIDを入力してください。")
	private int userId;
 
	@NotEmpty(groups={CheckOrder1.class},message="パスワードを入力してください。")
	@Size(min=8,max=16,groups={CheckOrder2.class},message="パスワードは{min}文字以上{max}文字以下です。")
	@Pattern(regexp="[a-zA-Z0-9]*",groups={CheckOrder2.class},message="パスワードは英数である必要があります。")
	private String loginPassword;

public int getUserId() {
	return userId;
}
 
public void setUserId(int userId) {
	this.userId = userId;
}
 
public String getLoginPassword() {
	return loginPassword;
}
 
public void setLoginPassword(String loginPassword) {
	this.loginPassword = loginPassword;
}
}
```
---

```html:index.jsp
<!DOCTYPE html>
 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form"%>
 
<html>
 <head>
 <meta charset="utf-8">
 <title>ログイン</title>
 </head>
 <body>
 <f:form modelAttribute="loginForm" action="login" method="post">
 
<div>
 ユーザID：<input type="text" id="userId" name="userId">
 <f:errors path="userId" element="div" cssStyle="color:red" />
 </div>
 
<div>
 パスワード：<input type="text" id="loginPassword" name="loginPassword">
 <f:errors path="loginPassword" element="div" cssStyle="color:red" />
 </div>
 
<div>
 <input type="submit" value="ログイン">
 </div>
 
 </f:form>
 
 </body>
</html>
```
---

# 実行してみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/044c226c-c17d-7a1a-3de7-e59dfa117f1c.png)


ログインを押下します。index.htmlへ戻ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/6ca68833-5424-af6a-0860-b042a4f86ffe.png)

実際に存在するユーザID"1"を入力してみますと、正常にログインすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/ddfbe2c5-e72c-f92e-45ad-a111beeffe86.png)

#　次回
[次回](https://qiita.com/Hakata2002/private/cb87b987aa97a423effa)はテーブル結合して取得する方法を紹介します。