<%@ Directive %>
1. page
: 문서의 타입, 에러페이지, MIME 타입과 같은 정보 설정
속성 | 설명 |
Info | 페이지에 대한 설명 |
contentType | 생성할 MIME 타입 지정 |
PageEncoding | charset과 같이 인코딩 지정 (기본값: ISO-8859-1 → UTF-8로 변경) |
import | 페이지에서 사용할 패키지와 클래스 지정 |
session | 세션 사용 여부 지정 (기본값: true) |
buffer | 출력 버퍼(임시 메모리)의 크기 지정 (none: 사용안함, 기본 8KB) |
autoFlush | 출력 버퍼가 모두 차면 비울지 결정 (기본값: true) |
trimDirective Whitespaces | 지시어 선언으로 인한 공백 제거 (기본값: false) |
errorPage | 에러 내용을 보여줄 페이지 지정 (일일히 해줘야 하는 점에서 xml 추천) |
isErrorPage | 해당 페이지가 에러를 처리할 지 여부 (기본값: false) |
buffer
- jsp의 실행 과정:
- jsp파일은 서블릿 코드로 변환 된 후 컴파일되어 class 파일로 만들어진 뒤, 버퍼에 저장하고 일정량이 되었을 때 전송한다. 최종적으로 html형태로 웹 브라우저에 보내 화면에 출력 된다 (buffer는 임시 저장소를 두어 데이터를 큰 단위로 묶어 한 번에 보내는 등 효율적으로 처리함)
(ex) <%@ page buffer="1kb"%> //버퍼 크기의 기본 값은 8kb
autoFlush
: 버퍼가 모두 채워졌을 때 처리 방법
true | 버퍼가 채워지면 자동 flush(버퍼 안의 데이터를 목적지로 전송하고 버퍼를 비움) |
false | 버퍼가 채워지면 예외 발생 |
2. include
: 외부 파일을 현재 페이지에 포함, Ctrl + Space Bar (단축키)
jsp 파일을 소스 코드 보기(F12)로 확인해 보면 5행 정도의 공백을 확인할 수 있다. page 지시어가 있던 부분으로
컴퓨터가 공백을 문자로 인식하기 때문에 안드로이드와 같은 외부 기기 연동 시 문제를 일으키는 경우가 있다.
→ trimeDirectiveWhiespaces = "true" 를 넣어 공백 제거!
3. taglib
: 표현언어에서 사용할 자바 클래스나 JSTL 선언
<% Scriptlet (Script Elements) %>
: 자바 코드 직접 작성, JSP는 클라이언트의 요청을 받아 실행 될 때 서블릿(자바코드)으로 변환되고, 클래스로 컴파일된 후 응답을 하게 된다. 이 과정에서 _jspService() 메서드가 생성되는데, 변환된 코드의 위치는 스크립트 요소에 따라 _jspService() 메서드 내부 혹은 외부에 놓을 수 있다.
<%! 선언부 %>
: 사용할 멤버 변수, 메서드 선언
scriptlet에서는 선언부에 정의한 메서드를 호출만 할 수 있다. (스크립틀릿에서 메서드를 선언한다면 _jspService() 내부에 또다른 메서드를 선언하는 것)
<%= 표현식 %>
: 실행결과로 하나의 값이 남는 문장, 스크립틀릿 안에서 변수를 출력할 때는 out.print()를 사용해야 하므로... 표현식으로 단순하게!
_jspService()
: 탐색기나 네비게이터를 활용한다. 01DirectiveScript 폴더에 오면 조금 전 실행했던 jsp파일이 java파일과 class 파일로 만들어서 보임
Implicit Object 내장 객체
변수 이름 | 제공하는 기능 / 변수의 역할 | 변수 타입 |
request | doGet, doPost 메서드의 첫 번째 파라미터 | javax.servlet.http.HttpServletRequest |
response | doGet, doPost 메서드의 두 번째 파라미터 | javax.servlet.http.HttpServletResponse |
out | 웹 브라우저로 HTML 코드를 출력하는 기능 | javax.servlet.jsp.JspWriter |
application | JSP 페이지가 속하는 웹 애플리케이션에 관련된 기능 | javax.servlet.ServletContext |
config | JSP 페이지의 구성 정보를 가져오는 기능 | javax.servlet.ServletConfig |
pageContext | JSP 페이지 범위 내에서 사용할 수 있는 데이터 저장 기능 | javax.servlet.jsp.PageContext |
session | 세션에 관련된 기능 | javax.servlet.http.HttpSession |
page | JSP 페이지로부터 생성된 서블릿 | java.lang.Object |
exception | java.lang.Throwable |
내장 객체의 영역 Scope
- 내장 객체의 영역은 공유 된다
- 영역의 속성 값을 사용하여 객체 전달 (form으로 객체 전달이 불가능하기 때문에)
- Object 타입으로만 저장
각 객체가 저장되는 메모리의 유효기간, 각 영역에 저장된 데이터는 공유 범위가 서로 다름 (page < request < session < application 순)
데이터 전송 객체 DTO → 내장 객체 영역
웹에서 페이지page들이 모여 하나의 요청request을 처리하며, 요청들이 모여서 하나의 session을, session이 모여서 하나의 웹 application을 이룬다
내장객체 영역 메모리 소멸 | |
영역 | 설명 |
page | 동일한 페이지에서만 공유 |
request | 하나의 요청에 의해 호출된 페이지와 forward(요청 전달)된 페이지까지 공유 |
session | 클라이언트가 처음 접속한 후 웹 브라우저를 닫을 때까지 공유 |
application | 한 번 저장되면 웹 어플리케이션이 종료 될 때까지 유지 |
주요 메서드 | 설명 |
getParameter(name) | String으로 반환 |
Object getAttribute(String name) | K에 해당하는 V 값을 가져옴 속성이 없을 경우 null 리턴 |
setAttribute(String name, Object value) | 생성, 각 영역에 속성 저장, Object 타입은 모든 객체 저장 가능 |
removeAttribute(String name) | 저장된 속성 삭제 (세션 만료, 로그아웃 등에서 사용) 삭제할 속성명이 존재하지 않더라도 에러Null Pointer Exception 발생 X |
1. request 요청
: 클라이언트가 전송한 요청에 대한 정보를 가진 객체
요청 정보 전달 방법 | 특징 | |
GET | URL에 key와 value를 전달 | url, 포트번호, 쿼리스트링 (ex) ?age=20 등 명시 |
POST | BODY에 전달 | 보안성이 좋고 많은 양 전달 가능 |
Tip1) 용량이 큰 파일 전송 시 url의 용량에 제한이 있으므로 post와 get을 적당히 분배하여 사용
Tip2) POST 전송 시 한글 깨짐 주의!
request.setCharacterEncoding("UTF-8");
헤더 정보
user-agent: 웹브라우저의 종류
referer: 웹 서핑 시 링크를 통해 이동할 때 남는 흔적
cookie: 서버와 클라이언트 사이에 존재하는 정보
<body>
<a href="RequestHeader.jsp">요청 헤더 정보 읽기</a>
</body>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>RequestHeader</title>
</head>
<body>
<h2>3. 요청 헤더 정보 출력하기</h2>
<%
Enumeration headers = request.getHeaderNames(); /* 요청한 곳의 모든 key값을 가져옴 */
while (headers.hasMoreElements()) {
String headerName = (String)headers.nextElement(); /* 헤더의 요소값을 headerName에 담음 */
String headerValue = request.getHeader(headerName);
out.print("헤더명: " + headerName + ", 헤더값: " + headerValue + "<br>"); /* <%= 로 단순하게 표현 가능 */
}
%>
<p>이 파일을 직접 실행하면 referer 정보는 출력되지 않습니다.</p>
</body>
</html>
2. response 응답
: 요청에 대한 응답을 웹 브라우저로 보내줌 (페이지 이동을 위한 redirect와 http 헤더에 응답 헤더 추가)
Tip) 페이지를 이동하기 위해서 html 에서 <a>, 자바스크립트에서는 location, jsp에서는 response 내장객체의 sendRedirect() 를 이용! (URL이 바뀌지 않는다)
3. out 객체
: scriptlet 내 변수 값 출력, 출력되는 모든 정보는 버퍼에 저장된 후 웹 브라우저에 출력
Tip) out.println은 자동 개행 X → String intro = request.getParameter("introduce").replace("\r\n", "<br>"); /* 엔터를 <br>로 교체 */
4. application
: 내장 객체는 웹 앱당 하나만 생성된다.
web.xml: 웹 앱에 대한 설정 관리
4-1. 드라이버 연결 정보 입력
<!-- 컨텍스트 초기화 매개변수 web.xml 추가 설정-->
<context-param>
<param-name>INIT_PARAM</param-name>
<param-value>web.xml에 저장한 초기화 매개변수</param-value>
</context-param>
Tip) <%! > 에서 내장 객체를 바로 사용할 수 없어 this를 사용한다. <% > 이나 <%@ > 은 내장객체를 그대로 사용하면 된다.
4-2. 에러별 출력 페이지 설정
<!-- 에러페이지 분기 설정: location은 위치 정보로 컨텍스 루트를 제외한 경로 -->
<error-page>
<error-code>404</error-code>
<location>/02ImplicitObject/Exception.jsp</location> <!-- 웹 페이지 이동 -->
</error-page>
<error-page>
<error-code>405</error-code>
<location>/02ImplicitObject/Exception.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/02ImplicitObject/Exception.jsp</location>
</error-page>
'Java Server Pages' 카테고리의 다른 글
JSP JDBC ~ (0201 ~02) (0) | 2024.02.01 |
---|---|
JSP 쿠키 (0) | 2024.02.01 |
JSP 세팅 순서 (0) | 2024.01.31 |
JSP 클라이언트 에러 암기 (0) | 2024.01.31 |
Servlet (0) | 2024.01.30 |