본문 바로가기

학원/복기

[JSP] 내장객체(Implicit Object)

 

내장객체(Implicit Object)

 

내장객체는 WAS 프로그램에 의해 JSP 문서에서 사용되도록 제공되는 Java 객체이다.

 

page(HttpJspPage) : JSP 문서정보를 제공하기 위한 객체

config(ServletConfig) : WAS 프로그램에 등록된 환경설정 값을 제공하기 위한 객체

out(JspWriter) : 클라이언트에게 응답될 문서파일을 생성하기 위한 객체 - 출력스트림

request(HttpServletResquest) : 클라이언트의 요청정보를 제공하기 위한 객체

response(HttpServletResponse) : 클라이언트의 응답정보를 제공하기 위한 객체

session(HttpSession) : 서버와 클라이언트의 연결 지속성을 제공하기 위한 객체

application(ServletContext) : 웹자원(WebContext)을 관리하는 정보를 제공하기 위한 객체 - WAS

pageContext(PageContext) : 웹프로그램 작성에 필요한 객체를 제공하기 위한 객체

exception(Exception) : 웹프로그램 실행시 발생된 예외를 제공하기 위한 객체 - page Directive에서 isErrorPage 속성값을 [true]로 설정한 경우에만 제공 : 에러페이지에서 사용

 


 

예제)

 

 

1. 비로그인 상태의 사용자인 경우 사용자로부터 로그인 처리에 필요한 인증정보(아이디와 비밀번호)를 입력받기위한 JSP 문서(login_form.jsp) 생성

→ [로그인] 태그를 클릭한 경우 [login_action.jsp] 문서를 요청하여 페이지 이동 - 입력값(인증정보) 전달 

+ 로그인 상태의 사용자인 경우 환영메세지를 전달하여 응답

 

[login_form.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//바인딩된 세션에 저장된 에러메세지를 반환받아 저장
	String message=(String)session.getAttribute("message");
	if(message==null) {
		message="";
	} else {
		//session.removeAttribute(String attributeName) : 클라이언트의 정보(JSESSIONID 쿠키)로 
		//바인딩된 세션(session)에서 매개변수로 전달된 속성명의 속성값(객체)을 삭제하는 메소드
		// => 바인딩된 세션에 저장된 객체는 세션 소멸 전까지 유지
		//다른 JSP 문서에 세션에 저장된 에러메세지를 사용할 수 없도록 삭제 처리
		session.removeAttribute("message");
	}
	
	String id=(String)session.getAttribute("id");
	if(id==null) {
		id="";
	} else {
		session.removeAttribute("id");
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>로그인</h1>
	<hr>
	<form action="login_action.jsp" method="post" name="loginForm">
	<table>
		<tr>
			<td>아이디</td>
			<td><input type="text" name="id" value="<%=id%>"></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="password" name="passwd"></td>
		</tr>
		<tr>
			<td colspan="2"><button type="button" id="loginBtn">로그인</button>
		</tr>
	</table>
	</form>
	<p id="message" style="color: red;"><%=message %></p>
	
	<script type="text/javascript">
	loginForm.id.focus();
	
	document.getElementById("loginBtn").onclick=function() {
		if(loginForm.id.value=="") {
			document.getElementById("message").innerHTML="아이디를 입력해 주세요.";
			loginForm.id.focus();
			return;
		}
		
		if(loginForm.passwd.value=="") {
			document.getElementById("message").innerHTML="비밀번호를 입력해 주세요.";
			loginForm.passwd.focus();
			return;
		}
		
		loginForm.submit();
	}
	</script>
</body>
</html>

 

 

2. 인증정보(아이디와 비밀번호)를 전달받아 로그인 처리하기 위한 JSP 문서(login_action.jsp) 생성

→ [login_form.jsp] 문서의 form 태그를 이용하여 post 방식으로 요청하는 JSP 문서이다. 

 

인증 실패  : 전달받은 인증정보가 저장매체에 저장된 인증정보와 일치하지 않는 경우 

→ 클라이언트에게 [login_form.jsp]를 요청할 수 있는 URL 주소를 전달하여 응답한다.   

 

인증 성공 : 전달받은 인증정보가 저장매체에 저장된 인증정보와일치하는 경우

→ 인증 성공시, 권한 관련 정보가 저장된 객체를 세션에 저장한다. - 클라이언트에게 권한을 제공한다. (로그인)

→ 클라이언트에게 [login_user.jsp]를 요청할 수 있는 URL  주소를 전달하여 응답한다. 

 

 

[login_action.jsp]

 

request.getMethod() : JSP문서를 요청한 요청방식(GET or POST)을 반환하는 메소드 

response.sendError(int sc) : 클라이언트에게 에러코드(4XX or 5XX)를 전달하여 응답 처리하는 메소드 

response.sendRedirect(int sc) : 클라이언트에게 URL 주소를 전달하여 응답 처리하는 메소드 

→  URL 주소를 응답받은 클라이언트는 브라우저의 요청 URL 주소를 변경하여 요청 처리하고 실행결과를 응답받아 출력한다.  - 리다이렉트를 이용한 페이지 이동(리다이렉트 이동)  

URLEncoder.encode(String s, String enc) : 매개변수로 전달받은 문자열을 원하는 문자형태의 유니코드로 부호화 처리하여 반환하는 메소드 
→ JavaScript의 encoderURIComponent 함수와 동일한 기능을 제공한다.  
request.setCharacterEncoding(String enc) :  POST 방식으로 요청하여 리퀘스트 메세지 몸체부에 저장되어 전달되는 값에 대한 문자형태를 변경하는 메소드
request.getParameter(String name) : 전달값을 문자열(String 객체)로 반환하는 메소드 
→ 매개변수로 전달받은 이름의 전달값이 없는 경우 null을 반환한다. 
request.getParameterValues(String name) : 같은 이름으로 전달된 값이 여러개인 경우 모든 전달값을 문자열 배열로 반환하는 메소드
session.setAttribute(String attributeName, Object attributeValue) : 클라이언트의 정보(JSESSIONID 쿠키)로 바인딩 세션(session)에 이름(속성명)과 객체(속성값)를 전달받아 저장(변경)하는 메소드 

 

<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	if(request.getMethod().equals("GET")) {//JSP 문서를 GET 방식으로 요청한 경우 - 비정상적인 요청
		//1) 클라이언트에게 에러코드 전달하여 응답 처리 
		/*
		response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);//405
		return;
		*/
		
		//2) [login_form.jsp] 문서로 이동하기 위한 URL 주소를 전달하여 응답
		// => 질의문자열(QueryString)을 사용하여 [login_form.jsp] 문서에 값(에러메세지)을 전달
		// => 질의문자열로 영문자, 숫자, 일부 특수문자를 제외한 문자는 전달 불가능 - 부호화 처리하여 전달 가능
		/*
		String message=URLEncoder.encode("비정상적인 방법으로 페이지를 요청 하였습니다.", "utf-8");		
		response.sendRedirect("login_form.jsp?message="+message);
		return;
		*/
		
		//3) 바인딩된 세션에 에러메세지 저장 
		session.setAttribute("message", "비정상적인 방법으로 페이지를 요청 하였습니다.");
		response.sendRedirect("login_form.jsp");
		return;
	}
	//request.setCharacterEncoding("utf-8");//한글 전달값이 없는 경우 생략 가능
	
	String id=request.getParameter("id");
	String passwd=request.getParameter("passwd");
	
	if(!id.equals("abc123") || !passwd.equals("123456")) {//인증실패
		session.setAttribute("message", "아이디 또는 비밀번호가 맞지 않습니다.");
		session.setAttribute("id", id);
		response.sendRedirect("login_form.jsp");
		return;
	}


	//인증 성공
	session.setAttribute("loginId", id);//권한 관련 정보가 저장된 객체를 세션에 저장
	response.sendRedirect("login_user.jsp");
%>

 

 

 

로그인 상태의 사용자에게 환영메세지를 전달하여 응답하는 JSP 문서(login_user.jsp) 생성 

→ 비로그인 상태의 사용자인 경우 [login_form.jsp] 문서를 요청할 수 있는 URL 주소를 전달하여 응답 

 

[login_user.jsp]

 

session.getAttribute(String attributeName) : 클라이언트의 정보(JSESSIONID 쿠키)로 바인딩된 세션(session)에서 매개변수로 전달된 속성명의 속성값(객체)을 반환하는 메소드 

→ Object 객체로 반환되므로 반드시 명시적 객체 형변환을 사용해야 한다. 

→ 속성명으로 저장된 속성값이 없는 경우 null을 반환한다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String loginId=(String)session.getAttribute("loginId");

	if(loginId==null) {//반환받은 속성값(객체)가 없는 경우 - 비로그인 상태의 사용자 
		session.setAttribute("message", "로그인 상태의 사용자만 접근 가능한 페이지입니다.");
		response.sendRedirect("login_form.jsp");
		return;
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>로그인 사용자 전용 페이지</h1>
	<hr>
	<p>
		<%=loginId %>님, 환영합니다.&nbsp;&nbsp;
		<a href="logout_action.jsp">[로그아웃]</a>&nbsp;&nbsp;
		<a href="login_form.jsp">[메인으로]</a>
	</p>
	<hr>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<p>로그인 사용자만 확인 가능한 내용입니다.</p>
	<hr>
</body>
</html>

 

 

로그아웃 처리 후 [login_form.jsp] 문서를 요청할 수 있는 URL 주소를 전달하여 응답하는 [logout_action.jsp] 생성 

→ 로그아웃 처리 : 권한 관련 정보가 저장된 객체를 세션에서 삭제 처리

 

session.invalidate() : 클라이언트의 정보(JSESSIONID 쿠키)로 바인딩된 세션(session)을 삭제하는 메소드 - 세션 언바인딩(Session UnBinding) 처리 

 

[logout_action.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//session.removeAttribute("loginId");

	session.invalidate();
	
	response.sendRedirect("login_form.jsp");
%>

 

 


상대경로 절대경로

 

Koala.jpg 경로

 

상대경로를 이용하여 웹자원을 제공받아 사용

→ 상대경로 : 현재 요청 JSP 문서의 디렉토리를 기준으로 웹자원의 경로 표현
→ 웹자원의 경로를 잘못 표현한 경우 404 발생이 가능하기 때문에 웹자원의 경로는 절대경로로 표현하는 것을 권장한다.

<img alt="코알라" src="../images/Koala.jpg" width="200">

 

 절대경로를 이용하여 웹자원을 제공받아 사용
→ 절대경로 : 최상위 디렉토리를 기준으로 웹자원의 경로 표현 
→ 웹프로젝트의 파일이 저장된 컨텍스트 디렉토리의 경로 변경 가능 - 404 발생이 가능하다 

<img alt="코알라" src="/jsp/images/Koala.jpg" width="200">

 

절대경로에서 웹자원이 저장된 컨텍스트 디렉토리의 경로는 request 객체의 getContextPath() 메소드를 호출하여 반환받아 사용한다.

request.getContextPath() : 컨텍스트 디렉토리 경로를 반환하는 메소드

<img alt="코알라" src="<%=request.getContextPath() %>/images/Koala.jpg" width="200">