index.html 먼저 작성
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>parameter</title>
</head>
<body>
<h1 align="center">Request Parameter</h1>
<h3>GET 방식의 요청</h3>
<h4>form 태그를 이용한 get 방식의 요청</h4>
<form action="querystring" method="get">
<label>이름 : </label><input type="text" name="name">
<br>
<label>나이 : </label><input type="number" name="age">
<br>
<label>생일 : </label><input type="date" name="birthday">
<br>
<label>성별 : </label>
<input type="radio" name="gender" id="male" value="M"><label for="male">남자</label>
<input type="radio" name="gender" id="female" value="F"><label for="female">여자</label>
<br>
<label>국적 : </label>
<select name="national">
<option value="ko">한국</option>
<option value="ch">중국</option>
<option value="jp">일본</option>
<option value="etc">기타</option>
</select>
<br>
<label>취미 : </label>
<input type="checkbox" name="hobbies" id="movie" value="movie"><label for="movie">영화</label>
<input type="checkbox" name="hobbies" id="music" value="music"><label for="music">음악</label>
<input type="checkbox" name="hobbies" id="sleep" value="sleep"><label for="sleep">취침</label>
<br>
<input type="submit" value="GET 요청">
</form>
</body>
</html>
내가 넣은 값에 주소값에 출력된다. 대신 404오류페이지가 뜬다.
서블릿 생성
mapping은 위에서 html구문에서 작성해준 action값과 동일하게 작성한다.
doGet만 필요하니 나머지 선택체크하고 Finish
이후에 다시 값을넣고 실행하면 오류페이지는 안 뜬다. (빈 페이지)
HttpServlet 클래스의 service 메소드가 요청 방식에 의해 GET 요청은 doGet() 메소드를 호출하며 request와 response를 전달해준다.
service로부터 전달받은 HttpServletRequest는 요청 시 전달한 값을 getParameter()메소드로 추출해올 수 있다.
이 때 인자로 inptu태그에 지정한 name속성의 값을 문자열 형태로 전달해주어야 한다.
화면에서 전달한 form 태그 내의 모든 input 태그의 값을 HashMap으로 관리하고 있는데,
원하는 값을 찾기 위해서는 key 역할을 하는 문자열이 필요하기 때문이다.
name파라미터 값을 전달하니 출력문에 내가 입력한 이름이 나온다.
getParameter()메소드는 리턴 타입이 문자열 형태이다.
숫자를 전달해도 문자열 형태로 전달되므로 숫자로 된 값이 필요하다면 검증 후 parsing해줘야 한다.
java.sql.Date 타입으로 날짜 데이터 parsing
key역할을 하는 문자열이 없을 경우 value속성은 null로 리턴된다.
radio로 전달된 값은 여러 값 중 한가지만 전달되기 때문에 parameter로 전달 받은 값을 꺼내기만 하면 된다.
select box를 이용한 방식도 크게 다르지 않다.
checkbox는 다중으로 입력될 수 있기 때문에 선택된 값이 문자열이 아닌 문자열 배열의 형태로 전달된다.
이때 getParameterValues() 메소드를 이용하여 문자열 배열 형태로 값을 반환 받을 수 있다.
전체코드
@WebServlet("/querystring")
public class QueryStringTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
System.out.println("이름 : " + name);
int age = Integer.parseInt(request.getParameter("age"));
System.out.println("나이 : " + age);
java.sql.Date birthday = java.sql.Date.valueOf(request.getParameter("birthday"));
System.out.println("생일 : " + birthday);
String gender = request.getParameter("gender");
System.out.println("성별 : " + gender);
String national = request.getParameter("national");
System.out.println("국적 : " + national);
String[] hobbies = request.getParameterValues("hobbies");
for(String hobby : hobbies) {
System.out.println("취미 : " + hobby);
}
}
}
a 태그의 href 속성에 직접 파라미터를 쿼리스트링 형태로 작성하여 get 방식 요청
작업하던 웹 주소를 복사하여 index.html에 작성해준다.
중간에 name은 다른 값을 넣어줌
아까와 같은 결과가 나온다. (이름은 다른거로 입력했으니 최땡땡으로 나옴)
위에서 작성한 html 에서 action="formdata" method="post" 로 수정해준다.
<h4>form 태그를 이용한 post 방식 요청</h4>
<form action="formdata" method="post">
<label>이름 : </label><input type="text" name="name">
<br>
<label>나이 : </label><input type="number" name="age">
<br>
<label>생일 : </label><input type="date" name="birthday">
<br>
<label>성별 : </label>
<input type="radio" name="gender" id="male" value="M"><label for="male">남자</label>
<input type="radio" name="gender" id="female" value="F"><label for="female">여자</label>
<br>
<label>국적 : </label>
<select name="national">
<option value="ko">한국</option>
<option value="ch">중국</option>
<option value="jp">일본</option>
<option value="etc">기타</option>
</select>
<br>
<label>취미 : </label>
<input type="checkbox" name="hobbies" id="movie2" value="movie"><label for="movie2">영화</label>
<input type="checkbox" name="hobbies" id="music2" value="music"><label for="music2">음악</label>
<input type="checkbox" name="hobbies" id="sleep2" value="sleep"><label for="sleep2">취침</label>
<br>
<input type="submit" value="POST 요청">
</form>
위에서 action값과 동일하게 formdata로 mapping값을 넣어서 servlet생성
주소에서는 formdata로 전송됐고,
개발자도구 페이로드에서도 값이 잘 나오지만
출력문에서는 인코딩 처리가 안되어서 글자가 깨져서 나온다.
POST 방식으로 전달받은 데이터에 한글이 있는 경우 한글 값이 깨져서 보인다.
GET방식의 데이터는 HTMl charset에 기술된 인코딩 방식으로 브라우저가 한글을 이해한 뒤, %문자로 URLEncoder를 이용하여 변환 후 url요청으로 전송한다.
이 때 헤더의 내용은 알맞게 해석되어 별도의 charset 설정이 필요 없다.
(GET 요청은 보통 서버 쪽 리소스를 가져오는 용도의 행위를 요청하는 http 요청 방식이기 때문에 별도의 데이터가 필요 없어서 요청 본문-body-는 해석하지 않게 된다.)
하지만 POST 요청은 서버쪽 리소스에 내용을 추가하는 용도의 요청이기 때문에 요청하는 데이터가 필요한 경우가 많다.
이러한 정보를 요청 본문에 key&value 방식으로 담아 전송하는데, 헤더와는 별개로 URLEncoder를 이용하지 않고 페이지 meta에 기술된 charset에 따라 UTF-8로 해석된 데이터를 서버로 전송하게 된다.
request.getCharacterEncoding()을 호출해보면 null을 반환하는데, 인코딩된 방식을 명시해주지 않으면 기본 ISO-8859-1로 해석하게되어 값을 꺼내오면 글자가 깨지는 현상이 발생한다.
이 때, parameter를 꺼내오기 전에 parameter 값을 해석한 인코딩 방식이 UTF-8임을 setCharacterEncoding(String encType)으로 지정해주면 브라우저 요청 인코딩 방식과 일치하게 되어 한글 깨짐 현상을 막을 수 있다.
파라미터 값을 꺼내기 전에 디코딩할 인코딩 방식을 지정해주면 해당 방식으로 본문의 값을 해석한다.
인코딩을 제외한 나머지 값들은 GET 방식에서 값을 꺼내온 것과 동일하다.
만약 클라이언트 쪽에서 요청한 데이터의 key와 value를 일일이 확인하기 힘들다면 모든 데이터의 key를 이용하여 전송된 값들을 일괄 처리할 수도 있다. getParameterMap()
파라미터로 전달된 키 목록만 확인할 수 있다.
request.getParameterNames()를 이용한다.
Enumeration은 Iterator와 거의 동일하게 쓰인다.
get방식과 post방식에 대해 간단히 설명하자면,
GET방식 - 무언가를 select(검색)할 때
POST방식 - insert, update, delete / body에 무제한으로 데이터를 넣을 수 있음 / 전체를 읽어와야 하기 때문에 get방식보다 느릴수있다.
'TIL > Servlet' 카테고리의 다른 글
[Servlet] mvc-1 (0) | 2022.03.18 |
---|---|
[Servlet] forward, redirect, cookie (0) | 2022.03.10 |
[Servlet] response, exception-handler (0) | 2022.03.07 |
[Servlet] annotation, service method (0) | 2022.03.03 |
[Servlet] CGI, WAS, 톰캣 다운로드, 서블릿 라이프 사이클 (0) | 2022.03.02 |