이번 실습에서는 회원가입을 위한 양식과 입력 데이터처리 과정에서 내장객체가 어떻게 활용될 수 있는지 살펴본다.

실습을 통해 기본 기본적인 내장객체들의 활용방법과 주요 기능에 대해 알아 본다.

실습 내용

간단한 HTML 파일로 회원가입에 필요한 정보를 입력 받기 위한 입력양식으로 구성된다. 입력 항목은 다음과 같다.

단순 텍스트 입력과 단일 선택, 다중 선택에 대한 처리를 알아 보기 위해 각각 <input type="text">, <select>, <input type="checkbox">를 사용했다.

다음과 같이 signupForm.html 파일을 생성 한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sign-up Form</title>
</head>
<body>
<H2>Sign-up form</H2>
<HR>
<form method="post" action="signupResult.jsp">
<label>Name</label><br>
<input type=text size=20 name="username"><br>

<label>Job</label><br>
<select name="job">
	<option selected>None</option>
	<option>Business</option>
	<option>IT Company</option>
	<option>Student</option>
</select>
<br>

<label>Hobbies</label><br>
<input type="checkbox" name="hobby" value="001-Soccer">Soccer
<input type="checkbox" name="hobby" value="002-Travel">Travel
<input type="checkbox" name="hobby" value="003-Music">Music

<hr>
<input type="submit" value="Confirm"><input type="reset" value="Cancel">
</form>
</body>
</html>

실행 결과는 다음과 같다.

signupForm.html 실행결과

HTML 폼으로 부터 전송되는 입력값은 이미 여러 예제에서 살펴본것 처럼 request.getParameter() 를 사용하면 된다.

signupResult.jsp 생성

먼저 다음과 같이 signupResult.jsp 파일을 생성한다. JSTL 사용을 위해 taglib 지시어도 추가해 둔다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sign-up Results</title>
</head>
<body>
	<H2>Sign-up Results</H2>
	<HR>
</body>
</html>

한글 캐릭터셋 설정

POST 방식으로 전달되는 한글 데이터의 정상적인 처리를 위해 request.setCharacterEncoding()을 page 지시어 바로 다음에 추가 한다.

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

일반적으로 jsp 를 뷰의 역할로만 구현한다면 필요 없으며 주로 컨트롤러 역할을 하는 서블릿이나 필터 설정등을 통해 처리하는것이 일반적이다.

이름과 직업 출력

<ul> <li> 태그를 이용해 HTML 폼에서 입력된 이름과 직업을 출력한다.

	<H2>Sign-up Results</H2>
	<HR>
	<ul>
		<li>Name: <%=request.getParameter("username")%></li>
		<li>Job: <%=request.getParameter("job")%></li>

취미 출력

취미의 경우 체크박스를 통해 여러 항목의 선택이 가능하다. 입력 양식에서 체크박스 항목들은 모두 동일한 name 속성을 가지고 있으며 선택 값들은 동일한 이름으로 중복해서 전달된다. 또한 서버로 전달되는 값은 화면에 보이는 값이 아닌 value 속성의 값이 된다.

GET 방식으로 전달된 경우라면 다음과 같이 URL 에 표시될 것이다.

/signupResult.jsp?username=hong&job=Business&hobby=001-Soccer&hobby=003-Music

중복된 name 속성으로 입력된 모든 항목을 가지고 오려면 request.getParameterValues() 메서드를 사용해야 하며 리턴값은 문자열 배열이 된다.

화면 출력을 위해 스크립트릿을 사용하는 경우 다음과 같이 구현할 수 있다.

	<li>Favorites:
	<ul>
	<%
		// getParameterValues 메서드를 이용해 "favorite" 로 설정된 form 의 체크박스 값들을 모두 읽어옴.
		String hobbies[] = request.getParameterValues("hobby");

		for (String hobby : hobbies) {
			out.println("<li>" + hobby + "</li>");
		}
	%>
	</ul>
	</li>
</ul>	

물론 스크립트릿 대신 JSTL과 EL을 사용을 사용하는 것이 좋으며 이경우 다음과 같이 구현할 수 있다.

	<c:forEach items="${paramValues.hobby}" var="hobby">
		<li>${hobby}</li>
	</c:forEach>

여기 까지 완성된 코드는 다음과 같다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sign-up Results</title>
</head>
<body>
	<H2>Sign-up Results</H2>
	<HR>
	<ul>
		<li>Name: <%=request.getParameter("username")%></li>
		<li>Job: <%=request.getParameter("job")%></li>
		<li>Favorites:
		<ul>
		<c:forEach items="${paramValues.hobby}" var="hobby">
			<li>${hobby}</li>
		</c:forEach>
	<%--
		// getParameterValues 메서드를 이용해 "favorite" 로 설정된 form 의 체크박스 값들을 모두 읽어옴.
		String hobbies[] = request.getParameterValues("hobby");

		for (String hobby : hobbies) {
			out.println("<li>" + hobby + "</li>");
		}
	--%>
		</ul>
		</li>
	</ul>
</body>
</html>

실행 결과

입력값 실행결과

request 내장객체는 HTML 폼의 입력값을 가져오는 용도뿐만 아니라 클라이언트 요청과 관련된 다양한 정보를 처리하기 위한 메서드를 가지고 있다. 여기서는 클라이언트의 IP 주소와 요청 method 를 출력해 본다. 앞의 소스에 이어서 작성 하도록 한다.

	<hr>
	<H2>Request Information</H2>
	1. Client IP Address : <%=request.getRemoteAddr()%> <br>
	2. Request Method : <%=request.getMethod()%>

인터넷에서 IP 주소는 사용자 컴퓨터마다 할당된 고유 주소라고 볼 수 있다. 따라서 게시글 작성자를 추적하거나 기록 보관의 용도로 IP주소를 사용하는 경우가 있다. request.getRemoteAddr() 은 현재 페이지를 요청하는 클라이언트 컴퓨터의 IP 주소를 가져온다.

기본적으로 IPv6 규격으로 출력하기 때문에 익숙한 IPv4로 출력하려면 톰캣 실행시 다음과 같은 추가 옵션이 필요 하다. 이클립스의 Run -> Run Configuration -> Tomcat 9.0 .... -> Arguments -> VM arguments 의 맨 앞이나 뒤에 추가한다. 추가할때 기존 설정값들이 변경되지 않도록 주의 한다.

-Djava.net.preferIPv4Stack=true

실행결과

request 정보 실행결과

response 는 서버에서 클라이언트로 응답을 보내기위한 정보를 다루는 내장 객체로 request에 비하면 제공되는 기능이 제한적이다.

여기서는 서버에서 응답하는 상태코드와 로케일(언어/지역) 설정을 보여준다. 그 외 사용자 정의 헤더 설정과 참조가 가능하다.

코드는 앞에서 이어 계속 작성하면 된다.

	<H2>Response Information</H2>
	1. Status Code : <%=response.getStatus()%> <br>
	2. Locale: <%=response.getLocale()%>
	<hr>

실행결과

response 정보 실행결과

application 은 웹 애플리케이션의 환경적인 정보를 제공하는 내장객체로 서버 버전을 포함한 각종 정보와 요청 리소스의 경로 정보등을 알 수 있다. 또한 log() 메서드를 이용해 톰캣의 로깅 시스템을 통한 로그 출력도 지원 한다.

	<H2>Server Information</H2>
	1. Server info : <%=application.getServerInfo() %> <br>
	2. Context Path : <%=application.getContextPath() %>
	<%
		application.log("Log from signupResult.jsp");
	%>

실행결과

application 정보 실행결과