일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Headless 컴포넌트
- jotai
- useLayoutEffect
- linux 배포판
- Compound Component
- 클라이언트 상태 관리 라이브러리
- 명시적 타입 변환
- zustand
- CS
- 암묵적 타입 변환
- type assertion
- AJIT
- Redux Toolkit
- helm-chart
- react
- useCallback
- prettier-plugin-tailwindcss
- JavaScript
- 타입 단언
- 주니어개발자
- Recoil
- task queue
- Custom Hook
- Render Queue
- Microtask Queue
- 프로세스
- docker
- TypeScript
- Sparkplug
- 좋은 PR
- Today
- Total
구리
TIL_210506_프로젝트 문제 해결(simple_shop 회원가입 완료) 본문
지금 배우는 프로젝트는 여러 사용자(클라이언트)가 접속할 수 있게 만들기에 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문도 미리 삽입)
클래스 및 파일들 흐름도
결과 사진
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값인지 먼저 확인하여야 한다
'HTML,CSS' 카테고리의 다른 글
TIL_210525_CSS_고급 선택자, 미디어 쿼리, Grid (0) | 2021.05.25 |
---|---|
TIL_210524_CSS 관련(border, image,float,box) 예시 (0) | 2021.05.24 |
HTML - input 태그 date 타입 관련 예시 (0) | 2021.05.21 |
TIL_210504_CSS 연습 및 예제 (simple_shop 기본 틀) (0) | 2021.05.04 |
TIL_210503_웹 UI 관련 기본지식, HTML 태그2, CSS 기초 (0) | 2021.05.04 |