1장
정적 웹페이지
컴퓨터에 저장된 텍스트 파일을 그대로 보는 것
동적 웹페이지
저장된 내용을 다른 변수로 가공 처리하여 보는 것
JSP의 특징
- 서블릿 기술의 확장
- 유지관리가 용이
- 빠른 개발이 가능
- 코드 길이를 줄일 수 있다.
JSP 컨테이너의 역할
.jsp파일에서 .java라는 서블릿 프로그램을 생성
서블릿 프로그램이 컴파일되어 .class 를 생성
JSP 페이지의 처리 과정
- 웹 브라우저가 웹 서버에 jsp를 요청
- 웹 서버는 요청된 Hello.jsp에서 .jsp 확장자를 발견하여 jsp 페이지임을 확인하고 웹 서버에 있는 JSP 컨테이너에게 전달
- JSP 컨테이너는 JSP 페이지를 서블린 프로그램인 Hello_jsp.java 파일로 변환
- JSP 컨테이너가 서블릿 프로그램을 컴파일 하여 Hello_jsp.class 파일로 만들고 웹 서버에 전달
- 웹 서버는 정적 페이지 처럼 .class 파일의 결과를 보여줌 -> 고로 웹 브라우저가 이를 받아 새로 가공된 HTML 페이지를 동적으로 처리하여 결과를 보여줌

JSP 생명주기
- 번역 단계
jsp 컨테이너가 jsp 소스 파일을 자바 코드(서블릿)로 변환
- 컴파일 단계
jsp 컨테이너가 번역 단계에서 생성된 자바 코드(서블릿)를 컴파일 하여 클래스 파일을 생성
- 로딩 및 초기화 단계
jsp 컨테이너가 앞의 두 단계에서 생성된 .class를 로딩하고 class의 인스턴스를 작성
- 실행 단계
jsp 컨테이너가 요청 및 응답 객체를 전달하는 jspService 메소드를 실행
- 소멸 단계
jsp 생명주기 완료, jsp 컨테이너는 실행되고 있는 jsp를 jspDestroy 메소드를 사용하여 제거
2장
jsp 태그의 종류
- 스크립트 태그
HTML 코드에 자바 코드를 넣어 프로그램이 수행하는 기능을 구현
- 디렉티브 태그
JSP 패키지를 어떻게 처리할 것인지 설정하여 JSP 페이지에 대한 정보를 JSP 컨테이너에 보냄
- 액션 태그
클라이언트/서버에 어떤 작동을 행하도록 명령을 지시하는 XML 형태의 태그로, JSP 페이지 사이에서 제어를 이동시킴
스크립트 태그
HTML 코드에 JAVA 코드를 넣어 프로그램이 수행하는 기능을 구현함
<% ... %>를 사용
JSP 페이지가 서블릿 프로그램에서 서블릿 프로그램으로 변환될 때 JSP 컨테이너가 자바 코드가 삽입되어 있는 스크립트 태그를 처리하고 나머지는 HTML 코드나 일반 텍스트로 간주
스크립트 태그의 종류

선언문 태그 : <%! %> 변수,메소드 정의
각행이 ;로 끝나야 함
여기에 변수나 메소드를 선언하면, 전역 메소드, 전역 변수로 사용
선언문 태그로 작성한 코드는 서블릿 프로그램에서 선언부에 해당
- _jspService() 메소드 외부에 배치됨
스크립틀릿 태그 : <% %> 자바 로직 코드
각행은 ; 로 끝나야 함
자바 코드로 이루어진 로직 부분을 표현
out 객체를 사용하지 않고도 쉽게 HTML 응답을 만들어냄
스크립틀릿 태그로 작성된 코드는 서블릿 프로그램에서 처리부에 해당

표현문 태그 : <% = %> 이면 호출 결과 출력
각 행을 ;로 종료할 수 없음
웹 브라우저에 출력할 부분을 표현
표현문 태그에 숫자, 문자, Boolean 등의 기본 데이터 타입과 자바 객체 타입 사용 가능
표현문 태그에 작성된 모든 자바 코드의 값은 문자열로 변환되어 웹 브라우저에 출력됨
표현문 태그로 작성한 코드는 서블릿 프로그램에서 출력부에 해당
표현문의 결과 값은 _jspService 메소드 내부에 있는 out.println() 의 매개변수가 되어 문자열 형태로 웹브라우저 결과로 출력됨
이때, JSP 표현문의 태그의 구문 전체는 서블릿 프로그램에서 out.print() 메소드의 매개변수가 되기 때문에 세미 콜론을 사용해서는 안됨.
3장
디렉티브 태그
JSP 페이지를 어떻게 처리할 것인지를 설정하는 태그

page 디렉티브 태그
- 현재 JSP 페이지에 대한 정보를 설정하는 태그
- JSP 페이지가 생성할 콘텐츠 유형의 문서, 사용할 자바 클래스, 오류 페이지 설정, 세션 사용 유무, 출력 버퍼의 유무
- JSP 페이지의 어디에서든 선언할 수 있지만 일반적으로 JSP페이지의 최상단에 선언하는 것을 권장
page 디렉티브 태그의 속성

language 속성
- jsp 페이지에서 사용할 프로그래밍 언어를 설정
- 기본 값은 java
contentType 속성
- 현재 JSP 페이지의 콘텐츠 유형을 설정하는데 사용
- 콘텐츠 유형(text/html, text/xml, text/plain 등), 기본 값은 text/html
- HTML을 출력하는 JSP 페이지는 contentType을 사용할 필요가 없음
- contentType 속성은 문자열 세트를 설정하여 JSP 페이지의 전체 문자열을 변경 가능

MIME-type
- MIME는 전자 우편을 위한 인터넷 표준 포맷
- 전자우편은 7비트 ASCII 문자를 사용하여 전송되기 때문에 8비트 이상의 코드를 사용하는 문자나 이진 파일들은 MIME 포맷으로 변환되어 SMTP로 전송
pageEncoding 유형
- 현재 JSP 페이지의 문자 인코딩 유형을 설정하는 데 사용
- 문자 인코딩 유형의 기본값은 ISO-8859-1


import 속성
- 현재 JSP페이지에서 사용할 자바 클래스를 설정하는 데 사용
- 둘 이상의 자바 클래스를 포함하는 경우, 쉼표로 구분해서 연속으로 여러 개의 자바 클래스를 설정
- 또는 여러개의 자바 클래스를 각각 별도로 사용할 수 있음


errorPage 속성
- 현재 JSP 페이지가 실행되는 동안 오류가 발생하면 특정 오류페이지로 이동하는데 사용함
- 웹 서버가 제공하는 기본 오류 페이지를 사용하지 않고 이동할 오류 페이지의 URL을 설정
<% page errorPage = "MyErrorPage.jsp" %>
include 디렉티브 태그
- JSP 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그
- 포함할 수 있는 외부 파일 : HTML, JSP, 텍스트 파일
<%@ include file= "파일명" %>
file 속성 값
- 현재 JSP 페이지에 포함할 내용을 가진 외부 파일명
- 외부 파일이 JSP 페이지와 같은 디렉터리에 있으면 파일명만, 아니면 전체 URL 혹은 상대 경로를 설정
include 디렉티브 태그는 웹 애플리케이션의 중복된 코드나 공통된 코드를 모듈화 할 수 있으므로 매우 유용함
수업 시간에 안함
taglib 디렉티브 태그
- 현재 JSP 페이지에 표현 언어, JSTL, 사용자 정의 태그 등 태그 라이브러리를 설정하는 태그
<%@ taglib uri="경로" prefix="태그 식별자"%>
- uri 속성: 사용자가 정의한 태그의 설정 정보를 가진 경로 주소
- prefix 속성: uri에 설정한 사용자가 정의한 태그를 식별하기 위한 고유의 이름
- 해당 JSP 페이지 내에서 uri 속성 값을 그대로 사용하면 길어서 복잡하므로 prefix 속성 값이 대신 식별할 수 있게 해 주는 것
taglib 디렉티브 태그가 서블릿 프로그램으로 번역될 때
- uri 속성값은 JSP 컨테이너에 사용자가 정의한 태그 라이브러리의 위치를 알려줌
- prefix 속성 값은 사용자가 정의한 태그 라이브러리의 접두어 태그가 무엇인지 JSP 컨테이너에 알려주는 역할을 함
4장
액션 태그
- 서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그
- 주석, 디렉티브 태그와 함께 JSP 페이지를 구성하는 태그
- JSP 페이지에서 페이지와 페이지 사이를 제어하거나, 다른 페이지의 실행 결과 내용을 현재 페이지에 포함하거나, 자바 빈즈의 다양한 기능을 제공
- 액션 태그에는 다양한 종류가 있으며, <% %> 와 같은 스크립트 태그의 형식을 따르지 않고 XML 형식 <jsp: ---/>를 사용
- 액션 태그는 반드시 끝나는 태그 />로 마무리 해야 함

forward 액션 태그
- 현재 jsp 페이지에서 다른 페이지로 이동하는 태그
- jsp 컨테이너는 현재 jsp 페이지에서 forward 액션 태그를 만나면 그 전까지 출력 버퍼에 저장되어있던 내용을 모두 삭제하고 forward 액션 태그에 설정된 페이지로 프로그램의 제어가 이동
forward 액션 태그의 페이지 흐름 처리 과정
- 웹 브라우저에서 웹 서버로 first.jsp를 요청
- jsp 컨테이너는 요청된 first.jsp를 실행
- first.jsp를 실행하다가 forward 액션 태그를 만나면 지금까지 저장된 출력 버퍼의 내용을 삭제하고 프로그램 제어를 page 속성에서 설정한 second.jsp로 이동
- second.jsp를 실행
- jsp 컨테이너는 second.jsp를 실행한 결과를 웹 브라우저에 응답
include 액션 태그
- include 디렉티브 태그처럼 현재 jsp 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그
- 현재 jsp 파일에 포함할 수 있는 파일은 html, jsp, 서블릿 페이지 등
<jsp:include page="파일명" flush="false"/>
page 속성 값
- 현재 jsp 페이지 내에 포함할 내용을 가진 외부 파일명
- 폴더 내에 있으면 파일명, 아니면 상대 경로 혹은 URL 설정
flush 속성 값
- 설정한 외부 파일로 제어가 이동할 때 현재 JSP 페이지가 지금까지 출력 버퍼에 저장한 결과를 처리
- 기본 값은 false이며, 출력 버퍼에 저장한 내용을 그대로 둠
- true로 설정하면 외부 파일로 제어가 이동할때 현재 jsp 페이작 지금까지 출력 버퍼에 저장된 내용을 웹 브라우저에 출력하고 출력 버퍼를 지움
include 디렉티브 태그와 include 액션 태그의 차이점
- include 액션 태그에서는 포함된 외부 파일이 실행된 후 현재 jsp 페이지로 제어를 반환
- include 디렉티브 태그에서는 단순하게 소스의 내용이 텍스트로 포함이 되지만, 액션 태그는 포함시킬 페이지의 처리 결과를 포함한다.
- 즉, include 디렉티브 태그는 주로 조각 코드를 삽입할때 사용, include 액션 태그는 페이지를 모듈화 할때 사용. 즉, 템플릿 페이지를 작성할 때 사용
include 액션 태그의 처리 과정
- 웹 브라우저에서 웹 서버로 first.jsp를 요청
- jsp 컨테이너는 요청받은 first.jsp를 처리하고 first.jsp 내의 출력 내용이 출력 버퍼에 저장 됨
- include 액션 태그를 만나면 하던 작업을 멈추고 프로그램 제어를 second.jsp로 이동
- second.jsp를 실행하고 second.jsp 내의 출력 내용이 출력 버퍼에 저장
- second.jsp의 처리가 끝나면 다시 first.jsp로 프로그램의 제어가 이동하는데, 이동 위치는 include 액션 태그 다음행이 됨
- first.jsp 의 나머지 부분을 처리하고, 출력할 내용이 있으면 출력 버퍼에 저장
- jsp 컨테이너는 출력 버퍼의 내용을 웹 브라우저에 응답으로 보냄
근데 이때, flush가 true 이면, second.jsp가 처리가 먼저 끝나기 때문에 경우에 따라 second.jsp가 먼저 출력 될 수도 있음.
param 액션 태그
- 현재 jsp 페이지에서 다른 페이지에 정보를 전달하는 태그
- 이 태그는 단독으로 사용되지 못하며 <jsp:forward> 나 <jsp:include> 태그의 내부에 사용
- 다른 페이지에 여러 개의 정보를 전송해야 할 때는 다중의 param 액션 태그를 사용

자바 빈즈 액션 태그의 기능과 사용법
자바 빈즈
- 프로그램의 효율을 높이기 위해 화면을 출력하는 부분과 데이터를 처리하는 로직 부분을 작성하며, 로직 부분의 코드에 자바 빈즈라는 클래스를 사용함
- 동적 콘텐츠 개발을 위해 자바 코드를 사용하며 자바 클래스로 로직을 작성
- JSP 페이지에서 화면을 표현하기 위한 계산식이나 자료의 처리를 담당하는 자바코드를 따로 분리하여 작성하는 것
- JSP 페이작 HTML과 같이 쉽고 간단한 코드만으로 구성
-
자바 빈즈는 데이터 표현을 목적으로 하는 자바 클래스이므로, 기존의 자바 클래스를 작성하는 방법과 동일하게 작성
-
자바빈즈는 데이터를 담는 멤버 변수인 프로퍼티(property)와 데이터를 가져오거나 저장하는 메서드로 구성.
-
자바 빈즈를 작성할때 규칙
- 자바 클래스는 java.io.Serializable 인터페이스를 구현
- 인수가 없는 기본 생성자가 있어야 한다.
- 모든 멤버 변수인 프로퍼티는 private 접근 지정자로 설정
- 모든 멤버 변수인 프로퍼티는 getter/setter() 메소드가 존재해야 한다
JSP와 자바빈즈의 흐름
- 웹 브라우저가 JSP 페이지에 요청을 전송
- JSP 페이지는 자바빈즈와 통신
- 자바빈즈가 데이터베이스에 연결
- JSP 페이지가 브라우저에 응답
useBean 액션 태그
- jsp 페이지에서 자바빈즈를 사용하기 위해 실제 자바 클래스를 선언하고 초기화 하는 태그
- id 속성과 scope 속성을 바탕으로 자바빈즈의 객체를 검색하고, 객체가 발견되지 않으면 빈 개체를 생성
<jsp:useBean id="자바빈즈 식별이름" class= "자바빈즈 이름" scope"범위"/>
- id : 자바 빈즈를 식별하기 위한 이름
- class : 패키지 이름을 표함한 자바빈즈의 이름. 자바빈즈는 인수가 없는 기존 생성자가 있어야 하며 추상 클래스 사용 불가
- scope : 자바빈즈가 저장되는 영역 설정. page(기본 값), request, session, application 중 하나의 값 사용
setProperty 액션 태그
-
프로퍼티의 값 저장
-useBean 액션 태그와 함께 자바빈즈의 setter() 메소드에 접근하여 자바빈즈의 멤버 변수인 프로퍼티의 값을 저장
<jsp:setProperty name"자바빈즈 식별 이름" property="프로퍼티이름" value="값"/>
-
name: useBean 태그에 id 속성 값으로 설정된 자바빈즈를 식별하기 위한 이름
-
property 자바빈즈의 프로퍼티 이름입니다. *를 사용하면 모든 요청 파라미터가 자바빈즈 프로퍼티의 setter() 메소드에 전달됨
-
value: 변경될 자바빈즈의 프로퍼티 값
-
param: 자바빈즈의 프로퍼티 값을 전달하는 요청 파라미터의 이름 param과 value를 동시에 모두 사용할 수 없다.
value와 param의 차이

지피티를 못믿긴 하지만
value는 진짜 그 값을 설정하고
param은 useBean으로 불러올때만 그 값이 뜨게 하는거 같다. (아님 말고~)
getProperty 액션 태그
- 프로퍼티의 값 가져오기
- useBean 액션태그와 함께 자바빈즈의 getter() 메소드에 접근
<jsp:getProperty name="member' property="name" />
5장
내장 객체
-
jsp 페이지에서 사용할 수 있도록 jsp 컨테이너에 미리 정의된 객체
-
jsp 페이지가 서블릿 프로그램으로 번역될 때 jsp 컨테이너가 자동으로 내장 객체를 멤버 변수, 메소드의 매개변수 등에 대한 각종 참조 변수로써 포함시킴
-
jsp 페이지에 별도의 import 문 없이 사용 가능

-
모든 내장 객체는 jsp 컨테이너가 관리하는 객체
-
속성은 각각의 내장 객체가 존재하는 동안 jsp 페이지 사이에서 정보를 주고 받거나 공유하는데 사용됨

request 내장 객체
- jsp 페이지에서 가장 많이 사용되는 기본 내장 객체
- 웹 브라우저에서 서버의 jsp 페이지로 전달하는 정보를 저장
- 폼 페이지에서부터 입력된 데이터를 전달 하는 요청 파라미터 값을 jsp 페이지로 가져옴
- jsp 컨테이너는 웹 브라우저에서 서버로 전달되는 정보를 처리하기 위해 request 내장 객체를 사용하여 사용자의 요구 사항을 얻어냄
요청 파라미터 관련 메소드
- 요청 파라미터는 사용자가 폼 페이지에 데이터를 입력한 후 서버에 전송할 때 전달되는 폼 페이지의 입력된 정보 형태를 말함
- 요청 파라미터는 <name=value> 형식으로 웹 브라우저에서 서버의 jsp 페이지로 전송
- 요청 파라미터는 폼 페이지에서 <input type = "text" ...> 처럼 양식이 텍스트 유형인 경우 값을 입력하지 않으면 서버로 빈 문자열이 전송됨
- 체크 박스와 radio 버튼 유형인 경우 선택하지 않고 전송하면 요청 파라미터 자체가 전달되지 않음

요청 HTTP 헤더 관련 메소드
- 웹 브라우저는 HTTP 헤더에 부가적인 정보를 담아 서버로 전송
- request 내장 객체는 헤더 정보나 쿠키 관련 정보를 얻을 수 있는 메소드를 제공함

response 내장 객체
- 사용자의 요청을 처리한 결과를 서버에서 웹 브라우저로 전달하는 정보를 저장함
- 서버는 응답 헤더와 요청 처리 결과 데이터를 웹 브라우저로 보냄
- jsp 컨테이너는 서버에서 웹 브라우저로 응답하는 정보를 처리하기 위해 response 내장 객체를 사용하여 사용자의 요청에 응답
페이지 이동 = 리다이렉션(redirection)
- 사용자가 새로운 페이지를 요청할 때와 같이 페이지를 강제로 이동하는 것
- 서버는 웹 브라우저에 다른 페이지로 강제 이동하도록 response 내장 객체의 리다이렉션 메소드를 제공
응답 HTTP 헤더 관련 메소드
- 응답 HTTP 헤더 관련 메소드는 서버가 웹 브라우저에 응답하는 정보에 헤더를 추가하는 기능을 제공
- 헤더에는 주로 서버에 대한 정보가 저장되어 있음

out 내장 객체
- 웹 브라우저에 데이터를 전송하는 출력 스트림 객체
- jsp 컨테이너는 jsp 페이지에 사용되는 모든 표현문 태그와 html, 일반 텍스트 등을 out 내장 객체를 통해 웹 브라우저에 전달
- 스트립틀릿 태그에 사용하여 단순히 값을 출력하는 표현문 태그(<%= %>)와 같은 결과를 얻을 수 있음

out.print와 out.println의 차이
- html의 특성으로 인해 실제 브라우저에서 줄바꿈이 보이지 않을수도 있다. 이는 HTML에서 일반적으로 공백 문자(스페이스, 탭, 줄 바꿈)이 연속해서 나타날 때 하나의 공백 문자로 처리되기 때문입니다. 따라서 줄 바꿈을 강제적으로 표시하려면
out.println("HEllo!"+"
"); 같이 br을 추가해야 한다.