본문 바로가기

웹 - Ajax

웹 - Ajax - 회원목록/가입 예제1 (조회까지)

*) Ajax는 레이아웃 일부분만 요청을 받아 수정을 할 수 있다.

-> DB와 해당 파일들 필요

-> 조회 화면까지 만들기

 

)db

--일련(회원)번호 관리객체
create sequence seq_member_idx

-- 회원테이블
create table member 
(
	mem_idx		int,								-- 회원번호
	mem_name	varchar2(100) 	not null,			-- 회원명
	mem_id		varchar2(100) 	not null,			-- 아이디
	mem_pwd		varchar2(100) 	not null,			-- 비밀번호
	mem_zipcode	char(5)	  		not null,			-- 우편번호(5자리 고정)
	mem_addr	varchar2(1000)  not null,			-- 주소
	mem_ip		varchar2(100)	not null,			-- 아이피
	mem_regdate	date			default sysdate,	-- 가입일자
	mem_grade	varchar2(100)	default '일반'		-- 회원등급
)

-- 기본키
alter table member
	add constraint pk_member_idx	primary key(mem_idx);
	
-- 아이디(unique)
alter table member
	add constraint unique_member_id unique(mem_id) ;

-- 회원등급(check)
alter table member
	add constraint ck_member_grade check(mem_grade in('일반','관리자'));		
	
-- sample data
insert into member values(seq_member_idx.nextVal, 
						  '김관리',
						  'admin', 
						  'admin', 
						  '00000', 
						  '서울시 관악구',
						  '127.0.0.1',
						  sysdate,
						  '관리자' 
						  );
						  
insert into member values(seq_member_idx.nextVal, 
						  '일길동',
						  'one', 
						  '1234', 
						  '00000', 
						  '서울시 관악구',
						  '127.0.0.1',
						  default,
						  default 
						  );

select * from member

 

)vo

package db.vo;

public class MemberVo {
	
	int mem_idx;
	String mem_name;
	String mem_id;
	String mem_pwd;
	String mem_zipcode;
	String mem_addr;
	String mem_ip;
	String mem_regdate;
	String mem_grade;
	
	
	public int getMem_idx() {
		return mem_idx;
	}
	public void setMem_idx(int mem_idx) {
		this.mem_idx = mem_idx;
	}
	public String getMem_name() {
		return mem_name;
	}
	public void setMem_name(String mem_name) {
		this.mem_name = mem_name;
	}
	public String getMem_id() {
		return mem_id;
	}
	public void setMem_id(String mem_id) {
		this.mem_id = mem_id;
	}
	public String getMem_pwd() {
		return mem_pwd;
	}
	public void setMem_pwd(String mem_pwd) {
		this.mem_pwd = mem_pwd;
	}
	public String getMem_zipcode() {
		return mem_zipcode;
	}
	public void setMem_zipcode(String mem_zipcode) {
		this.mem_zipcode = mem_zipcode;
	}
	public String getMem_addr() {
		return mem_addr;
	}
	public void setMem_addr(String mem_addr) {
		this.mem_addr = mem_addr;
	}
	public String getMem_ip() {
		return mem_ip;
	}
	public void setMem_ip(String mem_ip) {
		this.mem_ip = mem_ip;
	}
	public String getMem_regdate() {
		return mem_regdate;
	}
	public void setMem_regdate(String mem_regdate) {
		this.mem_regdate = mem_regdate;
	}
	public String getMem_grade() {
		return mem_grade;
	}
	public void setMem_grade(String mem_grade) {
		this.mem_grade = mem_grade;
	}
	
	
}

 

)dao (조회 메서드 추가 - 전체(list) - 부분(one-idx)/(one-id)

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import db.vo.MemberVo;
import service.DBService;

public class MemberDao {

	// single-ton pattern : 객체 1개만 생성해서 이용하자
	static MemberDao single = null;

	public static MemberDao getInstance() {

		//없으면 생성해라
		if (single == null)
			single = new MemberDao();

		return single;
	}

	// 외부에서 객체생성하지 말아라...
	private MemberDao() {

	}
	
	//전체조희
	public List<MemberVo> selectList() {

		List<MemberVo> list = new ArrayList<MemberVo>();

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		String sql = "select * from member order by mem_idx";

		try {
			//1.Connection 얻어오기
			conn = DBService.getInstance().getConnection();

			//2.PreparedStatement
			pstmt = conn.prepareStatement(sql);

			//3.ResultSet 얻어온다
			rs = pstmt.executeQuery();

			while (rs.next()) {

				//저장객체 생성->레코드에서 읽은 값을 넣는다
				MemberVo vo = new MemberVo();

				//rs가 가리키는 레코드값을 vo에 넣는다
				vo.setMem_idx(rs.getInt("mem_idx"));
				vo.setMem_name(rs.getString("mem_name"));
				vo.setMem_id(rs.getString("mem_id"));
				vo.setMem_pwd(rs.getString("mem_pwd"));
				vo.setMem_zipcode(rs.getString("mem_zipcode"));
				vo.setMem_addr(rs.getString("mem_addr"));
				vo.setMem_ip(rs.getString("mem_ip"));
				vo.setMem_regdate(rs.getString("mem_regdate").substring(0, 19));
				vo.setMem_grade(rs.getString("mem_grade"));

				//ArrayList에 추가
				list.add(vo);

			} //end:while

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();

		} finally {

			//마무리 작업(열린역순으로 닫기)
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return list;
	}
	
	// mem_idx에 해당되는 1건의 정보 얻어온다
	// 일부만 조회
	public MemberVo selectOne(int mem_idx) {

		MemberVo vo = null;

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		String sql = "select * from member where mem_idx=?";

		try {
			//1.Connection 얻어오기
			conn = DBService.getInstance().getConnection();

			//2.PreparedStatement
			pstmt = conn.prepareStatement(sql);

			//3.pstmt parameter index채우기
			pstmt.setInt(1, mem_idx);

			//4.ResultSet 얻어온다
			rs = pstmt.executeQuery();

			if (rs.next()) {

				//저장객체 생성->레코드에서 읽은 값을 넣는다
				vo = new MemberVo();

				//rs가 가리키는 레코드값을 vo에 넣는다
				vo.setMem_idx(rs.getInt("mem_idx"));
				vo.setMem_name(rs.getString("mem_name"));
				vo.setMem_id(rs.getString("mem_id"));
				vo.setMem_pwd(rs.getString("mem_pwd"));
				vo.setMem_zipcode(rs.getString("mem_zipcode"));
				vo.setMem_addr(rs.getString("mem_addr"));
				vo.setMem_ip(rs.getString("mem_ip"));
				vo.setMem_regdate(rs.getString("mem_regdate").substring(0, 19));
				vo.setMem_grade(rs.getString("mem_grade"));

			} //end:if

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();

		} finally {

			//마무리 작업(열린역순으로 닫기)
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return vo;
	}
	
	// mem_id에 해당되는 1건의 정보 얻어온다
	public MemberVo selectOne(String mem_id) {
		
		MemberVo vo = null;
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String sql = "select * from member where mem_id=?";
		
		try {
			//1.Connection 얻어오기
			conn = DBService.getInstance().getConnection();
			
			//2.PreparedStatement
			pstmt = conn.prepareStatement(sql);
			
			//3.pstmt parameter index채우기
			pstmt.setString(1, mem_id);
			
			//4.ResultSet 얻어온다
			rs = pstmt.executeQuery();
			
			if (rs.next()) {
				
				//저장객체 생성->레코드에서 읽은 값을 넣는다
				vo = new MemberVo();
				
				//rs가 가리키는 레코드값을 vo에 넣는다
				vo.setMem_idx(rs.getInt("mem_idx"));
				vo.setMem_name(rs.getString("mem_name"));
				vo.setMem_id(rs.getString("mem_id"));
				vo.setMem_pwd(rs.getString("mem_pwd"));
				vo.setMem_zipcode(rs.getString("mem_zipcode"));
				vo.setMem_addr(rs.getString("mem_addr"));
				vo.setMem_ip(rs.getString("mem_ip"));
				vo.setMem_regdate(rs.getString("mem_regdate").substring(0, 19));
				vo.setMem_grade(rs.getString("mem_grade"));
				
			} //end:if
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			
		} finally {
			
			//마무리 작업(열린역순으로 닫기)
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return vo;
	}
}

 

)조회 서블릿

package action.member;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

import dao.MemberDao;
import db.vo.MemberVo;

/**
 * Servlet implementation class MemberListAction
 */
@WebServlet("/member/list.do")
public class MemberListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 회원목록 가져오기
		List<MemberVo> list = MemberDao.getInstance().selectList();

		// request 바인딩
		request.setAttribute("list", list);
		
		// Dispatcher형식으로 호출
		String forward_page = "member_list.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

)조회 jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">
	#box{
		width: 1000px;
		margin: auto;
		margin-top: 50px;
	}
	
	#title{
		text-align: center;
		font-weight: bold;
		font-size: 32px;
		color: green; 
		text-shadow: 1px 1px 1px black;
	}
	
	#empty_msg{
		text-align: center;
		color: red;
		margin-top: 130px;
		font-weight: bold;
		font-size: 20px;
		
	}
/* 	th{
		background: #333333 !important;
		color: white;
	} */
	
	td{
		vertical-align: middle !important;
	}
</style>

</head>

<body>
	
	<div id="box">
		<h1 id="title">::::회원목록::::</h1>
		<div style="margin-top: 50px; margin-bottom: 5px" >
			<input class="btn btn-primary" type="button" value="회원가입">
		</div>
		
		<table class="table">
			<tr class="info">
				<th>회원번호</th>
				<th>회원명</th>
				<th>아이디</th>
				<th>비밀번호</th>
				<th>우편번호</th>
				<th>주소</th>
				<th>아이피</th>
				<th>가입일자</th>
				<th>회원등급</th>
				<th>편집</th>
			</tr>
		
		<!-- Data 출력 -->
		<!-- for(MemberVo vo : list) -->
		<c:forEach var="vo" items="${ list }">
			<tr>
				<td>${ vo.mem_idx }</td>
				<td>${ vo.mem_name }</td>
				<td>${ vo.mem_id }</td>
				<td>${ vo.mem_pwd }</td>
				<td>${ vo.mem_zipcode }</td>
				<td>${ vo.mem_addr }</td>
				<td>${ vo.mem_ip }</td>
				<td>${ vo.mem_regdate }</td>
				<td>${ vo.mem_grade }</td>
				<td>
					<input class="btn btn-success" type="button" value="수정">
					<input class="btn btn-danger" type="button" value="삭제">
				</td>
			</tr>
		</c:forEach>
				
		</table>
				
		<!-- Data가 없는 경우 -->
		<c:if test="${ empty requestScope.list }">
			<div id="empty_msg">등록된 회원정보가 없습니다.</div>
		</c:if>
			
	</div>
</body>
</html>