라이브러리는 도서관 아닌가요

JSP 5 - form 태그 POST 요청, HttpServletRequest의 메서드 본문

Java/JSP

JSP 5 - form 태그 POST 요청, HttpServletRequest의 메서드

veryhi 2022. 1. 5. 01:11

 

기존 코드 & 프로젝트 생성: https://verycrazy.tistory.com/96

 

JSP 3 - @WebServlet 어노테이션, 프로젝트 생성

앞에 살펴본 귀찮고 반복적일 것 같은 내용이 있다. 이전 글: https://verycrazy.tistory.com/95?category=1033905 JSP 2 - Context, Servlet Class 앞 내용: https://verycrazy.tistory.com/93?category=1033905..

verycrazy.tistory.com

 

 

 

바로 이전 포스트( https://verycrazy.tistory.com/97?category=1033905 )에서

 

GET 요청을 보낼 때 쿼리 값을 붙여서 사용자의 데이터를 얻는 방법을 살펴봤다.

 

 

 

이런 식으로 GET에 줄줄이 쿼리 값을 붙여서 요청을 날릴 수 있겠지만,

 

url의 길이 제한에 걸린다.

 

따라서 이럴 때에는 POST 형식에 맞춰 데이터를 보낼 수 있다.

 

 

 

post 방식으로 데이터를 날릴 때,

 

html의 대강의 코드는 아래와 같다.

 

( 당연히 method를 get으로 지정하면 다시 GET 방식으로 변한다. )

 

<form action="registerMenu" method="post">
     <div>
          <label>메뉴 이름: </label>
          <input name="menu" type="text" />
     </div>
     <div>
          <label>설명: </label>
          <input name="explanation" type="text" />
     </div>
     <div>
          <input type="submit" value="제출" />
     </div>
</form>

 

 

 

서블릿 클래스 안의 service 메서드 블럭에서는,

 

@WebServlet("사용자에게_받을_경로")

public class 머시깽이클래스 extends HttpServlet{

     @Override

     public void service(HttpServletRequest request, HttpServletResponse response){

 

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

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

         

          ~ 이하 menu, explanation 사용 코드 ~

 

     }

}

 

 

 

이런 식으로 받아올 수 있다.

 

menu나 explanation 두 객체에 저장되는 값이

 

String이 아니라 null일 수도 있는 경우에 대비하여

 

당연히 null 처리를 해주어야 한다. 

 

 

 

 

 

 

 

 

 

상태 유지 - application, session, cookie

사용자가 POST 같은 요청을 보낼 때 입력한 데이터는 서버 단에서 잠깐 보관한다.

 

따라서 데이터가 증발할 수 있는데,

 

이것을 찰나의 시간 동안 잡아두기 위해

 

서블릿 단에서 아래의 기능들을 사용할 수 있다.

 

1. application

2. session

3. cookie

 

하나씩 살펴보자.

 

 

 

 

 

 

 

 

 

 

1. application 저장

위의 HttpServlet을 구현한

 

서블릿 클래스 구현체에 코드를 추가해보면,

 

# service 메서드 안에 추가되는 코드

ServletContext application = request.getServletContext();

application.setAttribute("menu_", menu);

application.setAttribute("explanation_", explanation);

이런 식으로 변수에 받아놓고 계속 사용할 수 있다.

 

 

 

데이터를 꺼낼 때는,

 

# service 메서드 안에 추가되는 코드

String menu = (String)application.getAttribute("menu_");

return 타입이 Object 또는 null이기 때문에 이에 대한 타입 변환을 해주어야 한다.

 

application은 전역적인 범위에서 데이터를 뽑아 쓸 수 있는 특징이 있다.

 

 

 

 

 

 

 

 

 

 

2. session 저장
HttpSession session = request.getSession();

session.setAttribute("menu_", menu);

session.setAttribute("explanation_", explanation);

 

 

 

데이터를 꺼낼 때는,

String menu = (String)session.getAttribute("menu_");

application이랑 거의 뭐 다를 게 없다.

 

session은 말 그대로 현재 접속 중인 세션이 유지되는 동안 데이터를 저장한다.

 

서버 단과의 연결이 종료된 후 다시 세션을 실행시키는 시점엔 기존의 저장된 데이터가 날아간다는 뜻이다.

 

 

 

앞서 살펴본 application과 session은

 

서버 단인 WAS 내부에 잡혀 있는 공간이다.

 

application은 공용적으로 사용하고,

 

session은 개별 서블릿에 할당된다.

 

데이터의 속성에 따라 둘에 분류하여 저장하도록 하자.

 

 

 

 

 

 

 

 

 

 

3. cookie

 

위와 다르게 session 보다 더욱 개별적인 공간으로

 

브라우저의 도움을 받는 쿠키가 있다.

 

따져보면 이 데이터는 사용자가 가지고 있다.

 

원할 때마다 쿠키를 꺼내쓸 수 있고,

 

사용자에게 비교적 자유롭다.

 

 

 

// 쿠키 저장 - "cookie"라는 이름으로 저장된 키 값

String c = request.getParameter("cookie");

Cookie cookie = new Cookie("cookie", c); // (key, value)

reponse.addCookie(cookie);

 

// 쿠키 읽기

Cookie[] cookies = request.getCookies(); // array

String ___c = "";

 

// 키 값에 해당하는 쿠키 찾기

if(cookies != null){

     for(Cookie cookie : cookies){

          if("cookie".equals(cookie.getName())) // search with the key value

               ___c = cookie.getValue();

     }

}

 

# 항상 타입에 유의하자. =_=

 

// 출력

response.getWriter().println("cookie= " + ___c);

 

// 쿠키 받아오는 위치 설정

cookie.setPath("/특정경로/");      // 앞에서 선언된 Cookie cookie = new Cookie("cookie", c); 사용

 

특이한 점은 경로의 페이지가 없어 에러가 나더라도 쿠키는 잘 오간다는 점이다.

 

// 쿠키 제한 시간 설정

cookie.setMaxAge(3600); // 1시간 뒤에 사라지는 쿠키

 

쿠키가 사라지는 default 값은 브라우저 프로세스 종료 시점이다.

 

// 리디렉팅할 페이지 설정

response.sendRedirect("리디렉팅_할_페이지.html");

 

 

 

의외로 오래 저장해야 한다면 쿠키가 그 역할을 도맡는다.

 

아무래도 원격 서버의 session에게 주는 부담을 최소화하기 위해서이다.

 

서버 자원이 아무래도 공유 자원 같은 성질이 있다보니,

 

최대한 부담을 줄이는 게 맞지 않을까?

 

 

 

 

 

 

 

 

 

 

TMI

request 객체에는 사용자 입력 데이터

 

http 헤더파일에 암호화되어 들어가 있다.

 

당연히 GET 보다 POST가 보안에 더 적합하다.

 

데이터는 key: value의 형식으로,

 

url이 아니라 request body의 Form Data 부분에 들어간다.

 

 

 

request 객체의 타입인,

 

클래스 HttpServletRequest의 메서드를 몇 가지만 살펴보면 ( 훨씬 많다. )

 

1.

String getParameter(String name)
name의 값을 알 때, name에 대한 전송값을 받아오는 데 사용한다.

 

2.
String[] getParameterValues(String name)
같은 name에 대해 여러 개의 값을 받아올 때 사용한다.

(<input type="text" name="hi"> ... <input type="text" name="hi">)

 

3.
Enumeration getParameterNames( )
name 값을 모를 때, 사용한다.
 

4.

void setCharacterEncoding(String charset)

charset을 변경할 때 값을 넣어 호출한다. ( "UTF-8" 따위의 )

 

 

 

 

 

각각의 상황에 맞춰서 GET과 POST를 사용하면 된다.

Comments