Programming/국비학원

221026 - AJAX - JSON 데이터 교환 / MVC - 회원정보 조회, 회원 등록

지고르 2022. 10. 27. 14:05
AJAX
  • 서버 → 클라이언트
  • JsonServlet02
package ajax_jsp.ex02;

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

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/json2")
public class JsonServlet02 extends HttpServlet {


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		JSONObject object = new JSONObject();
		JSONArray memArray = new JSONArray();
		
		JSONObject memberInfo = new JSONObject();
		memberInfo.put("name", "홍길동");
		memberInfo.put("age", 50);
		memberInfo.put("hp", "010-1234-5678");
		memberInfo.put("email", "hong@gmail.com");
		memArray.add(memberInfo);
		
		memberInfo = new JSONObject();
		memberInfo.put("name", "김철수");
		memberInfo.put("age", 30);
		memberInfo.put("hp", "010-1111-2222");
		memberInfo.put("email", "kim@gmail.com");
		memArray.add(memberInfo);
		
		object.put("members", memArray);
		
		String jsonStr = object.toJSONString(); //JSON 데이터 -> 문자열
		
		out.print(jsonStr);

	}
    
}

//

"members" : [{"name":"홍길동",..},{"name":"김철수",..}]

 

 

 

  • json6.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSON 자료형</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
	function fn_json(){
		$.ajax({
			type:"post",
			async:false,
			url:"${contextPath}/json2",
			success: function(data,textStatus){ //data : 문자열로 받은 JSON 데이터
				let jsonInfo=JSON.parse(data); //문자열-> 자스 객체/값
				let memInfo="<h2>회원정보</h2>";
				memInfo+="-------------<br>";
				
				for (var i in jsonInfo.members){
					memInfo+="이름 : " + jsonInfo.members[i].name +"<br>";
					memInfo+="나이 : " + jsonInfo.members[i].age +"<br>";
					memInfo+="핸드폰 : " + jsonInfo.members[i].hp +"<br>";
					memInfo+="이메일 : " + jsonInfo.members[i].email +"<br>";
				}
				
				$("#output").html(memInfo);
			},
			error: function(data, textStatus){}
		});
	}
</script>
</head>
<body>
	<input type="button" onclick="fn_json();" value="데이터를 서버로부터 전송받기">
	<div id="output"></div>
</body>
</html>

 

localhost~/json6.jsp 방문, 버튼 클릭

→ 자바스크립트 함수 실행

→ 서블릿과 AJAX 통신해 응답 데이터 가져옴

 

 

 

 

MVC

Model : 비즈니스 로직  
View : 화면 구현
Controller : 사용자의 요청, 흐름 제어

 

 

 

 

  • MVC 동작 과정

클라이언트 요청 → 컨트롤러 (서블릿 / 로직 처리 ex. 어떤 상황에 어떤 함수 실행) → 모델 (DAO 클래스 / DB 연결, 쿼리 전송) → DB → 모델 (응답 데이터 받음) → 뷰 (JSP / 화면 구현) → 클라이언트

 

 

 

 

  • 회원정보 조회

모델 => MemberDAO 클래스
컨트롤러 => MemberController 서블릿
뷰 => listMembers.jsp

 

※ 서블릿매핑주소 입력해야 정보 조회 가능 (JSP 주소 X)

=> 컨트롤러 통해 DB 관련 함수 실행되므로

 

 

 

  • MemberDAO
package jspMVC.ex01;

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

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class MemberDAO {
	
	private DataSource dataFactory;
	private Connection con;
	private PreparedStatement ps;
	
	public MemberDAO() {
		try {
			Context ctx=new InitialContext();
			Context envContext=(Context)ctx.lookup("java:/comp/env");
			dataFactory=(DataSource) envContext.lookup("jdbc/oracle");
		}catch(Exception e){
			System.out.println("DB 연결 중 에러");
		}
	}
	
	public List<MemberVO> listMembers(){
		List<MemberVO> memberList = new ArrayList();
		
		try {
			con=dataFactory.getConnection();
			String query="select * from member_list order by joindate desc";
			System.out.println(query);
			
			ps=con.prepareStatement(query);
			ResultSet rs = ps.executeQuery();
			
			while(rs.next()) {
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joindate");
				
				MemberVO memberVO = new MemberVO(id, pwd, name, email, joinDate);
				
				memberList.add(memberVO);
			}
			rs.close();
			ps.close();
			con.close();
		} catch(Exception e) {
			System.out.println("쿼리 작성 중 에러");
		}
		return memberList;
	}

}

 

 

 

  • MemberVO
package jspMVC.ex01;

import java.sql.Date;

public class MemberVO {
	
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;
	
	public MemberVO() {
		System.out.println("MemberVO 생성자 호출");
	}

	public MemberVO(String id, String pwd, String name, String email, Date joinDate) {
		super();
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
		this.joinDate=joinDate;
	}

	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 getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getJoinDate() {
		return joinDate;
	}
	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
	
}

 

 

 

  • MemberController
package jspMVC.ex01;

import java.io.IOException;

import java.io.PrintWriter;
import java.util.List;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/mem.do")
public class MemberController extends HttpServlet {

	MemberDAO memberDAO;
	
	public void init(ServletConfig config) throws ServletException {
		memberDAO=new MemberDAO(); //모델 객체 생성
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		List<MemberVO> memberList = memberDAO.listMembers();
		request.setAttribute("memberList", memberList);
		
		RequestDispatcher rd = request.getRequestDispatcher("/listMembers.jsp");
		rd.forward(request, response);
	}
	
}

 

 

 

  • listMembers.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보 출력</title>
</head>
<body>
	<h2 align="center">회원정보</h2>
	<table align="center" border="1">
		<tr align="center" bgcolor="beige">
			<th>아이디</th><th>비밀번호</th><th>이름</th><th>이메일</th><th>가입일</th>
		</tr>
		<c:choose>
			<c:when test="${empty memberList}">
				<tr>
					<td colspan="5" align="center">등록된 회원이 없습니다.</td>
				</tr>
			</c:when>
			<c:when test="${not empty memberList}">
				<c:forEach var="member" items="${memberList}">
					<tr align="center">
						<td>${member.id }</td>
						<td>${member.pwd }</td>
						<td>${member.name }</td>
						<td>${member.email }</td>
						<td>${member.joinDate }</td>
					</tr>
				</c:forEach>
			</c:when>
		</c:choose>
	</table>
	<p align="center"><a href="#">회원가입</a></p>
</body>
</html>

 

 

 

 

  • 회원 등록
  • MemberController
package jspMVC.ex01;

import java.io.IOException;

import java.io.PrintWriter;
import java.util.List;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/member/*") // member/listMembers member/addMembers member/memberForm 등 여러 뷰와 데이터 교환
public class MemberController extends HttpServlet {

	MemberDAO memberDAO;

	public void init(ServletConfig config) throws ServletException {
		memberDAO=new MemberDAO(); //모델 객체 생성
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		String nextPage=null;
		String action = request.getPathInfo(); //URL 확장이 있는 리소스에 대한 추가 경로 정보
		System.out.println("요청명 : " + action);
        
		if (action==null||action.equals("/listMembers.do")) { //추가 경로 없거나 정보조회 주소
			
                    List<MemberVO> memberList = memberDAO.listMembers();
			request.setAttribute("memberList", memberList);
			nextPage = "/listMembers.jsp";
            
		} else if (action.equals("/memberForm.do")) { //회원가입창 주소
			
                        nextPage="/memberForm.jsp";
            
		} else if (action.equals("/addMember.do")){ //회원가입 submit 주소
			//회원가입창에 작성한 정보 가져오기
                        String id = request.getParameter("id");
			String pwd = request.getParameter("pwd");
			String name = request.getParameter("name");
			String email = request.getParameter("email");
			
			MemberVO memberVO = new MemberVO(id,pwd,name,email); //멤버 객체 등록
			memberDAO.addMember(memberVO); //DB에 등록
			nextPage="/member/listMembers.do"; //정보조회 주소로 가기
            
		}
		
		RequestDispatcher rd = request.getRequestDispatcher(nextPage); ////해당 주소로 포워딩
		rd.forward(request, response);
	}
	
}

 

 

 

  • listMembers.jsp (전체 회원정보 조회)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%
	request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보 출력</title>
</head>
<body>
	<h2 align="center">회원정보</h2>
	<table align="center" border="1">
		<tr align="center" bgcolor="beige">
			<th>아이디</th><th>비밀번호</th><th>이름</th><th>이메일</th><th>가입일</th>
		</tr>
		<c:choose>
			<c:when test="${empty memberList}">
				<tr>
					<td colspan="5" align="center">등록된 회원이 없습니다.</td>
				</tr>
			</c:when>
			<c:when test="${not empty memberList}">
				<c:forEach var="member" items="${memberList}">
					<tr align="center">
						<td>${member.id }</td>
						<td>${member.pwd }</td>
						<td>${member.name }</td>
						<td>${member.email }</td>
						<td>${member.joinDate }</td>
					</tr>
				</c:forEach>
			</c:when>
		</c:choose>
	</table>
	<p align="center"><a href="${contextPath}/member/memberForm.do">회원가입</a></p>
</body>
</html>

 

 

 

  • memberForm.jsp (회원가입 창)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
</head>
<body>
	<form action="${contextPath}/member/addMember.do" method="post">
		<h2 align="center">회원가입창</h2>
		<table align="center">
			<tr>
				<td width="200"><p align="right">아이디</p></td>
				<td width="400"><input type="text" name="id"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">비밀번호</td>
				<td width="400"><input type="text" name="pwd"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">이름</p></td>
				<td width="400"><input type="text" name="name"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">이메일</p></td>
				<td width="400"><input type="text" name="email"></td>
			</tr>		
		</table>
		<input type="submit" value="회원가입하기">

	</form>
</body>
</html>

 

 

 

  • MemberDAO
package jspMVC.ex01;

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

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class MemberDAO {
	
	private DataSource dataFactory;
	private Connection con;
	private PreparedStatement ps;
	
	public MemberDAO() {
		try {
			Context ctx=new InitialContext();
			Context envContext=(Context)ctx.lookup("java:/comp/env");
			dataFactory=(DataSource) envContext.lookup("jdbc/oracle");
		}catch(Exception e){
			System.out.println("DB 연결 중 에러");
		}
	}
	
	public List<MemberVO> listMembers(){
		List<MemberVO> memberList = new ArrayList();
		
		try {
			con=dataFactory.getConnection();
			String query="select * from member_list order by joindate desc";
			System.out.println(query);
			
			ps=con.prepareStatement(query);
			ResultSet rs = ps.executeQuery();
			
			while(rs.next()) {
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joindate");
				
				MemberVO memberVO = new MemberVO(id, pwd, name, email, joinDate);
				
				memberList.add(memberVO);
			}
			rs.close();
			ps.close();
			con.close();
		} catch(Exception e) {
			System.out.println("쿼리 작성 중 에러");
		}
		return memberList;
	}
	
	//회원가입
	public void addMember(MemberVO mem) {
		try {
			con=dataFactory.getConnection();
			
			String id = mem.getId();
			String pwd = mem.getPwd();
			String name = mem.getName();
			String email = mem.getEmail();
			
			String query="insert into member_list(id,pwd,name,email) values(?,?,?,?)";
			System.out.println(query);
			
			ps=con.prepareStatement(query);
			ps.setString(1, id);
			ps.setString(2, pwd);
			ps.setString(3, name);
			ps.setString(4, email);
			ps.executeUpdate();
			
			ps.close();
			con.close();
			
		}catch(Exception e) {
			System.out.println("DB 추가 중 에러");
		}
	}

}

 

 

 

  • MemberVO
package jspMVC.ex01;

import java.sql.Date;

public class MemberVO {
	
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;
	
	public MemberVO() {
		System.out.println("MemberVO 생성자 호출");
	}

	public MemberVO(String id, String pwd, String name, String email) {
		super();
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
		this.joinDate=joinDate;
	}
	
	public MemberVO(String id, String pwd, String name, String email, Date joinDate) {
		super();
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
		this.joinDate=joinDate;
	}

	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 getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getJoinDate() {
		return joinDate;
	}
	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
	
}