Programming Language/Javascript, ...

[Servlet] get 방식으로 요청 후 응답페이지 받기

Ma_Sand 2022. 4. 27. 22:53
반응형

get 방식의 특징

1. url의 header 영역에 데이터들을 포함시켜서 요청한다.

  → 사용자가 입력한 데이터들이 url에 노출되어 보안 유지가 불가능하다.

  → 로그인이나 회원가입과 같이 보안 유지가 필요한 경우에는 get 방식이 부적합하다.

 

 

2. header 영역은 전송 길이에 제한이 있다.

  → 방대한 데이터들을 담고 있을 경우엔 초과된 데이터들이 절단되어서 넘어간다.

  → 게시판 작성과 같은 경우엔 get 방식이 부적합하다.

 

 

3. url에 입력 데이터가 노출되므로 북마크(즐겨찾기)가 가능하다.

  → 검색 기능을 사용할 땐 get 방식이 적합하다.

 

 

 

<h2>회원 정보 입력</h2>

<form action="/Servlet/test.do" method="get">
	 <ul>
		<li>
			이름: <input type="text" name="name">
            <!--key값은 name으로 선택된다.-->
		</li>
		<li>
			성별:
			<label for="gender">남자</label><input type="radio" name="gender" id="gender" value="M">
			<label for="gender">여자</label><input type="radio" name="gender" id="gender" value="F">
			<!--radio버튼 사용 시 같은 종류는 name(key)을 동일하게 한다. 넘어갈 value값도 설정-->
		</li>
		<li>
			나이: <input type="number" name="age">
		</li>
		<li>
			거주 지역: 
		    <select name="city">
			    <option>서울</option>
			    <option>경기</option>
			    <option>강원</option>
			    <option>부산</option>
			    <option>대구</option>
			    <option>광주</option>
			    <option>울산</option>
			    <option>인천</option>
		    </select>
		</li>
		<li>
			키: <input type="range" name="height" min="0" max="220">
		</li>
		<li>
			선호하는 음식 선택(최대 5개) <br>
			<input type="checkbox" name="food" value="중식">중식 <br>
			<input type="checkbox" name="food" value="일식">일식 <br>
			<input type="checkbox" name="food" value="양식">양식 <br>
			<input type="checkbox" name="food" value="한식">한식 <br>
			<input type="checkbox" name="food" value="분식">분식 <br>
			<!--checkbox 사용 시 같은 종류는 name(key)을 동일하게 한다.
				단, 한 개의 key값이 여러 개의 value가 묶여 넘겨진다.-->
		</li>
		<li>
			<input type="submit" value="전송">
			<input type="reset" value="취소">
		</li>
	</ul>
</form>

 

form 내의 submit 버튼을 클릭했을 때 form 태그의 속성 중 action에 작성된 url로 요청된다. 이는 mvc에서 Controller를 호출하는 것이라고 보면 된다.(Servlet)

서블릿 요청의 경우에 반드시 해당 요청값이 웹 애플리케이션의 contextPath(처음에 지정했던 context-root) 뒤에 오게 해야 한다. ex) http://localhost:8080/Servlet/test.do

 

** 절대경로 방식

    - /로 시작된다.

    - localhost:8080 뒤에 action에 작성한 값이 붙어 요청된다.

** 상대경로 방식

    - 문구로 시작된다.

    - 현재 해당 페이지가 보여질 때의 url 경로 중 마지막 /에 action에 작성한 값이 붙어 요청된다.

 

 

 

 

get 방식으로 요청을 보내면 doGet() 메소드가 자동으로 호출된다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}

매개변수 HttpServletRequest 객체에 요청 시에 전달된 데이터들(사용자의 입력값, 요청 전송 방식, 요청한 사용자의 ip 등등)이 담긴다. HttpServletResponse는 요청 처리 후에 응답할 때 필요한 객체이다.

 

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String name = request.getParameter("name");
    String gender = request.getParameter("gender");
    int age = Integer.parseInt(request.getParameter("age"));
    String city = request.getParameter("city");
    double height = Double.parseDouble(request.getParameter("height"));
    String[] foods = request.getParameterValues("food");

요청을 처리하기 위해선 요청 시에 전달된 값을 꺼내야 한다.

 → request의 parameter 영역에 있는 데이터(key-value 형태로 이뤄짐) 

 → request.getParameter("key값")는 자료형 String(문자열)으로 꺼내진다. 

 → request.getParameterValues("key값")는 자료형 String[]로 꺼내진다.

     - 하나의 key값으로 여러 개의 value값들을 받을 경우에 배열의 형태로 반환된다.

 

    System.out.println(name);
    System.out.println(gender);
    System.out.println(age);
    System.out.println(city);
    System.out.println(height);
    System.out.println(foods);
    
    if(foods == null) {
        System.out.println("선택된 음식이 없습니다.");
    } else {
        System.out.println(String.join(",", foods));
    }

String.join("구분자", 배열) : 구분자를 통해 배열에 있는 모든 값들을 하나의 문자열로 반환시킨다.

 

 

 

response 객체를 통해 사용자에게 응답화면(html)을 전달할 때는 

response.setContentType("text/html; charset=UTF-8");

text 형식이 html 형식이고, 인코딩(charset)은 UTF-8이라고 전달한다.

 

 

 

요청한 사용자와의 스트림을 생성하여 사용자와의 연결 통로를 만든다.

PrintWriter out = response.getWriter();

 

 

생성된 스트림을 통해 html 구문을 한 줄씩 출력한다.

	out.println("<html>");
	out.println("<head>");
	out.println("<style>");
	out.println("h1{color:skyblue}");
	out.println("#name{background-color:lightyellow}");
	out.println("#age{background-color:aqua}");
	out.println("#city{color:purple}");
	out.println("span{border:2px solid orange}");
	out.println("</style>");
	out.println("</head>");
	out.println("<body>");
	out.println("<h1>개인정보 응답화면</h1>");
	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("선택되지 않았습니다.");
	} else {
		if(gender.contentEquals("M")) {
			out.print("<span id='gender'>남자</span>입니다.<br>");
		} else {
			out.print("<span id='gender'>여자</span>입니다.<br>");
		}
	}
	
	out.print("좋아하는 음식은 ");
	if(foods == null) {
		out.print("없습니다.");
	} else {
		out.print("<ul>");
		for(int i = 0; i < foods.length; i++) {
			out.printf("<li>%s</li>", foods[i]);
		}
		out.print("</ul>");
	}
	
	out.println("<body>");
	out.println("</html>");
	
	}
}
반응형