너굴 개발 일지

TIL_210506_프로젝트 문제 해결(simple_shop 회원가입 완료) 본문

HTML,CSS

TIL_210506_프로젝트 문제 해결(simple_shop 회원가입 완료)

너굴냥 2021. 5. 6. 22:04

지금 배우는 프로젝트는 여러 사용자(클라이언트)가 접속할 수 있게 만들기에 Connection 객체를 많이 만들어 놓을 것이다

 

DBConnectionMgr Class - DB에 접속하고 데이터를 처리하는 클래스1. 사용 후 자원해제2. Connection 객체 여러 개 미리 만들고 다수의 사용자가 접속시, 사용되지 않는 Connection 객체를 제공

3. Connection 객체를 미리 여러 개 생성 -> POOL 개념 

 - 1.Connection 객체 생성                     
  -2. Connection 객체 사용 여부 확인 )=> 과정3을 처리하기 위한 별도 클래스 필요(ConnectionObject : 서브 클래스)

 

회원 : 조회/삽입/수정/삭제 -dao:  MemberMgr, dto: MemberBean
상품 : 조회/삽입/수정/삭제 - dao:  ProductMgr, dto: ProductBean
주문: 조회/삽입/수정/삭제 - dao:  OrderMgr, dto: OrderBean
장바구니: 조회/삽입/수정/삭제 - dao:  CartMgr, dto: 아직 안만듦

 

프로젝트에 필요한 클래스 및 파일들 사진

(참고로 오라클에 미리 테이블 생성 후 zipcode_tbl에 데이터 삽입 선순위)

(추가 SQL문도 미리 삽입)

 

클래스 및 파일들 흐름도

 

결과 사진

idCheck.jsp 아이디 중복확인
zipSearch 도로명에 따른 주소 검색
zipSearch.jsp 주소 검색 후 결과
주소 검색 완료 후 회원가입 화면(member.jsp)
memberInsert.jps 회원가입 확인
mmberProc.jsp 회원가입 완료 화면
db에서 회원 데이터 삽입 성공 확인

 

Java 클래스들 코드

더보기

DBConnectionMgr

package com.bjy.mall;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.Vector;

public class DBConnectionMgr {
	private Vector<ConnectionObject> connections = new Vector<ConnectionObject>(10);
	private String _driver = "oracle.jdbc.driver.OracleDriver";
	private String _url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
	private String _user = "shop_bjy";
	private String _password = "1234";
	
	private boolean _traceOn = false;		// 사용가능 여부
	private boolean initialize = false;		// 초기화
	private int _openConnections = 50;		// 최대 가능 갯수
	
	private static DBConnectionMgr instance = null; // DBConnectionMgr 객체는 어플리케이션에서 단 하나만 존재 (싱글톤 패턴 사용)
	
	private DBConnectionMgr() {}
	
	public static DBConnectionMgr getInstance() {
		if(instance == null) {
			instance = new DBConnectionMgr();
		}
		return instance;
	}

	/** 열려 있는 Connection 객체 수 설정 **/
	public void setOpenConnectionCount(int count) {
		_openConnections = count;
	}
	
	/** 사용 가능  여부 설정 **/
	public void setEnableTrace(boolean enable) {
		_traceOn = enable;
	}
	
	/** Vector<ConnectionObject> connections 를 반환 **/
	public Vector<ConnectionObject> getConnectionList(){
		return connections;
	}
	
	/** 현재 열려 있는 Connection 객체 수 반환 **/
	public int getConnectionCount() {
		return connections.size();
	}
	
	/** 새로운 Connection 객체를 생성, 접근 제한자 private : 외부에서 Connection 객체 생성 못하게 함 **/
	private Connection createConnection() {
		Connection conn = null;
		
		try {
			if(_user == null) { _user = ""; }			// 여러 개의 사용자 계정을 쓸 경우를 대비해 사용자 계정을 변경할 경우 먼저 초기화 시켜줌
			if(_password == null) { _password = ""; }	
			
			Properties props = new Properties();
			props.put("user", _user);
			props.put("password", _password);
			
			conn = DriverManager.getConnection(_url, props);
	
		}catch(SQLException e) {
			System.err.println("createConnection() ERR : " + e.getMessage());
		}
		return conn;
	}
	
	/** 모든 연결을 닫고(해제) 연결 풀??**/
	public void finalize() {
		ConnectionObject conns = null;
		
		for(int i=0; i < connections.size(); i++) {
			conns = (ConnectionObject)connections.elementAt(i);
			
			try {
				conns.connection.close();	// Vector 안의 ConnectionObject 내의 Connection 객체 자원해제 (close())
			}catch(SQLException e) {
				System.err.println("finalize() close() ERR : " + e.getMessage());
			}
			conns = null;
		}
		connections.removeAllElements();	// Vector 안의 모든 객체 제거
	}
	
	/** 현재 사용되지 않지만 연결되어 있는 Connection 자원 해제 **/
	public void releaseFreeConnection() {
		ConnectionObject conns = null;
		
		for(int i=0;i<connections.size();i++) {
			conns = (ConnectionObject)connections.elementAt(i); // 형변환 안해도 가능 아닌가 ? 객체로 반환되기에 형변환 필요하다고 함
			if(!conns.inuse) { removeConnection(conns.connection); }
		}
	}
	
	/** 사용되지 않는 Connection 객체 제거**/
	public void removeConnection(Connection c) {
		if(c==null) { return; }
		
		ConnectionObject conns = null;
		for(int i=0;i<connections.size();i++) {
			conns = (ConnectionObject)connections.elementAt(i);
			
			if(c==conns.connection) {
				try {
					c.close();
					connections.removeElementAt(i);
				}catch(SQLException e) {
					System.err.println("removeConnection() close() ERR : " + e.getMessage());
				}
				break;
			} // end of if()
		
		} // end of for()
		
	} // end of removeConnection()
	
	
	/** PreparedStatement, Statement, ResultSet 다양한 자원 해제 메서드 **/
	/** 매개변수가 다르기에 오버로딩하여 작성 **/
	public void freeConnection(PreparedStatement pstmt, ResultSet rs, Connection c) {
		try {
			if(rs != null) { rs.close(); }
			if(pstmt != null) { pstmt.close(); }
			freeClose(c);
		}catch(SQLException e) {
			System.err.println("freeConnection() pstmt,rs close ERR : " + e.getMessage());
		}
	}
	
	public void freeConnection(Statement stmt, ResultSet rs, Connection c) {
		try {
			if(rs != null) { rs.close(); }
			if(stmt != null) { stmt.close(); }
			freeClose(c);
		}catch(SQLException e) {
			System.err.println("freeConnection() stmt, rs close ERR : " + e.getMessage());
		}
	}
	
	public void freeConnection(Statement stmt, Connection c) {
		try {
			if(stmt != null) { stmt.close(); }
			freeClose(c);
		}catch(SQLException e) {
			System.err.println("freeConnection() stmt close ERR : " + e.getMessage());
		}
	}
	
	public void freeConnection(PreparedStatement pstmt, Connection c) {
		try {
			if(pstmt != null) { pstmt.close(); }
			freeClose(c);
		}catch(SQLException e) {
			System.err.println("freeConnection() pstmt close ERR : " + e.getMessage());
		}
	}
	
	public void freeClose(Connection c) {
		try {
			if (c != null) {
				c.close();
			}else {
				freeClose(c);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	
	/** 새로운(현재 사용하지 않거나) Connection 객체를 반환**/
	public Connection getConnection() {
		Connection conn = null;
		ConnectionObject conns = null;
		
		if(!initialize) {
		
			try {
				Class.forName(_driver);
				conn = DriverManager.getConnection(_url, _user, _password);
			}catch(ClassNotFoundException e) {
				System.err.println("getConnection() driver ERR : " + e.getMessage());
			}catch(SQLException e) {
				System.err.println("getConnection() connect ERR : " + e.getMessage());
			}
		}
		
		boolean badConnection = false; // 연결이 잘못되었을 경우 상태값 저장
		
		for(int i=0;i<connections.size();i++) {
			conns = (ConnectionObject)connections.elementAt(i);
			
			// 연결이 유효한지 테스트
			if(!conns.inuse) {
				try {
					badConnection = conns.connection.isClosed();	// 기존 Connection 객체가 닫혀있는지 
					
					if(!badConnection) {
						badConnection = (conns.connection.getWarnings() != null);	// getWarnings() : 경고 발생 
					}
				}catch(SQLException e) {
					System.err.println("getConnection() validate ERR : " + e.getMessage());
				}
				
				// 잘못연결된 Connection 객체의 경우 pool(Vector)에서 제거
				if(badConnection) {
					connections.removeElementAt(i);
					continue;
				}
				
				conn = conns.connection;
				conns.inuse = true;
				
				break;
				
			} // end of if(!conns.inuse)
			
			if(conn == null) {
				conn = createConnection();
				conns = new ConnectionObject(conn, true);
				connections.addElement(conns);
			}
		}
		
		return conn;
	}
	
} // end of DBConnectionMgr


/** Connection 객체와 그 객체의 사용 여부를 저장할 수 있는 클래스 선언 
 * Sub Class 로 (클래스 선언시 접근 제한자 사용불가, 왜냐면 대표 클래스가 접근 제한자를 가지고 있기 때문) **/
class ConnectionObject{
	public Connection connection = null;	// Connection 객체
	public boolean inuse = false;			// 사용여부
	
	public ConnectionObject(Connection c, boolean useFlag) {
		connection = c;
		inuse = useFlag;
	}
	
}

MemberBean

package com.bjy.mall;

public class MemberBean {
	private String id=null;
	private String pwd=null;
	private String name=null;
	private String gender=null;
	private String birthday=null;
	private String email=null;
	private String zipcode=null;
	private String address=null;
	private String[] hobby=null;
	private String job=null;
	
	public MemberBean() {
		// TODO Auto-generated constructor stub
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getBirthday() {
		return birthday;
	}

	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String[] getHobby() {
		return hobby;
	}

	public void setHobby(String[] hobby) {
		this.hobby = hobby;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	
}

MemberMgr

package com.bjy.mall;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;

public class MemberMgr {
	private DBConnectionMgr pool;
	
	public MemberMgr() {
		pool = DBConnectionMgr.getInstance();
	}
	
	
	// ID 중복확인
	public boolean checkId(String id) {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		boolean flag = false;
		
		try {
			con = pool.getConnection();
			sql = "select id from member_tbl where id=?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			rs = pstmt.executeQuery();		// sql문 실행
			flag = rs.next();				// true면 중복, false 중복 아님
		}catch(Exception e) {
			System.err.println("checkId() ERR : " + e.getMessage());
		}finally{
			pool.freeConnection(pstmt, rs, con);
		}
		return flag;
	}
	
	/** 우편번호 검색 메서드 **/
	public Vector<ZipcodeBean> zipcodeRead(String area3){
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		Vector<ZipcodeBean> vlist = new Vector<ZipcodeBean>();
		
		try {
			con = pool.getConnection();
			sql = "select * from zipcode_tbl where area3 like ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, "%" + area3 + "%");// %강남대로%
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				ZipcodeBean bean = new ZipcodeBean();
				bean.setZipcode(rs.getString(1));
				bean.setArea1(rs.getString(2));
				bean.setArea2(rs.getString(3));
				bean.setArea3(rs.getString(4));
				vlist.addElement(bean);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			pool.freeConnection(pstmt, rs, con);
		}
		return vlist;
	}
	
	public boolean insertMember(MemberBean bean) {
		Connection con = null;
		PreparedStatement pstmt = null;
		String sql = null;
		boolean flag = false;
		try {
			con = pool.getConnection();
			sql = "insert into member_tbl (id,pwd,name,gender,birthday,email,zipcode,address,hobby,job) values (?,?,?,?,?,?,?,?,?,?)";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, bean.getId());	pstmt.setString(2, bean.getPwd());
			pstmt.setString(3, bean.getName());	pstmt.setString(4, bean.getGender());
			pstmt.setString(5, bean.getBirthday());	pstmt.setString(6, bean.getEmail());
			pstmt.setString(7, bean.getZipcode());	pstmt.setString(8, bean.getAddress());
			
			// 예 : {"인터넷","게임","음악"};
			String hobby[] = bean.getHobby();
			char hb[] = {'0', '0', '0', '0', '0'};
			String lists[] = {"인터넷", "여행", "게임", "영화", "운동" };
			if(hobby != null) {
				for(int i=0;i<hobby.length;i++) {
					for(int j=0;j<lists.length;j++) {
						if(hobby[i].equals(lists[j])) {
							hb[j] = '1';
							break;
						}
					}
				}
			}
			pstmt.setString(9, new String(hb));
			
			pstmt.setString(10, bean.getJob());
			if(pstmt.executeUpdate() == 1) {
				flag = true;
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally{
			pool.freeConnection(pstmt, con);
		}
		return flag;
	}
}

ZipcodeBean

package com.bjy.mall;

public class ZipcodeBean {
	
	private String zipcode = null;
	private String area1 = null;
	private String area2 = null;
	private String area3 = null;
	
	public ZipcodeBean() {
	}

	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}

	public String getArea1() {
		return area1;
	}

	public void setArea1(String area1) {
		this.area1 = area1;
	}

	public String getArea2() {
		return area2;
	}

	public void setArea2(String area2) {
		this.area2 = area2;
	}

	public String getArea3() {
		return area3;
	}

	public void setArea3(String area3) {
		this.area3 = area3;
	}

}

OrderBean

package com.bjy.mall;

public class OrderBean {
	private int no=0;
	private int productNo=0;
	private int quantity=0;
	private String rdate = null;
	private String state = null;
	private String id = null;
	
	public OrderBean() {
		// TODO Auto-generated constructor stub
	}

	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public int getProductNo() {
		return productNo;
	}

	public void setProductNo(int productNo) {
		this.productNo = productNo;
	}

	public int getQuantity() {
		return quantity;
	}

	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

	public String getRdate() {
		return rdate;
	}

	public void setRdate(String rdate) {
		this.rdate = rdate;
	}

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	
}

ProductBean

package com.bjy.mall;

public class ProductBean {
	private int no = 0;
	private String name = null;
	private int price = 0;
	private String detail = null;
	private String rdate = null;
	private int stock = 0;
	private String image = null;
	
	
	public ProductBean() {
		// TODO Auto-generated constructor stub
	}


	public int getNo() {
		return no;
	}


	public void setNo(int no) {
		this.no = no;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public int getPrice() {
		return price;
	}


	public void setPrice(int price) {
		this.price = price;
	}


	public String getDetail() {
		return detail;
	}


	public void setDetail(String detail) {
		this.detail = detail;
	}


	public String getRdate() {
		return rdate;
	}


	public void setRdate(String rdate) {
		this.rdate = rdate;
	}


	public int getStock() {
		return stock;
	}


	public void setStock(int stock) {
		this.stock = stock;
	}


	public String getImage() {
		return image;
	}


	public void setImage(String image) {
		this.image = image;
	}
	
	

}

 

회원가입 관련 jsp

더보기

member.jsp 수정본

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8"> <!-- meta태그는 항상 처음에... -->
	<title>Simple Shopping Mall : 회원가입(member.jsp)</title>
	<link href="style.css" rel="stylesheet" type="text/css">
	<script type="text/javascript" src="script.js?ver=2"></script>
</head>

<body bgcolor="#996600"  topmargin="100" >
	<%@ include file="top.jsp" %>

	<table width="75%" align="center" bgcolor="#ffff99" >
		<tr>
			<td align="center" bgcolor="#ffffcc" >
			
				<table width="95%" align="center"  bgcolor="#ffff99" border="1" >
					<form action="memberInsert.jsp" method="post" name="regForm">
					
						<tr align="center"  bgcolor="#996600" >
							<td colspan="3"><font color="#ffffff"><b>회원가입</b></font></td>
						</tr>
						
						<tr>
							<td width="16%">아이디</td>
							<td width="57%">
								<input type="text" name="id" size="15" required="required" />
								<input type="button" value="아이디 중복확인"  onclick="idCheck(this.form.id.value)" />
							</td>
							<td width="27%">아이디 입력은 필수 입니다.</td>
						</tr>
						
						<tr>
							<td>비밀번호</td>
							<td><input type="password" name="pwd" size="15" required="required" /></td>
							<td>비밀번호 입력은 필수입니다.</td>
						</tr>
						
						<tr>
							<td>비밀번호 확인</td>
							<td><input type="password" name="repwd" size="15" required="required" /></td>
							<td>비밀번호 확인 입력은 필수입니다.</td>
						</tr>
						
						<tr>
							<td>이름</td>
							<td><input type="text" name="name" size="15" required="required" /></td>
							<td>고객님의 실명을 입력해주세요</td>
						</tr>
				
						<tr>
							<td>성별</td>
							<td>
								남<input type="radio"  name="gender"  value="1" checked="checked" />
								여<input type="radio"  name="gender"  value="2" checked="checked" />
							</td>
							<td>성별을 선택하세요</td>
						</tr>
						
						<tr>
							<td>생년월일</td>
							<td><input type="text" name="birthday" size="10" placeholder="ex)880912" required="required" /></td>
							<td>생년월일을 입력해주세요</td>
						</tr>
				
						<tr>
							<td>이메일주소</td>
							<td><input type="email" name="email" size="27" placeholder="abcd@domain.com" required="required" /></td>
							<td>이메일을 입력해주세요</td>
						</tr>
						
						<tr>
							<td>우편번호</td>
							<td>
								<input type="text" name="zipcode" size="5" required="required" />
								<input type="button" value="우편번호찾기" onclick="zipCheck()"/>
							</td>
							<td>우편번호를 검색하세요</td>
						</tr>
						
						<tr>
							<td>주소</td>
							<td><input type="text" name="address" size="40" /></td>
							<td>주소를 적어주세요</td>
						</tr>
				
						<tr>
							<td>직업</td>
							<td>
								<select name="job">
									<option value="0" selected>선택하세요.</option>
									<option value="회사원">회사원</option>
									<option value="연구전문직">연구전문직</option>
									<option value="교수학생">교수학생</option>
									<option value="일반자영업">일반자영업</option>
									<option value="공무원">공무원</option>
									<option value="의료인">의료인</option>
									<option value="법조인">법조인</option>
									<option value="종교,언론,에술인">종교.언론/예술인</option>
									<option value="농,축,수산,광업인">농/축/수산/광업인</option>
									<option value="주부">주부</option>
									<option value="무직">무직</option>
									<option value="기타">기타</option>
								</select>
							</td>
							<td>직업을 선택해주세요</td>
						</tr>
						
						<tr>
							<td>취미</td>
							<td>
								<input type="checkbox" name="hobby" value="인터넷" checked="checked" />인터넷
								<input type="checkbox" name="hobby" value="여행" />여행
								<input type="checkbox" name="hobby" value="게임" />게임
								<input type="checkbox" name="hobby" value="영화" />영화
								<input type="checkbox" name="hobby" value="운동" />운동
								<input type="checkbox" name="hobby" value="음악" />음악
							</td>
							<td>취미를 선택하세요</td>
						</tr>
						
						<tr>
							<td colspan="3" align="center"> 
								<input type="submit" value="회원가입" onclick="inputCheck()" />
								<input type="reset" value="다시쓰기" />
							</td>
						</tr>
						
					</form>
				</table>
			
			</td>
		</tr>
	</table>

	<%@ include file="bottom.jsp" %>
</body>
</html>

script.js 수정본

function idCheck(id){
	if(id==""){
		alert("아이디를 입력해주세요");
		document.regForm.id.focus();
		return;
	}else{
		url="idCheck.jsp?id="+id;
		window.open(url, "post", "width=300,height=150");
	}
}

function win_close(){
	self.close();
}

function inputCheck(){
	if(document.regForm.repwd.value==""){
		alert("비밀번호확인 부분이 입력되지 않았습니다~");
		document.regForm.repwd.focus();
		return;
	}
	
	if(document.regForm.pwd.value != document.regForm.repwd.value){
		alert("비밀번호가 일치하지 않습니다.");
		document.regForm.repwd.focus();
		return;
	}
	document.regForm.submit();
}

function zipCheck(){
	url = "zipSearch.jsp?search=n";
	window.open(url, "post", "width=500,height=300");
}

idCheck.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<<jsp:useBean id="mMgr" class="com.bjy.mall.MemberMgr"></jsp:useBean>
<%
	request.setCharacterEncoding("UTF-8");
	String id = request.getParameter("id");
	boolean check = mMgr.checkId(id);
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>아아디 존재 확인 : idCheck.jsp</title>
	<script type="text/javascript" src="script.js"></script>
	<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body bgcolor="ffffcc">
	<!-- DB로부터 아이디의 존재 여부를 확인하여 사용자에게 사용기능 여부를 알려주는 역할 담당 -->
	<br />
	<div align="center">
		<b><%= id %></b>
	
		<%
			if(check){
				out.print("는 이미 존재하는 아이디입니다");
			}else{
				out.print("는 사용 가능한 아이디입니다");
			}
		%>		
	
		<a href="javascript:this.close();">닫기</a>
	</div>
</body>
</html>

zipSearch.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Vector" %>
<%@page import="com.bjy.mall.ZipcodeBean"%>

<jsp:useBean id="mMgr" class="com.bjy.mall.MemberMgr"></jsp:useBean>
<%
	request.setCharacterEncoding("UTF-8");
	String search = request.getParameter("search");
	String area3 = null;
	Vector<ZipcodeBean> vlist = null;
	
	// JavaScript : url="zipSearch.jsp?search=n"; 
	if(search.equals("y")){
		area3 = request.getParameter("area3");	// area3은 zipSearch.jsp 에서 검색 버튼 눌렀을 때 전달되는 파라미터명
		vlist = mMgr.zipcodeRead(area3);
	}
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>우편번호 검색 : zipSearch.jsp</title>
	<link href="style.css" rel="stylesheet" type="text/css">
	<script type="text/javascript">
		function loadSearch(){
			frm = document.zipFrm;	// <form> 태그 
			frm.action = "zipSearch.jsp";	// <form action="ziSearch.jsp"> 와 동일
			frm.submit();	// <form><input type="submit"> 과 동일
		}
		
		function sendAdd(zipcode, addr){
			opener.document.regForm.zipcode.value=zipcode;
			opener.document.regForm.address.value=addr;
			self.close();
		}
	
	</script>
</head>

<body bgcolor="#ffffcc">
	<div align="center">
		<form name="zipFrm" method="post">
			<table>
				<tr>
					<td>
						도로명 입력 <input type="text" name="area3" required="required" />
						<input type="button" value="검색" onclick="loadSearch()" />
					</td>
				</tr>
				
				<!--  검색 결과 시작 -->
				<%
					if(search.equals("y")){
						if(vlist.isEmpty()){
				%>
						<tr>
							<td align="center">검색된 결과가 없습니다</td>
						</tr>
				
				<%
						}else{
				%>
						<tr>
							<td align="center">*검색 후, 아래 우편번호를 클릭하면 자동으로 입력됩니다</td>
						</tr>
						
				<%
						for(int i=0;i<vlist.size();i++){
							ZipcodeBean zBean = vlist.get(i);
							String rZipcode = zBean.getZipcode();
							String rArea1 = zBean.getArea1();
							String rArea2 = zBean.getArea2();
							String rArea3 = zBean.getArea3();
							String adds = rArea1 + " " + rArea2 + " " + rArea3 + " ";
						
				%>
				
							<tr>
								<td>
									<a href="#" onclick="javascript:sendAdd('<%=rZipcode %>','<%=adds %>')" >
										<%=rZipcode+" "+adds %>
									</a>
								</td>
							</tr>
				<% 
							} // for(int i=0;i<vlist.size();i++) end
						} 	//	if(vlist.isEmpty()) end
					}		// if(search.equals("y")) end
				%>
				<!--  검색 결과 끝 -->
				<tr>
					<td align="center">
						<a href="#" onclick="self.close()">닫기</a>
					</td>
				</tr>
			</table>
			<input type="hidden" name="search" value="y" />
		</form>
	</div>

</body>
</html>

memberInsert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>

<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="mBean" class="com.bjy.mall.MemberBean"></jsp:useBean>
<jsp:setProperty property="*" name="mBean" />

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>memberInsert.jsp : member.jsp에서 입력받은 값을 사용자가 확인 할 수 있도록 함</title>
	<script type="text/javascript" src="script.js"></script>
	<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body bgcolor="#996600">
	<%@ include file="top.jsp" %>
	
	
	<table width="75%" align="center" bgcolor="#ffff99" border="1">
		<tr>
			<td align="center" bgcolor="#ffffcc">
			
				<table width="95%" align="center" bgcolor="#ffff99" border="1">
					
					<form action="memberProc.jsp" method="post" name="regForm">
						
						<tr align="center" bgcolor="#996600">
							<td colspan="3">
								<font color="#ffffff">
									<jsp:getProperty property="name" name="mBean"/>
									회원님이 작성하신 내용입니다. 확인해주세요.								
								</font>
							</td>
						</tr>
						
						<tr>
							<td>아이디</td>
							<td>
								<input type="text" name="id" value='<jsp:getProperty property="id" name="mBean"/>' />
							</td>
						</tr>
						
						<tr>
							<td>비밀번호</td>
							<td>
								<input type="password" name="pwd" value='<jsp:getProperty property="pwd" name="mBean"/>' />
							</td>
						</tr>
						
						<tr>
							<td>이름</td>
							<td>
								<input type="text" name="name" value='<jsp:getProperty property="name" name="mBean"/>' />
							</td>
						</tr>
						
						<tr>
							<td>성별</td>
							<td>
								여<input type="radio" name="gender" value="2" <%=mBean.getGender().equals("2") ? "checked" : "" %> />
								남<input type="radio" name="gender" value="1" <%=mBean.getGender().equals("1") ? "checked" : "" %> />
							</td>
						</tr>
						
						<tr>
							<td>생년월일</td>
							<td>
								<input type="text" name="birthday" value='<jsp:getProperty property="birthday" name="mBean"/>' />
							</td>
						</tr>
						
						<tr>
							<td>이메일</td>
							<td>
								<input type="text" name="email" value='<jsp:getProperty property="email" name="mBean"/>' />
							</td>
						</tr>
						
						<tr>
							<td>우편번호</td>
							<td>
								<input type="text" name="zipcode" value='<jsp:getProperty property="zipcode" name="mBean"/>' />
							</td>
						</tr>
						
						<tr>
							<td>주소</td>
							<td>
								<input type="text" name="address" value='<jsp:getProperty property="address" name="mBean"/>' />
							</td>
						</tr>
						
						<tr>
							<td>직업</td>
							<td>
								<input type="text" name="job" value='<jsp:getProperty property="job" name="mBean"/>' />
							</td>
						</tr>
						
						<tr>
							<td>취미</td>
							<td>
								<%
									if(mBean.getHobby() != null){
										// list, hobby 배열 원래는 비교해봐야 하지만 그 과정은 생략
										String[] list = {"인터넷", "여행", "게임", "영화", "운동", "음악"};
										String[] hobbys = mBean.getHobby();
										
										for(int i=0; i<hobbys.length; i++){
											out.print("<input type=checkbox name=hobby checked value=" + hobbys[i] + " />" + hobbys[i]);
										}
									}else{
										out.print("선택된 취미가 없습니다");
									}
								%>
							</td>
						</tr>
						
						<tr>
							<td colspan="2" align="center">
								<input type="submit" value="확인완료" />
								<input type="button" value="다시쓰기" onclick="history.back()" />
							</td>
						</tr>
					
					</form>
				
				</table>
			
			</td>
		</tr>
	</table>
	
	<%@ include file="bottom.jsp" %>
</body>
</html>

memberProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
%>

<jsp:useBean id="mMgr" class="com.bjy.mall.MemberMgr"></jsp:useBean>
<jsp:useBean id="mBean" class="com.bjy.mall.MemberBean"></jsp:useBean>
<jsp:setProperty property="*" name="mBean"/>
<%
	boolean flag= mMgr.insertMember(mBean);
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>memberProc.jsp</title>
	<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body bgcolor="#ffffcc">
	<br />
	<br />
	<div align="center">
		<%
			if(flag){
				out.println("<b>회원가입을 축하드립니다 </b><p>");
				out.println("<a href=login.jsp>로그인</a>");
			}else{
				out.println("<b>다시 입력하여 주십시오.</b><p>");
				out.println("<a href=member.jsp>다시 가입</a>");
			}
		%>
	</div>

</body>
</html>

 

Q) memberInsert.jsp (회원가입 확인)의 성별 체크란에 삼항 연산자 사용 이유?

member.jsp에서 입력한 정보들을 불러와야 하지만 gender 타입은 radio 형태였기에 둘 중 한가지가 체크되어야 했다.따라서 넘겨지는 gender 파라미터값이 2면 여<input type="radio" name="gender" value="2" ~~> 에 checked, 아니면 남자 input 태그에 checked 표시를 해야 했다.

 

Q) memberInsert.jsp (회원가입 확인)에서 취미 checkbox란에 null값인지 먼저 확인한 이유?취미는 필수 입력란이 아니였기에 넘겨진 hobby 파라미터값이 null값인지 먼저 확인하여야 한다