JSP

[JSP]response 객체

MoZZANG 2022. 4. 29. 19:15
response객체란?

- request객체와 함께 많이 사용되는 개체로 웹브라우저에 보내는 응답정보를 담고 있는 객체이다.

- response객체의 주요 기능은 응답헤더에 헤더 정보를 기록하거나 페이지 이동에 필요한 객체이다.

 

 

- 주요 메서드

응답 Content 설정에 필요한 메소드

- setContentType(String type) : 응답 컨텐트의 MIME 타입과 문자 encoding 을 설정.
                                         JSP에서는 PAGE지시어에 Content-Type이라는 속성에 설정 되어 있음.
                                         서블릿에서 현재 웹브라우저에 바로 출력시에 사용

 

<!-- 
JSP 페이지 에서는 response객체의 setContentType()메소드 불 필요.
page지시어에 속성(contentType)으로 설정해 놓았기때문에....
단,서블릿에서 페이지 이동을 안하고  직접 서블릿 자체에서 웹브라우저에 출력시에는 반드시 설정해줘라.
   -->

 

 

 

응답 Header 설정을 위한 메소드
addCookie(Cookie cookie):Cookie cookie를 응답에 추가.

boolean containsHeader(String name):
String name을 이름으로 가지는 응답 헤더가 있는지 boolean 형으로 반환.
기본 헤더인 Content-Type 및 Content-Length등의 존재 여부 판단시
단,Content-Length는 body태그 이후에서 판단 해야함.왜냐하면 헤더가 먼저 쓰이고
응답바디가 쓰임으로.....

setHeader(String name, String value):
String name을 이름으로 가지는 헤더에 String value를 저장함.
setIntHeader(String name, int value):String name을 이름으로 가지는 헤더에 int value를 저장함.
setDateHeader(String name, long date):String name을 이름으로 가지는 헤더에 long 형의 date를 저장함.
                                      date값은 1970년 1월 1일 이후로 흐러온 시간을 1/1000초 단위로 지정


addHeader(String name, String value):
String name을 이름으로 가지는 헤더에 
String value를 추가하여 저장.

addIntHeader(String name, int value):
String name을 이름으로 가지는 헤더에 int value를 추가하여 저장.

addDateHeader(String name, long date):
String name을 이름으로 가지는 헤더에 long 형의 date를 추가하여 저장함

*ADD계열은 기존 헤더값을 변경하고자할때
 SET계열은 새롭게 헤더를 추가하고자 할때

 

 

	//[응답헤더 설정]	
	/*
	웹브라우저가 지원하는 캐쉬기능를 이용하지 않겠다
	즉 현재 페이지를 매번 서버에 요청하도록 만드는 것
	*/
	//HTTP/1.0에 적용시킬때
	response.setHeader("pragma", "no-cache");
	//HTTP/1.1에 적용시킬때
	response.setHeader("cache-control", "no-cache");
	/*
	웹브라우저가 인식하지 못하는 Content-Type(MIME타입)인 경우
	웹브라우저는 파일 다운로드창을 보여준다
	※다운로드 구현시 적용
	
	IE에서는 아무값이나 FX에서는 
	application/unknown이나
	binary/octect-stream등	
	*/
	//response.setContentType("binary/octect-stream");
	/*
		add계열:기존 헤더명이 존재시 계속 추가,없을시 생성됨
		set계열:기존 헤더명이 존재시 기존 헤더명의 값이 변경됨,없을시 생성.	
	*/
	//add계열
	Date date = new Date();
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
	response.addHeader("Current-Date", dateFormat.format(date));
	response.addDateHeader("Current-Date",date.getTime());
	//set계열
	response.setHeader("Number-Of-Student","30");
	response.setIntHeader("Number-Of-Student",29);
	//response.setDateHeader("Current-Date", date.getTime()); //모든 Current-Date라는 응답헤더명이 대체됨.
	response.setContentType("text/html; charset=UTF-8");
	//setContentLength()는 파일 다운로드시 파일의 크기로 Content-Length를 설정할때 사용(진행바가 표시된다)

 

 

 

<body>
	<div class="jumbotron jumbotron-fluid bg-warning">
	    <div class="container-fluid">
	      <h1>응답헤더</h1>      
	    </div><!--container-fluid-->
  	</div><!--jumbotron-fluid--> 
  	<div class="container">    
  		<h3>설정한 응답헤더 출력하기</h3>
    	<ul class="list-unstyled">
   		<%
		//1]응답 헤더 명 얻기:getHeaderNames().
		//add계열 혹은 set계열로 설정한 응답헤더명을 가져 온다.단, 기존의 응답헤더명과 같은 setter로 설정해도
		//헤더명을 가져오지 못한다(예:setContdentType()/setContentLength()등)
		Collection<String> names= response.getHeaderNames();
		for(String headerName:names){
		//2]응답헤더값 얻기 : String getHeader("헤더명")
		String headerValue = response.getHeader(headerName);
		out.println(String.format("<li>%s : %s</li>",headerName,headerValue));
		}
    		
    		%>
    	</ul>
    	<h3>응답헤더 존재 여부 판단:boolean containHeader("헤더명")</h3>
    	<h5>Content-Type존재 여부:존재</h5>
    	<%=response.containsHeader("Content-Type") ? "Content-Type 존재" : "Content-Type 미 존재" %><br/>
    	<%=response.getContentType() %>    	
    	<h5>Content-Length존재 여부:미 존재</h5>
    	<%=response.containsHeader("Content-Length") ? "Content-Length 존재" : "Content-Length 미 존재" %>
  	</div><!-- container -->
</body>

 

페이지 이동을 위한 메서드

sendRedirect(String page) : 이동할 페이지 경로를 넣어 준다. 절대경로지정시 컨텍스트 루트를 포함한 경로.

 

<ResponseForRedirectIndex.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ResponseForRedirectIndex.jsp</title>5
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
	<div class="jumbotron jumbotron-fluid bg-warning">
	    <div class="container-fluid">
	      <h1>sendRedirect()메소드</h1>      
	    </div><!--container-fluid-->
  	</div><!--jumbotron-fluid--> 
  	<div class="container">    
    	<fieldset class="form-group border p-3">
    		<legend class="w-auto p-3">리다이렉트로 이동</legend>
    		<form class="form-inline" action="ResponseForRedirectProcess.jsp" method="POST">
    			<label>아이디</label>
    			<input type="text" name="id" class="form-control mx-2"/>
    			<label>비밀번호</label>
    			<input type="password" name="pwd" class="form-control mx-2"/>
    			<input type="submit" class="btn btn-danger mx-2" value="로그인"/>
    		</form>  		
    		
    	</fieldset>
  	</div><!-- container -->
</body>
</html>

 

▲ 사용자에게 아이디와 비밀번호를 입력받아  form태그의 action속성에 걸린 상대경로로 보낸다. 상대경로인 파일에서 유효성 체크등을 통해 만약 아이디와 비밀번호가 일치하면 마이페이지로, 그렇지 않으면 다시 입력페이지로 이동시키는 것을 할 것이다.

 

 

 

 

<ResponseForRedirectProcess.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    
    %>
<%
if(!"POST".equals(request.getMethod())){
%>
<script>
alert('잘못된 접근입니다');
history.back();
</script>
<%
return;
}
/*
사용자가 입력한 아이디와 비번을 받아서 회원인지 판단한 후
회원인 경우 마이페이지로 이동시키고
회원이 아닌 경우 다시 로그인 페이지로 이동시키자]
가정]아이디가 KIM이고 비번이 1234가 회원이라고 가정
*/
//1]사용자 입력값 받기
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
//2]회원여부 판단(데이타 베이스의 테이블에서 조회)
//3]회원인 경우 로그인 처리(session객체로)후 마이 페이지로 이동
//  회원이 아니면 다시 로그인 페이지로 이동.
if("KIM".equals(id) && "1234".equals(pwd)){//회원인 경우
//방법1]sendRedirect("자동으로 이동할 페이지 주소");
//response.sendRedirect(request.getContextPath()+"/BuiltInObject03/ResponseForMyPage.jsp?username="+id+"&password="+pwd);
//방법2]자스로 메시지 띄운 후 이동
//out.println("<script>");
//out.println("alert('"+id+"님 반갑습니다');");
//out.println("location.replace('ResponseForMyPage.jsp?username="+id+"&password="+pwd+"');");
//out.println("</script>");
//response.sendRedirect(request.getContextPath()+"/BuiltInObject03/ResponseForMyPage.jsp?username="+id+"&password="+pwd);
//방법3]POST방식으로 이동 즉 비번 URL에 노출막자
%>
<form method="post" action="ResponseForMyPage.jsp">
<input type="hidden" name="username" value="<%=id%>"/>
<input type="hidden" name="password" value="<%=pwd%>"/>
</form>
<script>
alert('<%=id%>님 방가 방가');
document.forms[0].submit();
</script>

<%
}
else{//비 회원인 경우
//response.sendRedirect("ResponseForRedirectIndex.jsp");
out.println("<script>");
out.println("alert('아이디와 비번이 틀려요');");
//기존값이 그대로 유지
out.println("history.back();");
//기존의 입력하거나 선택한 내용이 다 사라진다
//out.println("location.replace('ResponseForRedirectIndex.jsp');");
out.println("</script>");
}

%>

▲ 입력을 받는 페이지에서 입력받은 아이디와 비밀번호를 체크하는 페이지이다. 그러므로 UI 같은 것들이 필요없다.

 

아이디와 비밀번호는 get방식으로 넘겨주면 URL에 나타나기 때문에 POST방식으로 넘겨줘야 한다. 만약 POST방식이 아니면 history.back()으로 다시 입력페이지(Index페이지)로 돌아간다. 

 

아이디와 비밀번호가 틀린경우에는 response.sendRedirect()를 통해 index페이지로 돌아간다.

 

아이디와 비밀번호는 db가 아닌 KIM과 1234로 정해서 하드코딩하였다 ㅠ

 

 

 

 

<ResponseForMyPage.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ResponseForMyPage.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
	<div class="jumbotron jumbotron-fluid bg-warning">
	    <div class="container-fluid">
	      <h1>마이페이지</h1>      
	    </div><!--container-fluid-->
  	</div><!--jumbotron-fluid--> 
  	<div class="container">    
    	<fieldset class="form-group border p-3">
    		<legend class="w-auto p-3">마이 정보</legend>
    		<ul class="list-unstyled">
    			<li>아이디 : <%=request.getParameter("username") %></li>
    			<li>비밀번호 : <%=request.getParameter("password") %></li>
    		</ul>
    	</fieldset>
  	</div><!-- container -->
</body>
</html>

▲ 아이디가 KIM, 비밀번호가 1234경우 Process페이지에서 가져온 아이디와 비밀번호를 뿌려주면서 오는 마이페이지

 

 

 

'JSP' 카테고리의 다른 글

[JSP]application 객체  (0) 2022.05.02
[JSP]out 객체  (0) 2022.04.29
[JSP]request객체  (0) 2022.04.29
[JSP] 스크립팅 원소(Scripting Element)  (0) 2022.04.28
[JSP]지시어(Directive)  (0) 2022.04.28