JSP & Servlet


1. JSP 작성시 이클립스에서 JDBC 연동 을 하기 위해서는

다이나믹 웹 프로젝트 생성 후에 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;

}

}






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.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


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) {

str = e.toString();

}

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<h2>SQL 쿼리 전송 테스트1</h2>

<div><%=str%></div>

</body>

</html>






회원 테이블 자료 출력 테스트. SELECT 쿼리.

//쿼리문의 끝에 ; 표시하지 말것.

//SELECT mid, name, tel FROM member ORDER BY mid



//DBConn.java

//Oracle03.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


StringBuilder str = new StringBuilder();


try {

Connection conn = DBConn.getConnection();

String sql = String.format("SELECT mid, name, tel FROM member ORDER BY mid");

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

str.append("<table border=\"1\"><tbody><tr><th align=\"center\">mid</th><th align=\"center\">name</th><th align=\"center\">tel</th></tr>");

while(rs.next()) { //row 단위 접근

int mid = rs.getInt("mid"); //column 단위 접근

String name = rs.getString("name");

String tel = rs.getString("tel");

str.append(String.format("<tr><td align=\"center\">%d</td><td align=\"center\">%s</td><td align=\"center\">%s</td></tr>", mid, name, tel));

}

str.append("</tbody></table>");

//ResultSet 객체 소멸->필수

rs.close();

} catch(Exception e) {

}


%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<h2>SQL 쿼리 전송 테스트2</h2>

<div><%=str%></div>

</body>

</html>





문제) member 테이블의 회원수를 출력하는 프로그램 작성.

//SELECT COUNT(*) AS count FROM member


//DBConn.java

//Oracle04.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


String str = "";

try {

Connection conn = DBConn.getConnection();

String sql = String.format("SELECT COUNT(*) AS count FROM member");

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()) { //row 단위 접근

int count = rs.getInt("count");

str = String.format("회원수 : %d 명<br>", count);

}

//ResultSet 객체 소멸->필수

rs.close();

} catch(Exception e) {

str = e.toString();

}


%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<h2>SQL 쿼리 전송 테스트3</h2>

<div><%=str%></div>

</body>

</html>








문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성. 오라클, JSP 이용.

데이터 입력과 출력을 동시 실행. 


실행 예)

이름 [        ]

전화번호 [         ]

[ 등록 ]


----------------------------

전체 회원수 : 2명

----------------------------

회원번호 이름   전화번호

----------------------------

1        홍길동 010-123-1234

2        김길동 010-222-3333

----------------------------




//DBConn.java

//Oracle05.jsp -> 입력, 출력 화면 구성용 페이지. 액션 처리 겸용.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


int rowcount = 0;

String count = "";

String insert_check = "";

StringBuilder str = new StringBuilder();

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

//데이터 수신

request.setCharacterEncoding("euc-kr");

String r_name = request.getParameter("name");

String r_tel = request.getParameter("tel");

//submit 되기전 각 항목을 입력받기 전이라면 아래의 제어문 이 실행되지 않음.

if (r_name != null && r_tel != null) {

String sql0 = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, '%s', '%s')", r_name, r_tel);

Statement stmt0 = conn.createStatement();

rowcount = stmt0.executeUpdate(sql0);

if (rowcount == 1) {

insert_check = "정상적으로 입력이 완료되었습니다.";

}

}

String sql1 = String.format("SELECT COUNT(*) AS count FROM member");

Statement stmt1 = conn.createStatement();

ResultSet rs1 = stmt1.executeQuery(sql1);

while(rs1.next()) { //row 단위 접근

count = rs1.getString("count");

}

String sql2 = String.format("SELECT mid, name, tel FROM member ORDER BY mid");

Statement stmt2 = conn.createStatement();

ResultSet rs2 = stmt2.executeQuery(sql2);

while(rs2.next()) { //row 단위 접근

int mid = rs2.getInt("mid"); //column 단위 접근

String name = rs2.getString("name");

String tel = rs2.getString("tel");

str.append(String.format("<tr><td align=\"center\">%d</td><td align=\"center\">%s</td><td align=\"center\">%s</td></tr>", mid, name, tel));

}


rs1.close();

rs2.close();

} catch(Exception e) {

count = e.toString();

}


%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

var name = document.getElementById("name");

var tel = document.getElementById("tel");

var msg = document.getElementById("msg");

msg.style.display = "none";

if (name.value == "") {

msg.style.display = "inline";

name.value = "";

name.focus();

return;

}

if (tel.value == "") {

msg.style.display = "inline";

tel.value = "";

tel.focus();

return;

}

obj.form.submit();

}


</script>

</head>

<body>

<h2>이름 전화번호 저장 JDBC 프로그램</h2>

<form method="post">

이름 <input type="text" name="name" id="name"><br>

전화번호 <input type="text" name="tel" id="tel"><br>

<input type="button" value="결과" onclick="myFunc(this)"><br>

<span id="msg" style="display:none; color:red;">모든 항목을 입력해야함</span>

<font color="blue"><%=insert_check%></font>

</form>

<h3>출력 -------------------</h3>

<div>

<h4>전체 회원수 : <%=count%> 명</h4>

<table border="1">

<tbody>

<tr><th>번호</th><th>이름</th><th>전화</th></tr>

<%=str%>

</tbody>

</table>

</div>

</body>

</html>







문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성. 오라클, JSP 이용. JSP 파일 분할 / forward() 메소드 이용.

데이터 입력과 출력을 동시 실행. 


실행 예)

이름 [        ]

전화번호 [         ]

[ 등록 ]


----------------------------

전체 회원수 : 2명

----------------------------

회원번호 이름   전화번호

----------------------------

1        홍길동 010-123-1234

2        김길동 010-222-3333

----------------------------


//DBConn.java


//Oracle06.jsp -> 입력, 출력 화면 구성 페이지 및 데이터 베이스 select 액션 처리

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


String count = "";

StringBuilder str = new StringBuilder();

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

//Insert와 관련된 액션은 Oracle06_Insert.jsp에서 구현

String sql1 = String.format("SELECT COUNT(*) AS count FROM member");

Statement stmt1 = conn.createStatement();

ResultSet rs1 = stmt1.executeQuery(sql1);

while(rs1.next()) { //row 단위 접근

count = rs1.getString("count");

}

String sql2 = String.format("SELECT mid, name, tel FROM member ORDER BY mid");

Statement stmt2 = conn.createStatement();

ResultSet rs2 = stmt2.executeQuery(sql2);

while(rs2.next()) { //row 단위 접근

int mid = rs2.getInt("mid"); //column 단위 접근

String name = rs2.getString("name");

String tel = rs2.getString("tel");

str.append(String.format("<tr><td align=\"center\">%d</td><td align=\"center\">%s</td><td align=\"center\">%s</td></tr>", mid, name, tel));

}


rs1.close();

rs2.close();

} catch(Exception e) {

count = e.toString();

}


%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

var name = document.getElementById("name");

var tel = document.getElementById("tel");

var msg = document.getElementById("msg");

msg.style.display = "none";

if (name.value == "") {

msg.style.display = "inline";

name.value = "";

name.focus();

return;

}

if (tel.value == "") {

msg.style.display = "inline";

tel.value = "";

tel.focus();

return;

}

obj.form.submit();

}


</script>

</head>

<body>

<h2>이름 전화번호 저장 JDBC 프로그램</h2>

<form action="Oracle06_Insert.jsp" method="post">

이름 <input type="text" name="name" id="name"><br>

전화번호 <input type="text" name="tel" id="tel"><br>

<input type="button" value="결과" onclick="myFunc(this)"><br>

<span id="msg" style="display:none; color:red;">모든 항목을 입력해야함</span>

</form>

<h3>출력 -------------------</h3>

<div>

<h4>전체 회원수 : <%=count%> 명</h4>

<table border="1">

<tbody>

<tr><th>번호</th><th>이름</th><th>전화</th></tr>

<%=str%>

</tbody>

</table>

</div>

</body>

</html>


//Oracle06_Insert.jsp -> 데이터 베이스 insert 액션 처리

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

String r_name = request.getParameter("name");

String r_tel = request.getParameter("tel");

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

String sql0 = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, '%s', '%s')", r_name, r_tel);

Statement stmt0 = conn.createStatement();

stmt0.executeUpdate(sql0);

} catch (Exception e) {

}

//입력이 끝나면 Oracle06.jsp로 자동 이동해야 함.

//sendRedirect() 메소드 이용.

String url = String.format("Oracle06.jsp");

response.sendRedirect(url);


%>





문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성. 오라클, JSP 이용. JSP 파일 분할 / forward() 메소드 이용.

데이터 입력과 출력을 동시 실행.  삭제 기능 추가.


실행 예)

이름 [        ]

전화번호 [         ]

[ 등록 ]


---------------------------------

전체 회원수 : 2명

---------------------------------

회원번호 이름   전화번호     삭제

---------------------------------

1        홍길동 010-123-1234 삭제

2        김길동 010-222-3333 삭제

---------------------------------


//DBconn.java

//Oracle07.jsp -> 입력, 출력 화면 구성 페이지. 출력 액션만 처리.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


String count = "";

StringBuilder str = new StringBuilder();

try {


Connection conn = DBConn.getConnection();


String sql1 = String.format("SELECT COUNT(*) AS count FROM member");

Statement stmt1 = conn.createStatement();

ResultSet rs1 = stmt1.executeQuery(sql1);

while(rs1.next()) { //row 단위 접근

count = rs1.getString("count");

}

String sql2 = String.format("SELECT mid, name, tel FROM member ORDER BY mid");

Statement stmt2 = conn.createStatement();

ResultSet rs2 = stmt2.executeQuery(sql2);

while(rs2.next()) { //row 단위 접근

int mid = rs2.getInt("mid"); //column 단위 접근

String name = rs2.getString("name");

String tel = rs2.getString("tel");

str.append(String.format("<tr><td align=\"center\">%d</td><td align=\"center\">%s</td><td align=\"center\">%s</td><td><input type=\"button\" value=\"삭제\" onclick=\"myDel(%d)\"></td></tr>", mid, name, tel, mid));

}


rs1.close();

rs2.close();

} catch(Exception e) {

count = e.toString();

}


%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

var name = document.getElementById("name");

var tel = document.getElementById("tel");

var msg = document.getElementById("msg");

msg.style.display = "none";

if (name.value == "") {

msg.style.display = "inline";

name.value = "";

name.focus();

return;

}

if (tel.value == "") {

msg.style.display = "inline";

tel.value = "";

tel.focus();

return;

}

obj.form.submit();

}

function myDel(num) {

if (confirm("선택한 자료를 삭제하시겠습니까?")) {

//URL 요청 명령

window.location.href = "Oracle07_Delete.jsp?mid="+num;

}

}


</script>

</head>

<body>

<h2>이름 전화번호 저장 JDBC 프로그램3</h2>

<form action="Oracle07_Insert.jsp" method="post">

이름 <input type="text" name="name" id="name"><br>

전화번호 <input type="text" name="tel" id="tel"><br>

<input type="button" value="결과" onclick="myFunc(this)"><br>

<span id="msg" style="display:none; color:red;">모든 항목을 입력해야함</span>

</form>

<h3>출력 -------------------</h3>

<div>

<h4>전체 회원수 : <%=count%> 명</h4>

<table border="1">

<tbody>

<tr><th>번호</th><th>이름</th><th>전화</th><th>삭제</th></tr>

<%=str%>

</tbody>

</table>

</div>

</body>

</html>



//Oracle07_Insert.jsp  -> 입력 액션만 처리.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

String r_name = request.getParameter("name");

String r_tel = request.getParameter("tel");

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

String sql0 = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, '%s', '%s')", r_name, r_tel);

Statement stmt0 = conn.createStatement();

stmt0.executeUpdate(sql0);

} catch (Exception e) {

}

//입력이 끝나면 Oracle07.jsp로 자동 이동해야 함.

//sendRedirect() 메소드 이용.

String url = String.format("Oracle07.jsp");

response.sendRedirect(url);


%>



//Oracle07_Delete.jsp  -> 삭제 액션만 처리.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


String mid = request.getParameter("mid");


if (mid != null) {

try {

Connection conn = DBConn.getConnection();

String sql = String.format("DELETE member WHERE mid=%s", mid);

Statement stmt = conn.createStatement();

stmt.executeUpdate(sql);

} catch (Exception e) {

}

}


//삭제처리후 메인 페이지 자동 이동

String url = String.format("Oracle07.jsp");

response.sendRedirect(url);


%>





문제) 여러명의 국어, 영어, 수학 점수를 입력 받아서 

총점, 평균, 판정 결과 출력하는 JDBC 프로그램 작성. 오라클 이용. JSP 이용.

총점 기준 정렬(내림차순) 출력.


판정 기준은

합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상

과락 -> 과목중에 40점 미만이 있고, 평균은 60점 이상

불합격 -> 평균이 60점 미만


평균이 60점 이상 -> 합격

평균이 60점 미만 -> 불합격


합격 또는 과락 구분은 -> 국어, 영어, 수학 점수가 모두 40점 이상인 확인.


실행 예)

성적 입력 -------------------------

이름 [        ]

국어 [        ]

영어 [        ]

수학 [        ]

[ 등록 ]



---------------------------------------

    이름 국어 영어 수학 총점 평균 판정

---------------------------------------

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


--scoewView를 이용한 select 쿼리

SELECT sid, name, kor, eng, mat, tot, ave, grade

FROM score

ORDER BY tot DESC;




//DBConn.java

//Oracle08.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


StringBuilder str = new StringBuilder();


try {

Connection conn = DBConn.getConnection();

String sql = String.format ("SELECT name, kor, eng, mat, tot, ave, grade FROM scoreView ORDER BY tot DESC");

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

int rank = 1;

while (rs.next()) {

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 (String.format("<tr><td align=\"center\">%d등</td><td align=\"center\">%s</td><td align=\"right\">%d</td><td align=\"right\">%d</td><td align=\"right\">%d</td><td align=\"right\">%d</td><td align=\"right\">%.1f</td><td align=\"center\">%s</td></tr>", rank++, name, kor, eng, mat, tot, ave, grade));

}

} catch(Exception e) {

}


%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

//데이터 검사

var name = document.getElementById("name");

var kor = document.getElementById("kor");

var eng = document.getElementById("eng");

var mat = document.getElementById("mat");

var korVal = parseInt(kor.value);

var engVal = parseInt(eng.value);

var matVal = parseInt(mat.value);

var msg1 = document.getElementById("msg1");

var msg2 = document.getElementById("msg2");

msg1.style.display = "none";

msg2.style.display = "none";

if (name.value == "") {

msg1.style.display = "inline";

name.focus();

return;

}

if (kor.value.match(/[^0-9]/) || korVal > 100 || kor.value == "") {

msg2.style.display = "inline";

kor.value = "";

kor.focus();

return;

}

if (eng.value.match(/[^0-9]/) || engVal > 100 || eng.value == "") {

msg2.style.display = "inline";

eng.value = "";

eng.focus();

return;

}

if (mat.value.match(/[^0-9]/)|| matVal > 100 || mat.value == "") {

msg2.style.display = "inline";

mat.value = "";

mat.focus();

return;

}

//모든 데이터 확인 후 서브밋

obj.form.submit();

}


</script>

</head>

<body>

<div>

<h2>성적 처리</h2>

<form action="Oracle08_Insert.jsp" method="post">

이름 <input type="text" style="width:80px;" name="name" id="name"><br>

국어(0~100) <input type="text" style="width:80px;" name="kor" id="kor"><br>

영어(0~100) <input type="text" style="width:80px;" name="eng" id="eng"><br>

수학(0~100) <input type="text" style="width:80px;" name="mat" id="mat"><br>

<input type="button" value="등록" onclick="myFunc(this)"><br>

<span id="msg1" style="color:red; display:none;">모든 항목을 입력해야 합니다.</span><br>

<span id="msg2" style="color:red; display:none;">반드시 국어, 영어, 수학은 0~100 사이 점수를 입력해야 합니다.</span><br>

</form>

<h3>출력 -------------</h3>

<div>

<table border="1" style="width:500px;">

<tbody>

<tr><th>등수</th><th>이름</th><th>국어</th><th>영어</th><th>수학</th><th>총점</th><th>평균</th><th>판정</th></tr>

<%=str%>

</tbody>

</table>

</div>

</div>

</body>

</html>



//Oracle08_Insert.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

String r_name = request.getParameter("name");

String r_kor = request.getParameter("kor");

String r_eng = request.getParameter("eng");

String r_mat = request.getParameter("mat");

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

String sql = String.format("INSERT INTO score (sid, name, kor, eng, mat) VALUES (scoreSeq.nextval, '%s', %s, %s, %s)", r_name, r_kor, r_eng, r_mat);

Statement stmt = conn.createStatement();

stmt.executeUpdate(sql);

} catch (Exception e) {

}


String url = String.format("Oracle08.jsp");

response.sendRedirect(url);


%>






문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성4. 오라클, JSP 이용.

데이터 입력과 출력을 동시 실행. 


실행 예)

이름 [        ]

전화번호 [         ]

[ 등록 ]


----------------------------

전체 회원수 : 2명

----------------------------

회원번호 이름   전화번호

----------------------------

1        홍길동 010-123-1234

2        김길동 010-222-3333

----------------------------


//DBConn.java

//MemberDTO.java -> 자료 처리 전용 클래스. 멤버변수. getter, setter

package com.test;


public class MemberDTO {

private int mid;

private String name, tel;

public int getMid() {

return mid;

}

public void setMid(int mid) {

this.mid = mid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}


}





//MemberDAO.java -> 데이터베이스 액세스 담당 클래스. 입력, 출력, 연결용 메소드.

package com.test;


import java.util.*;

import java.sql.*;


public class MemberDAO {

private Connection conn;

//연결 전용 메소드

public void connect() throws SQLException, ClassNotFoundException{

conn  = DBConn.getConnection();

}

//연결 해제 전용 메소드

public void close() throws SQLException{

DBConn.close();

conn = null;

}

//입력 메소드 즉, INSERT 쿼리 실행

public int add(MemberDTO dto) throws SQLException{

int result = 0;

String sql = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, '%s', '%s')", dto.getName(), dto.getTel());


//쿼리 실행

//Java에서 쿼리를 실행하면 

//내부적으로 COMMIT은 자동 실행됨.

//executeUpdate() 메소드는 DML문인 경우만 실행.

Statement stmt = conn.createStatement();

result = stmt.executeUpdate(sql);

return result;

}

//회원수 출력 전용 메소드

public int count() throws SQLException {

int result = 0;

String sql = String.format("SELECT COUNT(*) AS count FROM member");

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql); //결과집합

while(rs.next()) { //row 단위 접근

int count = rs.getInt("count"); //column 단위 접근

result = count;

}

rs.close();

return result;

}

//출력 메소드 즉, SELECT 쿼리 실행

public ArrayList<MemberDTO> lists() throws SQLException{

ArrayList<MemberDTO> arrayList = new ArrayList<MemberDTO>();

//SELECT 쿼리 준비

String sql = String.format("SELECT mid, name, tel FROM member ORDER BY mid");

//쿼리 실행

//executeQuery() 메소드는 DQL문인 경우만 실행.

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql); //결과집합

//결과 집합(ResultSet)을 리턴해야 된다.

//결과 집합은 특성상 이 메소드를 벗어날 수 없다. 왜냐하면 ResultSet은 메소드 빠져나가기 전에 반드시 클로즈하기 때문.

//결과 집합을 -> 결렉션 저장

//컬렉션을 리턴.

while(rs.next()) { //row 단위 접근

int mid = rs.getInt("mid"); //column 단위 접근

String name = rs.getString("name");

String tel = rs.getString("tel");

MemberDTO dto = new MemberDTO();

dto.setMid(mid);

dto.setName(name);

dto.setTel(tel);

arrayList.add(dto);

}

rs.close();

return arrayList;

}


}





//Oracle09.jsp -> 입력, 출력 화면구성. 출력 액션 처리.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


String count = "";

StringBuilder str = new StringBuilder();

MemberDAO dao = new MemberDAO();

try {


//데이터 베이스 연결 구문

dao.connect();


//회원수를 돌려주는 메소드 호출.

count = String.format("%d", dao.count());

//회원 명단을 돌려주는 메소드 호출.

for (MemberDTO dto : dao.lists()) {

str.append("<tr>");

str.append(String.format("<td align=\"center\">%d</td><td align=\"center\">%s</td><td align=\"center\">%s</td><td><input type=\"button\" value=\"삭제\" onclick=\"myDel(%d)\"></td>", dto.getMid(), dto.getName(), dto.getTel(), dto.getMid()));

str.append("</tr>");

}

} catch(Exception e) {

count = e.toString();

} finally {

dao.close();

}


%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

var name = document.getElementById("name");

var tel = document.getElementById("tel");

var msg = document.getElementById("msg");

msg.style.display = "none";

if (name.value == "") {

msg.style.display = "inline";

name.value = "";

name.focus();

return;

}

if (tel.value == "") {

msg.style.display = "inline";

tel.value = "";

tel.focus();

return;

}

obj.form.submit();

}

function myDel(num) {

if (confirm("선택한 자료를 삭제하시겠습니까?")) {

//URL 요청 명령

window.location.href = "Oracle09_Delete.jsp?mid="+num;

}

}


</script>

</head>

<body>

<div>

<h2>이름 전화번호 저장 JDBC 프로그램4</h2>

<form action="Oracle09_Insert.jsp" method="post">

이름 <input type="text" name="name" id="name"><br>

전화번호 <input type="text" name="tel" id="tel"><br>

<input type="button" value="결과" onclick="myFunc(this)"><br>

<span id="msg" style="display:none; color:red;">모든 항목을 입력해야함</span>

</form>

<h3>출력 -------------------</h3>

<div>

<h4>전체 회원수 : <%=count%> 명</h4>

<table border="1">

<tbody>

<tr><th>번호</th><th>이름</th><th>전화</th><th>삭제</th></tr>

<%=str%>

</tbody>

</table>

</div>

</div>

</body>

</html>




//Oracle09_Insert.jsp -> 입력 액션 처리.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

String r_name = request.getParameter("name");

String r_tel = request.getParameter("tel");

MemberDAO dao = new MemberDAO();

try {

//데이터 베이스 연결

dao.connect();


MemberDTO dto = new MemberDTO();

dto.setName(r_name);

dto.setTel(r_tel);

dao.add(dto);

} catch (Exception e) {

} finally {

dao.close();

}

//입력이 끝나면 Oracle09.jsp로 자동 이동해야 함.

//sendRedirect() 메소드 이용.

String url = String.format("Oracle09.jsp");

response.sendRedirect(url);


%>



//Oracle09_Delete.jsp -> 삭제 액션 처리.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


String num = request.getParameter("num");


MemberDAO dao = new MemberDAO();


if (num != null) {

try {

dao.connect();

dao.remove(Integer.parseInt(num));

} catch (Exception e) {

}

}


//삭제처리후 메인 페이지 자동 이동

String url = String.format("Oracle09.jsp");

response.sendRedirect(url);


%>








문제) 여러명의 국어, 영어, 수학 점수를 입력 받아서 

총점, 평균, 판정 결과 출력하는 JDBC 프로그램 작성. 오라클 이용. JSP 이용. DAO / DTO 분할구현 후 이용하는 방식사용.

총점 기준 정렬(내림차순) 출력.


판정 기준은

합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상

과락 -> 과목중에 40점 미만이 있고, 평균은 60점 이상

불합격 -> 평균이 60점 미만


평균이 60점 이상 -> 합격

평균이 60점 미만 -> 불합격


합격 또는 과락 구분은 -> 국어, 영어, 수학 점수가 모두 40점 이상인 확인.


실행 예)

성적 입력 -------------------------

이름 [        ]

국어 [        ]

영어 [        ]

수학 [        ]

[ 등록 ]



---------------------------------------

    이름 국어 영어 수학 총점 평균 판정

---------------------------------------

1등 hong 100  100  100  300  100.0 합격

2등 kim   80   90   80  ..    ..   합격

---------------------------------------



//DBConn.java

//ScoreDTO.java

package com.test;


public class ScoreDTO {

private int sid, kor, eng, mat, tot;

private String name;

private String grade;

private double avg;

public int getSid() {

return sid;

}

public void setSid(int sid) {

this.sid = sid;

}

public int getKor() {

return kor;

}

public void setKor(int kor) {

this.kor = kor;

}

public int getEng() {

return eng;

}

public void setEng(int eng) {

this.eng = eng;

}

public int getMat() {

return mat;

}

public void setMat(int mat) {

this.mat = mat;

}

public int getTot() {

return tot;

}

public void setTot(int tot) {

this.tot = tot;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getGrade() {

return grade;

}

public void setGrade(String grade) {

this.grade = grade;

}

public double getAvg() {

return avg;

}

public void setAvg(double avg) {

this.avg = avg;

}


}






//ScoreDAO.java

package com.test;


import java.sql.*;

import java.util.*;


public class ScoreDAO {


private Connection conn;

public void connect () throws SQLException, ClassNotFoundException{

conn = DBConn.getConnection();

}


public void close() throws SQLException{

DBConn.close();

conn = null;

}


public int add(ScoreDTO dto) throws SQLException{

int result = 0; // 1행이 입력되었습니다. 에서 1을 반환받기 위해 사용.

String sql = String.format("INSERT INTO score (sid, name, kor, eng, mat) VALUES (scoreSeq.nextval, '%s', %d, %d, %d)", dto.getName(), dto.getKor(), dto.getEng(), dto.getMat());

Statement stmt = conn.createStatement();

result = stmt.executeUpdate(sql);

return result;

}

public int remove(int num) throws SQLException{

int result = 0; // 1행이 입력되었습니다. 에서 1을 반환받기 위해 사용.

String sql = String.format("DELETE score WHERE sid=%s", num);

Statement stmt = conn.createStatement();

result = stmt.executeUpdate(sql);

return result;

}


public ArrayList<ScoreDTO> lists() throws SQLException {

ArrayList<ScoreDTO> arrayList = new ArrayList<ScoreDTO>();

//쿼리 준비

String sql = String.format("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 (kor+eng+mat) DESC");

//쿼리 실행

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()) { //row 단위 접근

int sid = rs.getInt("sid"); //column 단위 접근

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 avg = rs.getDouble("ave");

String grade = rs.getString("grade");

ScoreDTO dto = new ScoreDTO();

dto.setSid(sid);

dto.setName(name);

dto.setKor(kor);

dto.setEng(eng);

dto.setMat(mat);

dto.setTot(tot);

dto.setAvg(avg);

dto.setGrade(grade);

arrayList.add(dto);

}

rs.close();

return arrayList;

}

}





//Oracle10.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<%


StringBuilder str = new StringBuilder();

ScoreDAO dao = new ScoreDAO();


try {

dao.connect();

int rank = 1;

for (ScoreDTO dto :dao.lists()) {

str.append (String.format("<tr><td class=\"style01\">%d등</td><td class=\"style01\">%s</td><td class=\"style02\">%d</td><td class=\"style02\">%d</td><td class=\"style02\">%d</td><td class=\"style02\">%d</td><td class=\"style02\">%.1f</td><td class=\"style01\">%s</td><td class=\"style01\"><input type=\"button\" value=\"삭제\" onclick=\"myDel(%s)\"></td></tr>", rank++, dto.getName(), dto.getKor(), dto.getEng(), dto.getMat(), dto.getTot(), dto.getAvg(), dto.getGrade(), dto.getSid()));

}

} catch(Exception e) {

} finally {

dao.close();

}


%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<style type="text/css">

.style01 {

text-align: center;

}

.style02 {

text-align: right;

}



</style>

<script type="text/javascript">


function myFunc(obj) {

//데이터 검사

var name = document.getElementById("name");

var kor = document.getElementById("kor");

var eng = document.getElementById("eng");

var mat = document.getElementById("mat");

var korVal = parseInt(kor.value);

var engVal = parseInt(eng.value);

var matVal = parseInt(mat.value);

var msg1 = document.getElementById("msg1");

var msg2 = document.getElementById("msg2");

msg1.style.display = "none";

msg2.style.display = "none";

if (name.value == "") {

msg1.style.display = "inline";

name.focus();

return;

}

if (kor.value.match(/[^0-9]/) || korVal > 100 || kor.value == "") {

msg2.style.display = "inline";

kor.value = "";

kor.focus();

return;

}

if (eng.value.match(/[^0-9]/) || engVal > 100 || eng.value == "") {

msg2.style.display = "inline";

eng.value = "";

eng.focus();

return;

}

if (mat.value.match(/[^0-9]/)|| matVal > 100 || mat.value == "") {

msg2.style.display = "inline";

mat.value = "";

mat.focus();

return;

}

//모든 데이터 확인 후 서브밋

obj.form.submit();

}

function myDel(num) {

if (confirm("선택한 자료를 삭제하시겠습니까?")) {

//URL 요청 명령

window.location.href = "Oracle10_Delete.jsp?sid="+num;

}

}


</script>

</head>

<body>

<div>

<h2>성적 처리</h2>

<form action="Oracle10_Insert.jsp" method="post">

이름 <input type="text" style="width:80px;" name="name" id="name"><br>

국어(0~100) <input type="text" style="width:80px;" name="kor" id="kor"><br>

영어(0~100) <input type="text" style="width:80px;" name="eng" id="eng"><br>

수학(0~100) <input type="text" style="width:80px;" name="mat" id="mat"><br>

<input type="button" value="등록" onclick="myFunc(this)"><br>

<span id="msg1" style="color:red; display:none;">모든 항목을 입력해야 합니다.</span><br>

<span id="msg2" style="color:red; display:none;">반드시 국어, 영어, 수학은 0~100 사이 점수를 입력해야 합니다.</span><br>

</form>

<h3>출력 -------------</h3>

<div>

<table border="1" style="width:500px;">

<tbody>

<tr><th>등수</th><th>이름</th><th>국어</th><th>영어</th><th>수학</th><th>총점</th><th>평균</th><th>판정</th><th>삭제</th></tr>

<%=str%>

</tbody>

</table>

</div>

</div>

</body>

</html>




//Oracle10_Insert.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

String r_name = request.getParameter("name");

String r_kor = request.getParameter("kor");

String r_eng = request.getParameter("eng");

String r_mat = request.getParameter("mat");

ScoreDAO dao = new ScoreDAO();

ScoreDTO dto = new ScoreDTO();

try {

//데이터 베이스 연결

dao.connect();

dto.setName(r_name);

dto.setKor(Integer.parseInt(r_kor));

dto.setEng(Integer.parseInt(r_eng));

dto.setMat(Integer.parseInt(r_mat));

dao.add(dto);

} catch (Exception e) {

} finally {

dao.close();

}


String url = String.format("Oracle10.jsp");

response.sendRedirect(url);


%>




//Oracle10_Delete.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.sql.*" %>

<%@ page import="com.test.*" %>

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

String sid = request.getParameter("sid");

ScoreDAO dao = new ScoreDAO();

ScoreDTO dto = new ScoreDTO();

try {

//데이터 베이스 연결

dao.connect();

dao.remove(Integer.parseInt(sid));

} catch (Exception e) {

} finally {

dao.close();

}


String url = String.format("Oracle10.jsp");

response.sendRedirect(url);


%>



WRITTEN BY
빨강꼬마

,