2022. 3. 18. 22:21ㆍLanguage`/JSP (Java Server Page)
Out 객체
- JSP 페이지 내의 비-스크립트 요소들(HTML & 텍스트)은 out 기본 객체에 그대로 전달된다
- 값을 출력하는 표현식의 결과값도 out 기본 객체에 전달된다
- 출력 메소드는 기본적으로 print() / println() / newLine()이 제공된다
※ out.println()을 통한 개행
out.println()을 사용하면 웹 페이지에서 개행이 될까?
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page trimDirectiveWhitespaces="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.println("Hello ");
out.println("World ");
out.print("??");
%>
</body>
</html>
<결과 예측>
Hello
World
??
<실제 결과>
실제로 웹 페이지에서는 개행이 되지 않았다
Why?
HTML 코드 내에서만 개행이 이루어졌다
실제로 JSP 페이지는 일단 자바 소스코드로 변환이되고, 해당 자바 소스코드는 서블릿 클래스로 컴파일이 되는데 이 과정에서 "Hello " / "World " / "??" 를 HTML 코드 관점에서 보면 그냥 1줄로 표기되는 방식이다. 따라서 실제 웹 페이지에서 개행을 하려면 println()안에 <br>을 넣어줘서 서블릿 클래스가 <br>을 인식하도록 해줘야 한다
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page trimDirectiveWhitespaces="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.println("Hello <br>");
out.println("World <br>");
out.print("??");
%>
</body>
</html>
out 객체와 buffer의 관계
- JSP 페이지가 사용하는 버퍼는 실제로 out 객체가 내부적으로 사용하는 버퍼랑 동일하다
<%@ page buffer = "16kb" %>
>> 이 코드는 실질적으로 out 객체가 16Kb 크기의 버퍼를 내부적으로 사용한다는 코드이다
메소드 | 설명 |
int getBufferSize() | 버퍼의 크기 return |
int getRemaining() | 현재 남아있는 버퍼의 크기 return |
void clear() | 버퍼 내용 비우기 >> 버퍼가 이미 flush된 상태이면 IOException 에러 발생 |
void clearBuffer() | 버퍼 내용 비우기 >> 버퍼가 이미 flush된 상태여도 예외가 발생하지 않는다 |
void flush() | 버퍼 flush >> 버퍼 내용을 Client에게 전송 |
boolean isAutoFlush() | autoFlush가 "true"로 설정되어 있으면 "return true" |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page trimDirectiveWhitespaces="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.println("버퍼 크기 : " + out.getBufferSize() + "<br>");
out.println("남은 버퍼 크기 : " + out.getRemaining() + "<br>");
out.println("AutoFlush 여부 : " + out.isAutoFlush());
%>
</body>
</html>
- 따로 page 디렉티브를 통해서 autoFlush를 설정해주지 않으면 autoFlush의 default value는 "true"이다
- 그리고 buffer의 default value는 "8kb"이다
pageContext 객체
- pageContext 객체를 직접 사용하는 경우는 드물고, 커스텀 태그를 구현할 때는 사용된다
- 기본 객체 구하기
- 속성 처리
- 페이지 흐름 제어
- 에러 데이터 구하기
기본 객체 접근 메소드
메소드 | 설명 |
ServletRequest getRequest() | request 기본 객체 return |
ServletResponse getResponse() | response 기본 객체 return |
HttpSession getSession() | session 기본 객체 return |
ServletContext getServletContext() | application 기본 객체 return |
ServletConfig getServletConfig() | config 기본 객체 return |
JspWriter getOut() | out 기본 객체 return |
Exceptioin getException() | exception 기본 객체 return >> 해당 JSP 페이지가 에러 페이지인 경우에만 의미가 있다 |
Object getPage() | page 기본 객체 return |
application 객체
- 특정 Web-Application에 포함된 모든 JSP 페이지는 하나의 application 객체를 공유한다
- application 객체는 W-A의 대부분의 정보를 보유하고 있다
- 초기 설정 정보
- 서버 정보
- 자원 정보
- Client 정보
- ....
1) W-A 초기화 파라미터 정보 읽기
- W-A에서 사용할 수 있는 초기화 파라미터는 "WEB-INF\web.xml" 파일에 <context-param> 태그를 통해서 추가
<context-param>
<description>파라미터 설명(필수 X)</description>
<param-name>파라미터 이름</param-name>
<param-value>파라미터 값</param-value>
</context-param>
메소드 | 설명 |
String getInitParameter(String name) | 이름이 "name"인 W-A 초기화 파라미터 값을 읽어온다 >> 없으면 null 리턴 |
Enumeration<String> getInitParameterNames() | W-A 초기화 파라미터 이름 목록을 return |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>W-A 초기화 파라미터 정보</title>
</head>
<body>
<%
Enumeration<String> emr = application.getInitParameterNames();
while(emr.hasMoreElements()){
String name = emr.nextElement();
out.println(name + " : " + application.getInitParameter(name) + "<br>");
}
%>
</body>
</html>
>> 주로 DB 연결과 관련된 설정 경로 / 로깅 설정 파일 / 주요 속성 정보를 담고 있는 파일 경로 등을 지정할 때 초기화 파라미터를 사용한다 :: 그러면 모든 JSP 페이지가 해당 파라미터들을 사용할 수 있다
2) 서버 정보 읽기
- 현재 사용하고 있는 웹 컨테이너(WAS)에 대한 정보를 읽어올 수 있다
메소드 | 설명 |
String getServerInfo() | 서버 정보 구하기 |
Strinig getMajorVersion() | 서버가 지원하는 서블릿 규약의 메이저 버전 return >> 버전의 정수 부분 return |
String getMinorVersion() | 서버가 지원하는 서블릿 규약의 마이너 버전 return >> 버전의 소수 부분 return |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.println("서버 정보 : " + application.getServerInfo() + "<br>");
out.println("메이저 버전 : " + application.getMajorVersion() + "<br>");
out.println("마이너 버전 : " + application.getMinorVersion() + "<br>");
%>
</body>
</html>
>> 톰캣 10.0.17 버전이 서블릿 5.0 규약을 지원한다
3) 로그 메시지 기록
- WAS가 사용하는 로그 파일에 로그 메시지를 기록할 수 있다
메소드 | 설명 |
void log(String msg) | msg를 로그로 남기기 |
void log(String msg, Throwable throwable) | msg를 로그로 남기고 Exception 정보도 함께 기록 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
application.log("로그 기록 Test");
%>
</body>
</html>
3) W-A 자원(파일) 읽기
- JSP 페이지에서 W-A 폴더에 위치한 파일을 이용할 때 사용
메소드 | 설명 |
String getRealPath(String path) | 지정한 경로 "path"에 해당하는 자원의 시스템상에서의 경로 return |
java.net.URL getResource(String path) | 지정한 경로 "path"에 해당하는 자원에 접근할 수 있는 URL 객체 return |
java.io.InputStream getResourceAsStream(String path) | 지정한 경로 "path"에 해당하는 자원으로부터 데이터를 읽어올 수 있는 InputStream return |
Example) /chap05/poem.txt의 데이터 읽기
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.io.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
char [] buffer = new char[1024];
int c;
String resourcePath = "/chap05/poem";
String realPath = application.getRealPath(resourcePath);
out.println("실제 경로 : " + realPath + "<br><br>");
out.println("## poem.txt 데이터 읽기 ##<br>");
try{
BufferedReader br = new BufferedReader(new InputStreamReader(
application.getResourceAsStream(resourcePath), "UTF-8"
));
while((c = br.read(buffer, 0, buffer.length)) > 0){
out.print(new String(buffer, 0, c));
}
} catch(IOException e){
out.println("Exception 발생 : " + e.getMessage());
}
%>
</body>
</html>
>> 시가 1줄로 나오는 이유는 poem.txt의 데이터를 결국 서블릿 클래스로 컴파일해서 JSP 페이지가 Client에게 전송되는데 서블릿 클래스에서 개행을 의미하는 <br>이 시에 없기 때문에 1줄로 나온다