[20121114] 2일차 (POST 전송방식, GET 전송방식, forward(), sendRedirect())
Java/JSP & Servlet 2012. 11. 15. 17:25문제) 임의의 수를 입력 받아서 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 -> 출력 전용 화면
'Java > JSP & Servlet' 카테고리의 다른 글
[20121120] 6일차 (직원관리) (0) | 2012.12.04 |
---|---|
[20121119] 5일차 (직원관리) (0) | 2012.12.04 |
[20121116] 4일차 (회원관리 + 성적처리) (0) | 2012.12.04 |
[20121115] 3일차 (JSP와 JDBC 연동, DTO클래스와 DAO클래스 연동 코딩) (0) | 2012.11.15 |
[20121113] 1일차 (JSP, JSP기본문법, JSP데이터송수신) (0) | 2012.11.15 |
WRITTEN BY