[JSP] request 객체
2022. 3. 17. 21:46ㆍLanguage`/JSP (Java Server Page)
request 객체
우리가 주소창에 어떤 웹 사이트의 주소를 입력하면
>> 웹 브라우저(Client)는 웹 서버(Server)에 연결하고, 요청 정보들을 전송한다
- 여기서 이 요청 정보를 제공하는 것이 "request 객체"이다
request 객체가 제공하는 기능들
- Client(웹 브라우저)와 관련된 정보 읽기
- Server와 관련된 정보 읽기
- Client가 전송한 request 파라미터 읽기
- Client가 전송한 request 헤더 읽기 (HTTP 메시지 헤더)
- Client가 전송한 cookie 읽기
- 속성 처리
1) Client 정보 & Server 정보 읽기
메소드 | 설명 |
String getRemoteAddr() | 웹 서버에 연결한 Client의 IP주소 |
long getContentLength() | Client가 전송한 request 정보의 길이 >> 이 때, 길이를 알 수 없을 경우 "-1" 리턴 |
String getCharacterEncoding() | Client가 request를 보낼 때 사용한 캐릭터의 인코딩 |
String getContentType() | Client가 request를 보낼 때 사용한 Content Type |
String getProtocol() | Client가 request한 프로토콜 |
String getMethod() | 웹 브라우저가 정보를 전송할 때 사용한 방식 |
String getRequestURI() | 웹 브라우저가 요청한 URL에서의 경로 |
String getContextPath() | JSP 페이지가 속한 웹 App의 컨텍스트 경로 |
String getServerName() | 연결할 때 사용한 서버 이름 |
int getServerPort() | 서버가 실행중인 포트 번호 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Chap03</title>
</head>
<%
String remoteAddr = request.getRemoteAddr();
int contentLength = request.getContentLength();
String characterEncoding = request.getCharacterEncoding();
String contentType = request.getContentType();
String protocol = request.getProtocol();
String method = request.getMethod();
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String serverName = request.getServerName();
int serverPort = request.getServerPort();
%>
<body>
클라이언트 IP = <%=remoteAddr%><br>
Request 정보 길이 = <%=contentLength%><br>
Request 정보 인코딩 = <%=characterEncoding%><br>
Request 정보 컨텐츠 타입 = <%=contentType%><br>
Request 프로토콜 = <%=protocol%><br>
Request 메소드 = <%=method%><br>
Request URI = <%=requestURI%><br>
Web Application Context Path = <%=contextPath%><br>
서버 이름 = <%=serverName%><br>
서버 포트번호 = <%=serverPort%>
</body>
</html>
2) Client(웹 브라우저)가 전송한 파라미터 읽기
메소드 | 설명 |
String getParameter(String name) | 이름이 "name"인 파라미터의 값을 구하기 >> 없으면 null 리턴 |
String [] getParameterValues(String name) | 이름이 "name"인 모든 파라미터의 값을 배열로 구하기 >> 없으면 null 리턴 |
java.util.Enumeration getParameterNames() | 웹 브라우저가 전송한 파라미터의 이름 목록을 구하기 |
java.util.Map getParameterMap() | 웹 브라우저가 전송한 파라미터의 Mapping 쌍 구하기 >> [파라미터 이름 : 값]으로 구성 |
1) form을 통해서 Client가 Server로 Request 보내기 (form.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Chap03</title>
</head>
<body>
<form action="requestParameter.jsp" method="post">
이름: <input type="text" name="name"/><br><br>
나이: <input type="text" name="age"/><br><br>
이메일: <input type="email" name="email"/><br><br>
아이디: <input type="text" name="id"/><br><br>
비밀번호: <input type="password" name="password"/><br><br>
기술 스택:
<input type="checkbox" name="tech" value="spring">Spring
<input type="checkbox" name="tech" value="springboot">Spring Boot
<input type="checkbox" name="tech" value="springsecurity">Spring Security
<input type="checkbox" name="tech" value="jpa">JPA
<input type="checkbox" name="tech" value="mybatis">MyBatis
<input type="checkbox" name="tech" value="react">React
<input type="checkbox" name="tech" value="vuejs">Vue.js
<input type="checkbox" name="tech" value="svelte">Svelte
<br><br>
<button type="submit">데이터 전송</button>
</form>
</body>
</html>
2) Server는 Client가 보낸 Request 정보 읽기 (requestParameter.jsp)
<%@ page import="java.util.Map" %>
<%@ page import="java.util.Enumeration" %>
<%@ page import="java.util.Arrays" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Chap03</title>
</head>
<%
request.setCharacterEncoding("UTF-8"); // 인코딩 지정
// getParameter
String name = request.getParameter("name");
String age = request.getParameter("age");
String email = request.getParameter("email");
String id = request.getParameter("id");
String password = request.getParameter("password");
// getParameterValues()
String[] techList = request.getParameterValues("tech");
// getParameterNames()
Enumeration<String> parameterNames = request.getParameterNames();
// getParameterMap()
Map<String, String[]> parameterMap = request.getParameterMap();
%>
<body>
<h3>getParameter(...)</h3>
이름 = <%=name%><br>
나이 = <%=age%><br>
이메일 = <%=email%><br>
아이디 = <%=id%><br>
비밀번호 = <%=password%>
<br><br>
<h3>getParameterValues("tech")</h3>
기술 스택 =
<%
out.print("[ ");
for (String tech : techList) {
out.print(tech + " ");
}
out.print("]");
%>
<br><br>
<h3>getParameterNames()</h3>
<%
while (parameterNames.hasMoreElements()) {
String pName = parameterNames.nextElement();
out.print(pName + " ");
}
%>
<br><br>
<h3>getParameterMap()</h3>
<%
for (String mName : parameterMap.keySet()) {
out.print(mName + " -> [ ");
for (String value : parameterMap.get(mName)) {
out.print(value + " ");
}
out.print("]<br>");
}
%>
</body>
</html>
requestParam.jsp의 <% %> 처음부분을 보면 request.setCharacterEncoding("UTF-8")이라는 설정이 보인다
웹 브라우저는 Server에 파라미터들을 전송할 떄 charset을 이용해서 파라미터 값들을 "인코딩"한다.
그러면 이러한 파라미터 정보들을 받은 Server는 브라우저가 전송한 파라미터 데이터를 "디코딩"한다
이 때 브라우저 - Server간에 사용한 charset정보가 일치해야 정확하게 인코딩/디코딩 할 수 있다.
따라서 브라우저가 "UTF-8"로 인코딩한 데이터를 서버에서 디코딩할 때 반드시 "UTF-8"로 디코딩해야 한다는 의미이다
서버측에서 setCharacterEncoding을 설정하지 않으면 default인 "ISO-8859-1"을 charset으로 사용하게 된다
## GET 방식 요청 인코딩 결정 규칙 3가지 ##
1. <a> 태그의 링크 태그에 Query String 추가 = 웹 페이지 인코딩 사용
2. FORM의 method를 "GET"으로 지정해서 전송 = 웹 페이지 인코딩 사용
3. 웹 브라우저 주소에 직접 Query String을 포함하는 URL을 입력 = 웹 브라우저마다 다르다
>> Tomcat 8버전 이상부터는 GET 방식으로 전달된 파라미터 값을 읽어올때 사용하는 default charset이 "UTF-8"이다
3) Request에 대한 HTTP 메시지 헤더 읽기
메소드 | 설명 |
String getHeader(String name) | 지정한 이름의 헤더 값을 구한다 >> host / user-agent / accept / connection / .... |
java.util.Enumeration getHeaders(String name) | 지정한 이름의 헤더 목록 구하기 >> accept-encoding의 경우 value가 여러개가 존재할 수 있기 때문에 해당 값들을 Enumeration으로 가져온다 >> value가 1개이면 그냥 getHeader로 value를 가져오면 된다 |
java.util.Enumeration getHeaderNames() | 모든 헤더의 이름을 구하기 |
int getIntHeader(String name) | 지정한 헤더의 값을 정수 값으로 읽기 |
long getDateHeader(String name) | 지정한 헤더의 값을 시간 값으로 읽기 >> 시간은 1970년 1월 1일 이후로 1/1000초 단위로 계산 |
<%@ page import="java.util.Enumeration" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Chap03</title>
</head>
<body>
<%
Enumeration<String> emr = request.getHeaderNames();
while(emr.hasMoreElements()){
String headerName = emr.nextElement();
Enumeration<String> emrH = request.getHeaders(headerName);
out.print(headerName + " >> ");
while(emrH.hasMoreElements()){
String headerValue = emrH.nextElement();
out.print(headerValue + " ");
}
out.println("<br><br>");
}
%>
</body>
</html>