본문 바로가기
프로그래밍 공부/JSP

[DoIt] JSP - 기본 데이터 전달(JSP -> Servlet) , get/post 전달방식

by Luna_lua 2023. 1. 10.
반응형

원래는 request와 response의 내용을 모두 다뤄야 하지만 오늘은 Main페이지에서 action (form태그)를 사용하여 데이터 전달하여 받는 법을 알아보려 한다.

- 사칙연산 예제 : JSP -> Servlet 데이터 전달하여(연산은 따로 java에서)  servlet에서 응답해주는 예제 

// Main Source
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산기 - JSP 페이지</title>
</head>
<body>
   <h1>JSP로 만든 페이지</h1>
   <form action="Oper" method="post">
      <p>수식을 입력하세요(두 정수의 사칙 연산)</p>
      <input type="text" name="input">
      <button type="submit">확인</button>
   </form>
</body>
</html>

//project - java Resources - src - java파일(연산이 필요한 내용)
package com.koreait.servlet;

public class Calc {
   public int num1;
   public int num2;
   
   public Calc() {;}
   
   public Calc(int num1, int num2) {
      super();
      this.num1 = num1;
      this.num2 = num2;
   }

   //두 정수의 사칙연산 메소드 4개 선언
   public int add() {return num1 + num2;}
   public int sub() {return num1 - num2;}
   public int mul() {return num1 * num2;}
   
   /**
    * @throws ArithmeticException
    */
   public int div() {return num1 / num2;}
}
// 서블릿의 doGet, doPost를 사용하여 연산후 데이터 표현
package com.koreait.servlet;

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;

/**
 * Servlet implementation class Oper
 */
@WebServlet("/Oper")
public class Oper extends HttpServlet {
   private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Oper() {
        super();
        // TODO Auto-generated constructor stub
    }

   /**
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    */
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      response.setContentType("text/html; charset=UTF-8");
      String input = request.getParameter("input");
      int result = 0, count = 0, temp = 0;
      
      Calc c = null;
      String[] arTemp = null;
      
      PrintWriter out = response.getWriter();
      
      
      String opers = "+-*/";
      
      for (int i = 0; i < opers.length(); i++) {
         for (int j = 0; j < input.length(); j++) {
            if(opers.charAt(i) == input.charAt(j)) {
               count++;
               temp = i;
            }
         }
      }
      out.print("<p>");
      if(count == 1) {
         arTemp = input.split("\\" + opers.charAt(temp));
         try {
            c = new Calc(Integer.parseInt(arTemp[0]), Integer.parseInt(arTemp[1]));
            
            switch(temp) {
            case 0:
               result = c.add();
               break;
            case 1:
               result = c.sub();
               break;
            case 2:
               result = c.mul();
               break;
            case 3:
               result = c.div();
               break;
            }
            out.println("결과 : " + result);
         } catch (NumberFormatException e) {
            out.println("정수만 입력하세요.");
         } catch (ArithmeticException e) {
            out.println("0으로 나눌 수 없다.");
         }
      }else if(count == 0) {
         out.println("연산자를 찾지 못했습니다.");
      }else {
         out.println("두 정수의 연산만 가능합니다.");
      }
      out.println("</p>");
      out.print("<a href='calc'>JSP 페이지로 이동</a>");
   }

   /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      // TODO Auto-generated method stub
      doGet(request, response);
   }

}

 

 

+) servlet에서 응답하는데 URL을 숨기고 싶을때 사용하는 Mapping기능!

: WEB-INF -> web.xml

// Main Source
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 페이지</title>
</head>
<body>
	<h1>JSP로 만든 페이지</h1>
// Hello라는 이름으로 가면 servlet으로 이동한다.
		<form action="Hello" method="post">
       	// get 또는 post로 보내면 서블릿에서 그에 해당하는 메소드를 실행
        // post는 servlet 맵핑으로 url이 /Baby로 끝난다.
		<p>서블릿으로 이동</p>
		<button type="submit">이동</button>
	</form>
</body>
</html>


// servlet
package com.koreait.servlet;

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;

/**
 * Servlet implementation class MyServlet
 */
 // 어노테이션에 Hello로 지정되어있기 때문에 Main Source에서 action을 하면 서블릿으로 넘어간다.
@WebServlet("/Hello")
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		out.println("<html><body><h1>서블릿으로 만든 페이지</h1>");
		out.println("<a href='index.jsp'>jsp로 이동!</a></body></html>");
		out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		out.println("<html><body><h1>서블릿으로 만든 페이지</h1>");
		out.println("<a href='Baby'>jsp로 이동!</a></body></html>");
		out.close();
	}

}


// web.xml
// servlet Mapping
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>day02</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>baby-jsp</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <servlet-name>baby-jsp</servlet-name>
    <url-pattern>/Baby</url-pattern>
  </servlet-mapping>
</web-app>

=> Main Source에서 action을 진행할때 method방식은 get과 Post방식이 있다.

get방식:

   - 주소에 데이터를 추가하여 전달 하는 방식

   - ?(물음표)이후부터는 쿼리 스트링이라고 부르며 key:value 의 세트로 데이터가 전송된다.

   - 보통 쿼리 스트링에 포함되어 전송되므로 길이에 제한이 있으며, 주소에 데이터가 보이므로 보안상 취약점이 존재한다.

   - 중요한 데이터 혹은 길이가 긴 데이터는 POST방식을 사용하여 요청하는 것이 좋지만

      GET방식이 POST 방식보다 상대적으로 빠르다. 그러나 상대적일 뿐 둘다 빠르게 느껴진다.

 

post방식 :

   - 데이터를 별도로 첨부하여 전달하는 방식

   - 브라우저 히스토리에도 남지 않고 데이터는 쿼리 문자열과는 별도로 전송된다.

   - 데이터의 길이에 제한도 없으며, GET방식보다 보안성이 높다

   - GET방식보다 상대적으로 느리다

 

결론 :

전송할 데이터의 양이 작고 노출되어도 무방하다면 GET방식을 사용하고

전송할 데이터의 양이 크거나 노출이 되면 안될 데이터라면 POST방식을 사용한다.

 

// GET 방식 - 자기페이지에 request 전송
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GET 방식의 요청</title>
</head>
<body>
	<h1>GET 방식의 요청</h1>
	
	<%
		String city = request.getParameter("city");
		String zipcode = request.getParameter("zipcode");
		
		if(city == null || zipcode == null){
			response.sendRedirect("post_test.jsp");
		}else{
	%>
	<!-- 자신에게 보낼때는 action을 생략 할 수 있다. -->
	<form>
		<input type="text" value="Seoul" name="city" readonly>
		<input type="text" value="12388" name="zipcode" readonly>
		<button> GET방식으로 요청 보내기!</button>
	</form>
	
	<p>
		<%=city %> <%=zipcode %>
	</p>
	<%} %>
</body>
</html>


// POST 방식
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>POST 방식 전송 예제</title>
</head>
<body>
	<h1>POST방식 전송 예제</h1>
	<form action="get_test.jsp" method="post">
		<input type="text" value="Seoul" name="city" readonly>
		<input type="text" value="12388" name="zipcode" readonly>
		<button> POST방식으로 요청 보내기!</button>
	</form>
</body>
</html>
반응형