作った動機
訓練校でアプリを8人チームで制作することになったのだが、機能要件にログイン機能が必須だった。
登録したロールによって表示できるページを分けたいが、やり方がいまいちわからなかった。
3連休だし作ってみよ!
機能
- 新規登録。
- ログイン、ログアウト。
- 管理者とユーザーでロール分け。
- 管理者には管理者ページしか表示されない。
- ユーザーにはユーザーページしか表示されない。
- ログインしてない場合はログイン画面と新規登録画面へ誘導。
よかったこと
4時間くらいで作れた。
3か月前なら3~5倍くらい時間がかかっていたと思う。
成長してるんやなあ。
環境
Java version 13.0.1
mysql 8.0
DAO
AccountDAO.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.AccountBeans;
public class AccountDAO {
// データベース接続に使用する情報
final String jdbcId = "root";
final String jdbcPass = "password";
final String jdbcUrl = "jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=JST";
// ログインアカウントを探す
public AccountBeans findAccount(AccountBeans ab) {
// 戻り値の用意
AccountBeans returnAb = new AccountBeans();
// データベースへ接続
try (Connection con = DriverManager.getConnection(jdbcUrl, jdbcId, jdbcPass)) {
String sql = "SELECT loginId, pass, name, roleId FROM account WHERE loginId = ? AND pass = ?";
PreparedStatement ps= con.prepareStatement(sql);
ps.setString(1, ab.getLoginId());
ps.setString(2, ab.getPass());
ResultSet rs = ps.executeQuery();
if (rs.next()) {
// 見つかったアカウント情報を戻り値にセット
returnAb.setLoginId(rs.getString("loginId"));
returnAb.setPass(rs.getString("pass"));
returnAb.setName(rs.getString("name"));
returnAb.setRole(rs.getInt("roleId"));
} else {
// アカウントがなければnullを返す
return null;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return returnAb;
}
}
AccountRegisterDAO.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import model.AccountBeans;
public class AccountRegisterDAO {
// データベース接続に使用する情報
final String jdbcId = "root";
final String jdbcPass = "password";
final String jdbcUrl = "jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=JST";
public AccountRegisterDAO(AccountBeans ab) {
try (Connection con = DriverManager.getConnection(jdbcUrl, jdbcId, jdbcPass)) {
String sql = "INSERT INTO account (loginId, pass, name, roleId) VALUES (?, ?, ?, ?)";
PreparedStatement ps= con.prepareStatement(sql);
ps.setString(1, ab.getLoginId());
ps.setString(2, ab.getPass());
ps.setString(3, ab.getName());
ps.setInt(4, ab.getRole());
int r = ps.executeUpdate();
if(r != 0) {
System.out.println("新規登録成功!");
} else {
System.out.println("新規登録失敗( ノД`)シクシク…");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
servlet
AccountCheck.java
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.AccountBeans;
/**
* Servlet implementation class AccountCheck
*/
@WebServlet("/AccountCheck")
public class AccountCheck extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AccountCheck() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// セッションからログイン情報を取得
HttpSession session = request.getSession();
AccountBeans ab = (AccountBeans) session.getAttribute("account");
// ロールでフォワード先を振り分ける
if(ab.getRole() == 1) {
RequestDispatcher rd = request.getRequestDispatcher("admin.jsp");
rd.forward(request, response);
} else if(ab.getRole() == 2) {
RequestDispatcher rd = request.getRequestDispatcher("user.jsp");
rd.forward(request, response);
} else {
RequestDispatcher rd = request.getRequestDispatcher("error.jsp");
rd.forward(request, response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
AccountRegister.java
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import dao.AccountRegisterDAO;
import model.AccountBeans;
/**
* Servlet implementation class AccountRegister
*/
@WebServlet("/AccountRegister")
public class AccountRegister extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AccountRegister() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String loginId = request.getParameter("loginId");
String pass = request.getParameter("pass");
int role = Integer.parseInt(request.getParameter("role"));
// register.jspから受け取った値をビーンズにセット
AccountBeans ab = new AccountBeans();
ab.setName(name);
ab.setLoginId(loginId);
ab.setPass(pass);
ab.setRole(role);
// アカウントをDBに登録
AccountRegisterDAO ard = new AccountRegisterDAO(ab);
// セッションにアカウント情報を保存
HttpSession session = request.getSession();
session.setAttribute("account", ab);
RequestDispatcher rd = request.getRequestDispatcher("registerSuccess.jsp");
rd.forward(request, response);
}
}
AccountSearch.java
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import dao.AccountDAO;
import model.AccountBeans;
/**
* Servlet implementation class AccountDAO2
*/
@WebServlet("/AccountSearch")
public class AccountSearch extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AccountSearch() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String loginId = request.getParameter("loginId");
String pass = request.getParameter("pass");
// login.jspから受け取ったログインIDとpassをビーンズにセット
AccountBeans ab = new AccountBeans();
ab.setLoginId(loginId);
ab.setPass(pass);
// アカウントの有無を検索
// 検索したアカウント情報を取得
AccountDAO ad = new AccountDAO();
AccountBeans returnAb = ad.findAccount(ab);
if(returnAb != null) {
// セッションにアカウント情報&ロールを登録
HttpSession session = request.getSession();
session.setAttribute("account", returnAb);
RequestDispatcher rd = request.getRequestDispatcher("loginSuccess.jsp");
rd.forward(request, response);
} else {
RequestDispatcher rd = request.getRequestDispatcher("error.jsp");
rd.forward(request, response);
}
}
}
Logout.java
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class Logout
*/
@WebServlet("/Logout")
public class Logout extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Logout() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession session = request.getSession();
session.invalidate();
RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
rd.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
filter
Filter.java
package filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/**
* Servlet Filter implementation class Filter
*/
@WebFilter("/*")
public class Filter implements javax.servlet.Filter {
/**
* Default constructor.
*/
public Filter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
request.setCharacterEncoding("UTF-8");
// pass the request along the filter chain
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
JavaBeans
AccountBeans.java
package model;
import java.io.Serializable;
public class AccountBeans implements Serializable {
private static final long serialVersionUID = 1L;
private String loginId;
private String pass;
private String name;
private int role;
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRole() {
return role;
}
public void setRole(int role) {
this.role = role;
}
}
JSP
admin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>管理者ページ</title>
</head>
<body>
ここは管理者用のページです。<br>
<c:choose>
<c:when test="${account.role == 1 }">
登録内容の確認。
<p>ログインID:<c:out value="${account.loginId }"></c:out></p>
<p>パスワード:<c:out value="${account.pass }"></c:out></p>
<p> 名前:<c:out value="${account.name }"></c:out></p>
<p> ロール:管理者</p>
<p><a href="/login/Logout"><button type="button" >ログアウト</button></a></p>
<a href="user.jsp"><button type="button" >ユーザーページへ</button></a>
</c:when>
<c:when test="${account.role == 2 }">
<a href="user.jsp">ユーザーページへ</a>
</c:when>
<c:otherwise>
<a href="login.jsp">ログインページへ</a>
</c:otherwise>
</c:choose>
</body>
</html>
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
ログインに失敗しました。<br>
<a href="login.jsp"><button>ログインページへ</button></a>
</body>
</html>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン画面</title>
</head>
<body>
<form action="/login/AccountSearch" method="post">
ユーザーID:<input type="text" name="loginId" required><br>
パスワード:<input type="password" name="pass" required><br>
<input type="submit" value="ログイン"><br>
</form>
<p>
アカウント登録がお済みでない方はこちらへ↓<br>
<a href="register.jsp"><button>新規登録</button></a>
</p>
</body>
</html>
loginSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン成功</title>
</head>
<body>
ログインが成功しました!
<p><a href="/login/AccountCheck"><button type="button" name="aaa" >ユーザー or 管理者ページへ</button></a></p>
</body>
</html>
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新規登録</title>
</head>
<body>
<form action="/login/AccountRegister" method="post">
<p>すべて入力してください</p>
<p>
<input type="radio" name="role" value="1">管理者で登録する
<input type="radio" name="role" value="2" checked>ユーザーで登録する
</p>
名前:<input type="text" name="name" required><br>
ユーザーID:<input type="text" name="loginId" required><br>
パスワード:<input type="password" name="pass" required><br>
<input type="submit" value="登録"><br>
</form>
</body>
</html>
registerSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登録完了</title>
</head>
<body>
新規登録が完了しました!
<p><a href="/login/AccountCheck"><button type="button" name="aaa" >ユーザー or 管理者ページへ</button></a></p>
</body>
</html>
user.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ユーザー情報</title>
</head>
<body>
ここはユーザーページです。<br>
<c:choose>
<c:when test="${account.role == 2 }">
登録内容の確認。
<p>ログインID:<c:out value="${account.loginId }"></c:out></p>
<p>パスワード:<c:out value="${account.pass }"></c:out></p>
<p> 名前:<c:out value="${account.name }"></c:out></p>
<p> ロール:ユーザー</p>
<p><a href="/login/Logout"><button type="button" >ログアウト</button></a></p>
<a href="admin.jsp"><button type="button" >管理者ページへ</button></a>
</c:when>
<c:when test="${account.role == 1 }">
<a href="admin.jsp">管理者ページへ</a>
</c:when>
<c:otherwise>
<a href="login.jsp">ログインページへ</a>
</c:otherwise>
</c:choose>
</body>
</html>