TIL 45 | [JSP] 내장 객체(Implicit Object) - requst 객체

Yoonsik·2022년 10월 1일
1

JSP

목록 보기
4/12

⛓ 내장객체란?

JSP의 내장객체를 이해하기 위해선 웹의 동작방식에 대한 이해가 필요합니다.

웹은 그림과 같이 클라이언트가 서버로 요청(Request)를 보내면 서버가 그에 맞는 결과를 응답(Response)으로 돌려주는 형태로 동작합니다.

이때, JSP 내장객체는 요청과 응답, 혹은 HTTP 헤더 등의 정보를 쉽게 다룰 수 있게 해줍니다.
쉽게 말해, 클라이언트의 요청을 받거나 응답할때 사용합니다.

JSP 내장객체는 JSP 페이지가 실행될 때 컨테이너가 자동으로 생성해 주기 때문에 별도의 선언이나, 객체로의 생성 없이 바로 사용이 가능합니다.

JSP는 실행될때 Java파일인 서블릿으로 변환되고, .class 파일로 컴파일 됩니다.
이러한 변환과정에서 _jspService() 메소드가 생성되는데, 이 메소드 안에 JSP 내장객체의 참조변수를 컨테이너가 생성합니다.

실제로 서블릿 Java파일에 들어가 보면, 다음과 같이 _jspService() 메소드 안에 JSP 내장객체의 참조변수들이 선언되어 있는것을 확인할 수 있습니다.


... 코드생략 ...

내장객체의 특징

  • 컨테이너가 미리 (_jspService()에) 선언해놓은 참조 변수를 이용해 사용한다.
  • 별도의 객체 생성 없이 각 내장객체의 메서드를 사용할 수 있다.
  • JSP 문서 내의 스트립틀릿 <% %>, 표현식 <%= %> 에서만 사용이 가능하다.
  • 선언부 <%! %> 에서는 즉시 사용하는것은 불가능하고, 매개변수로 전달받아 사용할 수 있다.

⛓ request 객체

클라이언트(주로 웹 브라우저)가 전송한 요청정보를 저장하는 객체이다.

🔗 request 객체의 기능

  • 클라이언트(웹 브라우저)와 관련된 정보 읽기 기능
  • 서버와 관련된 정보 읽기 기능
  • 클라이언트가 전송한 요청 파라미터 읽기 기능
  • 클라이언트가 전송한 요청 헤더 읽기 기능
  • 클라이언트가 전송한 쿠키 읽기 기능
  • 속성처리기능

🔗 request 객체의 주요 메소드

메소드리턴타입설명
getParameter(String name)String클라이언트가 전송한 이름이 'name'인 요청 파라미터의 값을 구한다.
해당 이름의 파라미터가 존재하지 않을 경우, null
getParameterValues(String name)String[]클라이언트가 전송한 이름이 'name'인 모든 요청 파라미터의 값을 배열로 구한다. 즉, 이름이 'name'인 여러개의 파라미터를 배열 형태로 구할 수 있다.
해당 이름의 파라미터가 존재하지 않을 경우, null
getParameterName()java.util.Enumeration웹 브라우저(클라이언트)가 전송한 파라미터의 이름을 구한다.
getParameterMap()java.util.Map웹 브라우저(클라이언트)가 전송한 파라미터의 Map<이름, 값>을 세트로 구한다.
getRemoteAddr()String웹 서버에 연결한 클라이언트의 IP 주소를 구한다.
getMethod()String웹 브라우저(클라이언트)가 정보를 전송할 때 사용한 전송방식을 구한다.
getRequestURL()String클라이언트가 전송한 요청주소를 URL 형태로 반환한다.
getRequestURI()String클라이언트가 전송한 요청주소를 URI 형태로 반환한다.
getServerName()String연결할 때 사용한 서버의 이름을 구한다.
getServerPort()int서버가 실행중인 포트번호를 구한다.

⛓ request 내장객체를 이용한 클라이언트의 환경정보를 읽는 프로그램

🔗 RequestMain.jsp - 클라이언트의 요청을 전송


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>내장객체 -- request</title>
</head>
<body>
	<h2>GET 방식을 이용한 클라이언트의 요청 전송</h2>
	<a href="./RequestWebInfo.jsp?eng=Hello&han=안녕"> <!-- <a> 태그를 이용해 링크를 만들 수 있다. <a> 태그의 기본형으로 href 속성을 이요해 연결할 파일이나 링크할 주소를 입력한다. 다음은 텍스트로 이루어진 GET 방식을 이용한 텍스트 링크이다.-->
		GET 방식 전송
	</a>
	<br />	
	<h2>POST 방식을 이용한 클라이언트의 요청 전송</h2>
	<form action="RequestWebInfo.jsp" method="post">
		영어 : <input type="text" name="eng" value="Bye" /><br />
		한글 : <input type="text" name="han" value="잘가" /><br />
		<input type="submit" value="POST 방식 전송" />
	</form>
</body>
</html>

RequestMain.jsp 이 페이지는 클라이언트의 요청을 전송하기 위한페이지로, HTML로만 구성되어 있습니다.

클라이언트가 서버로 요청을 전송할 때 사용하는 방법을 크게 HTTP Method라고 하며, 이 페이지에서는 HTTP Method의 GET 방식과 POST 방식을 사용하여 클라이언트의 요청을 전송하였습니다.

GET 방식

<h2>GET 방식을 이용한 클라이언트의 요청 전송</h2>
	<a href="./RequestWebInfo.jsp?eng=Hello&han=안녕"> <!-- <a> 태그를 이용해 링크를 만들 수 있다. <a> 태그의 기본형으로 href 속성을 이요해 연결할 파일이나 링크할 주소를 입력한다. 다음은 텍스트로 이루어진 GET 방식을 이용한 텍스트 링크이다.-->
		GET 방식 전송
	</a>

GET 방식은 다음과 같이 클라이언트의 데이터를 URL 뒤에 쿼리스트링(query string) 형태로 붙여 전달하는 형태이며, <a> 태그를 이용해 전송이 가능합니다.

이 코드에서는 이름(key)이 eng이고, 값(vlaue)이 Hello인 요청 파라미터와 이름(key)이 han이고, 값(vlaue)이 안녕인 요청 파라미터를 GET 방식을 이용하여 서버로 전송하였습니다.

POST 방식

<h2>POST 방식을 이용한 클라이언트의 요청 전송</h2>
	<form action="RequestWebInfo.jsp" method="post">
		영어 : <input type="text" name="eng" value="Bye" /><br />
		한글 : <input type="text" name="han" value="잘가" /><br />
		<input type="submit" value="POST 방식 전송" />
	</form>

GET 방식은 URL에 데이터를 쿼리스트링 형태로 붙여서 보내는 반면, POST 방식은 HTTP 패킷의 바디영역에 데이터를 넣어서 보냅니다.

이코드에서는 <form> 태그를 이용한 POST 방식을 통해 요청을 전송하였습니다.

action 속성으로 지정한 폼 영역에서 사용자가 입력한 데이터를 처리해줄 서버 프로그램 RequestWebInfo.jspname="eng" value="Bye", name="han" value="잘가" 라는 파라미터가 전달됩니다.

이렇게 GET 방식과 POST 방식을 사용하여 클라이언트의 요청을 전송해 보았습니다.
이제 request 내장객체를 이용하여 클라이언트와 서버의 환경정보를 읽어와 화면에 표시해 보겠습니다.

🔗 RequestWebInfo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>내장 객체 - request</title>
</head>
<body>
	<h2>1. 클라이언트와 서버의 환경정보 읽기</h2>
	<ul> <!--  <ul> unordered list : 순서가 정해져 있지 않은 리스트(항목) 생성 -->
		<li>데이터 전송 방식 getMethod() : <%= request.getMethod() %></li>
		<li>URL getRequestURL() : <%= request.getRequestURL() %></li>
		<li>URI getRequestURI() : <%= request.getRequestURI() %></li>
		<li>프로토콜 getProtocol() : <%= request.getProtocol() %></li>
		<li>서버명 getServerName() : <%= request.getServerName() %></li>
		<li>서버 포트 getServerPort() : <%= request.getServerPort() %></li>
		<li>클라이언트 IP주소 getRemoteAddr() : <%=request.getRemoteAddr() %></li>
		<li>쿼리 스트링 getQueryString() : <%=request.getQueryString() %></li>
		<li>전송된 값 1 getParameter("String name") : <%=request.getParameter("eng") %></li>
		<li>전송된 값 2 getParameter("String name") : <%=request.getParameter("han") %></li>
	</ul>
</body>
</html>
  • <li>데이터 전송 방식 getMethod() : <%= request.getMethod() %></li>
    request 내장객체의 getMethod()메소드를 이용하여 요청을 전송한 클라이언트의 데이터 전송방식(ex GET, POST ..)을 표현식을 통해 화면에 표시하였다.

  • <li>URL getRequestURL() : <%= request.getRequestURL() %></li>
    <li>URI getRequestURI() : <%= request.getRequestURI() %></li>

    request 내장객체의 getRequestURL(), getRequestURI()메소드를 이용하여 클라이언트가 전송한 요청주소를 URL/URI 형태로 반환하여 화면에 표시하였다.

  • <li>서버명 getServerName() : <%= request.getServerName() %></li>
    request 내장객체의 getServerName()메소드를 이용하여연결할때 사용한 서버의 이름을 구해 화면에 표시하였다.

  • <li>클라이언트 IP주소 getRemoteAddr() : <%=request.getRemoteAddr() %></li>
    request 내장객체의 getRemoteAddr()메소드를 이용하여 웹 서버에 연결한 클라이언트의 IP주소를 구해 화면에 표시하였다.

  • <li>쿼리 스트링 getQueryString() : <%=request.getQueryString() %></li>
    request 내장객체의 getQueryString()메소드를 이용하여 요청주소 뒷부분의 파라미터 전달을 위한 쿼리스트링 전체를 반환하여 화면에 표시하였다.

    RequestMain.jsp 파일에서 GET 방식으로 요청 파라미터를 전송한 경우

    다음과 같이 주소표시줄에서 쿼리스트링 형식으로 파라미터 2개가 전달되어 있는 것을 확인할 수 있으며, 출력도 쿼리 스트링 getQueryString() : eng=Hello&han=%EC%95%88%EB%85%95 와 같이 정상적으로 출력된 것을 확인 할 수 있습니다.
    GET 방식으로 요청 파라미터를 URL의 뒷부분에 쿼리스트링 형태로 전달하였기 때문에, 요청주소 뒷부분의 데이터를 포함한 쿼리스트링을 반환하는 getQueryString() 메소드를 사용하면 정상적으로 해당 쿼리스트링이 반환되어 표현식을 통해 출력됩니다.


    RequestMain.jsp 파일에서 POST 방식으로 요청 파라미터를 전송한 경우

    POST 방식으로 요청 파라미터를 전달하였기 때문에 해당 데이터는 GET 방식을 사용했을 때 처럼 URL이 아닌, HTTP패킷의 body영역에 포함되어 전달됩니다.
    따라서, 주소표시줄에는 경로 외에는 아무것도 표시되지 않습니다. 따라서 getQueryString()메소드를 통해 구한 쿼리스트링 또한 애초에 존재하지 않기 때문에 null이 출력됩니다.

  • <li>전송된 값 1 getParameter("String name") : <%=request.getParameter("eng") %></li>
    request 내장객체의 getQueryString()메소드를 이용하여 매개변수로 입력받은 "eng"라는 이름을 가진 요청 파라미터의 값을 구해 표현식을 통해 화면에 표시하였다.

  • <li>전송된 값 2 getParameter("String name") : <%=request.getParameter("han") %></li>
    마찬가지로, request 내장객체의 getQueryString()메소드를 이용하여 매개변수로 입력받은 "han"이라는 이름을 가진 요청 파라미터의 값을 구해 표현식을 통해 화면에 표시하였다.


⛓ 클라이언트의 요청 매개변수를 읽는 프로그램

사용자가 <form> 태그의 하위태그( ex) input-> text, radio, checkbox ...)를 통해 입력한 값들도 서버로 전송됩니다.
이렇게 전송된 값은 서버에서 읽은다음 각각 변수에 저장합니다. 그 후, 처리를 위해 컨트롤러나 모델로 전달됩니다.

🔗 02RequestMain.jsp - 클라이언트에게 데이터를 입력받고 해당 요청을 전송

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>내장객체 - request</title>
</head>
<body>
	<h2>2. 클라이언트의 요청 파라미터 읽기</h2>
	<form action="02RequestParameter.jsp" method="post">
		아이디 : <input type="text" name="id" value="" /><br />
		성별 : 
		<input type="radio" name="sex" value="male"  checked="checked" />남자
		<input type="radio" name="sex" value="female" />여자
		<br />
		관심사항 : 
		<input type="checkbox" name="favorite" value="politics" />정치
		<input type="checkbox" name="favorite" value="economy" />경제
		<input type="checkbox" name="favorite" value="entertainments" />연예
		<br />
		메모 :
		<textarea name="memo" cols="30" rows="4"></textarea>
		<br/>
		<input type="submit" value="전송" />
	</form>
</body>
</html>

이전 RequestMain.jsp 파일과 같은 기능으로, <form>태그 하위 요소를 통해 클라이언트에게서 데이터를 입력받고 POST 방식을 이용하여 지정한 02RequestParameter.jsp 파일로 전송합니다.

이렇게 전송된 값들은 서버(02RequestParameter.jsp) 에서 읽은 다음, 변수에 저장하여 사용합니다.

🔗 02RequestParameter.jsp - 전송받은 요청 파리미터의 값을 구한뒤, 변수에 저장하고 화면에 표시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>내장객체 - request</title>
</head>
<body>
<h2>-- 입력받은 클라이언트의 요청 파라미터 내용 --</h2>
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String sex = request.getParameter("sex");
String favorite[] = request.getParameterValues("favorite");
String favoStr = "";
if (favorite != null)
	for (int i = 0; i < favorite.length; i++) {
		favoStr += (favorite[i] + " ");
	}
String memo = request.getParameter("memo").replace("/r/n", "<br/>");
%>
<ul>
	<li>아이디 : <%= id %></li>
	<li>성별 : <%= sex %></li>
	<li>관심사항 : <%= favoStr %></li>
	<li>메모 : <%= memo %></li>
</ul>
</body>
</html>

02RequestMain.jsp 파일에서 전송한 요청 파라미터의 값을 request 내장객체의 메소드 getParameter("String Name") | getParameterValues("String Name")를 이용하여 구한뒤, 읽어낸 값들을 각각 변수에 저장하여 표현식을 통해 화면에 출력하였습니다.

  • request.setCharacterEncoding("UTF-8");
    인코딩처리를 하여 전송된 값이 한글인 경우 글자가 깨지는 현상이 발생하지 않게 하였다.

  • String id = request.getParameter("id");
    String sex = request.getParameter("sex");

    요청 파라미터 id는 input type="text"로 입력받은 하나의 값이기 때문에 request.getParemeter("id");를 통해 값을 읽어낸후, 변수 String id에 저장하였다.

    또, 요청 파라미터 sex는 여러개 항목중 하나만 선택할 수 있는input type="radio"로 입력받은 하나의 값이기 때문에 마찬가지로 request.getParemeter("id");를 통해 값을 읽어낸뒤, 변수 String sex에 저장하였다.

  • String memo = request.getParameter("memo").replace("/r/n", "<br/>");
    요청 파라미터 memo 또한 <textarea><textarea/>로 입력받은 하나의 값이기 때문에 request.getParemeter("memo");를 통해 값을 읽어낸뒤, 변수 String memo에 저장하였다.

    이때, textarea 에서 사용자가 여러줄을 입력할때, 커서를 아래로 이동하기 위해 Enter를 입력하게 되는데, 이Enter는 특수기호 /r/n으로 입력되게 된다.
    하지만 우리는 입력받은 값을 html을 이용하여 화면에 나타내기 때문에, 사용자에게 입력받을때 적용된 특수기호 /r/n을 html에서 줄바꿈 기능을 하는 <br>태그로 바꿔주어야 한다.
    이 부분을 처리하기 위해 replace("/r/n", "<br/>")을 사용하였다.

  • String favorite[] = request.getParameterValues("favorite");
    요청 파라미터 favorite는 여러가지 항목을 복수선택 가능한 input type="checkbox"로 입력받은 값이기 때문에 하나만 선택되는 경우도 있지만, 복수선택되는 경우도 존재한다.

    이런식으로 이름은 같지만(favorite) 여러개의 값이 존재(politics, economy, entertainments)하는 요청 파라미터의 모든 값을 구하기 위해서는 request.getParameterValues("String Name") 메소드를 이용해야 한다.
    이렇게 구해진 여러개의 값은 배열형태로 저장된다. (이 코드에서는 String favorite[])

    이렇게 배열형태로 저장된 값을 하나의 문자열로 연결한다음, 화면에 출력하기 위해 다음과 같이 처리하였다.

String favoStr = "";
if (favorite != null)
	for (int i = 0; i < favorite.length; i++) {
		favoStr += (favorite[i] + " ");
	}
1) 하나의 문자열로 연결된 문자열들을 저장할 String 타입 변수 favoStr 생성.
2) checkbox 선택이 비어있지 않은 경우 for문을 실행하도록 조건문을 생성.
3) 사용자가 checkbox를 통해 선택한 요청 파라미터 favorite의 값들을 읽어내 
저장한 배열favorite[]의 길이만큼 for문을 반복하여 비어있는 문자열 변수 
favoStr안에 favorite[0] ~ favorite[@] 값을 이어붙여 저장.

profile
꾸준함의 힘

0개의 댓글