본문 바로가기
ICIA 수업일지

2021.09.08 수업일지(Spring, Servlet, JSTL)

by 주성씨 2021. 9. 8.

- 로그인으로 회원관리 하는 작업을 하도록 하겠다.

- 메인 페이지에 메뉴란에 로그인을 만들도록 하겠다.

- main.jsp

#menu h4:nth-child(7){
	float:right;
}
				<h4>
					<a href="/cart/list">장바구니</a>
				</h4>
				<h4>
					<a href="/user/login">로그인</a>
				</h4>
			</div>

확인

 

- 유저 정보를 작업받는 Servlet을 만들도록 하겠다.

- create new UserServlet.java

package controller;

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;

@WebServlet(value = { "/user/login", "/user/logout", "/user/insert", "/user/list", "/user/read", "/user/update" })
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		switch (request.getServletPath()) {
		case "/user/login":
			request.setAttribute("pageName", "/user/login.jsp");
			break;
		}
		RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
		dis.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}

}

 

- 로그인 페이지를 만든다.

- create new folder user

- create new user\login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<style>
form[name=frm] {
	margin-top: 100px;
	margin-bottom: 100px;
}
input[type=submit]{
	background: rgb(242, 242, 242);
	padding: 10px 30px 10px 30px;
	border: 1px solid gray;
	border-radius:5px 5px 5px;
	font-size: 15px;
	font-weight: bold;
}
</style>
<form name="frm">
	<table>
		<tr>
			<th colspan="2"><h2>로그인</h2></th>
		</tr>
		<tr>
			<td class="title" width=100>아이디</td>
			<td width=200><input type="text" name="id"
				placeholder="아이디를 입력하세요." /></td>
		</tr>
		<tr>
			<td class="title">비밀번호</td>
			<td><input type="password" name="pass"
				placeholder="비밀번호를 입력하세요." /></td>
		</tr>
		<tr>
			<td colspan="2" style="text-align: center;"><input type="submit"
				value="로그인" /></td>
		</tr>
	</table>
</form>

확인

 

- DB에 users 테이블을 생성하고 데이터를 넣겠다.

-- 2021.09.08 

CREATE TABLE users (
    id nvarchar(20),
    pass nvarchar(20),
    name nvarchar(20),
    address nvarchar(200),
    tel nvarchar(50),
    email nvarchar(50),
    PRIMARY KEY (id)
);

insert into users(id, pass, name, address, tel, email)
values('user01', 'pass', '홍길동', '인천 서구 경서동 동문굿모닝힐', '010-1010-2020', 'user01@shop.com');
insert into users(id, pass, name, address, tel, email)
values('user02', 'pass', '심청이', '인천 부평구 부평5동 104번지', '010-2020-1010', 'user02@shop.com');

select * from users;

 

확인

 

- create new model\UserVO.java

package model;

public class UserVO {
	private String id;
	private String pass;
	private String name;
	private String address;
	private String tel;
	private String email;
    
    // getter setter toString...

 

- create new model\UserDAO.java

- 로그인 체크 메서드

package model;

import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDAO {
	// 1. 로그인 체크 메서드
	public UserVO login(String id) {
		UserVO vo = new UserVO();
		try {
			String sql = "select * from users where id=?";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setString(1, id);
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				vo.setId(rs.getString("id"));
				vo.setPass(rs.getString("pass"));
				vo.setName(rs.getString("name"));
				vo.setAddress(rs.getString("address"));
				vo.setTel(rs.getString("tel"));
				vo.setEmail(rs.getString("email"));
			}
		} catch (Exception e) {
			System.out.println("UserDAO login : " + e.toString());
		}
		return vo;
	}
}

 

- UserServlet.java

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 브라우저 객체 생성
		PrintWriter out = response.getWriter();
		String id = request.getParameter("id");
		String pass = request.getParameter("pass");
		switch (request.getServletPath()) {
		case "/user/login":
			UserVO vo = udao.login(id);
			if (vo.getId() == null) {
				out.println(0); // 아이디가 존재하지 않는 경우
			} else if (vo.getPass().equals(pass)) {
				out.println(1); // 로그인 성공
			} else {
				out.println(2); // 비밀번호가 클린경우
			}
			break;
		}
	}

 

- login.jsp

- 페이지에서 id pass를 받아서 post로 넘겨는 ajax을 만들어주겠다.

<script>
	// 로그인 버튼을 눌렀을때
	$(frm).on('submit', function(e) {
		e.preventDefault();
		var id = $(frm.id).val();
		var pass = $(frm.pass).val();
		if (id == "") {
			alert("아이디를 입력하세요.");
			$(frm.id).focus();
			return;
		}
		if (pass == "") {
			alert("비밀번호를 입력하세요.");
			$(frm.pass).focus();
			return;
		}
		$.ajax({
			type : 'post',
			url : '/user/login',
			data : {
				"id" : id,
				"pass" : pass
			},
			success : function(data) {
				alert(data);
			}
		})
	})
</script>

 

확인

 

			success : function(data) {
				if (data == 0) {
					alert("아이디가 존재하지 않습니다.");
				} else if (data == 2) {
					alert("비밀번호를 확인해주세요.")
				} else {
					alert("로그인 되었습니다.");
					location.href = "/";
				}
			}

 

- 로그인 성공하면 session에 저장한다.

- UserServlet.java

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 브라우저 객체 생성
		PrintWriter out = response.getWriter();
		String id = request.getParameter("id");
		String pass = request.getParameter("pass");
		switch (request.getServletPath()) {
		case "/user/login":
			UserVO vo = udao.login(id);
			if (vo.getId() == null) {
				out.println(0); // 아이디가 존재하지 않는 경우
			} else if (vo.getPass().equals(pass)) {
				out.println(1); // 로그인 성공
				HttpSession session = request.getSession(); // new
				session.setAttribute("user", vo); // new
			} else {
				out.println(2); // 비밀번호가 클린경우
			}
			break;
		}
	}

 

- 로그인되면 로그아웃 로그아웃을 누르면 로그인이 보이도록 하겠다.

- main.jsp

				<h4>
					<a href="/cart/list">장바구니</a>
				</h4>
				<c:if test="${user==null}">
					<h4 style="float: right;">
						<a href="/user/login">로그인</a>
					</h4>
				</c:if>
				<c:if test="${user!=null}">
					<h4 style="float: right;">
						<a href="/user/logout">로그아웃</a>
					</h4>
					<h4 style="float: right;">${user.name}님</h4>
				</c:if>
			</div>
			<div id="content">

 

확인

 

- 로그아웃을 할 수 있도록 하겠다.

- 로그아웃을 하면 세션정보를 지우고 메인으로 가도록 하겠다.

- UserServlet.java

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher dis = request.getRequestDispatcher("/main.jsp"); // renew
		switch (request.getServletPath()) {
		case "/user/login":
			request.setAttribute("pageName", "/user/login.jsp"); // renew
			dis.forward(request, response);
			break;
		case "/user/logout": // new
			session.invalidate();
			response.sendRedirect("/");
			break;
		}
	}

 

확인

 

- 업체목록, 상품목록, 상품등록, 주문목록 은 관리자만 볼 수 있는 것이니 유저 로그인 시에 안보이도록 하겠다.

- 간단하게 users 테이블에 관리자 를 넣어주도록 하겠다.

- sql

insert into users(id,pass,name) values('manager','pass','관리자');

 

- main.jsp

- id가 관리자 아이디랑 같으면 메뉴가 보이도록 하겠다.

				<c:if test="${user.id=='manager'}">
				<h4>
					<a href="/mall/list">업체목록</a>
				</h4>
				<h4>
					<a href="/product/list">상품목록</a>
				</h4>
				<h4>
					<a href="/product/insert">상품등록</a>
				</h4>
				<h4>
					<a href="/purchase/list">주문목록</a>
				</h4>
				</c:if>

 

- 로그인한 유저가 장바구니에 상품을 담고 주문할 경우 해당 유저의 정보가 주문상세정보에 들어갈 수 있도록 하겠다.

- cart\list.jsp

	<!-- 주문자 정보 -->
	<form name="frm">
		<table id="tblinfo">
			<tr>
				<td class="title" width=100>주문번호</td>
				<td width=850><input name="order_id" size=100
					value="${order_id}" /></td>
			</tr>
			<tr>
				<td class="title" width=100>주문자 성명</td>
				<td><input name="name" value="${user.name}" size=100 /></td>
			</tr>
			<tr>
				<td class="title" width=100>배송지 주소</td>
				<td><input name="address" value="${user.address}" size=100 /></td>
			</tr>
			<tr>
				<td class="title" width=100>이메일 주소</td>
				<td><input name="email" value="${user.email}" size=100 /></td>
			</tr>
			<tr>
				<td class="title" width=100>전화번호</td>
				<td><input name="tel" value="${user.tel}" size=100 /></td>
			</tr>
			<tr>
				<td class="title" width=100>결제방법</td>
				<td><input type="radio" name="payType" value="0" />무통장 <input
					type="radio" name="payType" value="1" />카드</td>
			</tr>
		</table>
		<div style="margin-top: 20px; text-align: center;">
			<input type="submit" value="주문하기" />
		</div>
	</form>

 

확인

 

- 관리자는 장바구니가 안보이도록 하겠다.

- main.jsp

				<c:if test="${user.id!='manager'}">
				<h4>
					<a href="/cart/list">장바구니</a>
				</h4>
				</c:if>

 

- 주문정보 입력시 검색하여 삽입하는 API를 이용하도록 하겠다.

- cart\list.jsp

<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
			<tr>
				<td class="title" width=100>배송지 주소</td>
				<td><input name="address" value="${user.address}" size=100 />
				<button id="search">주소검색</button></td>
			</tr>
<script>
	$('#orderinfo').hide();

	// 주소 검색 버튼을 눌렀을때
	$('#search').on('click',function(){
		new daum.Postcode({
			oncomplete:function(data){
				$(frm.address).val(data.address);
			}
		}).open();	
	});

 

확인

 

- purchase table에 user_id 컬럼을 넣고 데이터를 넣는다.

- sql

alter table purchase add column user_id nvarchar(20);

update purchase set user_id='user02' where order_id='R122';

이런식으로 임의로 넣는다.

 

- 그리고 해당 user_id를 외래키로 지정한다.

alter table purchase add foreign key(user_id) references users(id);

 

- 완성했으면 다이어그램을 생성해보도록 한다.

확인

 

- 로그인한 유저 아이디를 가지고 그 유저가 주문한 상품이 어떤 것인지 알 수 있도록 하겠다.

- main.jsp

		<div id="center">
			<div id="menu">
				<h4>
					<a href="/">Home</a>
				</h4>
				<c:if test="${user.id=='manager'}">
					<h4>
						<a href="/mall/list">업체목록</a>
					</h4>
					<h4>
						<a href="/product/list">상품목록</a>
					</h4>
					<h4>
						<a href="/product/insert">상품등록</a>
					</h4>
					<h4>
						<a href="/purchase/list">주문목록</a>
					</h4>
				</c:if>
				
				<c:if test="${user.id!='manager' && user!=null}">
					<h4>
						<a href="/purchase/userlist">주문목록</a>
					</h4>
				</c:if>
				
				<c:if test="${user.id!='manager'}">
					<h4>
						<a href="/cart/list">장바구니</a>
					</h4>
				</c:if>
				
				<c:if test="${user==null}">
					<h4 style="float: right;">
						<a href="/user/login">로그인</a>
					</h4>
				</c:if>
				
				<c:if test="${user!=null}">
					<h4 style="float: right;">
						<a href="/user/logout">로그아웃</a>
					</h4>
					<h4 style="float: right;">${user.name}님</h4>
				</c:if>
			</div>
			<div id="content">
				<jsp:include page="${pageName}"></jsp:include>
			</div>
		</div>

 

확인

 

- purchaseServlet.java

package controller;

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;

@WebServlet(value = { "/purchase/list" , "/purchase/userlist"}) // renew
public class PurchaseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		switch (request.getServletPath()) {
		case "/purchase/list":
			request.setAttribute("pageName", "/purchase/list.jsp");
			break;
		case "/purchase/userlist": // new
			request.setAttribute("pageName", "/purchase/userlist.jsp");
			break;
		}
		RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
		dis.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}

}

 

- create new purchase\userlist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<h1>${user.name}의 주문목록</h1>

 

확인

 

- purchasedao의 list 메서드를 이용해서 해당 유저의 주문목록을 불러오도록 하겠다.

- purchaseRESTServlet.java

@WebServlet(value = { "/purchase_user.json","/purchase/orders", "/purchase/insert", "/getID", "/update_status", "/purchase_read.json",
		"/purchase.json", "/purchase_product.json" })
public class PurchaseRESTServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	ProductDAO dao = new ProductDAO();
	PurchaseDAO pdao = new PurchaseDAO();

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		switch (request.getServletPath()) {
		case "/purchase_user.json":
			SqlVO vo = new SqlVO();
			vo.setTable("purchase");
			vo.setKey("user_id");
			vo.setWord(request.getParameter("user_id"));
			vo.setOrder("order_id");
			vo.setDesc("desc");
			vo.setPage(Integer.parseInt(request.getParameter("page")));
			vo.setPerPage(Integer.parseInt(request.getParameter("perPage")));
			out.println(pdao.list(vo));
			break;

 

확인

 

- purchase\userlist.jsp

- purchase\list의 #condition / #tbl / script>getNewList 부분을 복사해서 아래와 같이 수정한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<h1>${user.name}의&nbsp;주문목록</h1>
<div id="condition">
	<select id="perPage">
		<option value=2>2개</option>
		<option value=4>4개</option>
		<option value=8>8개</option>
		<option value=12>12개</option>
	</select> 
	검색수 : <span id="total"></span>
</div>
<hr />
<table id="tbl"></table>
<script id="temp" type="text/x-handlebars-template">
	<tr class="title">
		<th width=100>주문번호</th>
		<th width=100>주문자명</th>
		<th width=500>주소</th>
		<th width=200>전화번호</th>
		<th width=200>주문정보</th>
	</tr>
   {{#each array}}
	<tr class="row">
		<td>{{order_id}}</td>
		<td>{{name}}</td>
		<td>{{address}}</td>
		<td>{{tel}}</td>
		<td style="text-align:center;"><button order_id={{order_id}}>주문성세정보</button></td>
	</tr>
   {{/each}}
</script>
<div id="pagination">
	<button id="prev">&lt;</button>
	<span id="page"></span>
	<button id="next">&gt;</button>
</div>

<!-- 구매정보출력 -->
<div id="info" style="display: none;">
	<h1>주문상세정보</h1>
	<table id="tblinfo"></table>
	<script id="tempinfo" type="text/x-handlebars-template">
<tr>
	<td class="title" width=50px>이름</td>
	<td width=50>{{name}}</td>
	<td class="title" width=100>전화번호</td>
	<td width=150>{{tel}}</td>
	<td class="title" width=50>이메일</td>
	<td width=150>{{email}}</td>
	<td class="title" width=50>구매일</td>
	<td width=200>{{pdate}}</td>
</tr>
<tr>
	<td class="title">주소</td>
	<td colspan=3>{{address}}</td>
	<td class="title">결제</td>
	<td>{{payType}}</td>`
	<td class="title">상태</td>
	<td order_id="{{order_id}}">
		<input type="radio" name="status" id="inProgress" {{printCheck0 status}}/>처리중
		<input type="radio" name="status" id="progComplete" {{printCheck1 status}}/>처리완료
	</td>
</tr>
	</script>
	<script>
		Handlebars.registerHelper("printCheck0", function(status) {
			if (status == "0")
				return "checked";
		})
		Handlebars.registerHelper("printCheck1", function(status) {
			if (status == "1")
				return "checked";
		})
	</script>
</div>

<!-- 주문상세정보 하단 구매상품 상세 정보 출력 -->
<div id="purpro_info">
	<table id="purpro_tblinfo"></table>
	<script id="purpro_tempinfo" type="text/x-handlebars-template">
<tr>
	<th class="title" width=100>상품코드</th>
	<th class="title" width=350>상품명</th>
	<th class="title" width=200>제조사</th>
	<th class="title" width=100>가격</th>
	<th class="title" width=50>수량</th>
	<th class="title" width=100>합계</th>
</tr>
   {{#each array}}
<tr>
	<td>{{prod_id}}</td>
	<td>{{prod_name}}</td>
	<td>{{mall_name}}</td>
	<td>{{price}}</td>
	<td>{{quantity}}</td>
	<td>{{sum}}</td>
</tr>
   {{/each}}
<tr>
	<td class="title">총합계</td>
	<td colspan=5 style="text-align:right; font-weight: bold; font-size:20px;">{{total}}원</td>
</tr>
	</script>
</div>

<script>
	var page = 1;
	var user_id = "${user.id}";
	alert(user_id);
	// 구매정보 버튼을 눌렀을때 구매상세 정보가 나오게
	$("#tbl").on("click", ".row button", function() {
		var order_id = $(this).attr("order_id");
		$('#info').show();
		$.ajax({
			type : 'get',
			url : '/purchase_read.json',
			data : {
				"order_id" : order_id
			},
			dataType : 'json',
			success : function(data) {
				var temp = Handlebars.compile($('#tempinfo').html());
				$('#tblinfo').html(temp(data));
			}
		})
		$.ajax({
			type : 'get',
			url : '/purchase_product.json',
			data : {
				"order_id" : order_id
			},
			dataType : 'json',
			success : function(data) {
				var temp = Handlebars.compile($('#purpro_tempinfo').html());
				$('#purpro_tblinfo').html(temp(data));
			}
		})
	})

	$("#prev").on("click", function() {
		page--;
		getNewList();
	});
	$("#next").on("click", function() {
		page++;
		getNewList();
	})
	$("#word").on("keypress", function(e) {
		if (e.keyCode == 13) {
			page = 1;
			getNewList();
		}
	});
	$("#perPage, #order, #desc").on("change", function() {
		page = 1;
		getNewList();
	});

	getNewList();
	function getNewList() {
		var perPage = $('#perPage').val();
		$.ajax({
			type : 'get',
			url : '/purchase_user.json',
			dataType : 'json',
			data : {
				"page" : page,
				"perPage" : perPage,
				"user_id" : user_id
			},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#tbl').html(temp(data));
				$('#total').html(data.total);
				var lastPage = Math.ceil(data.total / perPage)
				$('#page').html("[ " + page + "/" + lastPage + " ]");
				if (page == 1) {
					$('#prev').attr('disabled', true);
					$('#prev').css('background', 'gray')
				} else {
					$('#prev').attr('disabled', false);
					$('#prev').css({
						'background' : 'rgb(246, 246, 246)',
						'color' : 'black'
					});
				}
				if (page == lastPage) {
					$('#next').attr('disabled', true);
					$('#next').css('background', 'gray');
				} else {
					$('#next').attr('disabled', false);
					$('#next').css({
						'background' : 'rgb(246, 246, 246)',
						'color' : 'black'
					});
				}
			}
		})
	}
</script>

 

확인

 

- 주문시 user_id가 purchase 테이블에 들어갈 수 있도록 하겠다.

- cart\list.jsp

	// 주문하기 버튼을 클릭할 경우
	$(frm).on('submit', function(e) {
		e.preventDefault();
		if (!confirm("상품을 주문하시겠습니까?"))
			return;
		var order_id = $(frm.order_id).val();
		var name = $(frm.name).val();
		var address = $(frm.address).val();
		var tel = $(frm.tel).val();
		var payType = $("input[name=payType]:checked").val();
		var email = $(frm.email).val();
		var user_id = "${user.id}"; // new
		$.ajax({
			type : 'post',
			url : '/purchase/insert',
			data : {
				"order_id" : order_id,
				"name" : name,
				"address" : address,
				"tel" : tel,
				"payType" : payType,
				"email" : email,
				"user_id" : user_id // new
			},
			success : function() {
				$('#tblorder .row').each(function() {
					var prod_id = $(this).find(".prod_id").html();
					var price = $(this).find(".price").html();
					var price = price.replaceAll(",", "");
					var quantity = $(this).find(".quantity").html();
					$.ajax({
						type : 'post',
						url : '/purchase/orders',
						data : {
							"order_id" : order_id,
							"prod_id" : prod_id,
							"price" : price,
							"quantity" : quantity
						},
						success : function() {
						}
					})
				})
				alert("주문되었습니다.")
			}
		})
	})

 

- purchaseVO.java

package model;

public class PurchaseVO {
	private String order_id;
	private String name;
	private String address;
	private String email;
	private String tel;
	private String pdate;
	private String payType;
	private String status;
	private String user_id; // new

 

- purchaseRESTServlet.java

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		PurchaseVO vo = new PurchaseVO();
		switch (request.getServletPath()) {
		case "/purchase/insert":
			vo.setOrder_id(request.getParameter("order_id"));
			vo.setName(request.getParameter("name"));
			vo.setAddress(request.getParameter("address"));
			vo.setEmail(request.getParameter("email"));
			vo.setTel(request.getParameter("tel"));
			vo.setPayType(request.getParameter("payType"));
			vo.setStatus(request.getParameter("status"));
			vo.setUser_id(request.getParameter("user_id")); // new
			pdao.insert(vo);
			break;

 

- purchaseDAO.java

	// 6. 주문정보 DB purchase 입력 메서드
	public void insert(PurchaseVO vo) {
		try {
			String sql = "insert into purchase(order_id,name,address,email,tel,pdate,status,payType,user_id) values(?,?,?,?,?,now(),?,?,?)";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setString(1, vo.getOrder_id());
			ps.setString(2, vo.getName());
			ps.setString(3, vo.getAddress());
			ps.setString(4, vo.getEmail());
			ps.setString(5, vo.getTel());
			ps.setString(6, vo.getStatus());
			ps.setString(7, vo.getPayType());
			ps.setString(8, vo.getUser_id()); // new
			ps.execute();
		} catch (Exception e) {
			System.out.println("PurchaseDAO insert : " + e.toString());
		}
	}

 

완료

 

- 유저 로그인에서 회원가입하는 페이지를 만들고

- login

		<tr>
			<td colspan="2" style="text-align: center;"><input type="submit"
				value="로그인" /><a href="/user/insert">회원가입</a></td> <!-- new -->
		</tr>

 

- userservlet

@WebServlet(value = { "/user/login", "/user/logout", "/user/insert", "/user/list", "/user/read", "/user/update" })
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	UserDAO udao = new UserDAO();

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
		switch (request.getServletPath()) {
		case "/user/insert": // new
			request.setAttribute("pageName", "/user/insert.jsp");
			dis.forward(request, response);
			break;

 

- create new user\insert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>회원가입</h1>

 

확인

 

- 회원가입 페이지에서 데이터를 전달할 수 있도록 하겠다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<script
	src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<h1>회원가입</h1>
<!-- 회원가입 정보입력 란 -->
<form name="frm">
	<table id="tblinfo">
		<tr>
			<td class="title" width=100>아이디</td>
			<td width=450><input type="text" name="id" size=50 /> <input
				type="button" value="중복체크" id="chkid"></td>
		</tr>
		<tr>
			<td class="title">비밀번호</td>
			<td><input type="password" name="pass" size=50 /></td>
		</tr>
		<tr>
			<td class="title">이름</td>
			<td><input type="text" name="name" size=50 /></td>
		</tr>
		<tr>
			<td class="title">주소</td>
			<td><input name="address" value="" size=22 readonly /> <input
				name="detailaddress" value="" size=22 />
				<button id="search">주소검색</button></td>
		</tr>
		<tr>
			<td class="title">전화번호</td>
			<td><input name="tel" size=50 /></td>
		</tr>
		<tr>
			<td class="title">이메일 주소</td>
			<td><input name="email" size=50 /></td>
		</tr>
	</table>
	<div style="margin-top: 20px; text-align: center;">
		<input type="submit" value="회원가입" /> <input type="reset" value="입력취소" />
	</div>
</form>
<script>
	// id check를 위한 변수 선언
	var chkid = 0;

	// 주소 검색 버튼을 눌렀을때
	$('#search, input[name=address]').on('click', function() {
		new daum.Postcode({
			oncomplete : function(data) {
				$(frm.address).val(data.address);
			}
		}).open();
	});

	// 회원가입 버튼을 클릭할 경우
	$(frm).on('submit', function(e) {
		e.preventDefault();
		
		if (id == "") {
			alert("아이디를 입력하세요.");
			$(frm.id).focus();
			return;
		}
		
		if (check == 0) {
			alert("아이디 중복체크 해주시기 바랍니다.");
			return;
		}

		if (!confirm("회원가입을 하시겠습니까?"))
			return;
		var id = $(frm.id).val();
		var pass = $(frm.pass).val();
		var name = $(frm.name).val();
		var detailaddress = $(frm.detailaddress).val();
		var address = $(frm.address).val() + " " + detailaddress;
		var tel = $(frm.tel).val();
		var email = $(frm.email).val();
		$.ajax({
			type : 'get',
			url : '/user/join',
			data : {
				"id" : id,
				"pass" : pass,
				"name" : name,
				"address" : address,
				"tel" : tel,
				"email" : email
			},
			success : function(data) {
				alert("회원가입이 완료되었습니다.");
				location.href="/";
			}
		})

	})
</script>

 

- 이제 user insert 메서드를 만들고 servlet을 통해서 실행하는 작업을 하도록 하겠다.

- UserDAO.java

- 회원가입 메서드를 만들겠다.

	// 2. 회원가입 메서드
	public void insert(UserVO vo){
		try {
			String sql = "insert into users(id,pass,name,address,tel,email) values(?,?,?,?,?,?)";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setString(1, vo.getId());
			ps.setString(2, vo.getPass());
			ps.setString(3, vo.getName());
			ps.setString(4, vo.getAddress());
			ps.setString(5, vo.getTel());
			ps.setString(6, vo.getEmail());
			ps.execute();
		} catch (Exception e) {
			System.out.println("UserDAO insert : "+e.toString());
		}
	}

 

- /user/join 이라는 path로 insert 작업을 해주겠다.

- UserServlet.java

package controller;

import java.io.IOException;
import java.io.PrintWriter;

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.UserDAO;
import model.UserVO;

@WebServlet(value = { "/user/join", "/user/login", "/user/logout", "/user/insert", "/user/list", "/user/read",
		"/user/update" })
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	UserDAO udao = new UserDAO();

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
		switch (request.getServletPath()) {
		case "/user/join":
			UserVO vo = new UserVO();
			vo.setId(request.getParameter("id"));
			vo.setPass(request.getParameter("pass"));
			vo.setName(request.getParameter("name"));
			vo.setAddress(request.getParameter("address"));
			vo.setTel(request.getParameter("tel"));
			vo.setEmail(request.getParameter("email"));
			udao.insert(vo);
			break;

 

- 아이디 중복체크를 하여 DB에 저장할 수 있도록 하겠다.

- UserDAO.java

package model;

import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDAO {
	// 3. 아이디 중복 체크
	public int check(String id){
		int check=0;
		try {
			String sql = "select * from users where id=?";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setString(1, id);
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				check=1;
			}
		} catch (Exception e) {
			System.out.println("UserDAO check : "+e.toString());
		}
		return check;
	}

 

- checkservlet을 통해 id 체크 작업을 할 수 있도록 하겠다.

- create new controller\CheckServlet.java

package controller;

import java.io.IOException;
import java.io.PrintWriter;

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 model.UserDAO;

@WebServlet("/check_id")
public class CheckServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		UserDAO udao = new UserDAO();
		out.println(udao.check(request.getParameter("id")));
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

 

확인

 

- 중복 작업을 통해서 사용 가능 유무를 받도록 하겠다.

- user\insert.jsp

	// 아이디 중복체크
	$("#chkid").on('click', function() {
		var id = $(frm.id).val();
		if (id == "") {
			alert("아이디를 입력하세요.");
			$(frm.id).focus();
			return;
		}
		$.ajax({
			type : "get",
			url : "/check_id",
			data : {
				"id" : id
			},
			success : function(data) {
				if (data == 1) {
					alert("이미 등록된 아이디입니다.");
					check = 2;
				} else {
					alert("사용해도 좋은 아이디입니다.");
					check = 1;
				}
			}
		})
	})

 

완료

 

확인

 

- 관리자가 유저 리스트를 볼 수 있도록 하겠다.

- main.jsp

				<c:if test="${user.id=='manager'}">
					<h4>
						<a href="/mall/list">업체목록</a>
					</h4>
					<h4>
						<a href="/product/list">상품목록</a>
					</h4>
					<h4>
						<a href="/product/insert">상품등록</a>
					</h4>
					<h4>
						<a href="/purchase/list">주문목록</a>
					</h4>
					<h4> <!-- new -->
						<a href="/user/list">회원목록</a>
					</h4>
				</c:if>

 

- create new user\list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>회원목록</h1>

 

- 회원목록을 불러오는 메서드를 만들겠다.

- UserDAO.java

	// 4. 회원목록 불러오는 메서드
	public JSONObject list(SqlVO vo) {
		JSONObject object = new JSONObject();

		try {
			String sql = "call list(?,?,?,?,?,?,?)";
			CallableStatement cs = Database.CON.prepareCall(sql);
			cs.setString(1, vo.getTable());
			cs.setString(2, vo.getKey());
			cs.setString(3, vo.getWord());
			cs.setString(4, vo.getOrder());
			cs.setString(5, vo.getDesc());
			cs.setInt(6, vo.getPage());
			cs.setInt(7, vo.getPerPage());
			cs.execute();

			ResultSet rs = cs.getResultSet();
			JSONArray array = new JSONArray();
			while (rs.next()) {
				JSONObject obj = new JSONObject();
				obj.put("id", rs.getString("id"));
				obj.put("name", rs.getString("name"));
				obj.put("address", rs.getString("address"));
				obj.put("tel", rs.getString("tel"));
				obj.put("email", rs.getString("email"));
				array.add(obj);
			}
			object.put("array", array);

			cs.getMoreResults();
			rs = cs.getResultSet();
			if (rs.next()) {
				object.put("total", rs.getInt("count(*)"));
			}
		} catch (Exception e) {
			System.out.println("UserDAO list : " + e.toString());
		}

		return object;
	}

 

- create new UserRESTServlet.java

package controller;

import java.io.IOException;
import java.io.PrintWriter;

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 model.SqlVO;
import model.UserDAO;

@WebServlet("/user.json")
public class UserRESTServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	UserDAO udao = new UserDAO();

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();

		switch (request.getServletPath()) {
		case "/user.json":
			SqlVO vo = new SqlVO();
			vo.setTable("users");
			vo.setKey(request.getParameter("key"));
			vo.setWord(request.getParameter("word"));
			vo.setOrder(request.getParameter("order"));
			vo.setDesc(request.getParameter("desc"));
			vo.setPage(Integer.parseInt(request.getParameter("page")));
			vo.setPerPage(Integer.parseInt(request.getParameter("perPage")));
			out.println(udao.list(vo));
			break;
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}

}

 

- user\list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<style>
table {
	border-collapse: collapse;
	margin: 0px auto;
	margin-bottom: 10px;
}

th {
	background: rgb(242, 242, 242);
	color: black;
}

th, td {
	border: 1px solid black;
	padding: 10px;
}

.row:hover {
	cursor: pointer;
	background: rgb(242, 242, 242);
	color: black;
}
</style>
<h1>회원목록</h1>
<div id="condition">
	<select id="key">
		<option value="id">아이디</option>
		<option value="name">이름</option>
		<option value="address">주소</option>
		<option value="tel">전화번호</option>
	</select> <input type="text" id="word" placeholder="검색어 입력" /> <select
		id="perPage">
		<option value=2>2개</option>
		<option value=4>4개</option>
		<option value=8>8개</option>
		<option value=12>12개</option>
	</select> 검색수 : <span id="total"></span> <select id="desc" style="float: right;">
		<option value="">오름차순</option>
		<option value="desc" selected>내림차순</option>
	</select> <select id="order" style="float: right; margin-right: 5px;">
		<option value="id">아이디</option>
		<option value="name">이름</option>
		<option value="address">주소</option>
		<option value="tel">전화번호</option>
	</select>
</div>

<table id="tbl"></table>
<div id="pagination">
	<button id="prev">&lt;</button>
	<span id="page"></span>
	<button id="next">&gt;</button>
</div>
<script id="temp" type="text/x-handlebars-template">
	<tr class="title">
		<th width=150>아이디</th>
		<th width=150>회원명</th>
		<th width=400>회원주소</th>
		<th width=200>전화번호</th>
		<th width=200>이메일</th>
	</tr>
   {{#each array}}
	<tr class="row">
		<td>{{id}}</td>
		<td>{{name}}</td>
		<td>{{address}}</td>
		<td>{{tel}}</td>
		<td>{{email}}</td>
	</tr>
   {{/each}}
</script>

<script>
	var page = 1;

	$("#prev").on("click", function() {
		page--;
		getNewList();
	});
	$("#next").on("click", function() {
		page++;
		getNewList();
	})
	$("#word").on("keypress", function(e) {
		if (e.keyCode == 13) {
			page = 1;
			getNewList();
		}
	});
	$("#perPage, #order, #desc").on("change", function() {
		page = 1;
		getNewList();
	});

	getNewList();
	function getNewList() {
		var key = $('#key').val();
		var word = $('#word').val();
		var perPage = $('#perPage').val();
		var order = $('#order').val();
		var desc = $('#desc').val();
		$.ajax({
			type : 'get',
			url : '/user.json',
			dataType : 'json',
			data : {
				"key" : key,
				"word" : word,
				"page" : page,
				"perPage" : perPage,
				"order" : order,
				"desc" : desc
			},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#tbl').html(temp(data));
				$('#total').html(data.total);
				var lastPage = Math.ceil(data.total / perPage)
				$('#page').html("[ " + page + "/" + lastPage + " ]");
				if (page == 1) {
					$('#prev').attr('disabled', true);
					$('#prev').css('background', 'gray')
				} else {
					$('#prev').attr('disabled', false);
					$('#prev').css({
						'background' : 'rgb(246, 246, 246)',
						'color' : 'black'
					});
				}
				if (page == lastPage) {
					$('#next').attr('disabled', true);
					$('#next').css('background', 'gray');
				} else {
					$('#next').attr('disabled', false);
					$('#next').css({
						'background' : 'rgb(246, 246, 246)',
						'color' : 'black'
					});
				}
			}
		})
	}
</script>

 

확인

 

- 유저가 자신의 이름을 클릭시 개인 페이지로 넘어가도록 하겠다.

- main.jsp

				<c:if test="${user!=null}">
					<h4 style="float: right;">
						<a href="/user/logout">로그아웃</a>
					</h4>
					<h4 style="float: right;"><a href="/user/read?id=${user.id}">${user.name}님</a></h4>
				</c:if>

 

- create new user\read.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>마이페이지</h1>

 

- UserDAO.java

	// 5. 마이페이지 회원 정보를 불러오도록 하겠다.
	public UserVO read(String id) {
		UserVO vo = new UserVO();
		try {
			String sql = "select * from users where id=?";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setString(1, id);
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				vo.setId(rs.getString("id"));
				vo.setName(rs.getString("name"));
				vo.setAddress(rs.getString("address"));
				vo.setTel(rs.getString("tel"));
				vo.setEmail(rs.getString("email"));
				vo.setPass(rs.getString("pass"));
			}
		} catch (Exception e) {
			System.out.println("UserDAO read : " + e.toString());
		}
		return vo;
	}

 

- UserServlet.java

package controller;

import java.io.IOException;
import java.io.PrintWriter;

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.UserDAO;
import model.UserVO;

@WebServlet(value = { "/user/join", "/user/login", "/user/logout", "/user/insert", "/user/list", "/user/read",
		"/user/update" })
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	UserDAO udao = new UserDAO();

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
		switch (request.getServletPath()) {
		case "/user/read":
			request.setAttribute("vo", udao.read(request.getParameter("id")));
			request.setAttribute("pageName", "/user/read.jsp");
			dis.forward(request, response);
			break;

 

- user\read.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script
	src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<h1>마이페이지</h1>
<form name="frm">
	<table id="tblinfo">
		<tr>
			<td class="title" width=100>아이디</td>
			<td width=450><input type="text" name="id" value="${vo.id}" size=50 readonly/></td>
		</tr>
		<tr>
			<td class="title">비밀번호</td>
			<td><input type="password" name="pass" value="${vo.pass}" size=50 /></td>
		</tr>
		<tr>
			<td class="title">이름</td>
			<td><input type="text" name="name" value="${vo.name}" size=50 /></td>
		</tr>
		<tr>
			<td class="title">주소</td>
			<td><input name="address" value="${vo.address}" size=50/>
				<button id="search">주소검색</button></td>
		</tr>
		<tr>
			<td class="title">전화번호</td>
			<td><input name="tel" value="${vo.tel}" size=50 /></td>
		</tr>
		<tr>
			<td class="title">이메일 주소</td>
			<td><input name="email" value="${vo.email}" size=50 /></td>
		</tr>
	</table>
	<div style="margin-top: 20px; text-align: center;">
		<input type="submit" value="정보수정" /> <input type="reset" value="입력취소" />
	</div>
</form>

 

확인

 

- 이제 마이페이지에서 정보를 수정할 수 있도록 하겠다.

- UserDAO.java

	// 6. 회원정보 수정 메서드
	public void update(UserVO vo){
		try {
			String sql = "update users set pass=?, name=?, tel=?, address=?, email=? where id=?";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setString(1, vo.getPass());
			ps.setString(2, vo.getName());
			ps.setString(3, vo.getTel());
			ps.setString(4, vo.getAddress());
			ps.setString(5, vo.getEmail());
			ps.setString(6, vo.getId());
			ps.execute();
		} catch (Exception e) {
			System.out.println("UserDAO update : "+e.toString());
		}
	}

 

- UserServlet.java

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 브라우저 객체 생성
		PrintWriter out = response.getWriter();
		String id = request.getParameter("id");
		String pass = request.getParameter("pass");
		HttpSession session = request.getSession();

		switch (request.getServletPath()) {
		case "/user/login":
			UserVO vo = udao.login(id);
			if (vo.getId() == null) {
				out.println(0); // 아이디가 존재하지 않는 경우
			} else if (vo.getPass().equals(pass)) {
				out.println(1); // 로그인 성공
				session.setAttribute("user", vo);
			} else {
				out.println(2); // 비밀번호가 클린경우
			}
			break;
		case "/user/update": // new
			UserVO uvo = new UserVO();
			uvo.setId(request.getParameter("id"));
			uvo.setPass(request.getParameter("pass"));
			uvo.setName(request.getParameter("name"));
			uvo.setAddress(request.getParameter("address"));
			uvo.setTel(request.getParameter("tel"));
			uvo.setEmail(request.getParameter("email"));
//			System.out.println(uvo.toString());
			udao.update(uvo);
            // 세션이 남아있어서 덮어씌우는 작업이 필요하다.
			session.setAttribute("user", uvo);
			break;
		}
	}

 

- user\read.jsp

<script>
	// 주소 검색 버튼을 눌렀을때
	$('#search, input[name=address]').on('click', function() {
		new daum.Postcode({
			oncomplete : function(data) {
				$(frm.address).val(data.address);
			}
		}).open();
	});

	// 회원가입 버튼을 클릭할 경우
	$(frm).on('submit', function(e) {
		e.preventDefault();

		if (!confirm("회원정보를 수정하시겠습니까?"))
			return;
		var id = $(frm.id).val();
		var pass = $(frm.pass).val();
		var name = $(frm.name).val();
		var address = $(frm.address).val();
		var tel = $(frm.tel).val();
		var email = $(frm.email).val();
		$.ajax({
			type : 'post',
			url : '/user/update',
			data : {
				"id" : id,
				"pass" : pass,
				"name" : name,
				"address" : address,
				"tel" : tel,
				"email" : email
			},
			success : function(data) {
				alert("수정이 완료되었습니다.");
				location.href="/";
			}
		})

	})
</script>

 

확인

 

- 장바구니에서 상품을 주문하면 장바구니 페이지가 초기화되도록 하겠다.

- purchaseRESTServlet.java

- 주문이 완료되면 세션을 삭제해주겠다.

		case "/purchase/orders":
			OrderVO ovo = new OrderVO();
			ovo.setOrder_id(request.getParameter("order_id"));
			ovo.setProd_id(request.getParameter("prod_id"));
			ovo.setPrice(Integer.parseInt(request.getParameter("price")));
			ovo.setQuantity(Integer.parseInt(request.getParameter("quantity")));
			pdao.insertOrders(ovo);
			HttpSession session = request.getSession(); // new
			session.removeAttribute("cartList"); // new
			break;
		}

 

- 세션이 삭제되면 cartList는 사라지고 null이 되기 때문에 다음과 같이 cart\list 페이지에서 바꿔준다.

- cart\list.jsp

<c:if test="${cartList.size()==null}"> <!-- renew -->
	<div>
		<h3>장바구니가 비어있습니다.</h3>
	</div>
</c:if>

 

확인