내가 이해한 한도내에서의 스프링에서의 ajax 구현시 데이터 흐름도는

1. ajax 함수 호출 



2.  - ajax함수내에서 데이터 조회에 참조할 데이터변수
     - 요청주소(컨트롤러에 맵핑해서 실행할 url 주소) 설정



3. 2번항목에서 지정한 컨트롤러에 실행되는 메소드내에서는 getParameter로 해당 변수를 받아온 후
    해당 변수를 사용하여 쿼리를 날려 결과값을 setAttribute 를 사용하여 jsp 단으로 전달한다. (return "abc.jsp";)



4. jsp에서는
        - 
responseText 인 경우 예를 들어
        <%  String result = (String) request.getAttribute("result");  out.write(result);         %>

과 같은 처리.

  - responseXML 인 경우

ArrayList<자료형> abc = (캐스팅 변환)request.getAttribute("속성명");

형대로 받아 StringBuilder를 사용해서 XML 형대로 문자열을 누적 처리.

다만, jsp에서 XML 형태로 가공할때 가공 후 응답은 

response.setContentType("text/xml; charset=euc-kr");

response.getWriter().write(result.toString()); 

을 사용하여 리턴.

EX) 간단한 XML 형태

<?xml version="1.0" encoding="utf-8"?>
<users>
<user>
<name>HyunWook Kim</name>
</user>
<user>
<name>redccoma</name>
</user>
</users>



5.    out.write(result) 구문이 실행되면 ajax 관련 함수중 콜백 함수를 실행하면서 응답확인을 하고 에러검출이 안될 경우

지정한 액션 혹은 지정한 함수를 실행. 예를 들어 xmlReq.status == 200 과 같은 조건일 경우 정상응답이므로 해당 조건하에서

사용자 정의 액션처리를 바로 하거나 printData(); 와 같은 사용자 지정함수를 호출.



6. printData() 와 같은 함수를 호출한다고 가정할 경우 var result = xmlReq.responseText; 

   혹은 var result = xmlReq.responseXML;  형태로 결과 데이터를 저장.

   당연히 TEXT와 같은 경우 단일 데이터이므로 재처리할 필요 없이 원하는 액션처리를 하면 되고,

   XML의 경우 아래의 코드처럼 xml값을 분석하여 가져온 후 동적으로 html 소스생성하고 innerHTML을 통해 문서로

   최종반환하여 처리를 종료.


  ex) 간단한 XML 분석 및 HTML 동적 소스 생성

var users = result.getElementsByTagName("user");

for(var i=0;i<users.length;i++){

result += users[i].getElementsByTagName("name")[0].firstChild.nodeValue + "<br>";

}

document.getElementById("str").innerHTML = str;


아래 영문내용과는 다르게 구현된 AJAX 소스 (어차피 같은 의미임-.-)

//AjaxSend02.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">


//전역변수

var xmlReq; 

//전송 역할 함수

function myFunc() {

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

//ajax 객체

xmlReq = new XMLHttpRequest(); //IE 7.0 이상

//서버 요청주소

var url = "AjaxReceive02.jsp";

//서버요청시 데이터 전송하는 부분

//데이터가 두개 이상인 경우는

//식별자=값&식별자=값&.... 형태로 작성

var postString = "data=" + data.value;

//응답이 돌아온다면 callback 함수 호출

//이벤트 등록 부분

xmlReq.onreadystatechange = callBack;

//ajax 요청 형식 // true는 비동기

xmlReq.open("POST", url, true);

//전송하는 데이터 안에 한글이 있는 경우 인코딩방식을 알려주어야 함.

xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=euc-kr");

//ajax 요청

xmlReq.send(postString);

}

//응답 확인 함수

function callBack() {

//state는 1, 2, 3, 4의 총 4가지 상태가 있음.

//1은 요청전

//2는 요청후

//3은 서버로 응답을 보낸 상태

//4는 최종 응답을 받은 상태를 의미

if(xmlReq.readyState == 4) {

//status는 서버 응답의 종류를 의미

//200은 정상적인 처리가 되었음을 의미

//500은 JSP 실행은 했지만 오류가 발생함.

//404는 요청 주소에 해당하는 파일이 없음.

if(xmlReq.status == 200) {

//정상적인 응답을 화면에 출력하는 함수 호출

printData();

} else {

alert("처리 불가!");

}

}

}

//결과 출력 함수

function printData() {

//응답은 두가지 종류가 존재

//responseText, responseXML

var result = xmlReq.responseText;

//alert(result);

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

msg.innerHTML = result;

}


</script>

</head>

<body>

<div>

<h2>데이터 송수신 테스트2(ajax 방식)</h2>

<form>

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

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

아이디 <input type="text" name="data" id="data"><br>

<input type="button" value="중복체크" onclick="myFunc()">

</form>

<div>결과 데이터 : <span id="msg"></span></div>

</div>

</body>

</html>




//AjaxReceive02.jsp

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

    pageEncoding="EUC-KR"%>

<%


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

String result = "OK";

if(data.equals("test") || data.equals("admin") || data.equals("hong")) {

result = "Cancel";

}


//ajax 방식에서 데이터를 처리후 재전송할때 out.write(값); 을 사용해야 함.

out.write(result);

%>



JSPAndAJAXExamples


Example 1 - Server side JSP encoding

service.jsp:

  <%@page contentType="text/html; charset=UTF-8"%>
 
<%@page import="org.json.simple.JSONObject"%>
 
<%
   
JSONObject obj=new JSONObject();
    obj
.put("name","foo");
    obj
.put("num",new Integer(100));
    obj
.put("balance",new Double(1000.21));
    obj
.put("is_vip",new Boolean(true));
    obj
.put("nickname",null);
   
out.print(obj);
   
out.flush();
  %>

Please note that you need to place json_simple-1.1.jar in WEB-INF/lib before running the JSP. Then the client side will get the resulting JSON text.

Example 2 - Client side XMLHttpRequest

client.html:

<html>
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<script type="text/javascript">
function createXMLHttpRequest(){
 
// See http://en.wikipedia.org/wiki/XMLHttpRequest
 
// Provide the XMLHttpRequest class for IE 5.x-6.x:
 
if( typeof XMLHttpRequest == "undefined" ) XMLHttpRequest = function() {
   
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
   
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
   
try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
   
try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
   
throw new Error( "This browser does not support XMLHttpRequest." )
 
};
 
return new XMLHttpRequest();
}

var AJAX = createXMLHttpRequest();

function handler() {
 
if(AJAX.readyState == 4 && AJAX.status == 200) {
     
var json = eval('(' + AJAX.responseText +')');
      alert
('Success. Result: name => ' + json.name + ',' + 'balance => ' + json.balance);
 
}else if (AJAX.readyState == 4 && AJAX.status != 200) {
    alert
('Something went wrong...');
 
}
}

function show(){
  AJAX
.onreadystatechange = handler;
  AJAX
.open("GET", "service.jsp");
  AJAX
.send("");
};
</script>

<body>
 
<a href="#" onclick="javascript:show();"> Click here to get JSON data from the server side</a>
</html>

Please place client.html and service.jsp (see Example 1) in the same directory and then open client.html in IE or Firefox, click the link and you'll get result.



출처 : https://code.google.com/p/json-simple/wiki/JSPAndAJAXExamples


WRITTEN BY
빨강꼬마

,

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

재전송 방법


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
빨강꼬마

,

JSP & Servlet


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

다이나믹 웹 프로젝트 생성 후에 WebContent > WEB-INF > lib 폴더에 ojdbc14.jar 파일을 넣어야 함.






DBConn 클래스를 이용한 오라클 연결 테스트



//DBConn.java -> Java Resources > src 폴더에 패키지 생성 후 복사할 것.

package com.test;


import java.sql.*;


public class DBConn {

//Singleton pattern

private static Connection dbConn;

public static Connection getConnection()

throws SQLException, ClassNotFoundException {

if (dbConn == null) {


String url = "jdbc:oracle:thin:@localhost:1521:xe";

String user = "scott";

String pw = "tiger";

Class.forName("oracle.jdbc.driver.OracleDriver");

dbConn = DriverManager.getConnection(url, user, pw);


}

return dbConn;

}

public static void close()

throws SQLException {

if (dbConn != null) {

if (!dbConn.isClosed()) {

dbConn.close();

}

}

dbConn = null;

}

}






SQL 쿼리 전송 테스트1 (scott 계정)


//회원 테이블 생성. 회원번호, 이름, 전화번호. 시퀀스 객체 생성.

CREATE TABLE member (

mid NUMBER --PK

,name VARCHAR2(10)

,tel VARCHAR2(20)

);


ALTER TABLE member

ADD CONSTRAINT member_mid_pk PRIMARY KEY(mid);


CREATE SEQUENCE memberSeq;



//회원 테이블에 자료 입력. INSERT 쿼리.

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

//INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'hong', '111-1111')


//DBConn.java

//Oracle02.jsp

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

    pageEncoding="EUC-KR"%>

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

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

<%


String str = "";


try {

//연결

Connection conn = DBConn.getConnection();

//쿼리 준비

//쿼리 작성시 끝에 ; 표시하지 말것.

String sql = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'lee', '123-1234')");

//쿼리 실행

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

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

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

Statement stmt = conn.createStatement();

int count = stmt.executeUpdate(sql);

//결과 출력

str = String.format("%d개의 행이 입력되었습니다.<br>", count);

}catch(Exception e) {

str = e.toString();

}

%>

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

<html>

<head>

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

<title>Insert title here</title>

</head>

<body>

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

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

</body>

</html>






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

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

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



//DBConn.java

//Oracle03.jsp

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

    pageEncoding="EUC-KR"%>

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

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

<%


StringBuilder str = new StringBuilder();


try {

Connection conn = DBConn.getConnection();

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

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

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

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

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

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

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

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

}

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

//ResultSet 객체 소멸->필수

rs.close();

} catch(Exception e) {

}


%>

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

<html>

<head>

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

<title>Insert title here</title>

</head>

<body>

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

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

</body>

</html>





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

//SELECT COUNT(*) AS count FROM member


//DBConn.java

//Oracle04.jsp

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

    pageEncoding="EUC-KR"%>

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

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

<%


String str = "";

try {

Connection conn = DBConn.getConnection();

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

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

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

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

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

}

//ResultSet 객체 소멸->필수

rs.close();

} catch(Exception e) {

str = e.toString();

}


%>

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

<html>

<head>

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

<title>Insert title here</title>

</head>

<body>

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

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

</body>

</html>








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

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


실행 예)

이름 [        ]

전화번호 [         ]

[ 등록 ]


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

전체 회원수 : 2명

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

회원번호 이름   전화번호

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

1        홍길동 010-123-1234

2        김길동 010-222-3333

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




//DBConn.java

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

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

    pageEncoding="EUC-KR"%>

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

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

<%


int rowcount = 0;

String count = "";

String insert_check = "";

StringBuilder str = new StringBuilder();

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

//데이터 수신

request.setCharacterEncoding("euc-kr");

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

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

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

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

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

Statement stmt0 = conn.createStatement();

rowcount = stmt0.executeUpdate(sql0);

if (rowcount == 1) {

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

}

}

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

Statement stmt1 = conn.createStatement();

ResultSet rs1 = stmt1.executeQuery(sql1);

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

count = rs1.getString("count");

}

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

Statement stmt2 = conn.createStatement();

ResultSet rs2 = stmt2.executeQuery(sql2);

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

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

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

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

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

}


rs1.close();

rs2.close();

} catch(Exception e) {

count = e.toString();

}


%>

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

<html>

<head>

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

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

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

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

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

msg.style.display = "none";

if (name.value == "") {

msg.style.display = "inline";

name.value = "";

name.focus();

return;

}

if (tel.value == "") {

msg.style.display = "inline";

tel.value = "";

tel.focus();

return;

}

obj.form.submit();

}


</script>

</head>

<body>

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

<form method="post">

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

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

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

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

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

</form>

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

<div>

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

<table border="1">

<tbody>

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

<%=str%>

</tbody>

</table>

</div>

</body>

</html>







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

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


실행 예)

이름 [        ]

전화번호 [         ]

[ 등록 ]


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

전체 회원수 : 2명

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

회원번호 이름   전화번호

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

1        홍길동 010-123-1234

2        김길동 010-222-3333

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


//DBConn.java


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

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

    pageEncoding="EUC-KR"%>

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

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

<%


String count = "";

StringBuilder str = new StringBuilder();

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

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

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

Statement stmt1 = conn.createStatement();

ResultSet rs1 = stmt1.executeQuery(sql1);

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

count = rs1.getString("count");

}

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

Statement stmt2 = conn.createStatement();

ResultSet rs2 = stmt2.executeQuery(sql2);

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

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

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

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

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

}


rs1.close();

rs2.close();

} catch(Exception e) {

count = e.toString();

}


%>

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

<html>

<head>

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

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

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

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

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

msg.style.display = "none";

if (name.value == "") {

msg.style.display = "inline";

name.value = "";

name.focus();

return;

}

if (tel.value == "") {

msg.style.display = "inline";

tel.value = "";

tel.focus();

return;

}

obj.form.submit();

}


</script>

</head>

<body>

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

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

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

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

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

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

</form>

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

<div>

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

<table border="1">

<tbody>

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

<%=str%>

</tbody>

</table>

</div>

</body>

</html>


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

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

    pageEncoding="EUC-KR"%>

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

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

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

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

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

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

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

Statement stmt0 = conn.createStatement();

stmt0.executeUpdate(sql0);

} catch (Exception e) {

}

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

//sendRedirect() 메소드 이용.

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

response.sendRedirect(url);


%>





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

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


실행 예)

이름 [        ]

전화번호 [         ]

[ 등록 ]


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

전체 회원수 : 2명

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

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

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

1        홍길동 010-123-1234 삭제

2        김길동 010-222-3333 삭제

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


//DBconn.java

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

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

    pageEncoding="EUC-KR"%>

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

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

<%


String count = "";

StringBuilder str = new StringBuilder();

try {


Connection conn = DBConn.getConnection();


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

Statement stmt1 = conn.createStatement();

ResultSet rs1 = stmt1.executeQuery(sql1);

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

count = rs1.getString("count");

}

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

Statement stmt2 = conn.createStatement();

ResultSet rs2 = stmt2.executeQuery(sql2);

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

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

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

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

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

}


rs1.close();

rs2.close();

} catch(Exception e) {

count = e.toString();

}


%>

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

<html>

<head>

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

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

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

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

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

msg.style.display = "none";

if (name.value == "") {

msg.style.display = "inline";

name.value = "";

name.focus();

return;

}

if (tel.value == "") {

msg.style.display = "inline";

tel.value = "";

tel.focus();

return;

}

obj.form.submit();

}

function myDel(num) {

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

//URL 요청 명령

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

}

}


</script>

</head>

<body>

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

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

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

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

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

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

</form>

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

<div>

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

<table border="1">

<tbody>

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

<%=str%>

</tbody>

</table>

</div>

</body>

</html>



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

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

    pageEncoding="EUC-KR"%>

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

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

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

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

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

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

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

Statement stmt0 = conn.createStatement();

stmt0.executeUpdate(sql0);

} catch (Exception e) {

}

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

//sendRedirect() 메소드 이용.

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

response.sendRedirect(url);


%>



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

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

    pageEncoding="EUC-KR"%>

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

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

<%


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


if (mid != null) {

try {

Connection conn = DBConn.getConnection();

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

Statement stmt = conn.createStatement();

stmt.executeUpdate(sql);

} catch (Exception e) {

}

}


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

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

response.sendRedirect(url);


%>





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

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

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


판정 기준은

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

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

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


평균이 60점 이상 -> 합격

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


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


실행 예)

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

이름 [        ]

국어 [        ]

영어 [        ]

수학 [        ]

[ 등록 ]



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

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

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

1등 hong 100  100  100  300  100.0 합격

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

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



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

--오라클에 성적 저장용 테이블 생성

CREATE TABLE score (

sid NUMBER --PK, 자동 번호 부여

,name VARCHAR2(10)

,kor NUMBER(3) --CK (0~100)

,eng NUMBER(3) --CK (0~100)

,mat NUMBER(3) --CK (0~100)

);


--제약 조건 추가

ALTER TABLE score

ADD CONSTRAINT score_sid_pk PRIMARY KEY (sid);

ALTER TABLE score

ADD CONSTRAINT score_kor_ck CHECK (kor BETWEEN 0 AND 100);

ALTER TABLE score

ADD CONSTRAINT score_eng_ck CHECK (eng BETWEEN 0 AND 100);

ALTER TABLE score

ADD CONSTRAINT score_mat_ck CHECK (mat BETWEEN 0 AND 100);


--자동 번호 부여 시퀀스 객체 생성

CREATE SEQUENCE scoreSeq;



--INSERT 쿼리 샘플 (쿼리 끝 부분에 ; 표시하지 말 것)

INSERT INTO score (sid, name, kor, eng, mat)

VALUES (scoreSeq.nextval, 'hong', 100, 100, 100)


--SELECT 쿼리 샘플 (쿼리 끝 부분에 ; 표시하지 말 것)

SELECT sid, name, kor, eng, mat

, (kor+eng+mat) AS tot

, (kor+eng+mat)/3 AS ave


--, 조건검사 쿼리 추가 ->합격, 불합격, 과락 출력

, CASE

WHEN ((kor+eng+mat)/3 >= 60) AND (kor<40 OR eng<40 OR mat<40) THEN '과락'

WHEN ((kor+eng+mat)/3 >= 60) THEN '합격'

ELSE '불합격'

END AS grade


FROM score

ORDER BY tot DESC


--scoewView를 이용한 select 쿼리

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

FROM score

ORDER BY tot DESC;




//DBConn.java

//Oracle08.jsp

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

    pageEncoding="EUC-KR"%>

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

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

<%


StringBuilder str = new StringBuilder();


try {

Connection conn = DBConn.getConnection();

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

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

int rank = 1;

while (rs.next()) {

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

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

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

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

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

double ave = rs.getDouble("ave");

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

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

}

} catch(Exception e) {

}


%>

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

<html>

<head>

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

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

//데이터 검사

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

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

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

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

var korVal = parseInt(kor.value);

var engVal = parseInt(eng.value);

var matVal = parseInt(mat.value);

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

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

msg1.style.display = "none";

msg2.style.display = "none";

if (name.value == "") {

msg1.style.display = "inline";

name.focus();

return;

}

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

msg2.style.display = "inline";

kor.value = "";

kor.focus();

return;

}

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

msg2.style.display = "inline";

eng.value = "";

eng.focus();

return;

}

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

msg2.style.display = "inline";

mat.value = "";

mat.focus();

return;

}

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

obj.form.submit();

}


</script>

</head>

<body>

<div>

<h2>성적 처리</h2>

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

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

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

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

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

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

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

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

</form>

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

<div>

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

<tbody>

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

<%=str%>

</tbody>

</table>

</div>

</div>

</body>

</html>



//Oracle08_Insert.jsp

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

    pageEncoding="EUC-KR"%>

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

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

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

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

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

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

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

try {

//데이터 베이스 연결

Connection conn = DBConn.getConnection();

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

Statement stmt = conn.createStatement();

stmt.executeUpdate(sql);

} catch (Exception e) {

}


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

response.sendRedirect(url);


%>






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

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


실행 예)

이름 [        ]

전화번호 [         ]

[ 등록 ]


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

전체 회원수 : 2명

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

회원번호 이름   전화번호

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

1        홍길동 010-123-1234

2        김길동 010-222-3333

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


//DBConn.java

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

package com.test;


public class MemberDTO {

private int mid;

private String name, tel;

public int getMid() {

return mid;

}

public void setMid(int mid) {

this.mid = mid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}


}





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

package com.test;


import java.util.*;

import java.sql.*;


public class MemberDAO {

private Connection conn;

//연결 전용 메소드

public void connect() throws SQLException, ClassNotFoundException{

conn  = DBConn.getConnection();

}

//연결 해제 전용 메소드

public void close() throws SQLException{

DBConn.close();

conn = null;

}

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

public int add(MemberDTO dto) throws SQLException{

int result = 0;

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


//쿼리 실행

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

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

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

Statement stmt = conn.createStatement();

result = stmt.executeUpdate(sql);

return result;

}

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

public int count() throws SQLException {

int result = 0;

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

Statement stmt = conn.createStatement();

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

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

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

result = count;

}

rs.close();

return result;

}

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

public ArrayList<MemberDTO> lists() throws SQLException{

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

//SELECT 쿼리 준비

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

//쿼리 실행

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

Statement stmt = conn.createStatement();

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

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

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

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

//컬렉션을 리턴.

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

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

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

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

MemberDTO dto = new MemberDTO();

dto.setMid(mid);

dto.setName(name);

dto.setTel(tel);

arrayList.add(dto);

}

rs.close();

return arrayList;

}


}





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

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

    pageEncoding="EUC-KR"%>

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

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

<%


String count = "";

StringBuilder str = new StringBuilder();

MemberDAO dao = new MemberDAO();

try {


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

dao.connect();


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

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

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

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

str.append("<tr>");

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

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

}

} catch(Exception e) {

count = e.toString();

} finally {

dao.close();

}


%>

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

<html>

<head>

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

<title>Insert title here</title>

<script type="text/javascript">


function myFunc(obj) {

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

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

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

msg.style.display = "none";

if (name.value == "") {

msg.style.display = "inline";

name.value = "";

name.focus();

return;

}

if (tel.value == "") {

msg.style.display = "inline";

tel.value = "";

tel.focus();

return;

}

obj.form.submit();

}

function myDel(num) {

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

//URL 요청 명령

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

}

}


</script>

</head>

<body>

<div>

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

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

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

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

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

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

</form>

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

<div>

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

<table border="1">

<tbody>

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

<%=str%>

</tbody>

</table>

</div>

</div>

</body>

</html>




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

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

    pageEncoding="EUC-KR"%>

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

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

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

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

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

MemberDAO dao = new MemberDAO();

try {

//데이터 베이스 연결

dao.connect();


MemberDTO dto = new MemberDTO();

dto.setName(r_name);

dto.setTel(r_tel);

dao.add(dto);

} catch (Exception e) {

} finally {

dao.close();

}

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

//sendRedirect() 메소드 이용.

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

response.sendRedirect(url);


%>



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

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

    pageEncoding="EUC-KR"%>

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

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

<%


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


MemberDAO dao = new MemberDAO();


if (num != null) {

try {

dao.connect();

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

} catch (Exception e) {

}

}


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

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

response.sendRedirect(url);


%>








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

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

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


판정 기준은

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

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

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


평균이 60점 이상 -> 합격

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


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


실행 예)

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

이름 [        ]

국어 [        ]

영어 [        ]

수학 [        ]

[ 등록 ]



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

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

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

1등 hong 100  100  100  300  100.0 합격

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

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



//DBConn.java

//ScoreDTO.java

package com.test;


public class ScoreDTO {

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

private String name;

private String grade;

private double avg;

public int getSid() {

return sid;

}

public void setSid(int sid) {

this.sid = sid;

}

public int getKor() {

return kor;

}

public void setKor(int kor) {

this.kor = kor;

}

public int getEng() {

return eng;

}

public void setEng(int eng) {

this.eng = eng;

}

public int getMat() {

return mat;

}

public void setMat(int mat) {

this.mat = mat;

}

public int getTot() {

return tot;

}

public void setTot(int tot) {

this.tot = tot;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getGrade() {

return grade;

}

public void setGrade(String grade) {

this.grade = grade;

}

public double getAvg() {

return avg;

}

public void setAvg(double avg) {

this.avg = avg;

}


}






//ScoreDAO.java

package com.test;


import java.sql.*;

import java.util.*;


public class ScoreDAO {


private Connection conn;

public void connect () throws SQLException, ClassNotFoundException{

conn = DBConn.getConnection();

}


public void close() throws SQLException{

DBConn.close();

conn = null;

}


public int add(ScoreDTO dto) throws SQLException{

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

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

Statement stmt = conn.createStatement();

result = stmt.executeUpdate(sql);

return result;

}

public int remove(int num) throws SQLException{

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

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

Statement stmt = conn.createStatement();

result = stmt.executeUpdate(sql);

return result;

}


public ArrayList<ScoreDTO> lists() throws SQLException {

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

//쿼리 준비

String sql = String.format("SELECT sid, name, kor, eng, mat, (kor+eng+mat) as tot, (kor+eng+mat)/3 as ave, case when ((kor+eng+mat)/3 >= 60) and (kor<40 or eng<40 or mat<40) then '과락' when ((kor+eng+mat)/3 >= 60) then '합격' else '불합격' end as grade FROM score ORDER BY (kor+eng+mat) DESC");

//쿼리 실행

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

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

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

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

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

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

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

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

double avg = rs.getDouble("ave");

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

ScoreDTO dto = new ScoreDTO();

dto.setSid(sid);

dto.setName(name);

dto.setKor(kor);

dto.setEng(eng);

dto.setMat(mat);

dto.setTot(tot);

dto.setAvg(avg);

dto.setGrade(grade);

arrayList.add(dto);

}

rs.close();

return arrayList;

}

}





//Oracle10.jsp

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

    pageEncoding="EUC-KR"%>

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

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

<%


StringBuilder str = new StringBuilder();

ScoreDAO dao = new ScoreDAO();


try {

dao.connect();

int rank = 1;

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

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

}

} catch(Exception e) {

} finally {

dao.close();

}


%>

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

<html>

<head>

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

<title>Insert title here</title>

<style type="text/css">

.style01 {

text-align: center;

}

.style02 {

text-align: right;

}



</style>

<script type="text/javascript">


function myFunc(obj) {

//데이터 검사

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

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

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

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

var korVal = parseInt(kor.value);

var engVal = parseInt(eng.value);

var matVal = parseInt(mat.value);

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

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

msg1.style.display = "none";

msg2.style.display = "none";

if (name.value == "") {

msg1.style.display = "inline";

name.focus();

return;

}

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

msg2.style.display = "inline";

kor.value = "";

kor.focus();

return;

}

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

msg2.style.display = "inline";

eng.value = "";

eng.focus();

return;

}

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

msg2.style.display = "inline";

mat.value = "";

mat.focus();

return;

}

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

obj.form.submit();

}

function myDel(num) {

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

//URL 요청 명령

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

}

}


</script>

</head>

<body>

<div>

<h2>성적 처리</h2>

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

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

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

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

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

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

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

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

</form>

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

<div>

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

<tbody>

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

<%=str%>

</tbody>

</table>

</div>

</div>

</body>

</html>




//Oracle10_Insert.jsp

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

    pageEncoding="EUC-KR"%>

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

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

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

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

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

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

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

ScoreDAO dao = new ScoreDAO();

ScoreDTO dto = new ScoreDTO();

try {

//데이터 베이스 연결

dao.connect();

dto.setName(r_name);

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

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

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

dao.add(dto);

} catch (Exception e) {

} finally {

dao.close();

}


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

response.sendRedirect(url);


%>




//Oracle10_Delete.jsp

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

    pageEncoding="EUC-KR"%>

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

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

<% 


//데이터 수신

request.setCharacterEncoding("euc-kr");

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

ScoreDAO dao = new ScoreDAO();

ScoreDTO dto = new ScoreDTO();

try {

//데이터 베이스 연결

dao.connect();

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

} catch (Exception e) {

} finally {

dao.close();

}


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

response.sendRedirect(url);


%>



WRITTEN BY
빨강꼬마

,

문제) 임의의 수를 입력 받아서 3의 배수, 4의 배수로 구분해서 출력.


실행 예)

임의의 정수(3 또는 4의 배수) [3  ] [결과]


입력받은 숫자 : 3

구분 : 3의 배수



//Send_Receive07.jsp

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

    pageEncoding="EUC-KR"%>

<%


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


StringBuilder str = new StringBuilder();

if (number != null) {

int numInt = Integer.parseInt(number);

str.append(String.format("입력받은 숫자 : %s<br>구분 : ", number));

String numStr = "3또는 4의 배수가 아닌 수";

if (numInt%3 == 0) {

numStr = "3의 배수";

}

if (numInt%4 == 0) {

numStr = "4의 배수";

}

if (numInt%12 == 0) {

numStr = "3과 4의 공배수";

}

str.append(numStr);

}

%>

<!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 num = document.getElementById("number");

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

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


msg.style.display = "none";

msg1.style.display = "none";

if (num.value.match(/[^0-9]/)) {

msg.style.display = "inline";

num.value = "";

num.focus();

} else if (num.value == "") {

msg1.style.display = "inline";

num.value = "";

num.focus();

} else {

obj.form.submit();

}

}


</script>

</head>

<body>

<div>

<h2>데이터 송수신 테스트</h2>

<form method="post">

임의의 정수(3 또는 4의 배수) <input type="text" style="width:80px;" name="number" id="number">

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

<span id="msg" style="color:red; display:none;">숫자만 입력하세요</span>

<span id="msg1" style="color:red; display:none;">항목을 입력하세요</span>

</form>

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

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

</div>

</body>

</html>







문제) 국어, 영어, 수학 점수를 입력 받아서 판정 결과 출력. JSP 이용.

판정 기준은

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

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

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


평균이 60점 이상 -> 합격

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


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


실행 예)

국어(0~100) [XX  ]

영어(0~100) [YY  ]

수학(0~100) [ZZ  ]

[ 결과 ]


입력받은 점수 : 국어 XX, 영어 YY, 수학 ZZ

판정 결과 : 합격


//Send_Receive08.jsp

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

    pageEncoding="EUC-KR"%>

<%


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

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

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


StringBuilder str = new StringBuilder();

if (korData != null) {

int korInt = Integer.parseInt(korData);

int engInt = Integer.parseInt(engData);

int matInt = Integer.parseInt(matData);

str.append(String.format("입력받은 점수 : 국어 %s, 영어 %s, 수학 %s<br>판정 결과 : ", korData, engData, matData));

String msg = "불합격";

                

        double avg = (korInt + engInt + matInt) / 3.0;

        

        if (avg>=60) {

            if (korInt>=40 && engInt>=40 && matInt>=40) {

                msg = "합격";

            } else {

                msg = "과락";

            }

        }        

        str.append(msg);

}


%>

<!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 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 (kor.value.match(/[^0-9]/)) {

msg2.style.display = "inline";

kor.value = "";

kor.focus();

return;

}

if (eng.value.match(/[^0-9]/)) {

msg2.style.display = "inline";

eng.value = "";

eng.focus();

return;

}

if (mat.value.match(/[^0-9]/)) {

msg2.style.display = "inline";

mat.value = "";

mat.focus();

return;

}

//범위 및 빈칸 검사

if (kor.value == "" || korVal > 100) {

msg1.style.display = "inline";

kor.value = "";

kor.focus();

return;

}

if (eng.value == "" || engVal > 100) {

msg1.style.display = "inline";

eng.focus();

return;

}

if (mat.value == "" || matVal > 100) {

msg1.style.display = "inline";

mat.focus();

return;

}

obj.form.submit();

}


</script>

</head>

<body>

<div>

<h2>데이터 송수신 테스트</h2>

<form method="post">

국어(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>

<span id="msg2" style="color:red; display:none;">0~100사이의 숫자만 입력하세요.</span>

</form>

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

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

</div>

</body>

</html>






문제) 만년달력. JSP 이용.


//Send_Receive09.jsp

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

    pageEncoding="EUC-KR"%>

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

<%


String syear = request.getParameter("year");

String smonth = request.getParameter("month");


StringBuilder yearLists = new StringBuilder();

StringBuilder monthLists = new StringBuilder();

//현재 년도를 얻은 후 +10, -10년 정도를 <option> 태그에 등록

Calendar calendar = new GregorianCalendar();

int cyear = calendar.get(Calendar.YEAR);

int cmonth = calendar.get(Calendar.MONTH) + 1;

//전달받은 년도, 월이 없는 경우 현재 년도, 월로 셋팅

if (syear == null && smonth == null) {

syear = String.valueOf(cyear);

smonth = String.valueOf(cmonth);

}

//전달 받는 년도, 월을 정수형으로 형 변환

int iyear = Integer.parseInt(syear);

int imonth = Integer.parseInt(smonth);

for (int a=(cyear-10) ; a<=(cyear+10) ; a++) {

if (a == iyear) {

yearLists.append(String.format("<option value=\"%d\" selected=\"selected\">%d</option>", a, a));

} else {

yearLists.append(String.format("<option value=\"%d\">%d</option>", a, a));

}

}

for (int a=1; a<=12; a++) {

if (a == imonth) {

monthLists.append(String.format("<option value=\"%d\" selected=\"selected\">%d</option>", a, a));

} else {

monthLists.append(String.format("<option value=\"%d\">%d</option>", a, a));

}

}

//만년달력 생성 과정 추가

int total = (iyear-1)*365 + ((iyear-1)/4 - (iyear-1)/100 + (iyear-1)/400);

int[] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

for (int a=0; a<imonth-1; a++) {

total += m[a];

}

//올해가 윤년이면서 2월 이상인 경우 +1

if (imonth>=3 && (iyear%4==0 && iyear%100!=0 || iyear%400==0)) {

total++;

}

//특정 일까지의 날짜수 더하기

total += 1;

//요일 계산

int week = total%7; //0 일요일, 1 월요일, 2 화요일, ...


//해당 월의 마지막 날짜 구하기

int lastDay = m[imonth-1];

if (imonth==2 && (iyear%4==0 && iyear%100!=0 || iyear%400==0)) {

lastDay = 29;

}

//요일, 마지막 날짜를 얻은 후 달력 출력.

/* StringBuilder sb = new StringBuilder();

sb.append(String.format("----- %d년 %d월 -----<br>", iyear, imonth));

sb.append(String.format(" 일 월 화 수 목 금 토<br>"));

for (int count=1; count<=week; count++) {

sb.append(String.format("%s", ""));

}

for (int day=1; day<=lastDay; day++) {

sb.append(String.format("%d", day));

if ((day+week)%7 == 0) {

sb.append(String.format("<br>"));

}

} */

//테이블 태그를 포함한 결과 출력


String str = "";

str += "<table><tbody>";

str += "<tr><th>일</th><th>월</th><th>화</th><th>수</th><th>목</th><th>금</th><th>토</th></tr>";

str += "<tr>";

//해당월 1일의 특정 요일에 해당하는 빈 칸 출력

for (int a=1; a<=week; a++) {

str += "<td></td>";

}

//해당월 1일부터 마지막 날까지 출력

for(int a=1; a<=lastDay; a++) {

str += "<td style=\"text-align:center\">"+a+"</td>";

//일주일 단위로 행 변경

if (((a+week)%7)==0) {

str += "</tr><tr>";

}

}

str += "</tr></tbody></table>";

%>

<!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>만년달력 출력</h2>

<form method="get">

년 <select name="year" id="year" onchange="myFunc(this)"><%=yearLists%></select>

월 <select name="month" id="month" onchange="myFunc(this)"><%=monthLists%></select>

</form>

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

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

</div>

</body>

</html>






POST, GET 전송 방식



1. 클라이언트가 서버에 데이터를 전송하는 방식. 2가지.

 - 인코딩 방식이 다름.


2. POST 방식 특성

- 주소 요청시 헤더 부분에 데이터를 포함해서 전송하는 방식.

- 대용량 데이터 전송 가능

- 전송되는 데이터가 외부에 노출되지 않는다.

- 편지와 같은 특성을 가진다.

- 중요한 정보는 POST 방식으로 전송하는 것이 안전함.

- 한글 전송시 POST 방식으로 보내는 것이 안전함.

- 특수문자가 포함된 문자열 전송시 POST 방식으로 전송하는 것이 안전함.


형식

<form action="주소" method="post">

<input ...>

</form>



3. GET 방식 특성

- 주소 요청시 주소 부분에 데이터를 포함해서 전송하는 방식.

- 한정된 용량 범위의 데이터 전송 가능 (4Kb 정도 (4000자))

- 전송되는 데이터가 화면에 노출된다.

- 엽서와 같은 특성을 가진다.


형식1

<form action="주소" method="get">

<input ...>

</form>


형식2

<a href="주소?식별자=값&식별자=값&...">메시지</a>






구구단 출력 (GET 방식 전송 이용)


실행 예)

1단 2단 3단 4단 ... 9단       -> 하이퍼링크


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

5 * 1 = 5

5 * 2 = 10

...

5 * 9 = 45





//Send_Receive10.jsp

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

    pageEncoding="EUC-KR"%>

<%


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

StringBuilder str = new StringBuilder();


if (num != null) {

int data = Integer.parseInt(num);

for (int a=1; a<=9 ; a++) {

str.append(String.format("%d * %d = %d<br>", data, a, (data*a)));

}

}


%>

<!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">

</script>

<style type="text/css">

 a {text-decoration: none; color:grey;}

 a:hover {text-decoration: underline; color:red;}

</style>

</head>

<body>

<div>

<h2>데이터 송수신(GET 전송방식) 테스트</h2>

<div>

<a href="Send_Receive10.jsp?num=1">1단</a> 

<a href="Send_Receive10.jsp?num=2">2단</a> 

<a href="Send_Receive10.jsp?num=3">3단</a> 

<a href="Send_Receive10.jsp?num=4">4단</a> 

<a href="Send_Receive10.jsp?num=5">5단</a> 

<a href="Send_Receive10.jsp?num=6">6단</a> 

<a href="Send_Receive10.jsp?num=7">7단</a> 

<a href="Send_Receive10.jsp?num=8">8단</a> 

<a href="Send_Receive10.jsp?num=9">9단</a>

</div>

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

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

</div>

</body>

</html>





forward() 메소드에 의한 데이터 재전송

- 입력, 처리, 출력 페이지를 별도로 작성.


- 특징

. 재전송 (서버차원에서 URL을 다른 페이지로 변경해버린다)

. 입력(HTML이 포함된 JSP 페이지) -> 처리(Servlet) -> 출력 전용 페이지(HTML이 포함된 JSP 페이지)

. request.setAttribute() 메소드를 이용해서 데이터를 재전송시킬 수 있다.

. 받을 때는 request.getAttribute() 메소드 이용.

. 재전송 데이터는 객체 형태의 데이터 모두 가능.

. 서버 차원에서 URL을 다른 페이지로 변경하기 때문에 클라이언트는 변경된 사실을 알 수 없다.



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

//빈칸검사

//숫자검사

obj.form.submit();

}


</script>

</head>

<body>

<div>

<h3>데이터 송수신 테스트11(재전송)</h3>

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

숫자1 <input type="text" name="num1" id="num1"><br>

숫자2 <input type="text" name="num2" id="num2"><br>

연산자 <select name="op"><option value="add">더하기</option>

<option value="sub">빼기</option><option value="mul">곱하기</option>

<option value="div">나누기</option></select><br>

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

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

</form>

</div>

</body>

</html>


//Redirect11.jsp  -> 처리 전용. 데이터 재전송 과정 추가. JSP 코드만 존재

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

    pageEncoding="EUC-KR"%>

<%

//데이터 수신

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

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

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


//처리

int n1 = Integer.parseInt(num1);

int n2 = Integer.parseInt(num2);

double result = 0;

if (op.equals("add")) {

result = n1 + n2;

}

if (op.equals("sub")) {

result = n1 - n2;

}

if (op.equals("mul")) {

result = n1 * n2;

}

if (op.equals("div")) {

result = n1 / (double)n2;

}

//결과 재전송 과정-> Receive11.jsp

//request.setAttribute()는

//forward() 메소드로 페이지 재전송시

//데이터를 보내는 방법

request.setAttribute("result", Double.valueOf(result));

RequestDispatcher dispatcher

= request.getRequestDispatcher("Receive11.jsp");

dispatcher.forward(request, response);

%>




//Receive11.jsp -> 출력 전용

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

    pageEncoding="EUC-KR"%>

<%

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

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

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


//forward() 메소드로 페이지 재전송될 때

//request.setAttribute()에 의해서 전달된 데이터를

//받는 방법


Double result = (Double)request.getAttribute("result");

StringBuilder str = new StringBuilder();

str.append(String.format("전달받는 숫자 : %s, %s<br>", num1, num2));

str.append(String.format("전달받는 연산자 : %s<br>", op));

str.append(String.format("결과 : %s<br>", result.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>

<div>

<h2>데이터 송수신 테스트11(재전송)</h2>

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

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

</div>

</body>

</html>






sendRedirect() 메소드에 의한 데이터 재전송

- 입력, 처리, 출력 페이지를 별도로 작성.


- 특징

. 재전송 (서버차원에서 URL을 다른 페이지로 변경해버린다)

. 요청페이지(HTML이 포함된 JSP 페이지) -> 처리(Servlet) -> 결과페이지(HTML이 포함된 JSP 페이지)

. 클라이언트 차원에서 URL을 다른 페이지로 변경하기 때문에 클라이언트는 변경된 사실을 알 수 있다.

. 재전송 데이터는 GET 방식으로만 전송 가능.

. 재전송 가능한 데이터는 문자열 형태의 데이터만 가능.




//Send12.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>

<h3>데이터 송수신 테스트12(재전송)</h3>

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

숫자1 <input type="text" name="num1" id="num1"><br>

숫자2 <input type="text" name="num2" id="num2"><br>

연산자 <select name="op"><option value="add">더하기</option>

<option value="sub">빼기</option><option value="mul">곱하기</option>

<option value="div">나누기</option></select><br>

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

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

</form>

</div>

</body>

</html>


//Redirect12.jsp  -> 처리 전용. 데이터 재전송 과정 추가. JSP 코드만 존재

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

    pageEncoding="EUC-KR"%>

<%

//데이터 수신

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

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

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


//처리

int n1 = Integer.parseInt(num1);

int n2 = Integer.parseInt(num2);

double result = 0;

if (op.equals("add")) {

result = n1 + n2;

}

if (op.equals("sub")) {

result = n1 - n2;

}

if (op.equals("mul")) {

result = n1 * n2;

}

if (op.equals("div")) {

result = n1 / (double)n2;

}

//결과 재전송 과정-> Receive12.jsp

//sendRedirect() 메소드 이용

String url = String.format("Receive12.jsp?num1=%s&num2=%s&op=%s&result=%s", num1, num2, op, String.valueOf(result));

response.sendRedirect(url);

%>



//Receive12.jsp  -> 출력 전용

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

    pageEncoding="EUC-KR"%>

<%

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

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

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

if (op.equals("add")) {

op = "더하기";

}

if (op.equals("sub")) {

op = "빼기";

}

if (op.equals("mul")) {

op = "곱하기";

}

if (op.equals("div")) {

op = "나누기";

}


//sendRedirect() 메소드로 보낸 결과 값 받는 부분

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

StringBuilder str = new StringBuilder();

str.append(String.format("전달받는 숫자 : %s, %s<br>", num1, num2));

str.append(String.format("전달받는 연산자 : %s<br>", op));

str.append(String.format("결과 : %s<br>", result));


%>    

<!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>데이터 송수신 테스트12(재전송)</h2>

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

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

</div>

</body>

</html>






게시판 작성시


글쓰기 페이지(Write.jsp)

-> 글쓰기 버튼

-> 글쓴 내용을 전달받은 페이지는 데이터베이스 입력 과정 실행(Insert.jsp)

-> 글 목록 페이지(List.jsp)로 이동(자동-sendRedirect()) 

-> 글 목록 페이지(List.jsp) 출력

-> 주소창의 주소가 List.jsp로 변경



글쓰기 페이지(Write.jsp)

-> 글쓰기 버튼

-> 글쓴 내용을 전달받은 페이지는 데이터베이스 입력 과정 실행(Insert.jsp)

-> 글 목록 페이지(List.jsp)로 이동(자동-forward()) 

-> 글 목록 페이지(List.jsp) 출력

-> 주소창의 주소가 Insert.jsp로 변경






문제) 국어, 영어, 수학 점수를 입력 받아서 판정 결과 출력. JSP 이용. forward() 메소드 이용한 재전송 처리

판정 기준은

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

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

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


평균이 60점 이상 -> 합격

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


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


실행 예)

국어(0~100) [XX  ]

영어(0~100) [YY  ]

수학(0~100) [ZZ  ]

[ 결과 ]


입력받은 점수 : 국어 XX, 영어 YY, 수학 ZZ

판정 결과 : 합격



//Send13.jsp -> 입력 전용 화면



//Redirect13.jsp -> 처리 전용 화면. 판정 결과만 얻는다.



//Receive13.jsp -> 출력 전용 화면


WRITTEN BY
빨강꼬마

,

JSP (Java Server Page)


1. JSP는 동적인 웹 페이지를 제공하는 서버에서 실행되는 스크립트 언어. 확장자는 .jsp



2. 기본문법은 Java를 따르지만 표기법은 JSP를 따른다.




//JSPSample01.jsp -> 서버에서 실행되는 JSP 페이지는 결과가 HTML Document가 된다.


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

    pageEncoding="EUC-KR"%>

<%

String str = "Hello, JSP World!";

%>    

<!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>

<h3><%=str%></h3>

</div>

</body>

</html>




//클라이언트에게 전달된 HTML Document 의 모습

//->JSP 영역의 소스코드는 서버에서 실행되었기 때문에 클라이언트에 전달되는 것은 결과값만 전달된다.


<!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>

<h3>Hello, JSP World!</h3>  //->결과값

</div>

</body>

</html>



//최종 실행된 웹페이지 모습


Hello, JSP World!







JSP 구성 요소


1. 디렉티브(Directive) : 페이지에 대한 설정 정보 지정. 클래스의 속성을 변경.

<%@  ...  %>


2. 선언부(Declaration) : 스크립트릿이나 표현식에 사용할 사용자 정의 메소드 작성시 사용.

<%!  ...  %>


3. 표현식(Expression) : HTML 문서에 결과 값을 출력할 때 사용.

<%=   ...  %>


4. 스크립트릿(Scriptlet) : JSP에서 자바 코드를 기술할 때 사용. 미리 준비된 메소드의 내부 코드가 된다.

<%   ...   %>






서식 지정 출력 예


//JSPSample02.jsp

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

    pageEncoding="EUC-KR"%>

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

<%

// 서식 지정 출력 예

String str = String.format("%d + %d = %d <br>", 10, 20, (10+20));


%>

<!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>

<h3><%= str %></h3>

</div>

</body>

</html>





자료형


1. JSP에서의 자료형은 Java와 동일


기본자료형 - 숫자형(정수(byte, short, int, long), 실수(double, float)), 불린(boolean)형, 문자(char)형

참조형 - 클래스, 배열, 문자열(String)형







변수


1. JSP에서의 변수는 Java와 동일


2. 스크립트릿에서 선언된 변수는 지역변수. 선언부에서 선언된 변수는 멤버변수.

   스크립트릿에서 선언된 변수는 JSP 페이지 내부 전체에서 사용가능.






연산자


1. JSP에서의 연산자는 Java와 동일.


2. 산술, 관계, 논리, 대입 연산자.






제어문(if, while, for, switch, break, continue, 확장 for)


1. JSP에서의 제어문은 Java와 동일.






반복문을 이용해서 1~100사이의 짝수만 출력. JSP 이용.


//JSPSample03.jsp

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

    pageEncoding="EUC-KR"%>

<%


String str = "";

int sum = 0;


for (int a=1; a<=100; a++) {

if (a%2 == 0) {

str += a + "<br>";

sum += a;

}

}

str += sum;


%>

<!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>

<h3><%=str%></h3>

</div>

</body>

</html>






문제) 반복문을 이용해서 1~100 사이의 짝수만 출력. 

마지막에 짝수들의 합까지 출력. JSP 이용.

실행 예)

2

4

6

8

...


100

------

합계:2550


//JSPSample04.jsp

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

    pageEncoding="EUC-KR"%>

<%


StringBuilder str = new StringBuilder();

int sum = 0;


for (int a=1; a<=100; a++) {

if (a%2 == 0) {

str.append(String.format("%d<br>", a));

sum += a;

}

}

str.append(String.format("----------<br>합계: %d", sum));


%>

<!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>

<h3><%=str%></h3>

</div>

</body>

</html>






데이터 송수신 테스트1     (텍스트 박스 객체)


//send01.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>

</head>

<body>

<div>

<h2>데이터 송수신 테스트1</h2>

<!-- <form> 에서 action 속성과 method 속성 필수 -->

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

<!-- JSP에서는 식별자를 name 속성으로 구분 -->

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

전화 <input type="text" name="tel">

<!-- submit 버튼을 클릭하면 데이터 전송됨 -->

<input type="submit" value="회원가입">

</form>

</div>

</body>

</html>




//receive01.jsp -> 처리, 출력 페이지 역할. 클라이언트가 전송한 데이터 수신 및 처리. 결과 메세지를 클라이언트에게 전송.

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

    pageEncoding="EUC-KR"%>

<%

//request JSP 전용 내장 객체(HttpServletRequest 클래스)

//getParameter() 메소드는 데이터 수신 담당. 자료형은 전부 String 변수로 받아야함.

//송수신 데이터에서 한글이 포함된 경우는 인코딩 추가 필요.

request.setCharacterEncoding("euc-kr");

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

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

//결과 메시지 출력

StringBuilder str = new StringBuilder();

str.append(String.format("name: %s, tel: %s<br>", name, tel));

%>

<!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>데이터 송수신 테스트1</h2>

<h3><%=str%></h3>

</div>

</body>

</html>





데이터 송수신 테스트2 (라디오 객체)



//Send02.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 radios = document.getElementsByName("size");

var check = 0;

for (var a=0; a<radios.length; a++) {

if (radios[a].checked) {

check = radios[a].value;

}

}

//데이터 전송

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

msg.style.display = "none";

if (check == 0) {

msg.style.display = "inline";

} else {

obj.form.submit();

}

}


</script>

</head>

<body>

<div>

<h2>데이터 송수신 테스트2</h2>

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

-사이즈 선택- <br>

<input type="radio" name="size" value="1"> 싱글레귤러(1)<br>

<input type="radio" name="size" value="3"> 파인트(3)<br>

<input type="radio" name="size" value="5"> 쿼터(5)<br>

<input type="button" value="확인" onclick="myFunc(this)"><br>

<span id="msg" style="color:red; display:none;"> 사이즈를 선택해야 합니다.</span>

</form>

</div>

</body>

</html>



//Receive02.jsp

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

    pageEncoding="EUC-KR"%>

<%


//서버에 수신되는 라디오 객체의 값은 선택된 항목만 수신된다. 즉, 라디오는 최대 한개 수신

//라디오 객체의 value 속성의 값이 수신된다.

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


String str = "";

//switch(변수) {} 에서 변수값은 int형 자료만 허용함

switch (Integer.parseInt(size)) {

case 1: str = "싱글레귤러(1)"; break;

case 3: str = "파인트(3)"; break;

case 5: str = "쿼터(5)"; break;

}


%>

<!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>데이터 송수신 테스트2</h2>

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

<div>선택한 사이즈는 <%=str%>입니다.</div>

</div>

</body>

</html>






데이터 송수신 테스트3 (체크박스 객체)



//Sand03.jsp



//Receive03.jsp







문제) 이름, 국어, 영어, 수학 점수를 입력 받아서 총점, 평균 계산해서 결과 출력하는 페이지 작성. JSP 이용.


//Send04.jsp 

//-> 이름, 국어, 영어, 수학 점수를 입력받는 페이지 작성. 서버에 데이터 전송.

//-> 데이터 검사 과정 추가. 자바스크립트 이용.



//Receive04.jsp 

//-> 이름, 국어, 영어, 수학 점수를 수신해서 총점, 평균 계산 및 결과 메시지 출력.

//-> 테이블 태그 이용해서 표 형태로 출력.






문제) 거스름돈을 환폐단위로 구분해서 출력. JSP 이용

실행 예)

금액(10~1000) [ 990 ] [결과]


총액 : 990원

오백원 1개, 백원 4개, 오십원 1개, 십원 4개


//Send&Receive05.jsp








문제) 세 개의 숫자를 전달받아 가장 큰 숫자, 가장 작은 숫자 구하기. JSP 이용.

실행 예)

숫자1 [XX  ]    숫자2 [YY   ]    숫자3 [ZZ   ]    [결과]


입력 받은 숫자 : XX, YY, ZZ

가장 큰 숫자 :  ZZ

가장 작은 숫자 : XX


//Send_Receive05.jsp


WRITTEN BY
빨강꼬마

,