[JSP] 9. out & request객체

out 내장객체

JSP에는 out이라는 내장객체가 있기때문에 Servlet이랑은 다르게, 별도의 객체생성할 필요가 없습니다.

 

더 편리하다는 장점이 있겠죠! (+ HTML에서 Java코드를 한 눈에 볼 수 있는 장점까지도 있습니다)

 

그렇다면, out 내장객체를 사용한 코드를 통해서 기본적인 특성들을 설명하겠습니다.

 

우선, 기본적인 사용셋팅을 다음과 같이 했습니다.

 

out을 사용하기위해서 PrintWriterimport해야합니다.

 

buffer='1kb'로 버퍼로 크기를 임의로 지정했습니다. (버퍼의 기본공간크기는 8kb)

 

autoFlush="true"를 통해서 버퍼공간이 꽉차면, 자동으로 autoFlush되도록 설정.

 



※ 여기서 잠깐!!


JSP페이지는 생성된 결과를 곧바로 브라우저에 전송하지 않고 출력버퍼라고 불리는 곳에서 임시로 출력 결과를 버퍼에 저장해두었다가 한번에 웹 브라우저에 전송합니다.


이러한 (출력)buffer를 사용하는 이유는
(1) 작은 데이터를 여러번 전송하는 것보다 한 번 큰 데이터를 전송하므로 전송 성능이 향상된다.
(2) 응답결과가 바로 전송되지 않기때문에 JSP실행 도중에 출력버퍼를 지우고 새로운 내용을 보여줄 수 있다.
(3) 버퍼가 다 차기전까지는 헤더를 변경할 수 있다


따라서,위의 코드에서는 buffer를 설정해주고 autoflash속성을 부여해주었습니다.
 

 

이제,  기본적인 설정이 끝났다면, out 내장객체에 대한 속성들을 사용하는 코드들을 보도록 하자

 

out.getBufferSize() : 현재 버퍼값을 출력한다

 

out.getRemaining() : 쓸 것 다쓰고, 남은 값을 반환한다.

 

out.println : 브라우저 출력문

 

out.flush() : 브라우저에 출력하고, 삭제

 

out.clearBuffer(); : 브라우저에 출력하지않고, 삭제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@page import="java.io.PrintWriter"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" buffer="1kb" autoFlush="true"%>
                    
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8">
<title> 내장객체 out</title>
</head>
<body>    
    <%= out.getBufferSize() %>  <!-- 자주사용 -->
       out.println("<h1> 출력내용</h1>");    
 
    <%= out.getRemaining() %>    
 
</body>
</html>
<!-- 모든 jsp는 버퍼크기로 저장된다. 
그리고 그때그때출력하지않고, 마지막에 모아두었다가 한꺼번에 출력된다. -->
 
 
 

request 내장객체

시작부터 예를 통해서 설명을 해드리도록 하겠습니다.

 

if(request.getMethod().equals("POST")){

    request.setCharacterEncoding("utf-8");

     out.println(request.getParameter("a"));  

}

else if(request.getMethod().equals("GET")){

    out.println(request.getParameter("a"));  

}

 

a.html에서 form태그를 b.jsp로 파라미터들을 전송한다고 한다.  이때, 조건문을 통해서 

 

만약에 doPost메서드로 사용됬다면 인코딩과정을 거져서 a파라미터를 출력한다.

만약에 doGet메서드로 사용됬다면 바로 a파라미터를 출력한다. 

 

※ 이때, a파라미터값은 input태그의 text타입이라고도 추정할 수 있겟죠? 아닐수도 있지만요! 또한, 입력할때는

http://localhost:port:경로명/?a=값을 작성하면 직접경로를 통해 입력할 수도 있어요!

 

본격적으로 request객체에 대해서

(1)
request.getContextPath()  : 프로젝트 path만 얻어온다.
request.getRequestURI()  : 프로젝트와 파일경로까지 얻어온다.
request.getRemoteAddr() : 현재 IP주소를 반환한다.

request.getHeader("user-agent")라는 기능도 있습니다. 이는 navigator객체로도 같은 결과를 만들 수 있습니다.

 

 

(2)

또한, SimpleDateFormatDate객체를 사용하려고 한다.

 

SimpleDateFormat을 사용해서 년/월/일/시/분/초의 형태를 재설정한다. 

 

재설정한 변수.format(date변수)를 통해 원하는 형태로 현재시간이 출력되는 예제도 접하도록 하였습니다.

 

(3)

-Djava.net.preferIP4Stack=true run config....에서 작성한다면 IPv6 -> IPv4형태로 현재아이피주소가 출력되게 됩니다.

 

(4) 

response.sendRedirect("http://www.google.com")는 입력경로 자체를 www.google.com으로 재설정한다는 것을 의미해요.  이 코드는 국민은행싸이트에서 보안카드숫자전체입력화면에서 해킹사건으로 사용됬던 코드로써 

a태그 링크와도 같다 

 

(5) FileWriter 객체를 이용해서 파일 작성하기. logwriter 

FileWriter fw =new FileWriter(); 

fw.writer("입력할 값을 쓰시오");

fw.close();

 

※ 로그기록을 간단하게 파일에 저장하기위해--> 내컴퓨터에 여러사용자가 접근시, 그 로그를 txt파일로 확인가능

※ c:\log.txt 파일 없으면 생성하고 저장한다.  있으면 저장한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%@page import="java.text.SimpleDateFormat, java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
<%@page import="java.io.*" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8">
<title> request, response, 파일쓰기 </title>
</head>
<body>
 
<%
String clientIP = request.getRemoteAddr(); 
String fileName = request.getRequestURI();
Date now = new Date();
SimpleDateFormat sd = new SimpleDateFormat("yyyy년도 MM월 dd일 HH시 mm분 ss초");
String now2=sd.format(now);
%>
  
 
<%= clientIP+"컴퓨터가"+fileName+" 접근한 시각은"+now2+"입니다<br>" %>
 
<%= request.getHeader("user-agent"%> 
 
<% response.sendRedirect("http://www.google.com"); %> 
 
<%  FileWriter fw = new FileWriter("c:\\log.txt",true); //또는 \한개로 작성해도된다. 또한, 2번째 매개변수를 true를 두어야지 누적할 수 있다. 안그러면 계속 초기화
    fw.write(
            clientIP+"컴퓨터가"+fileName+"에 접근한 시각은 "+now2+"입니다.\r\n"); //줄바꿈처리는 \r\ 
    fw.close();
%>
</body>
</html>