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

44일차_Servlet_Post 인코딩_

by 밀키스 2021. 5. 13.

21.05.13

 Servlet 

@Servlet - Post 인코딩 및 실습 

우선... 우리가 지금까지 데이터를 보냈던 방식과 다르게 데이터 전송을 했다.

보는것과 같이 "Post " 방식으로 데이터를 전송했는데, 이와 같이 설정하고 한글을 보내면 아래와 같이 깨진다.

 

42일차에서  server.xml  의 특정 부분에 "EUC-KR"을 추가하여 한글을 인코딩 했었다.

 

하지만 뭐.. Post 방식에는 안먹히나 보다.. 무튼, Post 방식으로 데이터를 전송할 때에 인코딩하는 법은

		// POST 방식으로 한글데이터 전송 시 설정
		request.setCharacterEncoding("EUC-KR");

 

위 처럼 "request" setCaracterEncoding  명령어를 사용한다.

아래는 해당 부분을 활용한 실습내용이다.

 

HTML파일 및 자바 파일

 

 

웹 창에서 메세지를 입력하면 이클립스의 콘솔창에서 출력하도록 만듬.

@Servlet 실습 - 연산자 선택 및 연산 

<body>
	<h1>메시지 전송</h1>
	<form action="numberCal" method="post">
		<input type="text" name="num1">
		<select name="cal">
			<option value="+">+</option>
			<option value="*">*</option>
			<option value="-">-</option>
			<option value="/">/</option>
		</select>
		<input type="text" name="num2">
		<input type="submit" value="계산">
	</form>
</body>

 

HTML 파일

  - 목록을 박기 위해 <select> 태그를 사용하였다.

  - 총 4개의 옵션을 만들었으며, Select에  cal  이란 이름을 주어 값을 가져올 수 있도록 하였다.

 

@WebServlet("/numberCal")
public class numberCalServlet extends HttpServlet {
	protected void service(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {
		int num1 = Integer.parseInt(request.getParameter("num1"));
		int num2 = Integer.parseInt(request.getParameter("num2"));
		String cal = request.getParameter("cal");
		System.out.print(num1+cal+num2);
		int cnt=0;
		if(cal.equals("+")) {
			cnt=num1+num2;
		}else if(cal.equals("-")) {
			cnt=num1-num2;
		}else if(cal.equals("*")) {
			cnt=num1*num2;
		}else if(cal.equals("/")) {
			cnt=num1/num2;
		}
		System.out.println("="+cnt);
		PrintWriter out = response.getWriter();
		out.print("<h1>");
		out.print(num1+cal+num2+"="+cnt);
		out.print("</h1>");	}}

 

Servlet 자바 파일

  - import한 라이브러리는 제외하였다.

  - 받은 값은 int형으로 계산하여야 하므로 변환해주었다.

  - name이 cal인 값을 받아 조건문을 활용하여 각 경우에 따라 연산을 진행하였다.

 

아래는 실습에 의한 결과이다.

 

 

@Servlet 실습 - getParameterValues

 

위와 같이 직업, 성별, 취미를 받는 HTML 파일을 생성하였다. 다만 취미의 경우 다중 선택이 가능한데, 위 처럼 2개를 선택 시,

 

 

위의 결과처럼 그냥 하나만 출력된다. 때문에, 취미 부분을 String 배열로 출력 받도록 한다.

 

@WebServlet("/info")
public class infoServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//직업, 성별, 취미 가져오기
		request.setCharacterEncoding("EUC-KR");
		String job = request.getParameter("job");
		String gender = request.getParameter("gender");
        	// request.getParameterValues()
		//    ->문자열 배열로 반환하는 메소드
		//	  -> 여러개의 input요소의 name속성 값이 하나로 정의된 경우
		String[] hob = request.getParameterValues("hob");
		System.out.println(job+"&&"+gender);
		for(int i=0; i<hob.length;i++) {
			if(i==hob.length-1) {System.out.println(hob[i]);}
			else{System.out.print(hob[i]+", ");}}}}

 

 request.getParameterValues() 
  -> 문자열 배열로 반환하는 메소드
  -> 여러개의 input요소의 name속성 값이 하나로 정의된 경우

 

위의 명령어를 통해 가져온 값을 단일이 아닌 배열로 받는 것. 해당 명령어를 적용하여 실습 결과를 보면,

 

 

위와 같이 취미 부분이 배열의 형태로 출력된다.

 

@Servlet 실습 - Join 

위와 같은 페이지에 정보를 적으면 이클립스 콘솔 창을 통해 값을 받는다.

 

아래는 해당 페이지에 대한 HTML 소스 코드이다.

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<!--  입력 요소들을 하나로 묶어주는 요소 -->
	<fieldset>
		<!--  묶여있는 영역의 제목을 정의하는 요소 -->
		<legend>회원 가입 페이지</legend>
		<form action="Join" method="post">
			<table align="center" width=400px style="margin: 0 auto;">
				<tr>
					<td align="left">ID</td>
					<td><input type="text" name="id"></td>
				</tr>
				<tr>
					<td align="left">PW</td>
					<td><input type="password" name="pw"></td>
				</tr>
				<tr>
					<td align="left">NAME</td>
					<td><input type="text" name="name"></td>
				</tr>
				<tr>
					<td align="left">EMAIL</td>
					<td><input type="text" name="email"></td>
				</tr>
				<tr>
					<td align="left">TEL</td>
					<td><input type="text" name="tel"></td>
				</tr>
				<tr>
					<td align="left">GENDER</td>
					<td>MAN<input type="radio" name="gender" value="MAN">
					WOMEN<input type="radio" name="gender" value="WOMEN"></td>
				</tr>
				<tr>
					<td align="left">HOOBBY</td>
					<td>SPORT<input type="checkbox" name="hobby" value="SPORT">
					STUDY<input type="checkbox" name="hobby" value="STUDY">
					EATING<input type="checkbox" name="hobby" value="EATING">
					</td>
				</tr>
				<tr>
					<td align="left">BIRHDAY</td>
					<td><input type="date" name="birthday">
					</td>
				</tr>
				 <tr>
            		<td align="left">COLOR</td>
            		<td><input type="color"></td>
       	 		</tr>
       	 		<tr>
       	 		<td align="left">COUNTRY</td>
       	 		<td>
       	 		<select name="country">
       	 			<option>KOREA</option>
       	 			<option>AMERICA</option>
       	 			<option>JAPAN</option>
       	 		</select>
       	 		</td>
       	 		</tr>
       	 		<tr>
       	 		<td align="left">TALK</td>
       	 		<td><textarea style="resize: none;" rows="20" cols="30"></textarea></td>
       	 		</tr>
       	 		<tr>
       	 		<td align="center" colspan="2"><input type="submit"><input type="reset"></td>
       	 		</tr>
			</table>
		</form>
	</fieldset>
</body>
</html>

 

기본적으로 37일차 HTML 수업 때 진행한 실습과 큰 차이가 없다. 단지, 해당 실습을 Servlet으로 진행할 뿐.

 

다른점이 있다면 <input> 태그의 "textarea" 옵션을 크기 변경하지 못하게한 것이 다르다. 해당 부분은 아래에 표기

 

그리고 다음은 각 정보들을 Servlet 파일을 통해 콘솔창에 출력한다. 

 

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

 

 

%%%%%

추가적으로 색상 코드나 성별에 대한 데이터를 가져올 때 이상하게 null 값이 나왔었다!

이에 대한 이유를 찾지 못했었다. 분명 "name"옵션도 분명 줬는데...

 

무튼 이유는 간단하다. Chrom창에 쌓인 쿠키 데이터 때문이였다.

변동이 거의 없는 쿠키 데이터가 지속적으로 쌓여서 해당 변경 내용이 반영되지 않은거라고 한다.

똥ㅋ...

 

아래는 Servlet 파일의 소스코드이다.

 

더보기

 

package com.servelet;

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;

@WebServlet("/Join")
public class JoinServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("EUC-KR");
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		String tel = request.getParameter("tel");
		String gender = request.getParameter("gender");
		String[] hobby = request.getParameterValues("hobby");
		String birthday = request.getParameter("birthday");
		String color = request.getParameter("color");
		String country = request.getParameter("country");
		String textarea = request.getParameter("textarea");
		System.out.println("아이디 :"+id);
		System.out.println("비밀번호 :"+pw);
		System.out.println("이름 :"+name);
		System.out.println("이메일 :"+email);
		System.out.println("전화번호 :"+tel);
		System.out.println("성별 :"+gender);
		System.out.print("취미 :");
		try {
		for(int i=0; i<hobby.length;i++) {
			if(i==hobby.length-1) {System.out.print(hobby[i]);}
			else {System.out.print(hobby[i]+", ");}
		}}catch(NullPointerException e) {
		}System.out.println();
		
		System.out.println("생일 :"+birthday);
		System.out.println("색상 코드 :"+color);
		System.out.println("지역 :"+country);
		System.out.println("하고 싶은 말??.. :"+textarea);
	}
}
반응형

댓글