Servlet & JDBC
1. 다이나믹 웹 프로젝트 생성 후에 WebContent > WEB-INF > lib 폴더에 ojdbc14.jar 파일을 넣어야 함.
------------------------------------------------------------------------------------
DBConn 클래스를 이용한 오라클 연결 테스트
//DBConn.java -> Java Resources > src 폴더에 패키지 생성 후 복사할 것.
package com.test;
import java.sql.*;
public class DBConn {
//Singleton pattern
private static Connection dbConn;
public static Connection getConnection()
throws SQLException, ClassNotFoundException {
if (dbConn == null) {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "scott";
String pw = "tiger";
Class.forName("oracle.jdbc.driver.OracleDriver");
dbConn = DriverManager.getConnection(url, user, pw);
}
return dbConn;
}
public static void close()
throws SQLException {
if (dbConn != null) {
if (!dbConn.isClosed()) {
dbConn.close();
}
}
dbConn = null;
}
}
//Oracle01.java
package com.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
public class Oracle01 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGetPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGetPost(req, resp);
}
protected void doGetPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=EUC-KR");
PrintWriter out = resp.getWriter();
String str = "연결 실패!";
Connection conn = null;
try {
conn = DBConn.getConnection();
str = "연결 성공!";
}catch(Exception e){
System.out.println(e.toString());
}finally {
try {
DBConn.close();
}catch(Exception e){
System.out.println(e.toString());
}
}
out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.println("<html>");
out.println("<head>");
out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-KR\">");
out.println("<title>Insert title here</title>");
out.println("</head>");
out.println("<body>");
out.println("<div>");
out.println("<h2>오라클 연결 테스트</h2>");
out.print("<div>");
out.print(str);
out.println("</div>");
out.println("</div>");
out.println("</body>");
out.println("</html>");
}
}
------------------------------------------------------------------------------------
SQL 쿼리 전송 테스트1 (scott 계정)
//회원 테이블 생성. 회원번호, 이름, 전화번호. 시퀀스 객체 생성.
CREATE TABLE member (
mid NUMBER --PK
,name VARCHAR2(10)
,tel VARCHAR2(20)
);
ALTER TABLE member
ADD CONSTRAINT member_mid_pk PRIMARY KEY(mid);
CREATE SEQUENCE memberSeq;
//회원 테이블에 자료 입력. INSERT 쿼리.
//쿼리문의 끝에 ; 표시하지 말것.
//INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'hong', '111-1111')
//DBConn.java
//Oracle02.java
package com.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Oracle02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGetPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGetPost(req, resp);
}
protected void doGetPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//한글 출력을 위한 도큐먼트 타입 알려주기
resp.setContentType("text/html; charset=EUC-KR");
//html 도큐먼트를 동적 생성하기 위한 부분
PrintWriter out = resp.getWriter();
String str = "";
try {
//연결
Connection conn = DBConn.getConnection();
//쿼리 준비
//쿼리 작성시 끝에 ; 표시하지 말것.
String sql = String.format("INSERT INTO member (mid,name, tel) VALUES (memberSeq.nextval, 'lee', '123-1234')");
//쿼리 실행
//Java에서 쿼리를 실행하면
//내부적으로 COMMIT은 자동 실행됨.
//executeUpdate() 메소드는 DML문인 경우만 실행.
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
//결과 메시지
str = String.format("%d개의 행이 입력되었습니다. <br>"
, count);
}catch(Exception e) {
System.out.println(e.toString());
}
out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.println("<html>");
out.println("<head>");
out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-KR\">");
out.println("<title>Insert title here</title>");
out.println("</head>");
out.println("<body>");
out.println("<div>");
out.println("<h2>SQL 쿼리 전송 테스트1</h2>");
out.print("<div>");
out.print(str);
out.println("</div>");
out.println("</div>");
out.println("</body>");
out.println("</html>");
}
}
//web.xml
-----------------------------------------------------------------------------------
회원 테이블 자료 출력 테스트. SELECT 쿼리.
//쿼리문의 끝에 ; 표시하지 말것.
//SELECT mid, name, tel FROM member ORDER BY mid
//DBConn.java
//Oracle03.java
//web.xml
------------------------------------------------------------------------------------
문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성2. 오라클, JSP 이용.
데이터 입력과 출력을 동시 실행.
실행 예)
이름 [홍길동 ]
전화번호 [010-123-1234 ]
[ 등록 ]
----------------------------
전체 회원수 : 2명
----------------------------
회원번호 이름 전화번호
----------------------------
1 홍길동 010-123-1234
2 김길동 010-222-3333
------------------------------------------
문제) 여러명의 국어, 영어, 수학 점수를 입력 받아서
총점, 평균, 판정 결과 출력하는 JDBC 프로그램 작성. 오라클, Servlet 이용.
총점 기준 정렬(내림차순) 출력.
판정 기준은
합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상
과락 -> 과목중에 40점 미만이 있고, 평균은 60점 이상
불합격 -> 평균이 60점 미만
평균이 60점 이상 -> 합격
평균이 60점 미만 -> 불합격
합격 또는 과락 구분은 -> 국어, 영어, 수학 점수가 모두 40점 이상인 확인.
실행 예)
성적 입력 ----------------
이름 [kim ]
국어 [80 ]
영어 [90 ]
수학 [80 ]
[ 등록 ]
---------------------------------------
이름 국어 영어 수학 총점 평균 판정
---------------------------------------
1등 hong 100 100 100 300 100.0 합격
2등 kim 80 90 80 .. .. 합격
---------------------------------------
---------------------------------------------
--오라클에 성적 저장용 테이블 생성
CREATE TABLE score (
sid NUMBER --PK, 자동 번호 부여
,name VARCHAR2(10)
,kor NUMBER(3) --CK (0~100)
,eng NUMBER(3) --CK (0~100)
,mat NUMBER(3) --CK (0~100)
);
--제약 조건 추가
ALTER TABLE score
ADD CONSTRAINT score_sid_pk PRIMARY KEY (sid);
ALTER TABLE score
ADD CONSTRAINT score_kor_ck CHECK (kor BETWEEN 0 AND 100);
ALTER TABLE score
ADD CONSTRAINT score_eng_ck CHECK (eng BETWEEN 0 AND 100);
ALTER TABLE score
ADD CONSTRAINT score_mat_ck CHECK (mat BETWEEN 0 AND 100);
--자동 번호 부여 시퀀스 객체 생성
CREATE SEQUENCE scoreSeq;
--INSERT 쿼리 샘플 (쿼리 끝 부분에 ; 표시하지 말 것)
INSERT INTO score (sid, name, kor, eng, mat)
VALUES (scoreSeq.nextval, 'hong', 100, 100, 100)
--SELECT 쿼리 샘플 (쿼리 끝 부분에 ; 표시하지 말 것)
SELECT sid, name, kor, eng, mat
, (kor+eng+mat) AS tot
, (kor+eng+mat)/3 AS ave
--, 조건검사 쿼리 추가 ->합격, 불합격, 과락 출력
, CASE
WHEN ((kor+eng+mat)/3 >= 60) AND (kor<40 OR eng<40 OR mat<40) THEN '과락'
WHEN ((kor+eng+mat)/3 >= 60) THEN '합격'
ELSE '불합격'
END AS grade
FROM score
ORDER BY tot DESC
--scoreView를 이용한 SELECT 쿼리
SELECT sid, name, kor, eng, mat, tot, ave, grade
FROM scoreView
ORDER BY tot DESC
//DBConn.java
//Oracle08.java
package com.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
public class Oracle08 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGetPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGetPost(req, resp);
}
protected void doGetPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//한글 출력을 위한 도큐먼트 타입 알려주기
resp.setContentType("text/html; charset=EUC-KR");
StringBuilder str = new StringBuilder();
try {
//데이터베이스 연결 구문
Connection conn = DBConn.getConnection();
//SELECT 실행 구문 -> 회원 명단 -> 테이블 태그 이용-> STR 변수에 누적
String sql = String.format("SELECT sid, name, kor, eng, mat, tot, ave, grade FROM scoreView ORDER BY tot DESC");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql); //결과집합
int rank = 0;
while(rs.next()) { //row 단위 접근
String name = rs.getString("name");
int kor = rs.getInt("kor");
int eng = rs.getInt("eng");
int mat = rs.getInt("mat");
int tot = rs.getInt("tot");
double ave = rs.getDouble("ave");
String grade = rs.getString("grade");
str.append("<tr>");
str.append(String.format("<td class=\"style1\">%d</td><td class=\"style1\">%s</td><td class=\"style2\">%d</td><td class=\"style2\">%d</td><td class=\"style2\">%d</td><td class=\"style2\">%d</td><td class=\"style2\">%.1f</td><td class=\"style1\">%s</td>"
, ++rank, name, kor, eng, mat, tot, ave, grade));
str.append("</tr>");
}
rs.close();
} catch(Exception e) {
System.out.println(e.toString());
}
//HTML 도큐먼트를 동적 생성하기 위한 부분
PrintWriter out = resp.getWriter();
out.println(" <!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
out.println(" <html>");
out.println(" <head>");
out.println(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-KR\">");
out.println(" <title>Insert title here</title>");
out.println(" ");
out.println(" <style type=\"text/css\">");
out.println(" .subject {");
out.println(" width:80px;");
out.println(" }");
out.println(" .style1 {");
out.println(" text-align: center;");
out.println(" }");
out.println(" .style2 {");
out.println(" text-align: right;");
out.println(" }");
out.println(" </style>");
out.println(" ");
out.println(" <script type=\"text/javascript\">");
out.println(" function myFunc(obj){");
out.println(" var name = document.getElementById('name');");
out.println(" var kor = document.getElementById('kor');");
out.println(" var eng = document.getElementById(\"eng\");");
out.println(" var mat = document.getElementById(\"mat\");");
out.println(" ");
out.println(" var msg = document.getElementById(\"msg\");");
out.println(" msg.style.display = \"none\";");
out.println(" ");
out.println(" //빈칸 검사");
out.println(" if(name.value == \"\" || kor.value == \"\" || eng.value ==\"\"|| mat.value==\"\"){");
out.println(" msg.style.display = \"inline\";");
out.println(" return;");
out.println(" } ");
out.println(" //숫자 검사");
out.println(" if (kor.value.match(/[^0-9]/) || eng.value.match(/[^0-9]/)||mat.value.match(/[^0-9]/)){");
out.println(" msg.style.display = \"inline\";");
out.println(" return;");
out.println(" } ");
out.println(" //범위 검사");
out.println(" if(parseInt(kor.value)>100 ||parseInt(eng.value)>100 ||parseInt(mat.value)>100 ){");
out.println(" msg.style.display = \"inline\";");
out.println(" return;");
out.println(" }");
out.println(" //데이터 전송");
out.println(" obj.form.submit();");
out.println(" }");
out.println(" </script>");
out.println(" ");
out.println(" </head>");
out.println(" <body>");
out.println(" <div>");
out.println(" <h2>성적 처리</h2>");
out.println(" <form action=\"Oracle08_Insert\" method=\"post\">");
out.println(" 이름 <input type=\"text\" name=\"name\" id=\"name\"><br>");
out.println(" 국어 <input type=\"text\" name=\"kor\" id=\"kor\" class=\"subject\"><br>");
out.println(" 영어 <input type=\"text\" name=\"eng\" id=\"eng\" class=\"subject\"><br>");
out.println(" 수학 <input type=\"text\" name=\"mat\" id=\"mat\" class=\"subject\"><br>");
out.println(" <input type=\"button\" value=\" 등록 \"");
out.println(" onclick=\"myFunc(this)\"><br>");
out.println(" <span id=\"msg\" style=\"color:red; display:none;\">이름, 국어, 영어, 수학을 입력해야 합니다.<br>국어, 영어, 수학을 0~100 사이의 숫자를 입력해야 합니다.</span>");
out.println(" </form>");
out.println(" <h3>출력 ------------</h3>");
out.println(" <div>");
out.println(" <table border=\"1\" style=\"width:500px;\">");
out.println(" <tbody>");
out.println(" <tr>");
out.println(" <th>등수</th>");
out.println(" <th>이름</th>");
out.println(" <th>국어</th>");
out.println(" <th>영어</th>");
out.println(" <th>수학</th>");
out.println(" <th>총점</th>");
out.println(" <th>평균</th>");
out.println(" <th>판정</th>");
out.println(" </tr>");
out.println(str);
out.println(" </tbody>");
out.println(" </table>");
out.println(" </div>");
out.println(" </div>");
out.println(" </body>");
out.println(" </html>");
}
}
//Oracle08_Insert.java
package com.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
public class Oracle08_Insert extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGetPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGetPost(req, resp);
}
protected void doGetPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//한글 출력을 위한 도큐먼트 타입 알려주기
resp.setContentType("text/html; charset=EUC-KR");
req.setCharacterEncoding("euc-kr");
String name = req.getParameter("name");
String kor = req.getParameter("kor");
String eng = req.getParameter("eng");
String mat = req.getParameter("mat");
try {
//데이터베이스 연결 구문
Connection conn = DBConn.getConnection();
//INSERT 실행 구문
String sql = String.format("INSERT INTO score (sid, name, kor, eng, mat) VALUES (scoreSeq.nextval, '%s', %s, %s, %s)", name, kor, eng, mat);
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
} catch(Exception e) {
System.out.println(e.toString());
}
//sendRedirect() 메소드 이용
String url = String.format("Oracle08");
resp.sendRedirect(url);
}
}
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Servlet_20121204</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>oracle08</servlet-name>
<servlet-class>com.test.Oracle08</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>oracle08</servlet-name>
<url-pattern>/Oracle08</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>oracle08_insert</servlet-name>
<servlet-class>com.test.Oracle08_Insert</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>oracle08_insert</servlet-name>
<url-pattern>/Oracle08_Insert</url-pattern>
</servlet-mapping>
</web-app>
-----------------------------------------------------------------------------------------------------
문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성4. 오라클, Servlet 이용.
데이터 입력과 출력을 동시 실행. 삭제 기능 추가.
MemberDTO, MemberDAO를 별도 작성.
실행 예)
이름 [홍길동 ]
전화번호 [010-123-1234 ]
[ 등록 ]
-----------------------------------
전체 회원수 : 2명
-----------------------------------
회원번호 이름 전화번호 삭제
-----------------------------------
1 홍길동 010-123-1234 삭제
2 김길동 010-222-3333 삭제
-----------------------------------
//DBConn.java
//MemberDTO.java
//MemberDAO.java
//Oracle09.java
//Oracle09_Insert.java
//Oracle09_Delete.java
------------------------------------------------------------------------------------------------------
재전송 방법.
1. sendRedirect()
요청주소 -> A
응답주소 -> B
브라우저 -> A -> B
2. forward();
요청주소 -> A (서블릿)
응답주소 -> B (JSP)
브라우저 주소 -> A -> A
'Java > JSP & Servlet' 카테고리의 다른 글
[20121206] 17일차 (0) | 2012.12.14 |
---|---|
[20121205] 16일차 (JSP / Servlet / JDBC 연동) (0) | 2012.12.05 |
[20121203] 14일차 (Servlet) (0) | 2012.12.04 |
[20121122] 8일차 (직원관리 최종버젼) (0) | 2012.12.04 |
[20121121] 7일차 (직원관리) (0) | 2012.12.04 |
WRITTEN BY