index.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
반갑습니다. 허접 홈페이지 입니다.<br/>
<c:if test="${empty sessionScope.member}"> <!-- member라는 세션이 존재하지 않으면 -->
<a href="<%=cp %>/member/member.kp">회원가입</a>
|
<a href="<%=cp %>/member/login.kp">로그인</a>
</c:if>
<c:if test="${not empty sessionScope.member}">
${sessionScope.member.userName}님 <!-- member라는 세션이 존재하면 -->
<a href="<%=cp %>/member/update.kp">정보수정</a>
|
<a href="<%=cp %>/member/logout.kp">로그아웃</a>
|
<a href="<%=cp %>/member/delete.kp">회원탈퇴</a>
</c:if>
<br/>
재미있게 놀다 가삼....
</body>
</html>
==================================================================================================================================
login.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="<%=cp%>/member/login_ok.kp" method="post">
아이디 : <input type="text" name="userId"><br/>
패스워드 : <input type="password" name="userPwd"> <br/>
<input type="submit" value="로그인"><br/>
<input type="button" value="돌아가기" onclick="javascript:location.href='<%=cp %>';"><br/>
<font color="red">${msg}</font>
</form>
</body>
</html>
==================================================================================================================================
created.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원가입</title>
<script type="text/javascript">
String.prototype.trim=function(){
var TRIM_PATTERN=/(^\s*)|(\s*$)/g;
return this.replace(TRIM_PATTERN,"");
};
function sendIt(){
var f=document.forms[0];
// 아이디
var str = f.userId.value;
str = str.trim();
if(! /^[a-z][a-z0-9_!@#$%^&*]{4,14}$/i.test(f.userId.value)){
alert("아이디는 영문자로 시작 5~15이내");
f.userId.focus();
return;
}
f.userId.value = str;
//패스워드검사
var str = f.userPwd.value;
str = str.trim();
if(! /(?=.*[_!@#$%^&*]|.*[0-14]).{0,14}$/i.test(f.userPwd.value)){
alert("패스워드는 하나이상의 특수문자를 포함이며 5~15이내 ");
f.userPwd.focus();
return;
}
f.userPwd.value = str;
//패스워드 확인
if(f.userPwd2.value!=f.userPwd.value){
alert("패스워드를 확인해주세요 ");
f.userPwd2.focus();
return;
}
// 이름
var str = f.userName.value;
str = str.trim();
if(! /^[\uac00-\ud7a3]*$/g.test(f.userName.value)){
alert("이름을 제대로 입력하쇼");
f.userName.focus();
return;
}
f.userName.value = str;
//전화번호
if(f.tel1.value==""){
alert("앞번호를 선택하세요");
f.tel1.focus();
return;
}
if(! f.tel2.value){
alert("가운데번호를 입력하세요");
f.tel2.focus();
return;
}
var mode="${mode}";
if(mode=="created")
f.action="<%=cp%>/member/member_ok.kp";
else if(mode=="update")
f.action="<%=cp%>/member/update_ok.kp";
f.submit();
}
</script>
</head>
<body>
<br/><br/>
<form action="" method="post">
<table align="center" width="312" border="2" cellspacing="0" cellpadding="0" bordercolor="#acacac">
<tr height="40">
<td style="padding-left:20px;" align="left"><b>회 원 가 입</b></td>
</tr>
</table>
<br/>
<table width="400" align="center" border="1" cellspacing="0" cellpadding="0" bordercolor="#kkkkkk">
<tr align="center">
<td width="100px" height="30" bgcolor="#EEEEEE" >아이디</td>
<td width="200px" style="padding-left:5px;" align="left">
<input type="text" name="userId" size="20" maxlength="100" value="${dto.userId}" ${mode=="update"?"readonly='readonly' style='border:0px solid #ffffff;'":"" }/>
</td>
</tr>
<tr align="center">
<td width="100" height="30" bgcolor="#EEEEEE" >패스워드</td>
<td width="100" style="padding-left:5px;" align="left">
<input type="password" name="userPwd" size="20" maxlength="100" value="${dto.userPwd}"/>
</td>
</tr>
<tr align="center">
<td width="100" height="30" bgcolor="#EEEEEE" >패스워드 확인</td>
<td width="100" style="padding-left:5px;" align="left">
<input type="password" name="userPwd2" size="20" maxlength="100" value="${dto.userPwd}"/>
</td>
</tr>
<tr align="center">
<td width="100" height="30" bgcolor="#EEEEEE" >이름</td>
<td width="100" style="padding-left:5px;" align="left">
<input type="text" name="userName" size="20" maxlength="100" value="${dto.userName}" ${mode=="update"?"readonly='readonly' style='border:0px solid #ffffff;'":"" }/>
</td>
</tr>
<tr align="center">
<td width="100" height="30" bgcolor="#EEEEEE" >전화번호</td>
<td align="left" >
<select name="tel1" >
<option value="" style="padding-left: 10"> 선택 </option>
<option value="010" ${dto.tel1=="010"?"selected='selected'":"" }>010</option>
<option value="011" ${dto.tel1=="011"?"selected='selected'":"" }>011</option>
<option value="016" ${dto.tel1=="016"?"selected='selected'":"" }>016</option>
<option value="017" ${dto.tel1=="017"?"selected='selected'":"" }>017</option>
</select>
<input type="text" name="tel2" size="4" maxlength="4" style="margin-left: 3px" value="${dto.tel2}"> -
<input type="text" name="tel3" size="4" maxlength="4" class="boxTF" value="${dto.tel3}">
</td>
</tr>
</table>
<table align="center">
<tr>
<td colspan="2">
<input type="button" value="${mode=='created'?'회원가입':'정보수정' }" onclick="sendIt()"/>
<input type="reset" value="다시입력"/>
<input type="button" value="${mode=='created'?'가입취소':'수정취소' }" onclick="javascript:location.href='<%=cp%>';"/>
</td>
</tr>
<tr align="center">
<td height="30" style="color:blue;">${msg}</td>
</tr>
</table>
</form>
</body>
</html>
==================================================================================================================================
MemberServlet.java
package com.member;
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;
@WebServlet("/member/*")
public class MemberServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
process(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
process(req, resp);
}
protected void forward(HttpServletRequest req,
HttpServletResponse resp, String path)
throws ServletException, IOException {
// 포워딩을 위한 메소드
RequestDispatcher rd=req.getRequestDispatcher(path);
rd.forward(req, resp);
}
protected void process(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
// cp부터 끝까지 주소
String uri=req.getRequestURI();
MemberDAO dao=new MemberDAO();
if(uri.indexOf("member.kp")!=-1) {
req.setAttribute("mode", "created");
forward(req, resp, "/WEB-INF/views/member/created.jsp");
}else if(uri.indexOf("member_ok.kp")!=-1){
MemberDTO dto=new MemberDTO();
dto.setUserId(req.getParameter("userId"));
dto.setUserPwd(req.getParameter("userPwd"));
dto.setUserName(req.getParameter("userName"));
String tel="";
tel=req.getParameter("tel1")+"-"+req.getParameter("tel2")+"-"+req.getParameter("tel3");
dto.setTel(tel);
int result=dao.insertMember(dto);
if(result==1){
String cp=req.getContextPath();
resp.sendRedirect(cp);
return;
}
//가입을 실패하면 다시 가입폼으로
req.setAttribute("mode", "created");
req.setAttribute("msg", "회원가입을 실패했습니다.");
forward(req, resp, "/WEB-INF/views/member/created.jsp");
}else if(uri.indexOf("login.kp")!=-1){
// 로그인 폼
forward(req, resp, "/WEB-INF/views/member/login.jsp");
}else if(uri.indexOf("login_ok.kp")!=-1){
// 로그인 처리
String userId=req.getParameter("userId");
String userPwd=req.getParameter("userPwd");
MemberDTO dto=dao.readMember(userId);
if(dto!=null){ // DB에 로그인 화면에서 입력한 userId의 데이터가 존재하면
if(dto.getUserPwd().equals(userPwd)){ // 존재하는 데이터와 넘어온 데이터가 같으면
//로그인 처리. 세션에 정보를 저장
HttpSession session=req.getSession();
session.setMaxInactiveInterval(20*60); //20*60초 -> 20분 로그인 상태 지속할 수 있게 설정함.
SessionInfo info=new SessionInfo();
info.setUserId(dto.getUserId());
info.setUserName(dto.getUserName());
// member 라는 이름으로 로그인한 사람 저장
session.setAttribute("member", info);
String cp=req.getContextPath();
//로그인 후, 로그아웃 후
//테이블에 추가, 수정, 삭제후에는 리다이렉트
resp.sendRedirect(cp);
return; // 메소드 전체를 빠져나온다.
}
}
//로그인 실패한 경우
req.setAttribute("msg", "아이디 또는 패스워드가 일치하지 않습니다.");
forward(req, resp, "/WEB-INF/views/member/login.jsp");
}else if(uri.indexOf("logout.kp")!=-1){
// 로그아웃
HttpSession session=req.getSession();
session.removeAttribute("member");
session.invalidate();
String cp=req.getContextPath();
resp.sendRedirect(cp);
}else if(uri.indexOf("update.kp")!=-1){
// 수정 폼
HttpSession session=req.getSession();
SessionInfo info=(SessionInfo)session.getAttribute("member"); // member의 세션 데이터를 SessionInfo에 담아둔다.
String cp=req.getContextPath();
if(info==null){
//로그인이 안된 상태. 로그인 페이지로 포워딩
forward(req, resp, "/WEB-INF/views/member/login.jsp");
return;
}
MemberDTO dto=dao.readMember(info.getUserId());
if(dto==null){
session.invalidate(); // 모든것을 지우고 초기화
resp.sendRedirect(cp);
return;
}
//수정페이지로 포워딩
req.setAttribute("mode", "update");
req.setAttribute("dto", dto);
forward(req, resp, "/WEB-INF/views/member/created.jsp");
}else if(uri.indexOf("update_ok.kp")!=-1){
MemberDTO dto=new MemberDTO();
dto.setUserId(req.getParameter("userId"));
dto.setUserPwd(req.getParameter("userPwd"));
String tel="";
tel=req.getParameter("tel1")+"-"+req.getParameter("tel2")+"-"+req.getParameter("tel3");
dto.setTel(tel);
int result=dao.updateMember(dto);
if(result==1){
String cp=req.getContextPath();
resp.sendRedirect(cp);
return;
}
//수정을 실패하면 다시 가입폼으로
req.setAttribute("mode", "update");
req.setAttribute("msg", "수정을 실패했습니다.");
forward(req, resp, "/WEB-INF/views/member/update.jsp");
}else if(uri.indexOf("delete.kp")!=-1){
HttpSession session=req.getSession();
SessionInfo info=(SessionInfo)session.getAttribute("member");
String cp=req.getContextPath();
if(info==null){ // 로그인 안된 상태
forward(req, resp, "/WEB-INF/views/member/login.jsp");
return;
}
MemberDTO dto=dao.readMember(info.getUserId());
if(dto==null){ //데이터가 없을 때(이미 삭제된경우)
session.invalidate(); // 모든것을 지우고 초기화
resp.sendRedirect(cp);
return;
}
String userId=dto.getUserId();
dao.deleteMember(userId);
session.invalidate();
resp.sendRedirect(cp);
}
}
}
==================================================================================================================================
MemberDAO.java
package com.member;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.util.DBConn;
public class MemberDAO {
private Connection conn=DBConn.getConnection();
public int insertMember(MemberDTO dto){
int result=0;
PreparedStatement pstmt=null;
String sql;
try{
sql="INSERT INTO join(userId,userPwd,userName,tel) VALUES(?,?,?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, dto.getUserId());
pstmt.setString(2, dto.getUserPwd());
pstmt.setString(3, dto.getUserName());
pstmt.setString(4, dto.getTel());
result=pstmt.executeUpdate();
pstmt.close();
}catch(Exception e){
System.out.println(e.toString());
}
return result;
}
public MemberDTO readMember(String userId){
MemberDTO dto=null;
PreparedStatement pstmt=null;
ResultSet rs= null;
String sql;
try{
sql="SELECT userId,userPwd,userName,tel FROM join WHERE userId=?";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, userId);
rs=pstmt.executeQuery();
if(rs.next()){
dto=new MemberDTO();
dto.setUserId(rs.getString("userId"));
dto.setUserPwd(rs.getString("userPwd"));
dto.setUserName(rs.getString("userName"));
dto.setTel(rs.getString("tel"));
if(dto.getTel()!=null){ //tel이 te1,tel2,tel3으로 합쳐져 있는 것을 수정을 위해 분리하였다. 전화번호 분리
String t[]=dto.getTel().split("-");
if(t.length==3){
dto.setTel1(t[0]);
dto.setTel2(t[1]);
dto.setTel3(t[2]);
}
}
}
rs.close();
pstmt.close();
}catch(Exception e){
System.out.println(e.toString());
}
return dto;
}
public int updateMember(MemberDTO dto){
int result=0;
PreparedStatement pstmt=null;
String sql;
try{
sql="UPDATE join SET userPwd=?, tel=? WHERE userId=?";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,dto.getUserPwd());
pstmt.setString(2, dto.getTel());
pstmt.setString(3, dto.getUserId());
result=pstmt.executeUpdate();
pstmt.close();
}catch(Exception e){
System.out.println(e.toString());
}
return result;
}
public int deleteMember(String userId){
int result=0;
PreparedStatement pstmt=null;
String sql;
try{
sql="DELETE FROM join WHERE userId=?";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, userId);
result=pstmt.executeUpdate();
pstmt.close();
}catch(Exception e){
System.out.println(e.toString());
}
return result;
}
}
==================================================================================================================================
MemberDTO.java
package com.member;
public class MemberDTO {
private String userId,userPwd,userName, tel1,tel2,tel3,tel;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getTel1() {
return tel1;
}
public void setTel1(String tel1) {
this.tel1 = tel1;
}
public String getTel2() {
return tel2;
}
public void setTel2(String tel2) {
this.tel2 = tel2;
}
public String getTel3() {
return tel3;
}
public void setTel3(String tel3) {
this.tel3 = tel3;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
==================================================================================================================================
SessionInfo.java
package com.member;
//세션에 저장할 객체(DTO형식으로 세션 객체를 저장한다고 생각하면 됨)
public class SessionInfo {
private String userId, userName, roll; //roll은 권한을 위한 변수
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getRoll() {
return roll;
}
public void setRoll(String roll) {
this.roll = roll;
}
}