[Web][JSP] 서블릿, 버퍼, out, pageContext, application, xml

포키·2023년 4월 20일
0

국비과정

목록 보기
52/73

JSP

jsp 파일은 연산용이 아니다 (∵ 재사용x)
본격적인 연산은 따로 클래스 파일을 만들어 처리한다

필수 이해 요소

  • JSP 처리 과정
  • 출력 버퍼
  • 웹 어플리케이션 폴더 구조
  • war 파일

JSP 처리 과정

  • 자바 웹 표준은 서블릿 (서블릿의 일부 기능을 편하게 만든 것이 jsp)
  • jsp 실행 중 예외가 발생할 경우 -> 프로그램은 서블릿 코드에서 에러난 부분을 알려준다!
  • jsp 코드를 변경해도 바로 적용되지 않을 수 있다
    서버 문제일 경우, 서블릿 파일(.java) 찾아서 삭제
    클라이언트 문제일 경우, 브라우저 캐시 삭제
  • .jsp -> .java -> .class -> 실행 순서

서블릿

  • init()(생성시), service()(내부 코드), destroy()(객체 삭제시)

서블릿 예시 코드

출력 버퍼

사용 이유

  1. 성능 향상
  2. 데이터가 바로 보내지지 않고 지연이 생김
    -> 이를 이용하는 기능 존재 (jsp:forward, 에러 페이지 처리 기능)
  3. 첫 번째 버퍼가 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 - 접근방식을 정의

profile
welcome

0개의 댓글