Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Java
- MariaDB Query Log
- this
- 2차원배열 구간합
- 생성자
- jquery
- Bean LifecCycle
- 합배열
- 자바 람다식
- json
- 백준
- this와 this() 차이
- 백준 11659번
- map()
- ajax
- @NoArgsConstructor
- 상속과 참조
- SQL
- pseudo-code
- 백준 11660번
- 슈더코드
- InterruptException
- 마리아DB 쿼리 로그
- 구간합
- @AllArgsConstructor
- function test
- interrupted()
- 구간합구하기
- select
- 백준 1235번
Archives
- Today
- Total
평범한 연구소
[JSP|Servlet] Request Parameter 본문
파라미터 값의 인코딩 및 디코딩
- 웹 브라우저: 웹 서버에 파라미터를 전송할 때 알맞은 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>");
}
}
%>
'Pront > Javascript' 카테고리의 다른 글
[JSP|Servlet] 액션 태그(action tag)와 자바빈즈(Java Bean) (0) | 2022.10.02 |
---|---|
[JSP|Servlet] submit 관련 버튼 (0) | 2022.10.02 |
[JSP] GET, POST 방식의 차이점 (0) | 2022.09.27 |
[javascript] 정규식 (0) | 2022.09.27 |
[Javascript] document 객체와 form 요소 접근 (0) | 2022.09.25 |