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?

More than 3 years have passed since last update.

Spring Frameworkを使ってみる(6)

Last updated at Posted at 2020-06-08

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

phpMysqlAdminにて下記操作します。

テスト用のデータを挿入します。
INSERT INTO user (id,name) VALUES (1,'hoge');
image.png

レコードが追加されました。
image.png

JPAプロジェクトに変更

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

JPAがない場合、該当するEclipseのバージョンのリポジトリからインストールしてください。
http://download.eclipse.org/webtools/repository/photon/?d
image.png

image.png

JPAが選択された状態を確認の上、「Finish」をクリックします。「Finish」が押下できない場合、次の画面にて、EclipseLinkをダウンロードしてください。
image.png

Install EclipseLink JAR Filesを参照すると、解決することができます。

JPAを使用したEntityの作成

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

プロジェクトを右クリック⇒「New」⇒「other…」を選択します。
開いたポップアップで「JPA」⇒「JPA Entities from Tables」を選択して「Next >」を押します。
image.png

開いたポップアップで前回作成したConnectionを選択。
「Schema」が選択されるので、つなぎたいテーブルを「Tables」でチェックしていきます。
チェック後、「Next >」を押します。
image.png

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

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

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

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

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へ追記

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」の処理の抜粋を示します。

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";
					}
			}
}

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;
}
}

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

ログインを押下します。index.htmlへ戻ってきます。
image.png

実際に存在するユーザID"1"を入力してみますと、正常にログインすることができました。
image.png

# 次回
次回はテーブル結合して取得する方法を紹介します。

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?