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);
%>
'Java > JSP & Servlet' 카테고리의 다른 글
[20121120] 6일차 (직원관리) (0) | 2012.12.04 |
---|---|
[20121119] 5일차 (직원관리) (0) | 2012.12.04 |
[20121116] 4일차 (회원관리 + 성적처리) (0) | 2012.12.04 |
[20121114] 2일차 (POST 전송방식, GET 전송방식, forward(), sendRedirect()) (0) | 2012.11.15 |
[20121113] 1일차 (JSP, JSP기본문법, JSP데이터송수신) (0) | 2012.11.15 |
WRITTEN BY