고래씌

[Servlet] 1-1. GET 방식 전달 실습 본문

Server/JSP과 Servlet

[Servlet] 1-1. GET 방식 전달 실습

고래씌 2023. 12. 5. 11:34

web.xml 파일
   - 배포서술자(DD, Deployment Descriptor)라고 해서 웹 애플리케이션의 기본적인 설정을 위해 작성하는 파일
   - 현재 웹 애플리케이션을 구동시키는 서버를 start할 때 가장 먼저 읽혀지는 파일
   - 개발자가 web.xml을 수정하지 않고도 개발 및 운영이 가능하지만 규모가 커지고 다양한 Filter, Servlet, Wrpper등을 사용하게 되면 직접 수정을 해야하는 경우도 많다.

 

 

welcome-file : 처음에 url로 현재 어플리케이션의 루트경로(contextpath)로 요청시 제일 먼저 보여지게 되는 메인페이지를 지정해 놓는것
   => 각자 본인컴퓨터에 구축해놓은 서버로 요청을 보내기(현재 서버의 ip주고 127.0.0.1 = localhost)
   => 서버의 포트번호 : 8081로 설정
     → 서버내의 구동중인 어플리케이션의 루트경로 context root : servlet
   => 합치면 localhost:8081/servlet 으로 요청시 WebContent바로 아래에 있는 index파일이 서비스

 

 

1. 서블릿(Servelt)이란?

: 웹 서비스를 위한 자바 클래스를 말하며 자바를 사용해서 웹페이지를 만들기 위해 필요한 기술이다.

 

- Server + Applet의 합성어로 JAVA언어를 이용하여 사용자의 요청을 받아 처리하고 그 결과를 다시 사용자에게 전송하는 역할의 Class파일을 말함. 즉 웹에서 동적인 페이지를 java로 구현한 서버 측 프로그램


- 사용자의 요청을 받아 처리하고 그에 해당하는 응답페이지를 만들어 다시 사용자에게 전송하는 역할을 하는 자바의 클래스


- 즉, 웹에서 동적인 페이지를 java로 구현할 수 있게 도와주는 서버측 프로그램(WAS서버에 의해 구동됨)
   java 클래스에서 웹 페이지 구현을 HTML이 포함된 구조라고 할 수 있다.(Java코드로 HTML을 구현)

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	 
	 <h1>Web</h1>
	 
	 <h2>* Servlet</h2>
	 
	 <p>
	 	서블릿이란?
	 	웹 서비스를 위한 자바 클래스를 말하며 자바를 사용해서 웹페이지를 만들기 위해 필요한 기술이다.
	 	- 사용자의 요청을 받아 처리하고 그에 해당하는 응답페이지를 만들어 다시 사용자에게 전송하는 역할을 하는
	 	자바의 클래스
	 	- 즉, 웹에서 동적인 페이지를 java로 구현할 수 있게 도와주는 서버측 프로그램(WAS서버에 의해 구동됨)
	 	java 클래스에서 웹 페이지 구현을 HTML이 포함된 구조라고 할 수 있다(Java코드로 HTML을 구현)
	 </p>

	<h3><a href="views/requestTest_GET.html">GET방식 테스트</a></h3>
	<h3><a href="">POST방식 테스트</a></h3>

</body>
</html>

 

 

 

 

 

 

2. GET방식으로 요청 후 응답페이지 받아보기

▶ views 폴더 생성후, Get 방식으로 갔을 때 이동하는 파일 생성 (requestTest_GET 파일) 

 

- 특징1. GET방식으로 요청한 데이터는 url의 header영역에 데이터들을 포함시켜 요청함
  => 사용자가 입력한 값이 url에 노출
  => 보안유지 X
  => 즉, 로그인이나 회원가입 같은 경우 GET 방식으로 작업하는게 부적합함

 


- 특징2. Header영역은 전송하는 데이터의 길이에 제한이 있음
  => 방대한 데이터를 담았을 경우 초과된 데이터는 절단
  => 즉, 게시판 작성같이 방대한 데이터가 포함된 경우 get방식으로 작업하는게 부적합함

 


- 특징3. URL에 데이터가 노출되기 때문에 즐겨찾기 기능을 사용하는데 있어서 적합하다.

 

 

① form내의 제출버튼을 클릭시 form 태그 속성 중 action에 작성된 url로 요청됨(제출)

 


② Servlet 요청 같은 경우 반드시 그 요청값이 현재 웹 애플리케이션의 contextpath(/servlet)뒤에 작성되어야 함
http://localhost:8081/servlet/test1.do

 


③-1. 절대경로방식(action속성의 속성값이 /로 시작되는 경우) : localhost:8081 뒤에 action에 지정한 속성값이 이어붙여지면서 요청이 들어감

 

=> localhost:8081/ 기준으로 뒤에 값이 붙여지면서 요청이 들어간다!



③-2. 상대경로방식(/가 아닌 문구로 시작되는 경우) : 현재 이 페이지가 보여질때의 "url경로"를 기준으로 마지막 위치의 /로부터 그뒤에 action 속성의 속성값이 이어붙여지면서 요청이 들어감

 

=> 마지막 / 로부터 그뒤에 속성값이 이어붙여지면서 요청이 들어간다!

 

 

■ requestTest_GET.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>GET방식으로 요청 후 응답페이지 받아보기</h1>

	<h2>개인정보 입력 - GET</h2>
	
	<form action='/servlet/test1.do' method="get">
		<ul>
			<li>
				<!-- input 태그 사용시 key 값은 반드시 서버에 넘겨줘야하는데 key값 설정은 name 속성으로 한다. -->
				이름 : <input type="text" name="name">
			</li>
			<li>
				성별 :
				남자 <input type="radio" name="gender" value="M">
				여자 <input type="radio" name="gender" value="F">
			</li>
			<li>
				나이 : <input type='number' name='age'>
			</li>
			<li>
				사는 도시 :
				<select name="city">
					<option>서울시</option>
					<option>경기도</option>
					<option>강원도</option>
					<option>인천</option>
				</select>
			</li>
			<li>
				키 : <input type="range" name="height" min="140" max="200">
			</li>
			<li>
				좋아하는 음식(모두 고르시오) :
				한식 <input type="checkbox" name="food" value="한식">
				중식 <input type="checkbox" name="food" value="중식">
				일식 <input type="checkbox" name="food" value="일식">
				양식 <input type="checkbox" name="food" value="양식">
				분식 <input type="checkbox" name="food" value="분식">
			</li>
			<li>
				<input type="submit">
				<input type="reset">
			</li>
		</ul>
	</form>

</body>
</html>

 

 

=> 제출을 클릭하면 url에 내가 입력했던 정보가 모두 노출됨.     ==> 이것이 GET 방식이다!

 

 

 

 

3. Servlet 프로그래밍

▶ RequestGetServlet 파일 생성

 

 

▶ test1.do로 변경

파일을 생성하고 나면 기본으로 이런 코드들이 작성되어있다. 여기서 우리는 test1.do파일로 연결을 해주어야하기 때문에 @WebServlet("/test1.do")로 변경해준다.

 

 

▶ protected void doGet  => get방식으로 들어왔을 때 응답 결과를 보여줌

▶ protected void doPost => post방식으로 들어왔을 때 응답 결과를 보여줌

 

=> 먼저 get방식으로 실습을 할 것이기 때문에 portected void doGet 메소드에 작성할 것이다.

 

 

▶ Get방식으로 요청했으면 현재 doGet가 호출됨
  - 첫번째 매개변수인 HttpServletRequest request에는 요청시 클라이언트가 전달한 내용들이 담김(입력한 값, 전송방식, 요청한 사용자의 ip, 쿠키정보, session 등...)

  - 우선, 요청을 처리하기 위해 요청시 전달된 값들을 뽑는다
  - request의 parameter 영역 안에 존재 → 데이터들은 key value 세트로 담겨있다.
    =>  따라서 request의 parameter 영역으로부터 전달된 데이터를 뽑는 메소드를 사용


  - request.getParameter("키값") : String => 무조건 문자열 자료으로 반환
  - request.getParameterValues("키값") : String[] => 무조건 문자열 배열형태로 반환

 

 

■ RequestGetServlet.java 파일

package com.kh.controller;

import java.io.IOException;
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 RequestGetServlet
 */

// test1.do로 바꾸어야함
@WebServlet("/test1.do")
public class RequestGetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RequestGetServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    
//    get방식으로 들어왔을 때 응답 결과를 보여줌
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String name = request.getParameter("name"); // "이고래"   이고래 입력하면 이고래가 전달됨, 아무것도 입력안했다면 "" 전달됨
		String gender = request.getParameter("gender"); // "M" / "F"  // 선택안한경우 NULL
		int age = Integer.parseInt(request.getParameter("age"));   // 무조건 문자열로 전달되기 때문에 형변환 필요
		
		String city = request.getParameter("city");
		double height = Double.parseDouble(request.getParameter("height"));  
		
		// 체크박스처럼 여러개의 정보를 동일한 키값으로 전달받는 경우
		// 반드시 배열형태로 받아야함
		String[] foods = request.getParameterValues("food");
		// 체크박스를 하나도 선택하지 않는다면 null 값 반환
		
		System.out.println("name : "+ name);
		System.out.println("gender : "+ gender);
		System.out.println("age : "+ age);
		System.out.println("city : "+ city);
		System.out.println("height : "+ height);
		
		if(foods == null) {
			System.out.println("foods : 없음");
		}else {
			System.out.println("foods : " + String.join(",", foods));
		}
				
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	
//	post로 들어왔을 때 응답결과
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

java console창 화면

 

☞ 다음과 같이 입력하고 제출 버튼을 클릭한 결과 Console 창에 이와 같은 화면이 출력된 것을 볼 수 있다.

 

 

4. 제출 버튼 누른 후 페이지 이동 시, 빈페이지 꾸미기

▶ db와 상호작용후 결과값을 토대로 사용자가 보게될 화면을 꾸며준다.

▶ 사용자가 보게될 응답페이지 만들기

 

 

 


▶ 장점 : java코드 내에서 작성을 하기 때문에 자바에서 활용가능한 다양한 api를 사용하여 html코드를  만들 수 있다.

▶ 단점 : 복잡하고, 혹시라도 html 페이지를 수정하고자 할 때 Java코드 내에서 수정이 이루어지기 때문에 수정된 내용을 다시 반영하고자한다면 서버를 재실행해야한다.

 

package com.kh.controller;

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 RequestGetServlet
 */

// test1.do로 바꾸어야함
@WebServlet("/test1.do")
public class RequestGetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RequestGetServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    
//    get방식으로 들어왔을 때 응답 결과를 보여줌
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		 System.out.println("잘 실행 되나...?");
		/*
		 * Get방식으로 요청했으면 현재 doGet가 호출됨
		 * 
		 * 첫번째 매개변수인 HttpServletRequest request에는 요청시 클라이언트가 전달한 내용들이 담김
		 * (입력한 값, 전송방식, 요청한 사용자의 ip, 쿠키정보, session 등...)
		 * 
		 * 우선, 요청을 처리하기 위해 요청시 전달된 값들을 뽑는다
		 * request의 parameter 영역 안에 존재 → 데이터들은 key value 세트로 담겨있다.
		 * 
		 * 따라서 request의 parameter 영역으로부터 전달된 데이터를 뽑는 메소드를 사용
		 * - request.getParameter("키값") : String => 무조건 문자열 자료형으로 반환
		 * - request.getParameterValues("키값") : String[] => 무조건 문자열 배열형태로 반환
		 */
		
		String name = request.getParameter("name"); // "이고래"   이고래 입력하면 이고래가 전달됨, 아무것도 입력안했다면 "" 전달됨
		String gender = request.getParameter("gender"); // "M" / "F"  // 선택안한경우 NULL
		int age = Integer.parseInt(request.getParameter("age"));   // 무조건 문자열로 전달되기 때문에 형변환 필요
		
		String city = request.getParameter("city");
		double height = Double.parseDouble(request.getParameter("height"));  
		
		// 체크박스처럼 여러개의 정보를 동일한 키값으로 전달받는 경우
		// 반드시 배열형태로 받아야함
		String[] foods = request.getParameterValues("food");
		// 체크박스를 하나도 선택하지 않는다면 null 값 반환
		
		System.out.println("name : "+ name);
		System.out.println("gender : "+ gender);
		System.out.println("age : "+ age);
		System.out.println("city : "+ city);
		System.out.println("height : "+ height);
		
		if(foods == null) {
			System.out.println("foods : 없음");
		}else {
			System.out.println("foods : " + String.join(",", foods));
		}
		
		
		/*
		 * db와 상호작용후 결과값을 토대로 사용자가 보게될 화면을 꾸며준다.
		 * 
		 * 사용자가 보게될 응답페이지 만들기
		 */
		
		// * response객체를 통해 사용자에게 html(응답화면)을 전달
		// 1) 출력할 내용은 문서형태의 html파일이고, 문자셋은 utf-8 임을 지정
		response.setContentType("text/html; charset=UTF-8");
		
		// 2) 응답하고자하는 사용자와의 스트림을 생성
		PrintWriter out = response.getWriter();
		
		// 3) 생성된 스트림을 통해 html 구문을 출력
		out.println("<html>");
			out.println("<head>");
				out.println("<style>");
					out.println("h2{color:red}");
					out.println("#name{color:orange}");
					out.println("#age{color:yellow}");
					out.println("#city{color:green}");
					out.println("#height{color:blue}");
					out.println("#gender{color:navy}");
				out.println("</style>");
		
			out.println("</head>");
			out.println("<body>");
				out.println("<h2>개인정보 응답화면</h2>");
				out.println("<span id='name'>"+name+"</span>님은");
				out.printf("<span id='age'> %d </span>살이며 ", age);
				out.printf("<span id='city'> %s </span>에 사는 ", city);
				out.printf("<span id='height'> %.1f </span>cm 이고 ", height);
				out.print("성별은 ");
				if(gender == null) {
					out.print("선택을 안했습니다. <br>");
				}else {
					out.printf("<span id='gender'>%s</span> 입니다.",gender.equals("M") ? "남자" : "여자");
				}
				
				out.print("<br>좋아하는 음식은 ");
				
				if(foods == null) {
					out.print("없습니다.");
				}else {
					out.print("<ul>");
					
					for(String food:foods) {
						out.printf("<li>%s</li>", food);
					}
					out.print("</ul>");
				}
				
			out.println("</body>");
		out.println("</html>");	
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	
//	post로 들어왔을 때 응답결과
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}