회원가입을 위한 테이블 생성
create table member(
id varchar(30) not null, # 아이디
password varchar(30) , #패스워드
name varchar(30), # 이름
email varchar(30), # 이메일
phone varchar(30), # 전화번호
job varchar(30), # 직업
regdate varchar(30), # 가입날짜
primary key(id)
)engine = innodb default charset=utf8;
drop table member;
desc member
select * from member limit 100; # 100개 행만 선택해봄
select id,password from member where id ='test'
select count(*) from member; # 회원수
insert into member values('bug','1234','대충벌레','bigbug@naver.com','010-1234-5212','학생',now());
# 테스트
프로젝트가 에러없이 일단 잘 실행되는지 확인하기 위해 index.jsp 만들고 확인
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>INDEX</title>
</head>
<body>
INDEX 페이지 입니다.
</body>
</html>
index.jsp 정상 출력됨
데이터베이스 연동하기 위해서 WEB-INF > lib 에 커넥터.jar 파일을 넣어줍니다.
기본적인 구조
[DBConnection.java]
package register0104;
import java.sql.*;
import java.util.Properties;
import java.util.Vector;
public class DBConnectionMgr {
private Vector connections = new Vector(10);
private String _driver = "org.gjt.mm.mysql.Driver", // com.mysql.jdbc.Driver 와 동일
_url = "jdbc:mysql://127.0.0.1:3306/db명?useUnicode=true&characterEncoding=UTF8",
_user = "유저명",
_password = "패스워드명";
private boolean _traceOn = false;
private boolean initialized = false;
private int _openConnections = 10;
private static DBConnectionMgr instance = null;
public DBConnectionMgr() {
}
/** Use this method to set the maximum number of open connections before
unused connections are closed.
*/
public static DBConnectionMgr getInstance() {
if (instance == null) {
synchronized (DBConnectionMgr.class) {
if (instance == null) {
instance = new DBConnectionMgr();
}
}
}
return instance;
}
public void setOpenConnectionCount(int count) {
_openConnections = count;
}
public void setEnableTrace(boolean enable) {
_traceOn = enable;
}
/** Returns a Vector of java.sql.Connection objects */
public Vector getConnectionList() {
return connections;
}
/** Opens specified "count" of connections and adds them to the existing pool */
public synchronized void setInitOpenConnections(int count)
throws SQLException {
Connection c = null;
ConnectionObject co = null;
for (int i = 0; i < count; i++) {
c = createConnection();
co = new ConnectionObject(c, false);
connections.addElement(co);
trace("ConnectionPoolManager: Adding new DB connection to pool (" + connections.size() + ")");
}
}
/** Returns a count of open connections */
public int getConnectionCount() {
return connections.size();
}
/** Returns an unused existing or new connection. */
public synchronized Connection getConnection()
throws Exception {
if (!initialized) {
Class c = Class.forName(_driver);
DriverManager.registerDriver((Driver) c.newInstance());
initialized = true;
}
Connection c = null;
ConnectionObject co = null;
boolean badConnection = false;
for (int i = 0; i < connections.size(); i++) {
co = (ConnectionObject) connections.elementAt(i);
// If connection is not in use, test to ensure it's still valid!
if (!co.inUse) {
try {
badConnection = co.connection.isClosed();
if (!badConnection)
badConnection = (co.connection.getWarnings() != null);
} catch (Exception e) {
badConnection = true;
e.printStackTrace();
}
// Connection is bad, remove from pool
if (badConnection) {
connections.removeElementAt(i);
trace("ConnectionPoolManager: Remove disconnected DB connection #" + i);
continue;
}
c = co.connection;
co.inUse = true;
trace("ConnectionPoolManager: Using existing DB connection #" + (i + 1));
break;
}
}
if (c == null) {
c = createConnection();
co = new ConnectionObject(c, true);
connections.addElement(co);
trace("ConnectionPoolManager: Creating new DB connection #" + connections.size());
}
return c;
}
/** Marks a flag in the ConnectionObject to indicate this connection is no longer in use */
public synchronized void freeConnection(Connection c) {
if (c == null)
return;
ConnectionObject co = null;
for (int i = 0; i < connections.size(); i++) {
co = (ConnectionObject) connections.elementAt(i);
if (c == co.connection) {
co.inUse = false;
break;
}
}
for (int i = 0; i < connections.size(); i++) {
co = (ConnectionObject) connections.elementAt(i);
if ((i + 1) > _openConnections && !co.inUse)
removeConnection(co.connection);
}
}
public void freeConnection(Connection c, PreparedStatement p, ResultSet r) {
try {
if (r != null) r.close();
if (p != null) p.close();
freeConnection(c);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void freeConnection(Connection c, Statement s, ResultSet r) {
try {
if (r != null) r.close();
if (s != null) s.close();
freeConnection(c);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void freeConnection(Connection c, PreparedStatement p) {
try {
if (p != null) p.close();
freeConnection(c);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void freeConnection(Connection c, Statement s) {
try {
if (s != null) s.close();
freeConnection(c);
} catch (SQLException e) {
e.printStackTrace();
}
}
/** Marks a flag in the ConnectionObject to indicate this connection is no longer in use */
public synchronized void removeConnection(Connection c) {
if (c == null)
return;
ConnectionObject co = null;
for (int i = 0; i < connections.size(); i++) {
co = (ConnectionObject) connections.elementAt(i);
if (c == co.connection) {
try {
c.close();
connections.removeElementAt(i);
trace("Removed " + c.toString());
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
private Connection createConnection()
throws SQLException {
Connection con = null;
try {
if (_user == null)
_user = "";
if (_password == null)
_password = "";
Properties props = new Properties();
props.put("user", _user);
props.put("password", _password);
con = DriverManager.getConnection(_url, props);
} catch (Throwable t) {
throw new SQLException(t.getMessage());
}
return con;
}
/** Closes all connections and clears out the connection pool */
public void releaseFreeConnections() {
trace("ConnectionPoolManager.releaseFreeConnections()");
Connection c = null;
ConnectionObject co = null;
for (int i = 0; i < connections.size(); i++) {
co = (ConnectionObject) connections.elementAt(i);
if (!co.inUse)
removeConnection(co.connection);
}
}
/** Closes all connections and clears out the connection pool */
public void finalize() {
trace("ConnectionPoolManager.finalize()");
Connection c = null;
ConnectionObject co = null;
for (int i = 0; i < connections.size(); i++) {
co = (ConnectionObject) connections.elementAt(i);
try {
co.connection.close();
} catch (Exception e) {
e.printStackTrace();
}
co = null;
}
connections.removeAllElements();
}
private void trace(String s) {
if (_traceOn)
System.err.println(s);
}
}
class ConnectionObject {
public java.sql.Connection connection = null;
public boolean inUse = false;
public ConnectionObject(Connection c, boolean useFlag) {
connection = c;
inUse = useFlag;
}
}
register.jsp 회원가입 폼
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<script type="text/javascript">
function idCheck(id){
if(id==""){
alert("아이디를 입력해 주세요.");
document.regForm.mem_id.focus();
}else{
url="idcheck.jsp?id="+id;
window.open(url,"post","width=300,height=200");
}
}
</script>
</head>
<body>
<table border="1" align='center'>
<form name='regform' method='post' action='register_ok.jsp'>
<tr>
<th colspan="2">회원가입</th>
</tr>
<tr>
<td width="20%">아이디</td>
<td width="60%"><input type='text' name='id' size='20'> <input type='button' value='중복확인' onclick='idCheck(this.form.id.value)'></td>
</tr>
<tr>
<td>패스워드</td>
<td><input type="password" name='password' size='20'></td>
</tr>
<tr>
<td>패스워드 확인</td>
<td><input type='password' name='password_re' size='20'></td>
</tr>
<tr>
<td>이름</td>
<td><input type='text' name='name' size='10'></td>
</tr>
<tr>
<td>이메일</td>
<td><input type='text' name='email' size='30'></td>
</tr>
<tr>
<td>전화번호</td>
<td><input type="text" name='phone' size='20'></td>
</tr>
<tr>
<td colspan="2" align='center'>
<input type='submit' value='회원가입'> <input type="reset" value='다시쓰기'>
</tr>
</form>
</table>
</body>
</html>
ID가 DB에있는 값과 중복되는게 있는지 비교
MemberDAO.java 생성후 코드 작성
package register0104;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class MemberDAO {
private DBConnectionMgr pool = null;
public MemberDAO() {
try {
pool = DBConnectionMgr.getInstance();
} catch (Exception e) {
System.out.println("Error : "+e);
}
}// 생성자
// 아이디 있는지 비교
public boolean checkID(String id) {
Connection c = null;
PreparedStatement p = null;
ResultSet r = null;
boolean check = false;
try {
c = pool.getConnection(); // 객체를 빌림
String query = "select id from member where id =?";
p = c.prepareStatement(query);
p.setString(1, id);
r = p.executeQuery();
check = r.next();
} catch (Exception e) {
// TODO: handle exception
System.out.println("Exception" +e);
}finally {
pool.freeConnection(c, p, r);
}
return check;
}
}
ID 체크를 위한 idcheck.jsp 를 만들어줌
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean id="memberDAO" class="register0104.MemberDAO"/>
<%
String id = request.getParameter("id");
boolean check = memberDAO.checkID(id);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ID 중복체크</title>
</head>
<body bgcolor="#FFFFDD">
<center>
<b><%=id %></b>
<%
if(check){
out.println("이미 존재하는 ID 입니다");
}else{
out.println("사용 가능한 아이디 입니다.");
}
%>
<a href="#" onclick='win_close()'>닫기</a>
</center>
</body>
</html>
회원가입을 위한 DAO 추가
//회원가입
public boolean memberInsert(MemberDTO memberDTO) {
Connection c=null;
PreparedStatement p = null;
boolean flag = false;
try {
c = p.getConnection();
String query = "insert into member values(?,?,?,?,?,?,now()";
p=c.prepareStatement(query);
p.setString(1, memberDTO.getId());
p.setString(2, memberDTO.getPassword());
p.setString(3, memberDTO.getName());
p.setString(4, memberDTO.getEmail());
p.setString(5, memberDTO.getPhone());
p.setString(6, memberDTO.getJob());
int cnt = p.executeUpdate();
// excuteQuery : resultSet 반환
// excuteUpdate : int 행의 갯수 반환
if(cnt>0) {
flag=true;
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("Exception "+e);
}finally {
pool.freeConnection(c, p);
}
return flag;
}
회원가입폼 입력확인을 위한 확인 폼 register_ok.jsp 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 확인</title>
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<%-- 폼에서 저장한 데이터를 빈에 저장한다.
빈에서 꺼내어 확인폼을 구성한다
맞다고 판단되면 확인을 눌러 처리
--%>
<jsp:useBean id="memberDTO" class="register0104.MemberDTO"/>
<jsp:setProperty property="*" name="memberDTO"/>
<table border="1" align='center'>
<form name='regform' method='post' action='insert.jsp'>
<tr>
<th colspan="2"><jsp:getProperty property="name" name="memberDTO"/>작성한 내용 확인</th>
</tr>
<tr>
<td width="20%">아이디</td>
<td width="60%"><input type='text' name='id' value='<jsp:getProperty property="id" name="memberDTO"/>'></td>
</tr>
<tr>
<td>이름</td>
<td><input type='text' name='name' value='<jsp:getProperty property="name" name="memberDTO"/>'></td>
</tr>
<tr>
<td><input type="hidden" name='password' value='<jsp:getProperty property="password" name="memberDTO"/>'></td>
</tr>
<tr>
<td>이메일</td>
<td><input type='text' name='email' value='<jsp:getProperty property="email" name="memberDTO"/>'></td>
</tr>
<tr>
<td>전화번호</td>
<td><input type="text" name='phone' value='<jsp:getProperty property="phone" name="memberDTO"/>'></td>
</tr>
<tr>
<td>직업</td>
<td><input type='text' name='job' value='<jsp:getProperty property="job" name="memberDTO"/>'></td>
</tr>
<tr>
<td colspan="2" align='center'>
<input type='submit' value='회원가입'> <input type="button" value='다시쓰기' onclick="history.back()">
</tr>
</form>
</table>
</body>
</html>
회원가입을 처리할 insert.jsp 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 가입 처리를 위한 페이지 --%>
<jsp:useBean id="memberDAO" class="register0104.MemberDAO"/>
<jsp:useBean id="memberDTO" class="register0104.MemberDTO"/>
<jsp:setProperty property="*" name="memberDTO"/>
<%
boolean flag = memberDAO.memberInsert(memberDTO);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 처리</title>
</head>
<body>
<%
if(flag){
out.println("회원가입 축하");
out.println("<a href=login.jsp>로그인</a>");
}else{
out.println("다시 가입 부탁");
out.println("<a href=register.jsp>재가입</a>");
}
%>
</body>
</html>
DB에 정상적으로 입력됬는지 확인
[지금 확인해보니 job 컬럼은 추가를 안했음]
index.jsp 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String id = (String)session.getAttribute("key");
System.out.println(id);
%>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
</script>
<meta charset="UTF-8">
<title>INDEX</title>
</head>
<body>
INDEX 페이지 입니다.
<%
if(id != null){
%>
<B><%=id %></B> 님 환영합니다.
<a href="logout.jsp">로그아웃</a>
<%}else{ %>
<a href='register.jsp'>회원가입</a>
<div>
<form name="login" method="post" action='login_ok.jsp'>
<p><input type="text" name='id' size='20' placeholder="아이디"></p>
<p><input type='password' name='password' size="20" placeholder="비밀번호"></p>
<p><input type='submit' value='로그인'> </p>
</form>
</div>
</form>
<% } %>
</body>
</html>
따로 로그인 페이지는 만들지 않고 index에 추가했음.
로그인 처리를 위한 login_ok.jsp 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("utf-8"); %>
<jsp:useBean id="memberDAO" class="register0104.MemberDAO"/>
<%
String id = request.getParameter("id");
String password = request.getParameter("password");
boolean check = memberDAO.logincheck(id,password);
if(check){
session.setAttribute("key", id);
response.sendRedirect("index.jsp");
}else{
response.sendRedirect("error.jsp");
System.out.print("올바르지 않은 게정 정보");
}
%>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
</script>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
로그인 처리를 위해 DAO에 추가
// 로그인 체크
public boolean logincheck(String id,String password) {
Connection c= null;
PreparedStatement p = null;
ResultSet r = null;
boolean logincheck = false;
try {
c = pool.getConnection();
String query = "select id , password from member where id = ? and password = ? ";
p=c.prepareStatement(query);
p.setString(1, id);
p.setString(2, password);
r=p.executeQuery();
logincheck =r.next();
System.out.println(logincheck);
} catch (Exception e) {
// TODO: handle exception
System.out.println("Exception : "+e);
}finally {
pool.freeConnection(c,p,r);
}
return logincheck;
}
에러가 있을시 이동할 error.jsp 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 에러</title>
</head>
<BR><BR><BR>
<center>
<b>로그인에 실패하셨습니다<p>
<input type="button" value="다시쓰기" onClick="history.back()">
</center>
</body>
</html>
로그아웃 할때 세션을 없앨 logout.jsp 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<% session.invalidate(); %>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
alert("로그아웃 됨");
location.href="index.jsp";
</script>
</head>
<body>
</body>
</html>
확인을 위해 다시 정리
index.jsp
id : abc , password : 1234 로 로그인
로그아웃시 세션 종료되고 다시 인덱스로 돌아옴
id 혹은 password가 일치하지 않을경우
다시쓰기 클릭시 다시 index로 돌아옴
프로젝트 소스 코드
https://github.com/inthegun/bug_register
inthegun/bug_register
회원가입,로그인 NO MVC. Contribute to inthegun/bug_register development by creating an account on GitHub.
github.com
'IT 기술 > 웹[JSP,HTML]' 카테고리의 다른 글
MVC 패턴 Oracle 게시판 [글 삽입 , 글 리스트 ] (1) | 2021.01.11 |
---|---|
MVC 없이 Dynamic Web Project [게시판] (2) | 2021.01.06 |
이클립스[Mysql,Oracle] Java로 연동테스트 (0) | 2020.12.16 |
이클립스 Database 연동하기 [MySQL , Oracle] (0) | 2020.12.03 |
이클립스 톰캣 설정후 주소창에 localhost:포트번호 고양이가 안뜨는 경우 (0) | 2020.11.20 |