JSP
jsp 파일은 연산용이 아니다 (∵ 재사용x)
본격적인 연산은 따로 클래스 파일을 만들어 처리한다
필수 이해 요소
- JSP 처리 과정
- 출력 버퍼
- 웹 어플리케이션 폴더 구조
- war 파일
JSP 처리 과정
- 자바 웹 표준은 서블릿 (서블릿의 일부 기능을 편하게 만든 것이 jsp)
- jsp 실행 중 예외가 발생할 경우 -> 프로그램은 서블릿 코드에서 에러난 부분을 알려준다!
- jsp 코드를 변경해도 바로 적용되지 않을 수 있다
서버 문제일 경우, 서블릿 파일(.java) 찾아서 삭제
클라이언트 문제일 경우, 브라우저 캐시 삭제

- .jsp -> .java -> .class -> 실행 순서
서블릿
- init()(생성시), service()(내부 코드), destroy()(객체 삭제시)

서블릿 예시 코드

출력 버퍼
사용 이유
- 성능 향상
- 데이터가 바로 보내지지 않고 지연이 생김
-> 이를 이용하는 기능 존재 (jsp:forward, 에러 페이지 처리 기능)
- 첫 번째 버퍼가 flush되기 전까지 헤더 변경 가능
헤더(헤더+라인)은 첫번째 버퍼가 전송되기 직전(사실상 첫 버퍼와 같이) 보내짐
(라인 -> 헤더 -> 첫 버퍼 -> 그 다음 순)
버퍼 설정
<%@ page buffer="4kb" autoFlush="false" %>
- 버퍼는 kb 단위로 지정 (안 붙이면 에러)
- 따로 지정하지 않으면 8kb
- 사용하지 않으려면
buffer="none" 지정
- autoFlush가 true면 자동으로 플러시가 이루어진다.
false면 버퍼가 다 찼을 때 예외를 발생시키고 작업을 중단한다.
일반적으로 false로 설정하는 경우는 없다.
웹 어플리케이션 폴더 구성과 URL 매핑
- war : web application archive
- war 폴더 구조 (배포 후의 폴더 구조!!)

- jar : java application archive
자바 소스 배포에 사용
웹 어플리케이션 폴더와 url의 관계
- p.107 참고해서 작성
http://localhost:8080/04_20/hello.jsp
-> D:\java\오전\env\apache-tomcat-6.0.53\webapps\04_20\hello.jsp
localhost:8080 -> WAS 폴더(ROOT)로 연결
이클립스에서 서버 구동의 의미.
서버.xml도 있고 여러 설정 파일들이 많은데 옛날에는 서버 설정을 바꾸고 실행하기 위해서 예를 들어 포트 번호를 바꾸려 할때 물리적인 톰캣 설정을 바꿔야 함
이클립스에서는 톰캣을 쓰긴 쓰는데 이클립스 안에서 톰캣 설정을 따로 두어서 그 설정으로 톰캣을 구동할 수 있게 함. 물리적 톰캣 설정 바꾸지 않음. 마음대로 설정을 바꿔가며 톰캣을 실행시키기 편함.
기본객체
- 기본객체 (실제 타입과 함께 기억하기)
request - javax.servlet.http.HttpServletRequest
response - javax.servlet.http.HttpServletResponse
pageContext - javax.servlet.jsp.PageContext
session - javax.servlet.http.HttpSession
application - javax.servlet.ServletContext
out - javax.servlet.jsp.JspWriter
config - javax.servlet.ServletConfig
page - java.lang.Object
exception - java.lang.Throwable
out
- 별로 쓸 데 없음 필수 습득에서 빼라
- jsp가 생성하는 모든 내용은 out 기본 객체를 통해 전송된다
그러므로 이전에 언급한 출력 버퍼 = out 기본 객체의 버퍼
clear(), clearBuffer()는 우리가 잘 사용하지 않음
pageContext
- pageContext 기본 객체는 JSP페이지와 일대일로 연결된 객체
= jsp가 바뀌면 pageContext 객체도 바뀐다
기능
기본 객체 구하기
ServletRequest > HttpServletRequest (상속)
jsp에서 getRequest, getResponse는 사용 안함 (기본객체니까)
서블릿 할 때 사용
★★★★★ application ★★★★★
- 전체 어플리케이션에 하나만 존재 (공유)
(다른 기본객체들은 JSP 파일별 존재)
- 웹 어플리케이션 전반에 걸쳐서(JSP 한정x) 사용되는 정보를 담고있다.
- 초기 설정 정보, 서버 정보, 제공하는 자원(파일) 읽기 가능
ServletContext 참고
웹 어플리케이션 초기화 파라미터 읽어오기
- web.xml로 값 지정, application 객체로 get 가능
<welcome-file-list> : web.xml에서 ROOT 접속시 보여줄 페이지 지정
<context-param> : web.xml에 초기화 파라미터를 추가
<param-name>로 이름 지정, <param-value>로 값 지정
web.xml = 배포서술자 [DD, Deploy Descriptor]
- 웹 어플리케이션 설정 정보를 담고있는 파일
[웹어플리케이션폴더]\WEB-INF에 있어야 한다
- 서블릿 3.0부터 어노테이션(of Java)으로 대체가능
but 본격적으로 쓰려면 어차피 만들어야 함
- xml 사용 참고
예를 들어 경로와 파일 이름 따로 저장
경로-파일명 따로 분리할 때 이후 경로나 파일 변경할 때 수정사항이 적어짐
또한, xml은 컴파일x => 검증x => 오타 있어도 체크되지 않음
- 변경시 서버 재시작(restart) 필요
-> 실제 프로그램에서는 web.xml -> '/conf/path.txt'를 등록, path.txt에 파일 경로 입력하고 수정
웹 어플리케이션 초기화 파라미터 관련 메서드
getInitParameter(String name) : return String
getInitParameterNames() : return Enumeration<String>
서버 정보 읽어오기
- 현재 사용중인 웹 컨테이너에 대한 정보 읽어오기
서버 정보 관련 메서드
getServerInfo() : return String
getMajorVersion() : return String
getMinorVersion() : return String
MajorVersion vs. MinorVersion
ex) 서블릿 3.1 에서 3이 MajorVersion(큰 변화), 1이 MinorVersion(작은 변화)
로그 메시지 기록하기
- 웹 컨테이너가 사용하는 로그 파일에 로그 메시지 기록 가능
- 콘솔에 찍히지만 파일로 남음
로그 기록 메서드
log(String msg) : return void
log(String msg, Throwable throwable) : return void
대형 프로그램에서는 log도 중요한 부분
웹 어플리케이션의 자원 구하기
- 웹 어플리케이션 폴더에 위치한 파일을 읽어올 때 사용
- 배포 후 실제 디스크상의 경로는 우리가 알 수 없음!
/ : ROOT 경로
(디스크상의 경로x 어플리케이션 내부 경로)
(상대경로x 절대경로)
이클립스 상에서 파일의 실제 경로를 요청하면 '이클립스가 관리하는 복사본 위치'가 나옴
개발하면서 알 수 있는 것은 contextPath뿐
앞으로는 대부분 어플리케이션 내부 경로를 사용
getRealPath(String 내부경로) : return String (실제 디스크상의 경로)
getResource(String 내부경로) : return URL (-> url.openStream() 스트림 얻기 가능)
getResourceAsStream(String 내부경로) : return InputStream (파일에 연결된 스트림)
어플리케이션 만들 때 주 저장 정보는 DB, 프로그램 동작에 관한 정보는 외부파일(Properties)로 저장
(외부파일 = 컴파일 필요없음 = 변경이 편리)
예제 코드
- 모델1? : ~(데이터와 구조?)가 혼재되어 있는 형태
IOC 참고
어떻게 해야하는지에 대한 통제권을 또 다른 프로그램에 준다
통제권 - Lib/Framework - 접근방식을 정의