Databaseとの接続を考慮したログイン処理の実装
phpMysqlAdminにて下記操作します。
テスト用のデータを挿入します。
INSERT INTO user (id,name) VALUES (1,'hoge');
JPAプロジェクトに変更
プロジェクトをJPAプロジェクトに変更します。
プロジェクトを右クリック⇒「Configure」⇒「Convert to JPA Project…」
JPAがない場合、該当するEclipseのバージョンのリポジトリからインストールしてください。
http://download.eclipse.org/webtools/repository/photon/?d
JPAが選択された状態を確認の上、「Finish」をクリックします。「Finish」が押下できない場合、次の画面にて、EclipseLinkをダウンロードしてください。
Install EclipseLink JAR Filesを参照すると、解決することができます。
JPAを使用したEntityの作成
JPAを使用してテーブルからEntityを作成していきます。
プロジェクトを右クリック⇒「New」⇒「other…」を選択します。
開いたポップアップで「JPA」⇒「JPA Entities from Tables」を選択して「Next >」を押します。
開いたポップアップで前回作成したConnectionを選択。
「Schema」が選択されるので、つなぎたいテーブルを「Tables」でチェックしていきます。
チェック後、「Next >」を押します。
「Next >」を押します。
「Package」に「com.example.HelloWorld.model」を指定します。指定後、「Finish」を押します。
modelパッケージの中にuser.javaが生成されました。
エラーが出ているので修正していきます。
エラーの原因は、「@Id」アノテーションがないからなのでIdに「@Id」アノテーションを付与します。
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」という名前でインターフェースを作成します。
「UserRepository」が作成されました。
「@Repository」を付与することと「JpaRepository<クラス名,String>」を継承します。
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へ追記
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」の処理の抜粋を示します。
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";
}
}
}
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;
}
}
<!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>
実行してみます
実際に存在するユーザID"1"を入力してみますと、正常にログインすることができました。
# 次回
次回はテーブル結合して取得する方法を紹介します。