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
빨강꼬마

,