본문 바로가기
강의/JSP 강의 정리

JSP 강의 정리 14일차

by 리드민 2022. 7. 25.
반응형

[1] 테스트 환경

hardware
cpu : intel i7-7700, gpu : intel hd 630, ram : ddr4 16GB, mainboard : samsung DB400S7A-Z51, secondary storage : 256GB SSD, 1TB HDD
OS
windows pro 64bits
software
jdk version 1.8.0_301
eclipse version 2021-09 (4.21.0)
apache-tomcat version 9.0.54

 

[2] 강의 정리

 

() 싱글톤 객체

 

Singleton.java

package singleton;

public class Singleton {
	
	private Singleton() {}
	
	private static Singleton instance = new Singleton();
	
	public static Singleton getInstance() {
		return instance;
	}
	
}

 

SingletonMain.java

package singleton;

public class SingletonMain {

	public static void main(String[] args) {
		
//		Singleton sing1 = new Singleton();
//		Singleton sing2 = new Singleton();
		
		Singleton sing1 = Singleton.getInstance();
		Singleton sing2 = Singleton.getInstance();
		
		
		if(sing1 == sing2) {
			System.out.println("같은 객체 입니다.");
		}else {
			System.out.println("다른 객체 입니다.");
		}
		
		
	}

}

 

() DAO, DTO로 회원가입구현

sql 문

create table circleMember(
    name nvarchar2(10),
    age nvarchar2(3),
    phone nvarchar2(20),
    email nvarchar2(20)
);

 

com.jsp.circle package

CircleMemberDAO.java

package com.jsp.circle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class CircleMemberDAO {
	
	// 싱글톤 : 단 하나의 객체만 생성하는 것
	
	private CircleMemberDAO() {}
	
	private static CircleMemberDAO instance = new CircleMemberDAO();
	
	public static CircleMemberDAO getInstance() {
		return instance;
	}
	
	// 싱글톤을 쓰는 이유
	// 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에
	// 메모리낭비를 방지할 수 있다. 또한 싱글톤으로 만들어진 클래스의 인스턴스는
	// 전역인스턴스 이기 때문에 다른 클래스의 인스턴스들이 공유하기 쉽니다.
	// DBCP(DataBase Connection Pool) 처럼 공통된 객체를
	// 여러개 생성해서 사용해야 하는 상황에서 많이 사용한다.
	
	
	// 데이터를 넣는 메소드
	public int insertCircle(CircleMemberDTO dto) {
		
		int result = 0;
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		// 자바에서 데이터베이스 쿼리문을 전송할때 사용할 수 있는 
		// 인터페이스는 Statement, PreparedStatement 2가지가 있다.
		
		// PreparedStatement 는 Statement 를 상속받은 인터페이스
		// 1. Statement의 기능향상 (여러번 수행할때 빠른속도)
		// 2. 코드안정성과 가독성이 높다.
		
		String driver = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "C##JSPUSER";
		String upw = "jsp123";
		
		String query = "insert into circleMember(name, age, phone, email) "
				+ "values(?, ?, ?, ?)";
		// 변수가 들어갈 자리는 ?로 써준다.
		
		try {
			
			Class.forName(driver);
			conn = DriverManager.getConnection(url, uid, upw);
			pstmt = conn.prepareStatement(query);
			
			pstmt.setString(1, dto.getName());
			pstmt.setInt(2, dto.getAge());
			pstmt.setString(3, dto.getPhone());
			pstmt.setString(4, dto.getEmail());
			
			result = pstmt.executeUpdate();
			// 반환결과는 레코드(행)의 수
			// 아무 리턴이 없으면 0
			
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			
			try {
				if(pstmt != null)pstmt.close();
				if(conn != null)conn.close();
			}catch(Exception e2) {}
			
		}
		
		
		return result;
	}
	
	// 데이터를 얻는 메소드
	public ArrayList<CircleMemberDTO> circleList(){
		
		ArrayList<CircleMemberDTO> list = new ArrayList<CircleMemberDTO>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String driver = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "C##JSPUSER";
		String upw = "jsp123";
		
		String query = "select * from circleMember";
		
		try {
			
			Class.forName(driver);
			
			conn = DriverManager.getConnection(url, uid, upw);
			pstmt = conn.prepareStatement(query);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				
				String name = rs.getString("name");
				int age = rs.getInt("age");
				String phone = rs.getString("phone");
				String email = rs.getString("email");
				
				list.add(new CircleMemberDTO(name, age, phone, email));
				
			}
			
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			
			try {
				
				if(rs != null)rs.close();
				if(pstmt != null)pstmt.close();
				if(conn != null)conn.close();
				
			}catch(Exception e2) {}
			
		}
		
		return list;
	}
	
	
	
	
}

 

com.jsp.circle package

CircleMemberDTO.java

package com.jsp.circle;

public class CircleMemberDTO {
	
	// 계층간 데이터 교환을 위한 자바빈 클래스
	private String name;
	private int age;
	private String phone;
	private String email;
	
	// 기본생성자
	public CircleMemberDTO() {}

	public CircleMemberDTO(String name, int age, String phone, String email) {
		super();
		this.name = name;
		this.age = age;
		this.phone = phone;
		this.email = email;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

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

 

circleJoin.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<!-- 
		form 태그를 사용해서 동아리 회원가입 폼 만들기
		(이름, 나이, 핸드폰번호, 이메일)
		입력받은 후 joinCheck.jsp로 전송하기 
	 -->
	
	<h2>동아리 회원가입</h2>
	
	<form action="joinCheck.jsp" method="post">
		
		이름 : <input type="text" name="name" size="10"><br>
		나이 : <input type="text" name="age" size="10"><br>
		핸드폰 : <input type="text" name="phone" size="20"><br>
		이메일 : <input type="text" name="email" size="20"><br> 
		
		<input type="submit" value="동아리가입">
		
		
	</form>
	
</body>
</html>

 

circleMemberList.jsp

<%@page import="com.jsp.circle.CircleMemberDTO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.jsp.circle.CircleMemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<%--
		DAO 객체를 생성후 circleList 메소드 호출하여 
		ArrayList 객체를 얻은 후 
		list안에있는 DTO 객체들의 데이터(이름, 나이, 전화번호, 이메일)를 출력하기
	 --%>
	
	<%
		CircleMemberDAO dao = CircleMemberDAO.getInstance();
		
		ArrayList<CircleMemberDTO> list = dao.circleList();
		
		out.print("<h1>동아리 회원 목록</h1>");
		
		for(int i = 0; i < list.size(); i++){
			
			CircleMemberDTO dto = list.get(i);
			
			out.print("<p>이름 : " + dto.getName() + ", 나이 : " + dto.getAge()
			+ ", 핸드폰 : " + dto.getPhone() + ", 이메일 : " + dto.getEmail() + "</p>");
			
		}
		
	%>
	
	<a href="circleJoin.html">동아리 회원가입하기</a>
	
</body>
</html>

 

joinCheck.jsp

<%@page import="com.jsp.circle.CircleMemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<%--
		
		1. 넘어온 데이터(parameter) 받기
		2. jsp useBean 액션태그를 사용해서 DTO 객체 생성하기
		3. setProperty 액션태그를 사용해서 DTO 객체에 데이터 넣기
		4. scriptlet으로 DAO 객체 생성 후 
		   insertCircle 메소드 호출하여 DB에 데이터 넣기
		
		5. 결과값을 얻은 후 회원가입이 정상적으로 완료되었다면
		   회원가입 축하합니다. 웹브라우저에 출력하기
		   a태그를 사용해서 회원목록을 보여주는 링크걸기
		   정상적으로 완료되지 않았다면 
		   회원가입 실패했습니다. 웹브라우저에 출력하기
	 --%>
	
	<%
		
		request.setCharacterEncoding("UTF-8");
	
		String name = request.getParameter("name");
		String strAge = request.getParameter("age");
		int age = Integer.parseInt(strAge);
		String phone = request.getParameter("phone");
		String email = request.getParameter("email");
	
	%>
	
	<jsp:useBean id="dto" class="com.jsp.circle.CircleMemberDTO" />
	
	<jsp:setProperty property="name" name="dto" value="<%=name %>"/>
	<jsp:setProperty property="age" name="dto" value="<%=age %>"/>
	<jsp:setProperty property="phone" name="dto" value="<%=phone %>"/>
	<jsp:setProperty property="email" name="dto" value="<%=email %>"/>
	
	<%
		CircleMemberDAO dao = CircleMemberDAO.getInstance();
	
		int result = dao.insertCircle(dto);
		
		if(result == 1){
	%>
			<h2>회원가입 축하합니다.</h2>
			<a href="circleMemberList.jsp">회원목록 보기</a>
			
	<%
		}else{
	%>
			<h2>회원가입 실패했습니다.</h2>
			<a href="circleJoin.html">회원 가입하기</a>
	<%
		}
	%>
	
</body>
</html>
반응형

'강의 > JSP 강의 정리' 카테고리의 다른 글

JSP 강의 정리 16일차  (0) 2022.07.27
JSP 강의 정리 15일차  (0) 2022.07.26
JSP 강의 정리 13일차  (0) 2022.07.22
JSP 강의 정리 12일차  (0) 2022.07.21
JSP 강의 정리 11일차  (0) 2022.07.20