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

재전송 방법


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


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


'Java > JSP & Servlet' 카테고리의 다른 글

[20121207] 18일차 (상담게시판)  (0) 2012.12.18
[20121206] 17일차  (0) 2012.12.14
[20121204] 15일차 (Servlet JDBC 연동)  (0) 2012.12.04
[20121203] 14일차 (Servlet)  (0) 2012.12.04
[20121122] 8일차 (직원관리 최종버젼)  (0) 2012.12.04

WRITTEN BY
빨강꼬마

,