Everything has an expiration date
[JSP & JDBC & Oracle] 20231212 [프로그램소스] - ScoreList, WebApp09_scott, ScoreInsert, 개인 필기 본문
[JSP & JDBC & Oracle] 20231212 [프로그램소스] - ScoreList, WebApp09_scott, ScoreInsert, 개인 필기
Jelly-fish 2023. 12. 13. 01:49
WebApp09
ScoreList.jsp
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="com.util.DBConn"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
String str = "";
Connection conn = DBConn.getConnection();
String sql = "SELECT SID, NAME, KOR, ENG, MAT"
+ ", (KOR+ENG+MAT) AS TOT"
+ ", (KOR+ENG+MAT)/3 AS AVG FROM TBL_SCORE"
+ " ORDER BY SID";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
str += "<table class='table'>";
str += "<tr>";
str += "<th>번호</th>";
str += "<th>이름</th>";
str += "<th>국어점수</th>";
str += "<th>영어점수</th>";
str += "<th>수학점수</th>";
str += "<th>총점</th>";
str += "<th>평균</th>";
str += "</tr>";
while (rs.next())
{
str += "<tr>";
str += "<td>" + rs.getString("SID") + "</td>";
str += "<td>" + rs.getString("NAME") + "</td>";
str += "<td>" + rs.getString("KOR") + "</td>";
str += "<td>" + rs.getString("ENG") + "</td>";
str += "<td>" + rs.getString("MAT") + "</td>";
str += "<td>" + rs.getString("TOT") + "</td>";
//str += "<td>" + String.format("%.1f", Double.parseDouble(rs.getString("AVG"))) + "</td>";
str += "<td>" + String.format("%.1f", rs.getDouble("AVG")) + "</td>";
str += "</tr>";
}
str += "</table>";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ScoreList.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<style type="text/css">
.errorMsg {color: red; font-size: small; display: none;}
input {width: 200px;}
button {width: 208px; height: 50px; font-weight: bold;}
#numTitle {width: 50px;}
#nameTitle {width: 100px;}
#telTitle {width: 160px;}
.errMsg {font-size: small; color: red; display: none;}
.contentTd {text-align: center;}
</style>
</style>
<script type="text/javascript">
function inputCheck()
{
// 이름에 해당하는 입력값 가져오기
// 국어, 영어, 수학 점수에 해당하는 입력값 가져오기
var stuName = document.getElementById("stuName");
var strKor = document.getElementById("kor");
var strEng = document.getElementById("eng");
var strMat = document.getElementById("mat");
var errName = document.getElementById("errorName");
var errKor = document.getElementById("errorKor");
var errEng = document.getElementById("errorEng");
var errMat = document.getElementById("errorMat");
errName.style.display = "none";
errKor.style.display = "none";
errEng.style.display = "none";
errMat.style.display = "none";
var kor = Number(strKor.value);
var eng = Number(strEng.value);
var mat = Number(strMat.value);
var flag = true;
// 이름의 값이 입력되지 않았으면 오류.
// 국어, 영어, 수학 점수 중 어느 하나라도
// 0 ~ 100 까지의 수가 아닐 때 오류.
if (stuName.value == "")
{
errName.style.display = "inline";
return false;
}
if (kor < 0 || kor > 100 || strKor.value == "" || isNaN(strKor.value))
{
errKor.style.display = "inline";
return false;
}
if (eng < 0 || eng > 100 || strEng.value == "" || isNaN(strEng.value))
{
errEng.style.display = "inline";
return false;
}
if (mat < 0 || mat > 100 || strMat.value == "" || isNaN(strMat.value))
{
errMat.style.display = "inline";
return false;
}
}
</script>
</head>
<body>
<!--
○ WebApp09
- 여러 명의 이름, 국어점수, 영어점수, 수학점수를 입력받아
총점과 평균을 계산하여 리스트를 출력해줄 수 있는 프로그램을 구현한다.
- 리스트 출력 시 번호 오름차순 정렬하여 출력할 수 있도록 한다.
- 데이터베이스 연동하여 처리한다.
(TBL_SCORE, SCORESEQ 활용)
- 즉, 성적 처리 프로그램을 데이터베이스 연동하여
JSP 로 구성할 수 있도록 한다.
데이터베이스 연결 및 데이터 처리
------------------------------------------------------------------------
성적 처리
이름(*) [ textbox ] → 이름 입력 확인
국어점수 [ textbox ] → 0 ~ 100 사이의 정수가 입력되었는지 확인
영어점수 [ textbox ] → 0 ~ 100 사이의 정수가 입력되었는지 확인
수학점수 [ textbox ] → 0 ~ 100 사이의 정수가 입력되었는지 확인
< 성적 추가 > → button
번호 이름 국어점수 영어점수 수학점수 총점 평균
1 임하성 90 80 70 xxx xx.x
2 이윤수 80 70 60 xxx xx.x
------------------------------------------------------------------------
○ WebApp09_scott.sql
ScoreList.jsp
ScoreInsert.jsp
com.util.DBConn.java
-->
<div>
성적 처리
<br>
<form action='ScoreInsert.jsp' method='post' onsubmit="return inputCheck()">
<table>
<tr>
<td>이름(*)</td>
<td>
<input type="text" name="stuName" id="stuName">
</td>
<td class='errorMsg' id='errorName'>이름은 필수 입력사항입니다.</td>
</tr>
<tr>
<td>국어점수</td>
<td>
<input type="text" name="kor" id="kor">
</td>
<td class='errorMsg' id='errorKor'>국어 점수를 0 ~ 100까지의 정수로 입력하세요.</td>
</tr>
<tr>
<td>영어점수</td>
<td>
<input type="text" name="eng" id="eng">
</td>
<td class='errorMsg' id='errorEng'>영어 점수를 0 ~ 100까지의 정수로 입력하세요.</td>
</tr>
<tr>
<td>수학점수</td>
<td>
<input type="text" name="mat" id="mat">
</td>
<td class='errorMsg' id='errorMat'>수학 점수를 0 ~ 100까지의 정수로 입력하세요.</td>
</tr>
<tr>
<td>
<button type="submit" style='width: 150px'>
성적 추가
</button>
</td>
</tr>
</table>
</form>
</div>
<div>
<%=str %>
</div>
</body>
</html>
WebApp09_scott.sql
[Data Base - Oracle : TBL_SCORE]
SELECT USER
FROM DUAL;
--==>> SCOTT
--○ 기존 테이블 제거
DROP TABLE TBL_SCORE;
--==>> Table TBL_SCORE이(가) 삭제되었습니다.
--○ 실습 테이블 생성 (TBL_SCORE)
CREATE TABLE TBL_SCORE
( SID NUMBER
, NAME VARCHAR2(30)
, KOR NUMBER(3)
, ENG NUMBER(3)
, MAT NUMBER(3)
);
--==>> Table TBL_SCORE이(가) 생성되었습니다.
--○ 생성된 테이블에 제약조건 추가
ALTER TABLE TBL_SCORE
ADD CONSTRAINT SCORE_SID_PK PRIMARY KEY(SID);
--==>> Table TBL_SCORE이(가) 변경되었습니다.
ALTER TABLE TBL_SCORE
ADD CONSTRAINT SCORE_KOR_CK CHECK(KOR BETWEEN 0 AND 100);
--==>> Table TBL_SCORE이(가) 변경되었습니다.
ALTER TABLE TBL_SCORE
ADD CONSTRAINT SCORE_ENG_CK CHECK(ENG BETWEEN 0 AND 100);
--==>> Table TBL_SCORE이(가) 변경되었습니다.
ALTER TABLE TBL_SCORE
ADD CONSTRAINT SCORE_MAT_CK CHECK(MAT BETWEEN 0 AND 100);
--==>> Table TBL_SCORE이(가) 변경되었습니다.
--○ 기존 시퀀스 제거
DROP SEQUENCE SCORESEQ;
--==>> Sequence SCORESEQ이(가) 삭제되었습니다.
--○ 실습 관련 시퀀ㅅ 다시 생성
CREATE SEQUENCE SCORESEQ
NOCACHE;
--==>> Sequence SCORESEQ이(가) 생성되었습니다.
--○ 리스트 조회 쿼리문 구성
-- (번호, 이름, 국어점수, 영어점수, 수학점수, 총점, 평균)
SELECT SID, NAME, KOR, ENG, MAT
, (KOR+ENG+MAT) AS TOT
, (KOR+ENG+MAT)/3 AS AVG
FROM TBL_SCORE
ORDER BY SID;
--> 한 줄 구성
SELECT SID, NAME, KOR, ENG, MAT, (KOR+ENG+MAT) AS TOT, (KOR+ENG+MAT)/3 AS AVG FROM TBL_SCORE ORDER BY SID;
;
--○ 데이터 입력 쿼리문 구성
INSERT INTO TBL_SCORE(SID, NAME, KOR, ENG, MAT)
VALUES(SCORESEQ.NEXTVAL, '임하성', 90, 80, 70);
--> 한 줄 구성
INSERT INTO TBL_SCORE(SID, NAME, KOR, ENG, MAT) VALUES(SCORESEQ.NEXTVAL, '임하성', 90, 80, 70)
;
--==>> 1 행 이(가) 삽입되었습니다.
--○ 샘플 데이터 추가 입력
INSERT INTO TBL_SCORE(SID, NAME, KOR, ENG, MAT) VALUES(SCORESEQ.NEXTVAL, '이윤수', 80, 70, 60)
;
--==>> 1 행 이(가) 삽입되었습니다.
--○ 확인
SELECT *
FROM TBL_SCORE;
--==>>
/*
========================
SID NAME KOR ENG MAT
========================
1 임하성 90 80 70
2 이윤수 80 70 60
========================
*/
--○ 커밋
COMMIT;
--==>> 커밋 완료.
ScoreInsert.jsp
<%@page import="java.sql.Statement"%>
<%@page import="com.util.DBConn"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("stuName");
String kor = request.getParameter("kor");
String eng = request.getParameter("eng");
String mat = request.getParameter("mat");
Connection conn = DBConn.getConnection();
String sql = String.format("INSERT INTO TBL_SCORE(SID, NAME, KOR, ENG, MAT)"
+ " VALUES(SCORESEQ.NEXTVAL, '%s', %s, %s, %s)", name, kor, eng, mat);
Statement stmt = conn.createStatement();
int result = stmt.executeUpdate(sql);
stmt.close();
DBConn.close();
if (result < 1)
{
response.sendRedirect("Error.jsp");
}
else
{
response.sendRedirect("ScoreList.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ScoreInsert.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
</body>
</html>
개인 필기 (20231212 이후 설명 내용)
[*.http 통신 방식]
[client] → [Server]
① url 입력 ② Http Request (a.html)
③ Server 수신
[a.html]
④ 자원 검색
⑤ 파일 스트림
↓
⑥ 네트워크 스트림
장부 안에 따로 보관됨
─────────────────
*.html (html 파일 모음)
─────────────────
*.jsp (jsp 파일 모음)
─────────────────
:
─────────────────
아파치와 톰캣은 별개이다.
톰캣 : 웹 컨테이너로서의 역할 수행한다.
※ ⑦ 임시 페이지 생성 → 실제 Server의 서비스로 등록됨
Http Response를 기반으로 응답이 이루어진다.
⑧ 캐시
(서버에서 응답한 내용을 클라이언트가 수신했을 때의 내용이 캐시로 들어간다.)
(그 캐시에 들어있는 내용을 브라우저에서 다시 로드하는 것.)
⑨ 로드
kr도메인 관리 dns 서버 → 어디로 찾아가야 하는지 알려줌.
(한번에 알려주는 게 아니라, url의 계층구조 절차에 맞게 주소를 계속해서 알려주면서 찾아가는 과정을 거치게 됨.)
방화벽, 라우터 통과
분산 트래픽...
캐시에 채워져있는 것이 있는지 확인
갱신된 내용이 없을 경우 캐시에 있는 내용 그대로 로드한다.
캐시를 지우려고 하면, 브라우저가 느려질 수 있음을 안내하는 이유가 이것이다.
*.jsp
① 클라이언트 url 입력
② Server 전송
③ WAS 전송
서버에 들어왔으면 Web Application Server라는 객체가 있다. 클라이언트의 요청을 이것에 전달.
④ a.jsp
↓
⑤ 서블릿 변환
↓
⑥ a.java
↓
⑦ a.java 컴파일
↓
⑧ a.class
[Servlet Container]
[ service() → doGet() ]
[ → doPost() ]
⑨ a.html 호출 결과 Html 그리기
⑩ Server에서 서비스 제공 준비가 끝났다는 것을 알림.
⑪ html 파일을 받은 이후엔 html 전송방식과 똑같다.
④ 자원 검색
파일 스트림
↓
네트워크 스트림
장부 안에 따로 보관됨
─────────────────
*.html (html 파일 모음)
─────────────────
*.jsp (jsp 파일 모음)
─────────────────
:
─────────────────
아파치와 톰캣은 별개이다.
톰캣 : 웹 컨테이너로서의 역할 수행한다.
※ 임시 페이지 생성 → 실제 Server의 서비스로 등록됨
Http Response를 기반으로 응답이 이루어진다.
캐시
(서버에서 응답한 내용을 클라이언트가 수신했을 때의 내용이 캐시로 들어간다.)
(그 캐시에 들어있는 내용을 브라우저에서 다시 로드하는 것.)