1. 웹 어플리케이션 구조
2. m_insert_form.jsp
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
32
33
34 |
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<%= request.getRequestURI() %> <br>
<form action="<%= request.getContextPath() %>/minsert/m_insert_pro.jsp" method="post">
<table border="1">
<tr>
<td>아이디</td>
<td><input type="text" name="m_id" size="20"></td>
<tr>
<tr>
<td>암호</td>
<td><input type="text" name="m_pw" size="20"></td>
<tr>
<tr>
<td>권한</td>
<td><input type="text" name="m_level" size="20"></td>
<tr>
<tr>
<td>이름</td>
<td><input type="text" name="m_name" size="20"></td>
<tr>
<tr>
<td>이메일</td>
<td><input type="text" name="m_email" size="20"></td>
<tr>
<tr>
<td colspan="4"><input type="submit" value="회원가입버튼"></td>
</tr>
</table>
</form> |
cs |
3. m_insert_pro.jsp
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 |
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<!-- Connection 객체, PreparedStatement 객체 사용하기 위해서는 import를 해줘야 함 -->
<!-- DriverManage와 SQLException(쿼리문 사용) 객체 사용하기 위해서도 import 해줘야 함 -->
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.SQLException" %>
<!--
JDBC(Java Database Connectivity) : 자바 언어를 이용해 DB에 접근할 수 있는 API 묶음
* API : java.sql.Connection 으로 정의되어 있음(java.sql.~ 클래스들 import 해줘야 함)
1. DB 주소 + 포트번호 + 이름 + 암호 이용해서 연결(Connection) 객체 생성
2. 커넥션에서 sql 객체 생성
3. sql 객체 이용하여 sql 작업을 함
4. 사용했던 리소스들(sql 객체, 커넥션 등)을 해제
-->
<!-- 자바 소스 코드가 들어가야 하기 때문에 스크립트릿 안에 자바 소스 코드를 넣었음 -->
<%
// console 창에 출력하기 전 form.jsp에서 받은 파라미터 값들이 깨지지 않도록 인코딩
request.getParameter("utf-8");
// Connection, PreparedStatement 객체 생성
// 선언만 해주고 초기화 해주지 않을 시 => nullPointException 일어날 가능성 있음
Connection conn = null;
// PreparedStatement와 Statement의 차이
// 1. PreparedStatement : 쿼리문이 들어갈 양식만 있음
// 2. Statement : 쿼리문 통째로 집어넣음
PreparedStatement pstmt = null;
// form의 파라미터들을 request 내장 객체 getParameter 메소드로 받아와 String형 변수들로 대입함
String m_id = request.getParameter("m_id");
String m_pw = request.getParameter("m_pw");
String m_level = request.getParameter("m_level");
String m_name = request.getParameter("m_name");
String m_email = request.getParameter("m_email");
System.out.println(m_id + "<-- m_id /minsert/m_insert_pro.jsp");
System.out.println(m_pw + "<-- m_pw /minsert/m_insert_pro.jsp");
System.out.println(m_level + "<-- m_level /minsert/m_insert_pro.jsp");
System.out.println(m_name + "<-- m_name /minsert/m_insert_pro.jsp");
System.out.println(m_email + "<-- m_email /minsert/m_insert_pro.jsp");
// JDBC 드라이버 로딩(mysql이기 때문에 mysql, jdbc 형식이기 때문에 jdbc라고 적어줘야 함)
Class.forName("com.mysql.jdbc.Driver");
// 해당 예제의 try문에는 catch가 없는데, 이것은 예외처리를 따로 해줄 필요가 없기 때문이다.
// (catch가 없는 경우에는 try~finally 문을 굳이 써야할 필요가 없음 => try~finally 없애도 됨)
try{
// 드라이버 주소, db id, db password가 필요(인코딩은 해줘도, 안 해줘도 됨)
String jdbcDriver = "jdbc:mysql://localhost:3306/dev22db?" +
"useUnicode=true&characterEncoding=utf8";
String dbUser = "dev22id";
String dbPass = "dev22pw";
// mysql 커넥션 연결
// 커넥션 정보가 담긴 return 값을 conn이라는 인스턴스 주소값에 대입
// 매개변수 안에 직접 드라이버 주소, db id, db password를 적어줘도 되지만 매개변수 값의 길이가
// 너무 길기 때문에 밖에 따로 변수로 선언
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
System.out.println("console> conn : " + conn);
// mysql 쿼리문 선언
// PreparedStatement 객체를 사용하는 이유는 ? 안에 들어가는 파라미터 값들이
// 계속 변할 수 있으므로, 일일히 쿼리를 수정하는 것보다는 PreparedStatement 객체를
// 사용함으로서 form에서 받아오는 파라미터 값들을 유연하게 대처할 수 있기 때문이다.
pstmt = conn.prepareStatement("INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)");
// 콘솔창에서 확인해보면 ?가 들어간 쿼리문만 출력됨
System.out.println("console> before pstmt : " + pstmt);
// form.jsp에서 받는 파라미터의 갯수대로 setting을 해준다.
// (form에서 받는 파라미터들은 모두 default string 형으로 받아오기 때문에 setString 메소드를 호출해야 함)
pstmt.setString(1, m_id);
pstmt.setString(2, m_pw);
pstmt.setString(3, m_level);
pstmt.setString(4, m_name);
pstmt.setString(5, m_email);
// 파라미터들을 setting 해준 뒤이기 때문에, 콘솔창에서 확인해보면 쿼리문 안에
// setting 해준 값들이 쿼리문에 같이 출력됨을 알 수 있음
System.out.println("console> after pstmt : " + pstmt);
// 쿼리 실행(쿼리문에서 직접 값을 받아오지 않는 경우만 사용 가능)
// 쿼리 실행 후 값을 직접 받아와야 하는 경우
// (ex. SELECT문 => ResultSet 객체 선언하고 사용, 인스턴스.executeQuery() 메소드 사용)
pstmt.executeUpdate();
}finally{
// 실행되었던 커넥션들을 모두 닫아줘야 함(객체 선언한 순서의 반대로 닫아줘야 함)
if (pstmt != null) try { pstmt.close(); } catch(SQLException ex) {}
if (conn != null) try { conn.close(); } catch(SQLException ex) {}
}
%> |
cs |
4. 결과
'BackEnd > Java' 카테고리의 다른 글
Servlet :: ServletContext vs ServletConfig (0) | 2016.11.22 |
---|---|
Java :: Abstract vs Interface (0) | 2016.10.28 |
Java :: 스레드(Thread) (0) | 2016.10.12 |
Java :: Code vs Heap vs Stack (0) | 2016.10.10 |
Java :: 자바 소켓 프로그래밍(TCP) (0) | 2016.10.09 |