JSP 내장객체 Request,Response,Session,Out,Application,PageContext

2020. 6. 1. 13:23자바 Java/JSP(Java Server Page)

반응형

 

** 내장객체별 메소드 정리 (추가로 해야함) 

 

 

<정리> 

내장객체는 JSP 파일에서 자바소스로 변환 될때 _jspService() 메소드에 자동으로 선언 및 초기화 되는 객체들을 의미한다. 

<%  %> <%=  %> 태그에서는 내장 객체를 바로 사용할 수 있다. 

내장 객체 request 타입은 HttpServletRequest 이며 요청정보를 처리한다. 

내장 객체 response 타입은 HttpServletResponse 이며 응답정보를 처리한다. 

내장 객체 session 타입은 HttpSession 이며 클라이언트 단위로 처리되는 객체이다. 

내장 객체 out 타입은 JspWriter 이며 클라이언트 쪽에 출력 처리 객체이다. 

내장 객체 application 타입은 ServletContext 이며 웹 애플리케이션 단위로 처리되는 객체이다. 

내장 객체 pageContext 타입은 PageContext 이며 JSP 페이지마다 하나씩 생성된다. 

pageContext는 JSP 내장 객체를 반환하는 메소드를 제공한다. 

<JSP의 내장 객체 > 

JSP 파일이 자바소스 파일로 변환될 때 _jsp.Service()메소드 내에 자동으로 선언 및 초기화 되는 변수들을 '내장객체' 라고 한다. 

내장 객체는 JSP 페이지에서 별도의 선언 및 초기화 작업 없이 바로 사용 할 수 있다. 

변수 이름  타입  설명
request javax.servlet.http.HttpServletRequest 요청정보 처리 객체
response javax.servlet.http.HttpServletResponse 응답정보 처리 객체 
session javax.servlet.http.HttpSession 상태정보 유지 객체
application javax.servlet.ServletContext 상태정보 유지 객체
config javax.servlet.ServletConfig 서블릿 정보 추출 객체
out javax.servlet.jsp.JspWriter 출력 처리 객체
pageContext javax.servlet.jsp.PageContext JSP 페이지 처리 객체 

 

 

<request, response >

request, response 내장객체는 각각 HttpServletRequest 와 HttpServletResponse 타입으로 요청정보와 응답정보를 처리하는 객체이다. 

 

request 내장객체의 관련 메소드 

   
String getParameter(name)  파라미터 변수 name에 저장된 변수를 얻어내는 메소드로, 이때 변수의 값은 String으로 리턴된다. 
String[] getParameterValues(name)  파라미터 변수 name에 저장된 모든 변수값을 얻어내는 메소드로, 이때 변수의 값은 String 배열로 리턴된다. checkbox에서 주로 사용된다.
String getProtocol()  웹 서버로 요청 시, 사용 중인 프로토콜을 리턴한다.
String getServerName()  웹 서버로 요청 시, 서버의 도메인 이름을 리턴한다. 
String getMethod()  웹 서버로 요청 시, 요청에 사용된 요청 방식(GET, POST, PUT 등)을 리턴한다. 
String getQueryString()  웹 서버로 요청 시, 요청에 사용된 QueryString을 리턴한다. 
String getRequestURI()  웹 서버로 요청 시, 요청에 사용된 URL 로부터 URI 값을 리턴한다
String getRemoteAddr()  웹 서버로 정보를 요청한 웹 브라우저의 IP주소를 리턴한다. 
int getServerPort()  웹 서버로 요청 시, 서버의 Port번호를 리턴한다. 
String getContextPath()  해당 JSP 페이지가 속한 웹 어플리케이션의 콘텍스트 경로를 리턴한다. 
 getSession()
요청 관련 세션 객체를 구한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[ 예제 ] 입력받은 ID와 비밀번호 중 하나라도 입력되지 않았을 경우 입력 페이지인 logInOut.jsp 페이지로 다시 돌려보내는 소스를 작성해보자. 

 

logInOut.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Input</title>
</head>
<body>
	<form action="example10.jsp" method="post">
	ID: <input type="text" name="id"><br>
	비밀번호: <input type="password" name="pwd"><br>
	<input type="submit" value="로그인">	
	</form>
</body>
</html>

 

example10.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>result</title>
</head>
<body>
<%
String id=request.getParameter("id");
String pwd=request.getParameter("pwd");

if(id.isEmpty() || pwd.isEmpty()){
	RequestDispatcher rd= request.getRequestDispatcher("logInOut.jsp");
	rd.forward(request,response);
	return;
}
%>
</body>
</html>

 

 

소스에 대한 설명 

RequestDispatcher rd= request.getRequestDispatcher("logInOut.jsp");

=>

RequestDispatcher 객체는 다른 페이지로 이동하는 forward() 또는 include()메소드를 가지고 있는 객체이다. 

RequestDispatcher 객체는 new 로 생성하는 것이 아니라 메소드를 이용해 생성해야 한다. 

HttpServletRequest 객체의 getRequestDispatcher()가 RequestDispatcher 객체를 생성해주는 메소드이다. 

메소드의 인자값으로는 이동할 페이지의 경로를 지정한다. 

내장 객체 request을 통해 메소드를 호출한다. 

 

rd.forward(request,response);
	return;

RequestDispatcher의 forward() 메소드는 페이지를 이동시키는 메소드이다. 이동하면서 현재 페이지에서 사용하던 HttpServletRequest와 HttpServletResponse 객체를 인자값으로 전달. 내장객체인 request와 response를 넘겨준다. 

그리고 페이지 이동후 현재 페이지 실행을 멈추기 위해 return; 을 사용하고 있다. 

 

 

 

[ 예제 ] 입력양식에 값이 입력되지 않아서 다시 입력페이지로 돌아올대, 오류메세지를 보여주도록 소스를 수정해보자 

logInOut.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Input</title>
</head>
<body>
<%
String msg=(String)request.getAttribute("error");
if(msg==null) msg=" ";
%>
<%=msg%>
	<form action="example10.jsp" method="post">
	ID: <input type="text" name="id"><br>
	비밀번호: <input type="password" name="pwd"><br>
	<input type="submit" value="로그인">	
	</form>
</body>
</html>

 

example10.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>result</title>
</head>
<body>
<%
String id=request.getParameter("id");
String pwd=request.getParameter("pwd");

if(id.isEmpty() || pwd.isEmpty()){
	request.setAttribute("error","ID 또는 비밀번호를 입력해주세요!");
	RequestDispatcher rd= request.getRequestDispatcher("logInOut.jsp");
	rd.forward(request,response);
	return;
}
%>
ID: <%=id%>/ PWD:  <%=pwd %>
</body>
</html>

 

요류가 발생해서 입력페이지로 이동하기 전에 오류 메세지를 생성하여 입력페이지로 전달해줘야 한다. 

웹은 HTTP 프로토콜을 사용하며, HTTP프로토콜은 무상태 특징이 있다. 즉, 하나의 페이지에서 사용하던 데이터를 다른 페이지에서 그대로 사용할 수 없다. 그래서 상태정보 유지기술이 필요하며, 이때 사용되는 페이지의 범위에 따라 정보 유지에 사용하는 객체가 달라진다. 

 

두 페이지의 공통점은 같은 request, client, application 이럴때는 HttpServletRequest, HttpSession, ServeltContext 객체 어디에 등록해도 무방하지만, forward() 메소드로 이동해온 logInOut.jsp 페이지에서 오류메세지 사용한 다음에 더는 사용할 필요 없으므로 HttpServletRequest 객체를 통해 정보를 유지하는 것이 효율적이다. 

 

Requestsms HttpServletRequest 타입의 내장객체이므로 request.setAttribute() 메소드를 이용하여 정보 등록

등록하는 이름은 " error "  등록하는 값은 String 타입의 "ID 또는 비밀번호를 입력해주세요! " 이다. 

 

소스에 대한 설명 

String msg=(String)request.getAttribute("error");

request.getAttribute("error") 실행문은 HttpServletRequest 객체에 " error"란 이름으로 등록된 값을 추출하여 반환

이때 반환된 값의 타입이 Object이므로 원래 등록했던 타입인 String 타입으로 변경한다. 

 

if(msg==null) msg=" ";

실행 순서가 logInOut.jsp -> example10.jsp -> logInOut.jsp 로 실행 되므로, example10.jsp 에서  "error" 란 이름으로 데이터가 등록되었다. 그래서 세번째 순서로 logInOut.jsp에서 request.getAttribute("error"); 명령문으로 등록된 값을 추출할 수 있다. 

 

그러나 첫번째 순서의 logInOut.jsp 를 실행했을 때에는 HttpServletRequest 안에 데이터가 등록되어 있지 않으므로 request.getAttribute("error"); 명령문의 반환값은 null dlek.  

msg 변숫값이 null 일때, 변수를 출력하면 "null"문자가 출력된다. 따라서 null 이 출력 되지 않도록 msg 변수에 빈 문자열 (" ")을 저장해 아무것도 출력되지 않게 한다. 

 

<%=msg%>

msg 변수 값을 출력. 첫번째 순서의 logInOut.jsp 가 실행 될 때 아무것도 출력 안되고, ID 또는 비밀번호를 입력하지 않은 상태에서 <로그인 버튼을 누르면 오류 메세지가 출력된다. 

 

 

<session>

session 은 javax.servlet.http.HttpSession 의 내장객체로서 클라이언트마다 하나씩 생성 클라이언트 단위로 정보를 유지하고자 할때 사용 (가장 대표적인 예가 로그인과 로그아웃에서 활용) 

 

 

[ 예제 ] logInOut.jsp 페이지에서 ID와 비밀번호를 입력받은 후 현재 로그인 상태인지를 판단하여 로그인 상태가 아니면 로그인 처리를 하고, 로그인 상태면 오류 메세지를 출력 

예제에서 로그인 처리는 HttpSession 객체에 "id" 라는 이름으로 id 값을 등록하는 것으로 처리. 

 

example10.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>result</title>
</head>
<body>
<%
String id=request.getParameter("id");
String pwd=request.getParameter("pwd");
//유효성 체크 
if(id.isEmpty() || pwd.isEmpty()){
	request.setAttribute("error","ID 또는 비밀번호를 입력해주세요!");
	RequestDispatcher rd= request.getRequestDispatcher("logInOut.jsp");
	rd.forward(request,response);
	return;
}
// 로그인 처리 
if(session.isNew() || session.getAttribute("id")==null){
	session.setAttribute("id",id);
	out.print("로그인 작업이 완료되었습니다.");
}else{
	out.print("이미 로그인 상태입니다.");
}
%>
</body>
</html>

소스에 대한 설명 

if(session.isNew() || session.getAttribute("id")==null){

session 변수가 초기화 될 때 HttpSession 객체가 새로 생성되서 반환 될 수도 있고, 기존에 존재하던 HttpSession 객체가 반환 될 수도 있습니다. 

 

if 문의 조건식은 현재 로그인 상태인지를 판단하는 부분. 

 

session.isNew() 메소드는 HttpSession 객체를 추출할대 새로 생성해서 반환하면 true를 반환하고, 기존에 있던 HttpSession 객체를 반환하면 false 를 반환한다. isNew() 메소드가 true 를 반환하면 HttpSession 객체를 새로 생성해서 반환한 것이므로 기존에 로그인 상태가 아니라는 의미

 

session.getAttribute("id")는 session객체에 "id" 이름으로 등록된 값을 추출한다. 만약 session 객체 안에 "id"란 이름으로 등록된 데이터가 없으면 null 을 반환한다. 따라서 session.getAttribute("id")==null 조건식은 HttpSession 객체에 id 이름으로 등록된 데이터가 없는지 물어보는 것이다. 조건식 session.isNew() 또는 session.getAttribute("id")==null  둘중에 하나라도 만족하면 현제 로그인 상태가 아니고 , 두 조건 모두 만족하면 현재 로그인 상태이다.

 

session.setAttribute("id",id);

session 에 "id" 이름으로 id 값을 등록한다. 여기서는 이 작업이 로그인 처리 작업이다.

 

 

 

 

[ 예제 ] Session 내장 객체를 이용하여 logInOut.jsp 페이지 실행될 때, 로그인상태 판단해서 로그인 상태가 아니면 로그인 화면만 로그인 상태면 로그아웃 화면만 보이게  처리  

 

example10.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>result</title>
</head>
<body>
	<% if(request.getMethod().equals("POST")){ %>
	<%
String id=request.getParameter("id");
String pwd=request.getParameter("pwd");
//유효성 체크 
if(id.isEmpty() || pwd.isEmpty()){
	request.setAttribute("error","ID 또는 비밀번호를 입력해주세요!");
	RequestDispatcher rd= request.getRequestDispatcher("logInOut.jsp");
	rd.forward(request,response);
	return;
}
// 로그인 처리 
if(session.isNew() || session.getAttribute("id")==null){
	session.setAttribute("id",id);
	out.print("로그인 작업이 완료되었습니다.");
}else{
	out.print("이미 로그인 상태입니다.");
}
%>

	<%=id %>/<%=pwd %>
	
	<% } else if(request.getMethod().equals("GET")){
  if(session !=null && session.getAttribute("id")!=null){
	  session.invalidate();
	  out.print("로그아웃 작업이 완료 되었습니다.");
  }else {
	  out.print("현재 로그인 상태가 아닙니다.");
  }
}	
%>

<%
RequestDispatcher rd=request.getRequestDispatcher("logInOut.jsp");
rd.forward(request,response);
%>

</body>
</html>

 

 

logInOut.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Input</title>
</head>
<body>

<% if(session.isNew() || session.getAttribute("id")==null){ %>


<%
String msg=(String)request.getAttribute("error");
if(msg==null) msg=" ";
%>
<%=msg%>
	<form action="example10.jsp" method="post">
	ID: <input type="text" name="id"><br>
	비밀번호: <input type="password" name="pwd"><br>
	<input type="submit" value="로그인">	
	</form>
<%}else{%>
	<a href="example10.jsp">로그아웃</a>
	<%} %>
</body>
</html>

 

소스에 대한 설명 

<a href="example10.jsp">로그아웃</a>

로그아웃 문자열에 링크를 걸어 로그아웃 작업 실행 할 수 있다 그런데 로그인버튼을 눌러도 example10.jsp가 실행되고 로그아웃 버튼을 눌러도 example10.jsp 가 실행 된다 어떻게 판단하고 구분하여 처리할까?

 

  if(session !=null && session.getAttribute("id")!=null){
	  session.invalidate();

내장 객체 session 을 이용하여 로그인 상태 판단하는 조건시, 로그인 상태에서만 로그아웃 작업을 한다. 

로그인 상태는 HttpSession 이 존재하고 HttpSession 에 "id" 가 등록된 상태,  session !=null 은 session이 null이 아닌지를 판단한다. 

session.getAttribute("id")!=null 은 session 에서 id 값 추출한 후 그 값이 null 이 아닌지를 물어보고 잇다. getAttribute("id") 메소드가 null 을 반환하면 "id" 이름으로 등록된 데이터가 없다는 의미이다. 

 

session.invalidate(); 메소드는 HttpSession 객체를 삭제하는 메소드 이다. 

 

 

 

<%
RequestDispatcher rd=request.getRequestDispatcher("logInOut.jsp");
rd.forward(request,response);
%>

 

<out>

out 내장객체는 javax.servlet.jsp.JspWriter 의  타입이다. out 내장 객체가 가지고 있는 메소드는 크게 두가지이다. 버퍼관련 메소드와 출력 관련 메소드 이다. 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
	int total=out.getBufferSize();
	out.print("첫번째 텍스트입니다.");
	out.clearBuffer();
	out.print("출력 버퍼의 크기 : " + total);
	out.print("<br> 사용되지 않은 버퍼의 크기 : "+ out.getRemaining());
	out.flush();
	out.print("<br>flush 후 버퍼의 크기 : "+ out.getRemaining());
	%>
	<hr>
	<h3> out.print() 메소드 </h3>
	<%
	out.print(100);
	out.print(true);
	out.print(3.14);
	out.print("TEST");
	out.print('가');
	out.print(new java.io.File("\\"));
	out.print("버퍼의 크기 : "+out.getRemaining());
	%>
</body>
</html>

 

위 코드의 결과 

 

소스에 대한 설명 

 

int total=out.getBufferSize();

자바언어는 출력 스트림을 이용해 외부로 데이터를 출력할 때 버퍼를 이용한다. 

getBufferSize() 는 기본 버퍼의 크기를 추출하는 메소드이다. 

 

out.print("첫번째 텍스트입니다.");
out.clearBuffer();

out.clearBuffer() 메소드는 버퍼에 있는 내용을 삭제하는 메소드 이다. clearBuffer() 메소드를 실행하기 전에 out.print("첫번째 텍스트입니다."); 명령문에서 문자열을 출력했다. 이 문자열은 실제 전송되지 않고 버퍼에 있다. 버퍼에 있는 상태에서 out.clearBuffer(); 가 실행됐으므로 실제 전송이 이루어지지 않고 삭제 된다. 

 

out.print("<br> 사용되지 않은 버퍼의 크기 : "+ out.getRemaining());

out.getRemaining() 메소드는 버퍼의 전체 크기에서 남은 용량을 추출한다. 

 

out.flush();

out.flush()메소드는 버퍼에 있는 내용을 강제로 전송한다. 버퍼가 꽉 차 있는지(full)와 상관 없이 버퍼의 내용을 전송 

 

out.print("버퍼의 크기 : "+out.getRemaining());

out.flush() 를 실행하여 버퍼를 비운다음, out.getRemaining()메소드를 이용해 버퍼의 남은 크기를 구하면 버퍼의 전체 크기와 같은 값이 반환된다. 

 

 

 

 

 

 

<application>

application 내장객체는 javax.servlet.ServletContext 의  타입이다. ServletContext 는 웹 애플리케이션마다 하나씩, 서비스가 시작될때 생성되는 객체로서, 서버에 대한 정보 추출과 웹 애플리케이션 단위로 상태정보를 유지하기 위해 사용한다. 

 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>application</title>
</head>
<body>

서버명 : <%= application.getServerInfo() %><br>
서블릿 버전 : <%=application.getMajorVersion() %>.<%=application.getMinorVersion() %>
<h3>/edu 리스트</h3>
<% java.util.Set<String> list=application.getResourcePaths("/");
if(list!=null){
	Object[] obj=list.toArray();
	for(int i=0;i<obj.length;i++){
		out.print(obj[i]+"<br>");
	}
}
%>
</body>
</html>

위 코드의 출력 결과 

소스에 대한 설명 

 

서버명 : <%= application.getServerInfo() %><br>

application.getServerInfo() 메소드는 현재 사용하고 있는 서버의 정보를 추출 

 

서블릿 버전 : <%=application.getMajorVersion() %>.<%=application.getMinorVersion() %>

application.getMajorVersion()  메소드는 현재 서버가 지원하고 있는 서블릿의 Major 버전을 추출 하고 

application.getMinorVersion() 메소드는 Minor 버전을 추출한다. 

 

java.util.Set<String> list=application.getResourcePaths("/");

application.getResourcePaths("/"); 는 인자로 지정한 디렉토리의 목록을 반환한다. 

 

if(list!=null){
	Object[] obj=list.toArray();
	for(int i=0;i<obj.length;i++){
		out.print(obj[i]+"<br>");
	}

 

 

 

 

 

<pageContext>

pageContext 내장객체는 javax.servlet.jsp.PageContext 의  타입이다. PageContext 는 서블릿 학습할때는 못보던 객체다. 왜냐하면 이것은 JSP 페이지당 하나씩 자동으로 생성되는 객체이기 때문이다. 

pageContext 내장객체가 수행하는 첫번째 기능은 요청을 재지정하는 것이다. 

두번째 기능은 다른메소드에서 내장객체를 사용하려면 기본적으로 사용할 수 없고, pageContext 내장객체를 이용해야 한다. 

 

example13.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%! public void work(String p, PageContext pc){
		try {
			JspWriter out=pc.getOut();
			if(p.equals("include")){
				out.print("--include 전 --<br>");
				pc.include("test.jsp");
				out.print("--include 후 --<br>");
			}else if(p.equals("forward")){
				pc.forward("test.jsp");
			}
		} catch(Exception e){
			System.out.println("오류발생!!!");
		}
	}%>	
<% 
String p=request.getParameter("p");
this.work(p,pageContext);
%>
</body>
</html>

 

 

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>Hello</h3>
</body>
</html>

 

 

 

 

 

 

 

 

 

http://localhost:8080/edu/example14.jsp?p=include  로 웹브라우저에서 실행 요청시 test.jsp 페이지가 편재 페이지에 포함 된다. 

 

http://localhost:8080/edu/example14.jsp?p=forward  로 웹브라우저에서 실행 요청시 test.jsp 페이지로 이동한다.

반응형