---------------------------------------
재전송 방법
1. sendRedirect()
요청 주소 -> A
응답 주소 -> B
브라우저 주소 -> A -> B
2. forward()
요청 주소 -> A (서블릿)
응답 주소 -> B (JSP)
브라우저 주소 -> A -> A
-----------------------------------
forward() 메소드에 의한 데이터 재전송
- 입력, 처리, 출력 페이지를 별도로 작성.
-특징
. 재전송 (서버 차원에서 URL를 다른 페이지로 변경해버린다)
. 입력(HTML이 포함된 JSP 페이지) -> 처리(Servlet) -> 출력(HTML이 포함된 JSP 페이지) 전용 페이지
. request.setAttribute() 메소드를 이용해서 데이터를 재전송시킬 수 있다.
. 받을 때는 request.getAttribute() 메소드 이용.
. 재전송 데이터는 객체 형태의 데이터는 모두 가능.
. 서버 차원에서 URL를 다른 페이지로 변경하기 때문에 클라이언트는 변경된 사실을 알 수 없다.
-----------------------------------
sendRedirect() 메소드에 의한 데이터 재전송
- 입력, 처리, 출력 페이지를 별도로 작성.
-특징
. 재전송 (서버 차원에서 URL를 다른 페이지로 변경해버린다)
. 요청페이지(HTML이 포함된 JSP 페이지) -> 처리(Servlet) -> 결과페이지(HTML이 포함된 JSP 페이지) 전용 페이지
. 클라이언트 차원에서 URL를 다른 페이지로 변경하기 때문에 클라이언트는 변경된 사실을 알 수 있다.
. 재전송 데이터는 GET 방식으로 전송 가능.
. 재전송 가능한 데이터는 문자열 형태의 데이터만 가능.
--------------------------------------
데이터 송수신 테스트9
-> Send09, Receive09를 모두 서블릿으로 변경
-> HTML 페이지가 있는 인터페이스는 JSP로 작성.
-> 액션은 Servlet이 담당.
//Send09.java -> 서블릿 클래스. 주소 처리 담당. 액션 담당.
package com.test;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Send09 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 {
//입력 화면 구성용 인터페이스 코드 작성
//-> 전용 JSP 페이지로 연결함.
RequestDispatcher dispatcher
= req.getRequestDispatcher("Send09.jsp");
dispatcher.forward(req, resp);
}
}
//Send09.jsp -> 데이터 입력용 인터페이스 담당.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!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) {
//데이터 검사
//이름, 전화번호가 비어있는지 검사하는 과정 추가
//이름, 전화번호가 채워진 경우만 데이터 전송
obj.form.submit();
}
</script>
</head>
<body>
<div>
<h2>데이터 송수신 테스트9</h2>
<!-- <form> 태그에서 action, method 속성 필수 -->
<form action="Receive09" method="post">
<!-- JSP에서는 식별자를 name 속성으로 구분 -->
이름 <input type="text" name="name"><br>
전화 <input type="text" name="tel"><br>
<!-- submit 버튼을 클릭하면 데이터 전송됨 -->
<!-- <input type="submit" value="회원가입"><br> -->
<!-- 자바스크립트 연동시 submit 대신 button 으로 처리 -->
<input type="button" value="회원가입"
onclick="myFunc(this)"><br>
<span id="msg" style="color:red; display:none;">이름, 전화번호를 채워야 합니다.</span>
</form>
</div>
</body>
</html>
//Receive09.java -> 서블릿 클래스. 주소 처리 담당. 액션 담당.
package com.test;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Receive09 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 {
//액션 처리 코드
//송수신 데이터에서 한글이 포함된 경우는 인코딩 추가 필수
req.setCharacterEncoding("euc-kr");
String name = req.getParameter("name");
String tel = req.getParameter("tel");
//결과 메시지 생성
StringBuilder str = new StringBuilder();
str.append(String.format("name:%s, tel:%s", name, tel));
//결과 메시지 재전송
req.setAttribute("str", str);
//결과 출력용 인터페이스 코드 작성
//-> 전용 JSP 페이지로 연결함.
RequestDispatcher dispatcher
= req.getRequestDispatcher("Receive09.jsp");
dispatcher.forward(req, resp);
}
}
//Receive09.jsp -> 결과 출력용 인터페이스 담당.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
//결과 메시지 수신
StringBuilder str = (StringBuilder)request.getAttribute("str");
%>
<!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>
<div>
<h2>데이터 송수신 테스트9</h2>
<h3><%=str%></h3>
</div>
</body>
</html>
//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_20121205</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>send09</servlet-name>
<!-- 서블릿 이름 -->
<servlet-class>com.test.Send09</servlet-class>
</servlet>
<!-- 클라이언트 요청 주소 -->
<servlet-mapping>
<!-- 서블릿 매핑용 이름 -->
<servlet-name>send09</servlet-name>
<!-- 클라이언트 요청 주소 이름 -->
<url-pattern>/Send09</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>receive09</servlet-name>
<servlet-class>com.test.Receive09</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>receive09</servlet-name>
<url-pattern>/Receive09</url-pattern>
</servlet-mapping>
</web-app>
//요청주소
http://localhost:8090/프로젝트이름/서블릿이름
http://localhost:8090/Servlet_20121205/Send09
--------------------------------------
데이터 송수신 테스트10
-> Send10, Receive10을 하나의 서블릿으로 변경
-> 서블릿 주소를 확장자로 통합 처리(*.확장자)
-> 서블릿 주소 분석 과정 필요
-> HTML 페이지가 있는 인터페이스는 JSP로 작성.
-> 액션은 Servlet이 담당.
//SendAndReceive10.java -> 서블릿 클래스. 주소 분석 과정. 액션 담당.
package com.test;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SendAndReceive10 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 {
//서블릿 주소 분석 과정 추가
String uri = req.getRequestURI();
//System.out.println(uri);
if (uri.indexOf("Send10.do") != -1) {
Send10(req, resp);
}
if (uri.indexOf("Receive10.do") != -1) {
Receive10(req, resp);
}
}
private void Send10(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//입력 화면 구성용 인터페이스 코드 작성
//-> 전용 JSP 페이지로 연결함.
RequestDispatcher dispatcher
= req.getRequestDispatcher("Send10.jsp");
dispatcher.forward(req, resp);
}
private void Receive10(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//송수신 데이터에서 한글이 포함된 경우는 인코딩 추가 필수
req.setCharacterEncoding("euc-kr");
String name = req.getParameter("name");
String tel = req.getParameter("tel");
//결과 메시지 생성
StringBuilder str = new StringBuilder();
str.append(String.format("name:%s, tel:%s", name, tel));
//결과 메시지 재전송
req.setAttribute("str", str);
//결과 출력용 인터페이스 코드 작성
//-> 전용 JSP 페이지로 연결함.
RequestDispatcher dispatcher
= req.getRequestDispatcher("Receive10.jsp");
dispatcher.forward(req, resp);
}
}
//Send10.jsp -> 인터페이스 담당.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!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) {
//데이터 검사
//이름, 전화번호가 비어있는지 검사하는 과정 추가
//이름, 전화번호가 채워진 경우만 데이터 전송
obj.form.submit();
}
</script>
</head>
<body>
<div>
<h2>데이터 송수신 테스트10</h2>
<!-- <form> 태그에서 action, method 속성 필수 -->
<form action="Receive10.do" method="post">
<!-- JSP에서는 식별자를 name 속성으로 구분 -->
이름 <input type="text" name="name"><br>
전화 <input type="text" name="tel"><br>
<!-- submit 버튼을 클릭하면 데이터 전송됨 -->
<!-- <input type="submit" value="회원가입"><br> -->
<!-- 자바스크립트 연동시 submit 대신 button 으로 처리 -->
<input type="button" value="회원가입"
onclick="myFunc(this)"><br>
<span id="msg" style="color:red; display:none;">이름, 전화번호를 채워야 합니다.</span>
</form>
</div>
</body>
</html>
//Receive10.jsp -> 인터페이스 담당.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
//결과 메시지 수신
StringBuilder str = (StringBuilder)request.getAttribute("str");
%>
<!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>
<div>
<h2>데이터 송수신 테스트10</h2>
<h3><%=str%></h3>
</div>
</body>
</html>
//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_20121205</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>send09</servlet-name>
<!-- 서블릿 이름 -->
<servlet-class>com.test.Send09</servlet-class>
</servlet>
<!-- 클라이언트 요청 주소 -->
<servlet-mapping>
<!-- 서블릿 매핑용 이름 -->
<servlet-name>send09</servlet-name>
<!-- 클라이언트 요청 주소 이름 -->
<url-pattern>/Send09</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>receive09</servlet-name>
<servlet-class>com.test.Receive09</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>receive09</servlet-name>
<url-pattern>/Receive09</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>sendandreceive10</servlet-name>
<!-- 서블릿 주소 분석 과정 필요 -->
<servlet-class>com.test.SendAndReceive10</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sendandreceive10</servlet-name>
<!-- 서블릿 주소를 확장자로 통합 처리
이름에 관계없이 확장자만 do인 경우는
모두 서블릿으로 처리됨 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
//요청주소
http://localhost:8090/Servlet_20121205/Send10.do
------------------------------------
문제) 이름, 국어, 영어, 수학 점수를 입력 받아서 총점, 평균 계산해서 결과 출력하는 페이지 작성. JSP&Servlet 이용.
//SungjukServlet.java ->서블릿 주소 분석 과정 추가.
//-> 이름, 국어, 영어, 수학 점수를 수신해서 총점, 평균 계산
package com.test;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SungjukServlet 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 {
//서블릿 주소 분석 과정 추가
String uri = req.getRequestURI();
//(브라우저에 요청된 주소를 프로그램적으로 읽어옴)
//System.out.println(uri); //(확인용)
//(uri.indexOf("")특정 문자열이 존재하는지 어떤지 알려주는 기능/ -1이 아니면 존재함.)
if (uri.indexOf("Send11.sung") != -1) {
Send11(req, resp);
}
if (uri.indexOf("Receive11.sung") != -1){
Receive11(req, resp);
}
}
private void Send11(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//입력 화면 구성용 인터페이스 코드 작성(예전)
//-> 전용 JSP 페이지로 연결함.
//forward()
RequestDispatcher dispatcher
= req.getRequestDispatcher("Send11.jsp");
dispatcher.forward(req, resp);
}
private void Receive11(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//액션 처리 코드
//송수신 데이터에서 한글이 포함된 경우는 인코딩 추가 필수
req.setCharacterEncoding("euc-kr");
String name = req.getParameter("name");
String kors = req.getParameter("kor");
String engs = req.getParameter("eng");
String mats = req.getParameter("mat");
int kor = Integer.parseInt(kors);
int eng = Integer.parseInt(engs);
int mat = Integer.parseInt(mats);
int tot = kor+eng+mat;
double ave= tot/(double)3;
//결과 메시지 재전송
req.setAttribute("name", name);
req.setAttribute("kor", kor);
req.setAttribute("eng", eng);
req.setAttribute("mat", mat);
req.setAttribute("tot", tot);
req.setAttribute("ave", ave);
//결과 출력용 인터페이스 코드 작성(예전)
//-> 전용 JSP 페이지로 연결함.
//forward()
RequestDispatcher dispatcher
= req.getRequestDispatcher("Receive11.jsp");
dispatcher.forward(req, resp);
}
}
//Send11.jsp
//-> 이름, 국어, 영어, 수학 점수를 입력받는 페이지 작성. 서버에 데이터 전송.
//-> 데이터 검사 과정 추가. 자바스크립트 이용.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!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 korObj = document.getElementById("kor");
var engObj = document.getElementById("eng");
var matObj = document.getElementById("mat");
var kor = korObj.value;
var eng = engObj.value;
var mat = matObj.value;
var msg1 = document.getElementById("msg1");
var msg2 = document.getElementById("msg2");
msg1.style.display = "none";
msg2.style.display = "none";
if(name.value =="" || kor =="" || mat =="" ||eng==""){
msg1.style.display ="inline";
if(name.value ==""){
name.focus();
}
if(kor==""){
korObj.focus();
}
if(mat ==""){
matObj.focus();
}
if(eng ==""){
engObj.focus();
}
} else if(kor.match(/[^0-9]/) ||eng.match(/[^0-9]/) || mat.match(/[^0-9]/)
|| parseInt(kor)>100 || parseInt(eng)>100 || parseInt(mat)>100){
msg2.style.display ="inline";
if(mat.match(/[^0-9]/) || parseInt(mat)>100){
matObj.value = "";
matObj.focus();
}
if(eng.match(/[^0-9]/) || parseInt(eng)>100){
engObj.value = "";
engObj.focus();
}
if(kor.match(/[^0-9]/) || parseInt(kor)>100){
korObj.value = "";
korObj.focus();
}
}else {
obj.form.submit();
}
}
</script>
</head>
<body>
<div>
<h2>성적 입력</h2>
<form action = "Receive11.sung" method ="post">
이름<input type="text" name="name" id="name"><br>
국어<input type="text" name="kor" id="kor">(0~100)<br>
영어<input type="text" name="eng" id="eng">(0~100)<br>
수학<input type="text" name="mat" id="mat">(0~100)<br>
<input type = "button" value="입력"
onclick = "myFunc(this)"><br>
<span id = "msg1" style ="color:red; display:none;">모든 항목을 채우세요.</span>
<span id = "msg2" style ="color:red; display:none;">점수는 범위에 맞는, 숫자를 쓰세요.</span>
</form>
</div>
</body>
</html>
//Receive11.jsp
//-> 결과 메시지 출력.
//-> 테이블 태그 이용해서 표 형태로 출력.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
String name = (String) request.getAttribute("name");
int kor = (Integer) request.getAttribute("kor");
int eng = (Integer) request.getAttribute("eng");
int mat = (Integer) request.getAttribute("mat");
int tot = (Integer) request.getAttribute("tot");
double ave = (Double) request.getAttribute("ave");
StringBuilder str = new StringBuilder();
str.append(String
.format("<table><tbody><th>이름</th><th>국어</th><th>영어</th><th>수학</th><th>총점</th><th>평균</th>"));
str.append(String
.format("<tr><td>%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%.2f</td></tr></tbody></table>",
name, kor, eng, mat, tot, ave));
%>
<!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>
<div>
<h2>성적 총점과 평균까지</h2>
<div><%=str%></div>
</div>
</body>
</html>
//web.xml -> 확장자 .sung로 서블릿 주소 등록.
<?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_20121205</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>sungjuk11</servlet-name>
<servlet-class>com.test.SungjukServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sungjuk11</servlet-name>
<url-pattern>*.sung</url-pattern>
</servlet-mapping>
</web-app>
//요청주소
http://localhost:8090/Servlet_20121205/Send11.sung
-----------------------------------------
문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성.
오라클, JSP, Servlet 이용.
데이터 입력과 출력을 동시 실행.
실행 예)
이름 [홍길동 ]
전화번호 [010-123-1234 ]
[ 등록 ]
----------------------------
전체 회원수 : 2명
----------------------------
회원번호 이름 전화번호
----------------------------
1 홍길동 010-123-1234
2 김길동 010-222-3333
----------------------------
//DBConn.java
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;
}
}
//MemberDTO.java -> 자료 처리 전용 클래스.
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;
}
}
//MemberServlet.java -> 서블릿. 서블릿 주소 분석. 입력 액션, 출력 액션.
package com.test;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
import java.util.ArrayList;
public class MemberServlet 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 {
//서블릿 주소 분석
String uri = req.getRequestURI();
if (uri.indexOf("Member.me") != -1) {
member(req, resp);
}
if (uri.indexOf("MemberInsert.me") != -1) {
memberInsert(req, resp);
}
}
private void member(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//데이터베이스 연결
//자료를 읽어온다.
//자료 재전송
String count = "";
ArrayList<MemberDTO>
arrayList = new ArrayList<MemberDTO>();
try {
//데이터베이스 연결 구문
Connection conn = DBConn.getConnection();
//SELECT 실행 구문 -> 회원수 -> count 변수에 저장
String sql1 = String.format("SELECT COUNT(*) AS count FROM member");
Statement stmt = conn.createStatement();
ResultSet rs1 = stmt.executeQuery(sql1); //결과집합
while(rs1.next()) { //row 단위 접근
int result = rs1.getInt("count"); //column 단위 접근
count = String.format("%d", result);
}
rs1.close();
//SELECT 실행 구문 -> 회원 명단 -> 테이블 태그 이용-> str 변수에 누적
String sql2 = String.format("SELECT mid, name, tel FROM member ORDER BY mid");
ResultSet rs2 = stmt.executeQuery(sql2); //결과집합
while(rs2.next()) { //row 단위 접근
int mid = rs2.getInt("mid"); //column 단위 접근
String name = rs2.getString("name");
String tel = rs2.getString("tel");
MemberDTO dto = new MemberDTO();
dto.setMid(mid);
dto.setName(name);
dto.setTel(tel);
arrayList.add(dto);
}
rs2.close();
req.setAttribute("count", count);
req.setAttribute("arrayList", arrayList);
} catch(Exception e) {
System.out.println(e.toString());
}
//MemberServlet.jsp 페이지로 연결
//forward() 메소드 이용
RequestDispatcher dispatcher
= req.getRequestDispatcher("MemberServlet.jsp");
dispatcher.forward(req, resp);
}
private void memberInsert(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//데이터 수신
//데이터베이스 연결
//자료를 입력한다.
req.setCharacterEncoding("euc-kr");
String name = req.getParameter("name");
String tel = req.getParameter("tel");
try {
Connection conn = DBConn.getConnection();
String sql = String.format("INSERT INTO member (mid,name,tel) VALUES (memberSeq.nextval, '%s', '%s')", name, tel);
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
} catch(Exception e) {
System.out.println(e.toString());
}
//Member.me 서블릿을 재요청 한다.
//sendRedirect() 메소드 이용
String url = String.format("Member.me");
resp.sendRedirect(url);
}
}
//MemberServlet.jsp -> 입력, 출력 화면 구성용 페이지. 결과 메시지 출력.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import="java.util.*" %>
<%@ page import="com.test.*" %>
<%
String count = (String)request.getAttribute("count");
StringBuilder str = new StringBuilder();
@SuppressWarnings("unchecked")
ArrayList<MemberDTO>
arrayList = (ArrayList<MemberDTO>)request.getAttribute("arrayList");
for (MemberDTO dto : arrayList) {
str.append("<tr>");
str.append(String.format("<td>%d</td>", dto.getMid()));
str.append(String.format("<td>%s</td>", dto.getName()));
str.append(String.format("<td>%s</td>", dto.getTel()));
str.append("</tr>");
}
%>
<!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 == ""
|| tel.value == "") {
msg.style.display = "inline";
return;
}
//데이터 전송
obj.form.submit();
}
</script>
</head>
<body>
<div>
<h2>이름과 전화번호를 저장하는 프로그램(JSP, Servlet, JDBC)</h2>
<form action="MemberInsert.me" 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="color:red; display:none;">이름, 전화를 입력해야 합니다.</span>
</form>
<h3>출력-------------</h3>
<div>
<h4>전체 회원수 : <%=count%> 명</h4>
<table style="width:400px;" border="1">
<tbody>
<tr><th>번호</th><th>이름</th><th>전화</th></tr>
<%=str%>
</tbody>
</table>
</div>
</div>
</body>
</html>
//web.xml -> 확장자(*.me)에 의한 서블릿 주소 등록.
<?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_20121205</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>member11</servlet-name>
<servlet-class>com.test.MemberServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>member11</servlet-name>
<url-pattern>*.me</url-pattern>
</servlet-mapping>
</web-app>
//요청주소
http://localhost:8090/Servlet_20121205/Member.me
------------------------------------------
문제) 여러명의 국어, 영어, 수학 점수를 입력 받아서
총점, 평균, 판정 결과 출력하는 JDBC 프로그램 작성.
오라클, JSP, Servlet 이용.
총점 기준 정렬(내림차순) 출력.
ScoreDTO, ScoreDAO 작성 추가.
판정 기준은
합격 -> 과목별로 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 .. .. 합격
---------------------------------------
//DBConn.java
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;
}
}
//ScoreDTO.java
package com.test;
public class ScoreDTO {
private String name;
private int kor, eng, mat;
private int tot;
private double ave;
private String grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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 double getAve() {
return ave;
}
public void setAve(double ave) {
this.ave = ave;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
}
//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 rowCount =0;
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();
rowCount = stmt.executeUpdate(sql);
return rowCount;
}
public ArrayList<ScoreDTO> lists()
throws SQLException{
ArrayList<ScoreDTO> arrayList = new ArrayList<ScoreDTO>();
String sql = String.format("SELECT 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");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
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");
ScoreDTO dto = new ScoreDTO();
dto.setName(name);
dto.setKor(kor);
dto.setEng(eng);
dto.setMat(mat);
dto.setTot(tot);
dto.setAve(ave);
dto.setGrade(grade);
arrayList.add(dto);
}
rs.close();
return arrayList;
}
}
//ScoreServlet.java
package com.test;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ScoreServlet 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 {
//서블릿 주소 분석
String uri = req.getRequestURI();
if (uri.indexOf("Score.sc") != -1) {
score(req, resp);
}
if (uri.indexOf("ScoreInsert.sc") != -1) {
scoreInsert(req, resp);
}
}
private void score(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//데이터베이스 연결
//자료를 읽어온다.
//자료 재전송
ScoreDAO dao = new ScoreDAO();
ArrayList<ScoreDTO>
arrayList = new ArrayList<ScoreDTO>();
try {
dao.connect();
arrayList = dao.lists();
} catch(Exception e) {
System.out.println(e.toString());
}
req.setAttribute("arrayList", arrayList);
//ScoreServlet.jsp 페이지로 연결
//forward() 메소드 이용
RequestDispatcher dispatcher
= req.getRequestDispatcher("ScoreServlet.jsp");
dispatcher.forward(req, resp);
}
private void scoreInsert(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//데이터 수신
//데이터베이스 연결
//자료를 입력한다.
req.setCharacterEncoding("euc-kr");
String name = req.getParameter("name");
String kor = req.getParameter("kor");
String eng = req.getParameter("eng");
String mat = req.getParameter("mat");
ScoreDAO dao = new ScoreDAO();
try {
dao.connect();
ScoreDTO dto = new ScoreDTO();
dto.setName(name);
dto.setKor(Integer.parseInt(kor));
dto.setEng(Integer.parseInt(eng));
dto.setMat(Integer.parseInt(mat));
dao.add(dto);
} catch(Exception e) {
System.out.println(e.toString());
}
//Score.sc 서블릿을 재요청 한다.
//sendRedirect() 메소드 이용
String url = String.format("Score.sc");
resp.sendRedirect(url);
}
}
//ScoreServlet.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import="java.util.*" %>
<%@ page import="com.test.*" %>
<%
StringBuilder str = new StringBuilder();
@SuppressWarnings("unchecked")
ArrayList<ScoreDTO>
arrayList = (ArrayList<ScoreDTO>)request.getAttribute("arrayList");
int rank = 0;
for (ScoreDTO dto : arrayList) {
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
, dto.getName()
, dto.getKor()
, dto.getEng()
, dto.getMat()
, dto.getTot()
, dto.getAve()
, dto.getGrade()));
str.append("</tr>");
}
%>
<!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">
.subject {
width:80px;
}
.style1 {
text-align: center;
}
.style2 {
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 msg = document.getElementById("msg");
msg.style.display = "none";
//빈칸 검사
if(name.value == "" || kor.value == "" || eng.value ==""||
mat.value==""){
msg.style.display = "inline";
return;
}
//숫자 검사
if (kor.value.match(/[^0-9]/) || eng.value.match(/[^0-9]/)
||mat.value.match(/[^0-9]/)){
msg.style.display = "inline";
return;
}
//범위 검사
if(parseInt(kor.value)>100 ||parseInt(eng.value)>100
||parseInt(mat.value)>100 ){
msg.style.display = "inline";
return;
}
//데이터 전송
obj.form.submit();
}
</script>
</head>
<body>
<div>
<h2>성적 처리(JSP, Servlet, JDBC)</h2>
<form action="ScoreInsert.sc" method="post">
이름 <input type="text" name="name" id="name"><br>
국어 <input type="text" name="kor" id="kor"
class="subject"><br>
영어 <input type="text" name="eng" id="eng"
class="subject"><br>
수학 <input type="text" name="mat" id="mat"
class="subject"><br>
<input type="button" value=" 등록 "
onclick="myFunc(this)"><br>
<span id="msg" style="color:red; display:none;">이름, 국어,
영어, 수학을 입력해야 합니다.<br>국어, 영어, 수학을 0~100 사이의 숫자를 입력
해야 합니다.</span>
</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>
//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_20121205</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>score11</servlet-name>
<servlet-class>com.test.ScoreServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>score11</servlet-name>
<url-pattern>*.sc</url-pattern>
</servlet-mapping>
</web-app>
//요청주소
http://localhost:8090/Servlet_20121205/Score.sc
--------------------------------------