본문 바로가기
국비교육기관/수업

43일차_Servlet_데이터전송 실습_Get/Post

by 밀키스 2021. 5. 12.

21.05.12

 Servlet 

@실습 - 서버로 숫자 전송, 더하기

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h1>서버로 두개의 숫자 더하는 실습</h1>
	<form action="Plus">
	<input type="text" name="num1">+
	<input type="text" name="num2">
	<input type="submit" value="Send">
	</form>
</body>
</html>

위는 해당 실습에 대한 HTML 파일의 소스 코드이다.

  - Plsu란 Mapping 값을 갖는 파일로 데이터를 전송한다.

  - num1, num2라는 두개의 데이터를 입력 받는다.

package com.servelet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

위는 Java 파일의 Import할 Library 내용이다. 굳이 적을 필요는 없다만... 일단...

@WebServlet("/Plus")
public class PlusServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String data = request.getParameter("num1");
		String num = request.getParameter("num2");
		String ip = request.getRemoteAddr();
		System.out.println("요청이 들어옴..");
		System.out.println(ip);
		System.out.println("전달 받은 데이터 >> "+data+"&&"+num);
		response.setContentType("text/html; charset=euc-kr");
		PrintWriter out = response.getWriter();

데이터를 전달받기 위한 내용

  - data와 num이라는 변수에 HTML파일에서 입력받은 2개의 데이터를 String 형태로 저장한다.

  - 데이터를 가져오기 위해  request.getParameter 라는 명령어를 사용하였다.

  - ip라는 변수에는 그냥 혹시나... 나한테 들어온 사람의 ip를 표출한다.

  -  response.setContestType 은... 어제(42일차) 배운 MIME Type에 대한 내용.

  - HTML형식으로 데이터를 적을 수 있다.

  -  PrintWriter 라는 객체를 불러와 Server를 통해 데이터를 전달할 수 있다.

		out.print("<body>");
		out.print("<h1>"+data+"+"+num+"=");
		try {
		out.print(Integer.parseInt(num)+Integer.parseInt(data)+"</h1>");
		}catch (NumberFormatException e) {
			out.print("숫자를 입력하셔야 합니다^^");		}	}}

위에서 전달받은 데이터를 HTML 명령어를 통해 해당 실습을 진행한다.  - 별거 없다. 전달 받은 데이터는 String형이고, 나는 수를 더하기 위함이기 때문에, int형으로 변환하기 위한     integer.parseInt  명령어를 사용하였다. 

  --> 이거는 좀 예상외이지만 int형 데이터의 크기를 넘어서는 숫자값을 입력해도

        NumberFormatException  에러가 난다....

 

아래는 실습 결과에 대한 화면이다.

숫자가 아닌 문자를 입력하면 첫번째와 같은 문구가 뜨도록 하였다.

그리고 위에서 언급했듯이 int형보다 큰 길이의 데이터를 입력하면 같은 문구가 뜬다...

@실습 - 이미지 선택하기

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<form action='img'>
	<h1>원하는 숫자를 입력하세요</h1>
	<h3>하나만 입력할 것</h3>
	<h3>1,one 2,two 3,three</h3>
	<input type='text' name='img'>
	<input type="submit" value="Send">
	</form>
</body>
</html>

해당 실습에 대한 HTML 파일

package com.servelet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

JAVA 파일의 호출한 Library

@WebServlet("/img")
public class imgServlet extends HttpServlet {
	protected void service(HttpServletRequest request, 
			HttpServletResponse response) 
			throws ServletException, IOException {
		// 사용자에게 데이터를 전달
		String img = request.getParameter("img");
		if(img.equals("2")) {
			img="'https://mblogthumb-phinf.pstatic.net/20160320_76/dramakr_14584672268641mQ7V_JPEG/cbuhf5dgnofkkoepdpmz.jpg?type=w800'";}
		else {
			img="'img/img"+img+".jpg'";}

img 라는 폴더에 이미지 파일 3개를 넣어 놓았다.

예외적으로 2번 이미지 같은 경우에는 파일이 아닌 특정 주소에서 "이미지 주소" 값을 긁어온 것.

선택한 파일이 2번이라면 이미지 주소값을 호출하도록 만들었다.

  - 조건문을 보면 img라는 변수 값을 변경해주는 모습을 볼 수 있다.

  - img라는 폴더에 img+이미지파일의 번호 와 같이 저장되어있기 때문에 위와 같이 변경해주었다.

 

아래는 이미지 파일을 저장한 폴더의 모습

		System.out.println("요청이 들어옴..");
		String ip = request.getRemoteAddr();
		System.out.println(ip);
		System.out.println("전달 받은 데이터 >> "+img);
		response.setContentType("text/html; charset=euc-kr");
		PrintWriter out = response.getWriter();
		out.print("<body bgcolor = '#F7E4E0' text='white'>");
		out.print("<img src="+img);
		out.print("</body>");}}

요청이 들어오면 전달 받은 데이터에 따른 img 파일을 나타내도록 하였다.

  - 위에서 변경한 img 변수로 이미지 파일을 불러온다.

  - img 태그의 src 옵션에 해당 변수를 넣어준 모습이다.

  - 그리고 그냥 예쁘라고 body 태그에 "bgcolor"를 주었당...

 

아래는 해당 실습에 대한 결과이다.

@실습 - 입력한 숫자만큼 Table 생성

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form action='room'>
	몇 개의 방을 만들까요?
	<input type='text' name='room'>
	<input type="submit" value="Send">
	</form>
</body>
</html>

HTML 파일

package com.servelet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

Java 파일의 호출한 Library

@WebServlet("/room")
public class MakeTableServlet extends HttpServlet {
	protected void service(HttpServletRequest request,
	HttpServletResponse response) 
			throws ServletException, IOException {
		String room = request.getParameter("room");
		System.out.println("요청이 들어옴..");
		String ip = request.getRemoteAddr();
		System.out.println(ip);
		System.out.println("전달 받은 데이터 >> "+room);
		response.setContentType("text/html; charset=euc-kr");
		PrintWriter out = response.getWriter();

위의 실습에서 계속 똑같이 진행된 구문이다. 데이터를 전달 받고, 설정하고...

		Random r = new Random();
		out.print("<table border='1'>");
		out.print("<tr>");
        
		for(int i=0;i<Integer.parseInt(room);i++) {
			out.print("<td style='font-size:50px;color:rgb("+r.nextInt(255)+","+
					r.nextInt(255)+","+r.nextInt(255)+");'>");
			out.print(i+1);
			out.print("</td>");		}
		out.print("</tr>");
		out.print("</table>");	}}

Table을 활용한 실습. 입력받은 숫자의 수 만큼 <td> 태그를 생성한다.

  -  style 을 활용하여 <td> 태그 안의 글자 크기와 색을 변경해주었다.

  - Table의 경우 <td> 태그 안에 있는 글자의 크기를 키우면 자동으로 크기가 늘어난다.

  - 글자안의 색은  color  옵션의  rgb 를 사용하였고, 보는것과 같이 값은  Random 을 활용하였다.

 

아래는 해당실습에 대한 결과화면이다.

@Servlet - Get / Post 

1. Get방식의 특징 

  - URL 주소를 통해서 데이터를 전달 -> 데이터 노출 -> 보안상 문제
    ex) http://localhost:8081/Servlet/room?room=13
    ?name=value 형식 : QueryString (쿼리스트링) 
  - 노출이 되는 정보들 (검색키워드, 글번호, 상품번호 등)
  - 파일전달은 안되며, 적은 양의 텍스트만 전달된다. (1024 byte)

2. Post 방식의 특징 

  - HTTP 구조에 데이터를 담아서 전달 -> 데이터 노출X -> 보안강화
  - 중요한 데이터(개인정보, 회원정보, 로그인정보 등...)를 서버에 전달할 때 사용하는 방식
  - 파일전달이 가능하며, 대용량 텍스트 전달 또한 가능하다.

 

일단 먼저... 중요한건 해당 내용에 대해 이해는 못했다... 아래는 실습에 대한 결과이다.

 

좌측부터 Get방식, Post 방식

일단 위와 같이 Get 방식의 경우 QueryString의 형태로 주소값에 데이터가 나타나 있다.

예로 들면 영화 사이트나, 게시글 페이지 들어가보면 페이지의 순서나 게시물 번호 등이 나타나 있지 않는가?? 그것과 같다.

 

우측의 Post방식의 경우 주소쪽에 Get방식과 다르게 데이터가 표출되지 않는다.

때문에, 로그인창과 같이 중요한 정보를 입력하는 등의 작업을 하는 페이지에 사용된다고 한다.

 

이 두개의 차이에 대해 정확하게 알지는 못하지만... 내가 확연히 알 수 있는것을 정리하면..

 

Get 방식URL주소를 통해 데이터가 전달된다. ( URL에 전송 받은 데이터가 표출된다. ) - QueryString

파일전달이 되지 않고, 적응 양의 Text만 전달된다.

 

Post 방식HTTP라는 구조에 데이터를 담아 전달된다. -> URL에 표출되지 않는다.

Form Data라는 구간에 값이 나타난다.

파일전달이 되며, 대용량의 Text도 전달 가능하다.

 

아 그리고 참고로 Get과 Post가 하는건 Service도 할 수 있다. ( 처음 Servlet 파일 만들 때 체크하는 함수 )

 

정도... 아래는 수업시간에 일단 캡쳐해봤다. 공부하자.. ㅠㅠㅠ

반응형

댓글