평범한 연구소

[JSP|Servlet] Request Parameter 본문

Pront/Javascript

[JSP|Servlet] Request Parameter

soyeonisgood 2022. 10. 2. 14:31

파라미터 값의 인코딩 및 디코딩

  • 웹 브라우저: 웹 서버에 파라미터를 전송할 때 알맞은 charset 을 이용해서 파라미터 값을 인코딩
  • 웹 서버: 알맞은 charset 을 이용해 웹 브라우저가 전송한 파라미터 데이터를 디코딩
  • charset 종류: ISO-8859-1(기본), UTF-8 ...
  • 웹 브라우저가 UTF-8을 이용해 인코딩했다면, 파라미터 값 또한 UTF-8로 디코딩해야 올바른 파라미터 값 사용 가능
  • UTF-8 인코딩
    • 공백: "+"
    • [ : "%5B"
    • ] : "%5D" 
    • 영숫자를 제외한 문자: %HH (문자코드의 16진수 2자리)
    • ex) "자바" : %EC%9E%90%EB%B0%94

 

 

GET 방식의 파라미터 전송

  • a 태그 이용
    • <a href="URL?키=값&키=값"> 텍스트 </a>
  • javascript의 location.href 속성 이용
    • location.href="URL?키=값&키=값";
  • form 태그 이용
    • method 속성을 따로 지정하지 않으면 디폴트로 GET 방식으로 파라미터 전송
  • GET 방식은 개발자가 직접 인코딩과 디코딩 작업 해야한다.

 

 

GET 방식의 문자열 인코딩 및 디코딩

  • javascript 를 이용한 문자열 인코딩 
    • encodeURIComponent(uriComponent) // 알파벳과 숫자 제외한 모든 문자 인코딩
    • encodeURI(uri) // 일부 특수문자 및 영숫자 제외하고 인코딩
  • javascript 를 이용한 문자열 디코딩
    • decodeURIComponent(uriComponent) // 알파벳과 숫자 제외한 모든 문자 디코딩
    • decodeURI(uri) // 일부 특수문자 및 영숫자 제외하고 디코딩
  • JSP 및 Servlet 에서 문자열 인코딩 및 디코딩
    • java.net 패키지의 URLEncoder.encode() 및 URLDecoder.decode() 이용
    • ex) String 변수 = URLEncoder.encode("문자열", "utf-8");
    • ex) String 변수 = URLDecoder.decode("문자열", "utf-8");

 

파라미터 인코딩 - GET 방식 예제

  • 기본적으로 클라이언트가 서버에 접속하면 파라미터 전송 방식은 GET
  • Query String : GET 방식으로 전송되는 파라미터
  • 주소줄에 파라미터 실어서 보냄 
    • 형식: 주소?이름=값&이름=값
  • 한글을 인코딩하지 않고 GET 방식으로 전송하면, IE는 에러가 발생한다.
    • <a href="ex01_ok.jsp?name=이자바&age=20">확인</a>  // 에러
    • Java 로 한글 인코딩 해주기 
<%@page import="java.net.URLEncoder"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>

...

<p>
	<!-- 자바를 이용하여 한글 인코딩 -->
	<a href="ex01_ok.jsp?name=<%= URLEncoder.encode("홍길동", "UTF-8")%>&age=20">확인</a>
</p>
<hr>

<p> 자바 스크립트를 이용하여 GET 방식으로 파라미터 전송 </p>
<p>
	<button type="button" onclick="send()">확인</button>
</p>

<script type="text/javascript">
function send() {
	let name = "김자바";
	let age = 17;
	
	// name을 인코딩하지 않고 서버로 전송하면 크롬은 "김" 만 전달되므로 반드시 인코딩 필요
	name = encodeURIComponent(name);
	
	location.href = "ex01_ok.jsp?name="+name+"&age="+age;
}

...

파라미터를 받는 jsp파일 (ex01_ok.jsp)

<%@page import="java.net.URLDecoder"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>

<%
	// 클라이언트가 보낸 요청 파라미터 받기
	// request : 요청 정보를 가지고 있는 JSP 내장 객체
	String name = request.getParameter("name");

	// GET 방식으로 넘어온 인코딩된 파라미터를 디코딩하지 않으면 WAS 에 따라 한글이 깨질 수 있다.
	name = URLDecoder.decode(name, "utf-8");

	int age = Integer.parseInt(request.getParameter("age"));
	String city = request.getParameter("city"); // 보낸 파라미터가 없는 경우 null
	
	String result = age >= 19 ? "성인" : "미성년자";
%>
 ...
<p>이름: <%= name %></p>
<p>나이: <%= age %>, <%= result %></p>
<p>출신도: <%= city %></p>

...

 

POST 방식의 파라미터 전송

  • form 태그 이용
    • method="post"
  • jsp 파일의 입력 폼을 보여주는 응답 화면이 사용하는 charset 은 page 지시어의 contentType 속성으로 설정 
<%@ page content Type="text/html; charset="utf-8"%>
  • html 파일의 입력 폼에서 사용할 charset 은 meta 태그를 이용하여 설정
<meta charset="utf-8">
  • POST 방식에 의해 전달받은 파라미터 값을 디코딩 할 때 사용할 charset 지정
request.setCharacterEncoding("utf-8");

 

파라미터 인코딩 - POST 방식 예제

<form action="ex02_ok.jsp" method="post">
	<p> 이름: <input type="text" name="name"> </p>
	<p> 점수: <input type="text" name="score"> </p>
	<p>
		<button type="submit">전송하기</button>
	</p>
</form>

파라미터를 받은 jsp 파일 (ex02_ok.jsp)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%
	// POST 방식으로 넘어온 파라미터의 인코딩 설정
	// POST 방식에서는 파라미터를 받기 전 반드시 아래처럼 문자 인코딩을 설정해야 하며,
	// 		설정하지 않으면 한글이 깨진다
	request.setCharacterEncoding("utf-8");

	String name = request.getParameter("name");
	int score = Integer.parseInt(request.getParameter("score"));
	String result = score>=80 ? "우수":"노력";
%>

...

<h3>파라미터 받기 - post</h3>
<p> 이름 : <%= name %> </p>
<p> 점수 : <%= score %>, <%= result %> </p>

 

 


getParameter 관련 예제

 

getParameter() 활용 예제

  • 동일한 이름으로 파라미터 전송한 경우, 첫 번째 파라미터만 받는다.
    • 이러한 경우엔 getParameterValues() 이용.
<form action="ex11_ok.jsp" method="post">
	<p>이름 : <input type="text" name="name"> </p>
	<p>패스워드 : <input type="password" name="pwd"> </p>
	<p>나이 : <input type="text" name="age"> </p>
	<p>
		<input type="radio" name="gender" value="M" checked="checked"> 남자
		<input type="radio" name="gender" value="F"> 여자
	</p>
	<p>
		좋아하는 과목
		<input type="checkbox" name="subject" value="자바">자바	
		<input type="checkbox" name="subject" value="스프링">스프링	
		<input type="checkbox" name="subject" value="서블릿">서블릿
		<input type="checkbox" name="subject" value="데이터베이스">데이터베이스	
		<input type="checkbox" name="subject" value="웹">웹
	</p>
	<p>
		<button type="submit">보내기</button>
	</p>
	
</form>

ex11_ok.jsp

<%
	// post 방식으로 넘어온 파라미터의 인코딩 설정(파라미터를 받기전에 설정)
	request.setCharacterEncoding("utf-8");

	// request.getParameter() 
	//   : get, post 방식으로 넘어온 파라미터 받기
	//   : 리턴타입 - String
	String a = request.getParameter("name");
	String pwd = request.getParameter("pwd");
	String age = request.getParameter("age");
	String gender = request.getParameter("gender");
	String city = request.getParameter("city");
		// 존재하지 않는 파라미터는 null 반환.
	String subject = request.getParameter("subject");
		// 통일한 이름으로 파라미터를 전송한 경우 getParameter()는 첫번째 파라미터만 받는다.
		// 동일한 이름의 파라미터가 두 개 이상인 경우 반드시 getParameterValues()로 받는다.
		// checkbox 는 선택한 것이 없으면 null 반환.
%>

...

<p> 이름 : <%= a %></p>
<p> 패스워드 : <%= pwd %></p>
<p> 나이 : <%= age %></p>
<p> 성별 : <%= gender %></p>
<p> 출신도 : <%= city %></p>
<p> 과목 : <%= subject %></p>

 

getParameterValues() 활용 예제

  •  checkbox 와 같이 동일한 이름의 파라미터가 2개 이상일 때 사용한다.
  •  
<form action="ex12_ok.jsp" method="post">
	<p>이름 : <input type="text" name="name"> </p>
	<p>패스워드 : <input type="password" name="pwd"> </p>
	<p>나이 : <input type="text" name="age"> </p>
	<p>
		<input type="radio" name="gender" value="M" checked="checked"> 남자
		<input type="radio" name="gender" value="F"> 여자
	</p>
	<p>
		좋아하는 과목
		<input type="checkbox" name="subject" value="자바">자바	
		<input type="checkbox" name="subject" value="스프링">스프링	
		<input type="checkbox" name="subject" value="서블릿">서블릿
		<input type="checkbox" name="subject" value="데이터베이스">데이터베이스	
		<input type="checkbox" name="subject" value="웹">웹
	</p>
	<p>
		<button type="submit">보내기</button>
	</p>
	
</form>

ex12_ok.jsp

  •  getParameterValues()의 리턴타입은 문자열 변수 String[]  
<%
request.setCharacterEncoding("utf-8");

	// - getParameterValues() 
	//	 : 리턴 타입 - String[]
	//   : 동일한 이름으로 파라미터를 전송한 경우 반드시 getParameterValues()로 파라미터를 받는다.
	//   : <select>의 multiple 속성을 준 경우에도 반드시 getParameterValues()로 파라미털르 받는다.
	String name = request.getParameterValues("name")[0];
	String pwd = request.getParameterValues("pwd")[0];
	String age = request.getParameterValues("age")[0];
	String gender = request.getParameterValues("gender")[0];
	String []ss = request.getParameterValues("subject");
	// checkbox, radio는 선택항목이 하나도 없으면 
	// 		getParameter(), getParameterValues() 모두 null 반환
	String subject = "";
	if (ss != null) {
		for(String s : ss) {
			subject += s + " ";
		}
	}
%>

 

getParameterMap() 활용 예제

<form action="ex13_ok.jsp" method="post">
	<p>이름 : <input type="text" name="name"> </p>
	<p>패스워드 : <input type="password" name="pwd"> </p>
	<p>나이 : <input type="text" name="age"> </p>
	<p>
		<input type="radio" name="gender" value="M" checked="checked"> 남자
		<input type="radio" name="gender" value="F"> 여자
	</p>
	<p>
		좋아하는 과목
		<input type="checkbox" name="subject" value="자바">자바	
		<input type="checkbox" name="subject" value="스프링">스프링	
		<input type="checkbox" name="subject" value="서블릿">서블릿
		<input type="checkbox" name="subject" value="데이터베이스">데이터베이스	
		<input type="checkbox" name="subject" value="웹">웹
	</p>
	<p>
		<button type="submit">보내기</button>
	</p>
	
</form>

ex13_ok.jsp

  •  getParameterMap()은 반복자 Iterator 사용 가능
  • 데이터 넣기: put()
  • 데이터 가져오기: get()
<%@page import="java.util.Iterator"%>
<%@page import="java.util.Map"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%
	request.setCharacterEncoding("utf-8");
		// 파라미터이름, 값
	Map<String, String[]> paramMap = request.getParameterMap();
	
%>
...
<%
	String name = paramMap.get("name")[0];
	String pwd = paramMap.get("pwd")[0];
	String age = paramMap.get("age")[0];
	String gender = paramMap.get("gender")[0];
	String[] ss = paramMap.get("subject");

	String subject = "";
	if(ss != null) {
		for(String s:ss) {
			subject += s + " ";
		}
	}
	out.print("<p>이름:"+name+"</p>");
	out.print("<p>패스워드:"+pwd+"</p>");
	out.print("<p>나이:"+age+"</p>");
	out.print("<p>성별:"+gender+"</p>");
	out.print("<p>과목:"+subject+"</p>");
	out.print("<hr>");
	
	// map은 key에서 반복자를 가져온다
	Iterator<String> it = paramMap.keySet().iterator();
	while( it.hasNext() ) {
		String key = it.next(); // 파라미터 이름
		String[] values = paramMap.get(key); // 파라미터 값
		
		if(values != null) {
			for(String s : values) {
				out.print("<p>" + key + " : " + s + "</p>");
			}
		}
	}
%>

 

 

getParameterNames() 활용 예제

  • 서버에 전달된 모든 파라미터의 이름을 반환.
<form action="ex14_ok.jsp" method="post">
	<p>이름 : <input type="text" name="name"> </p>
	<p>패스워드 : <input type="password" name="pwd"> </p>
	<p>나이 : <input type="text" name="age"> </p>
	<p>
		<input type="radio" name="gender" value="M" checked="checked"> 남자
		<input type="radio" name="gender" value="F"> 여자
	</p>
	<p>
		좋아하는 과목
		<input type="checkbox" name="subject" value="자바">자바	
		<input type="checkbox" name="subject" value="스프링">스프링	
		<input type="checkbox" name="subject" value="서블릿">서블릿
		<input type="checkbox" name="subject" value="데이터베이스">데이터베이스	
		<input type="checkbox" name="subject" value="웹">웹
	</p>
	<p>
		<button type="submit">보내기</button>
	</p>
	
</form>

ex14_ok.jsp

<%
	request.setCharacterEncoding("utf-8");

	// getParameterNames() : 서버로 전달된 모든 파라미터의 이름 반환
	Enumeration<String> e = request.getParameterNames();
	
%>

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

<h3>getParameterNames()</h3>

<%
	while(e.hasMoreElements()) {
		String name = e.nextElement();
		String[] ss = request.getParameterValues(name);
		for(String s : ss) {
			out.print("<p>"+name+" : "+s+"</p>");
		}
	}

%>