Html 1.0과 1.1 차이 : 1.0은 연결이 상시 끊어지지만, 1.1은 연결이 지속됨. 또한 속도고 1.1이 더 빠름
아파치 톰캣(Apache Tomcat) : 웹 서버 소프트웨어의 하나로, 서블릿 컨테이너라고도 함.
서블릿 컨테이너 : 서블릿과 JSP를 실행할 수 있는 환경을 말함. 기본적으로 웹 서버의 기능도 포함하고 있으며 자바로 개발되어 있음. 개발용이 아닌 실제 서비스용으로 웹 서버를 운영하려면 아파치 웹 서버를 설치하고 서블릿 컨테이너로 톰캣을 사용할 수 있도록 설정하는 것이 좋음.
JDK : 자바 실행환경과 컴파일 도구를 포함한 개발자 도구. 자바 소스를 클래스 파일로 컴파일하는 컴파일러 및 디버거, Java Doc 등 개발에 필요한 유틸리티로 구성됨
웹 2.0 : 2004년 처음 등장. 플랫폼으로서의 웹. 가벼운 프로그래밍 모델, 신디케이션, 개조와 재조합 가능한 설계 등이
중요 개념. Ajax(Asynchronous JavaScript and XML), Google API 등이 대표 기술
웹 3.0 : 2010년 등장. 컴퓨터가 정보자원의 뜻을 이해하고 논리적 추론 까지 가능한 시멘틱 웹 개념 등장.
- 속도와 플랫폼 변화 : 10Mbps ~ 1Gbps 의 초고속 인터넷 환경과 4G LTE 등 초고속 무선 인터넷 서비스 보급.
인터넷 사용 장치가 PC → 스마트폰, 태블릿, 스마트TV 등으로 급격히 변화 - 똑똑한 데이터와 인공지능의 향상 : 컴퓨터가 정보자원의 뜻을 이해하고 논리적 추론 까지 가능한 차세대 지능형 웹 기술.
구글 나우(Google Now), 애플 시리(Siri) 등 사용자의 상황이나 질문의 의도에 따라 지능화된 서비스 제공 - 애플리케이션의 진화 : 웹 2.0에서 시도되었던 open API, SOA 등이 새로운 플랫폼 등장으로 더욱 발전. 메쉬업은 컴포넌트화 된 애플리케이션의 부분을 조합해 개인이나 그룹의 용도에 맞게 여러 서비스 장치를 사용하는 사용자들이 손쉽게 자신만의 콘텐츠나 정보를 구성할 수 있도록 해줌.
서블릿 형태로 코드를 구현하게 되면 태그를 사용해야하기 때문에 불편함. 따라서 JSP가 개발이 됨
서블릿 : 자바를 이용한 서버 프로그래밍 기술. 초기 웹 프로그래밍 기술인 CGI(Common Gateway Interface)를 대체하기
위해 개발되었으나, 느린 처리 속도, 많은 메모리 요구, 불편한 화면 제어 등의 한계로 PHP, ASP 등 서버
스크립트 언어 등장.
서블릿
∙ 자바 플랫폼에서 컴포넌트를 기반으로 하는 웹 애플리케이션 개발의 핵심 기술
∙ JSP는 서블릿 기반의 웹 프로그래밍 기술로 내부적으로 JSP는 서블릿으로 변환 되어 실행됨
서블릿 장점
- 자바를 기반으로 하므로 자바 API를 모두 사용할 수 있다.
- 운영체제나 하드웨어에 영향을 받지 않으므로, 한 번 개발된 애플리케이션은 다양한 서버 환경에서도 실행할 수 있다.
- 웹 애플리케이션에서 효율적인 자료 공유 방법을 제공한다.
- 다양한 오픈소스 라이브러리와 개발도구를 활용할 수 있다.
서블릿과 서블릿 컨테이너
- 서블릿 컨테이너는 서블릿을 실행하기 위한 서버 소프트웨어를 말하는 것으로 JSP나 서블릿으로 만들어진 웹 프로그램을 개발하고 실행하기 위한 환경임
- 아파치 톰캣이 대표적임
서블릿 생명주기
- 서블릿 초기화 : init() 메서드
- 서블릿 실행시 호출되는 메서드로 초기에 한 번만 실행된다. 공통적으로 필요한 작업 등 수행
- 요청/응답 : service() 메서드
- 사용자 요청에 따라 스레드로 실행되는 메서드로 각각 service() 메서드를 통해 doGet() 혹은 doPost() 메서드가 호출됨
- 파라미터인 HttpServletRequest 와 HttpServletResponse 를 통해 사용자 요청을 처리한다.
- 컨테이너로부터 서블릿 종료 요청이 있을 때 호출되는 메서드.
- init()와 마찬가지로 한 번만 실행되며, 서블릿이 종료되면서 정리할 작업이 있다면 destroy() 를 오바라이딩해서 구현함
서블릿 개발
- 서블릿은 개발자가 소스 작성 후 컴파일 과정을 거쳐 컨테이너에 배치(deploy)하게 되면 컨테이너에 의해 실행되어 관리
- 이후 사용자 요청에 따라 스레드 단위로 실행되면서 데이터베이스 연동 등 필요한 작업을 수행하고 처리 결과를
사용자에게 HTML 형식으로 전달하는 구조로 동작 - 서블릿은 일반적인 애플리케이션처럼 버튼을 누르면 시작되고 처리를 마치면 종료되는 구조가 아님
- 서버에서 컨테이너에 의해 실행 되면서 생명주기를 가지며 특정 이벤트와 상태가 존재하는 구조
- 서블릿 개발은 해당 생명주기 메서드를 오버라이딩하거나 사용자 요청 처리 메서드를 구현
init() : 서블릿 실행시 한번만 실행, 초기화 작업을 코딩.
service() : 사용자 요청시 매번 개별적으로 호출.
doGet() : Get 방식일때 호출
doPost() : POST방식일 때 호출
destroy() : 서블릿 종료 시 실행 메서드
서블릿 동작 과정
- 컨테이너는 서블릿 클래스를 로딩
- 서블릿 클래스의 생성자 메서드를 호출해서 인스턴스를 생성
- 생성된 인스턴스가 init() 메서드 호출.
- 서블릿에 대한 사용자 요청에 대해서는 web.xml 파일 혹은 애너테이션을 참조해 URL 매핑을 하게 확인하고, 해당 서블릿 인스턴스로부터 스레드를 생성, service() 메서드를 호출함.이후 get/post에 대해 doGet()이나 doPost() 등의 메서드 호출.
- destroy() 메서드 호출
JSP
- 자바 서블릿 기반의 웹 프로그래밍 기술.
- 자바의 모든 기능 사용 가능.
- 자바로 구현된 컴포넌트의 연동이 용이한 구조.
- php나 asp처럼 html과 함께 스크립트를 사용할 수 있는 장점도 있음.
- 기본적으로 서블릿으로 변경되어 실행, 메모리상에 적재된 서블릿을 스레드로 실행함으로써 시스템 자원을 절약하고 요율적인 공유를 할 수 있음.
- 자바의 모든 기능을 사용할 수 있으며 안정성과 확장성이 뛰어나 가장 많이 사용되고 있는 웹 프로그래밍 기술
JSP 특징
- 자바의 모든 기능을 사용할 수 있어 발전 가능성이 무한하다.
- 서블릿으로 컴파일된 후 메모리에서 처리되기 때문에 많은 사용자의 접속도 원활하게 처리할 수 있다.
- JSP 또는 다른 서블릿 간의 데이터를 쉽게 공유 할 수 있다.
- 빈즈(Beans)라고 하는 자바 컴포넌트를 사용할 수 있다.
- 커스텀 태그를 만들어 사용할 수 있으며, JSTL(JSP Standard Tag Library)과 같은 태그 라이브러리를 이용할 수 있다.
- 스트러츠, 스프링 @MVC 등 다양한 프레임워크와 결합하여 개발할 수 있다.
JSP 동작과정 : JSP 는 HTML 과 유사한 처리 과정을 거치나 HTML이 단순 서버 파일을 브라우저로 보내주는 것에 비해
JSP는 서버에서 프로그램이 실행된 결과를 웹 브라우저로 전달하는 차이가 있음.
JSP와 서블릿 차이
∙ JSP는 HTML과 같은 일반적인 텍스트 파일 구조
∙ 서블릿은 자바 소스로 작성된 클래스 파일 구조
∙ JSP는 서블릿 컨테이너에 의해 서블릿 형태의 자바 소스로 변환되어 클래스로 컴파일 됨
서블릿 컨테이너
∙ 서블릿 컨테이너는 서블릿을 실행하고 JSP를 서블릿 코드로 변환하는 기능을 수행함
∙ 변환된 JSP의 서블릿 클래스를 실행하고 웹 서버의 메모리에 적재하고 사용자 요청에 따라 실행
JSP에 관해서 이것만은 알고 있자
- JSP는 일반 텍스트 파일로 되어 있음
(텍스트 파일은 컴퓨터가 이해할 수 없음. 즉 실행 가능한 프로그램이 아니며 특정 동작을 할 수 없음) - JSP는 HTML 코드와 몇몇 특수한 태그, 그리고 자바 코드가 섞여 있음
- 사용자가 요청할 경우 JSP는 컨테이너(톰캣)에 의해 서블릿 형태의 .java 소스로 변환되고 컴파일 됨
- 컴파일된 .class는 컴퓨터에서 실행할 수 있는 형태로 특정한 기능을 수행할 수 있게 됨.
이후 소스 변경 전까지 해당 파일은 메모리에 상주하면서 다시 컴파일 되지 않고 서비스 됨
GET 방식
∙ 서버에 있는 정보를 클라이언트로 가져오기 위한 방법이다. 예를 들어 HTML, 이미지 등을 웹 브라우저에서 보기 위한 요청
∙ 서버에는 최대 240Byte까지 데이터를 전달할 수 있음
∙ QUERY_STRING 환경변수를 통해서 서버로 전달되는데, 다음 형식을 따름.
∘ http://www.xxx.co.kr/servlet/login?id=hj&name=hong
∙ ‘?’ 이후의 값들은 서버에서 QUERY_STRING을 통해 전달된다. ‘속성=값’ 형태로 사용해야 하며 ‘&’는 여러 속성 값을
전달할 때 연결해주는 문자열
∙ URL이 노출되기 때문에 보안에 문제가 생길 수 있음
POST 방식
∙ 서버로 정보를 올리기 위해 설계된 방법이다. 예를 들어 HTML 폼에 입력한 내용을 서버에 전달하기 위한 요청
∙ 서버에 전달 할 수 있는 데이터 크기에는 제한이 없음
∙ URL에는 매개변수가 표시되지 않음
주석 : 주석은 프로그램 소스에 텍스트로 된 간단한 설명문을 넣는 것을 말함
∙HTML 주석 : 화면에는 안 보이지만, 브라우저 소스 보기를 통해 노출, <!-- 주석 -->
∙JSP 주석 : 브라우저 소스 보기를 해도 내용이 안 보임. <%-- 주석 --%>
지시어(Directives) : JSP 파일의 속성을 기술하는 JSP 문법
∙JSP 컨테이너에게 해당 페이지를 어떻게 처리해야 하는지 전달하기 위한 내용을 담고 있음
∙지시어는 크게 page, include, taglib으로 나눌 수 있으며, 각각에서 다루는 속성이 다름
page 지시어
∙현재 JSP 페이지를 컨테이너에서 처리하는 데 필요한 각종 속성을 기술하는 부분. 보통 JSP 페이지 맨 앞에 위치함
<%@ page 속성1="속성값1" 속성2="속성값2“ … %>
∙여러 줄에 나누어 작성할 수도 있음
<%@ page contentType="text/html;charset=UTF-8“
import="javax.sql.*, java.util.*" errorPage="error.jsp"%>
<%@ page import="java.util.*" %>
- Page 지시어와 JSP의 한글 처리
∙page 지시어에서 중요한 부분 중 하나는 한글 처리 부분임. 캐릭터셋 설정을 찾지 못할 경우 ISO8859-1을 적용함
∙페이지 지시어에 다음과 같이 한글 속성 설정 : pageEncoding="UTF-8", contentType="text/html;chatsert=UTF-8"
import : JSP 스크립트 부분에서 자바 클래스를 사용하는 경우 해당 클래스의 패키지에 대한 import 설정으로 기본적으로자바에서와 동일. 다만 패키지 import 구분을 컴마(”,”)를 이용하거나 라인 단위로 작성해야 함.
<%@ page import="java.sql.*, java.util.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
session
∙세션은 웹 브라우저와 웹 서버가 지속적인 클라이언트 인식을 위해 필요한 정보를 임시로 저장해두는 방법
∙주로 웹 사이트에 로그인하거나 쇼핑몰에서 장바구니 등을 구현할 때 사용됨
∙기본 값이 true(세션을 사용한다)이므로, 일부러 사용을 제한할 목적이 아니라면 별도로 설정하지 않아도 됨
<%@ page session="true" %>
buffer : JSP 페이지 데이터를 출력하기 위한 JspWriter 즉 out 내장객체의 버퍼 크기를 지정
∙기본값은 8KB 이고 JSP 페이지에 동적으로 많은 내용이 포함될 경우 버퍼 크기 조정이 필요할 수도 있으나 일반적으로는 변경하지 않아도 됨
autoFlush : 버퍼를 자동으로 비울 것인지를 지정하는 속성으로, 기본 값은 true
버퍼 속성에 지정되어 있는 크기만큼 버퍼를 유지하고 있다가 버퍼가 다 차면 자동으로 전송함
<%@ page autoFlush="true" %>
isThreadSafe : 기본적으로 서블릿은 스레드로 동작하기 때문에 스레드로 인한 동기화 문제를 해결하기 위한 옵션
∙기본값은 true로, 일반적으로 false로 설정하는 경우는 거의 없음 <%@ page ifThreadSafe="true" %>
info : 해당 JSP에 대한 간단한 설명으로 저작권이나 작성일 등 간단한 정보 기술에 사용
<%@ page info=“JSP Example" %>
errorPage, isErrorPage
∙두 속성은 jsp파일의 오류 처리를 위한 것으로, errorPage는 현재 페이지에 오류 발생시 호출할 페이지를 지정하는
속성이고 isErrorPage는 오류 처리를 위한 전용 페이지임을 알리는 속성
∙errorPage지정을 통해 보다 효과적으로 페이지 오류를 관리할 수 있음.
∘errorPage : 일반적인 JSP 파일에 사용
<%@ page errorPage=“오류_처리_파일.jsp” %>
∙isErrorPage : 오류 처리 파일에만 사용
<%@ page isErrorPage=“true” %>
contentType : 현재 JSP 페이지를 클라이언트에서 처리하기 위한 콘텐츠 유형을 지정하는 부분
∙윈도우에서 파일 확장자(.doc, .hwp등)에 따라 연결 프로그램이 동작하는 것과 마찬가지로 웹 브라우저에서도 contentType에 따라 전달되는 내용을 어떻게 처리할지 결정할 수 있음
<%@ page contentType=“text/html” %>
pageEncoding : 컨테이너에서 처리할 JSP 파일의 인코딩을 설정
<%@ page pageEncoding=“UTF-8” %>
∙JSP 2.0 스펙에 추가된 속성으로, 이전 버전을 지원하는 컨테이너의 경우에는 사용할 수 없다.
extends : JSP가 서블릿으로 변환될 때 상속받을 슈퍼클래스를 지정할 수 있는 부분
∙일반적으로는 사용할 일이 없으며 톰캣의 경우 org.apache.jasper.runtime.HttpJspBase 클래스를 상속받게 됨
include 지시어 : 현재 JSP 파일에 다른 HTML이나 JSP 문서를 포함하기 위한 기능을 제공
∙include 지시어는 다음 절에서 살펴볼 include 액션과 비슷한 기능을 함
<%@ include file=“포함할 파일_이름” %>
∙네이버와 같은 인터넷 포털사이트의 화면처럼 여러 정보의 조합으로 한 화면을 구성할 때 유용하게 사용됨
taglib 지시어 : JSP 기능을 확장하기 위해 만들어진 커스텀 태그 라이브러리를 사용하기 위한 지시어
∙태그 라이브러리는 10장에서 자세히 살펴볼 것이고 여기서는 간단한 문법만 참조.
<%@ taglib uri=“/META-INF/mytag.tld” prefix=“mytag” %>
∙커스텀 태그는 공통으로 활용하거나 특정 기능을 HTML 태그 형태로 모듈화 하는 기술임
∙다음 예제에서는 GetInfo 라는 커스텀 태그를 사용하는 예로 실제 기능은 별도로 구현되어 있고 실행 결과는 user1
이라는 사용자의 정보를 DB에서 가져와 출력하는 형태가 될 수 있음
<%@ page contentType=“text/html;charset=UTF-8” %>
<%@ taglib uri=“/WEB-INF/tlds/mytag.tld” prefix=“mytag” %> //taglib 지시어
<HTML>
<BODY>
<mytag:GetInfo name=“user1” /> //커스텀 태그 사용
</BODY>
</HTML>
JSP 액션의 종류
∙JSP 액션은 JSP 고유 기능으로 빈즈 클래스 연동 및 동적 페이지 관리를 위한 기능을 제공
<jsp:action_name attribute=“value” /> 형태를 가짐
∙주로 사용하는 액션은 useBean, getProperty, setProperty 이며 자바 클래스와의 연동을 위해 사용함
∙액션(Action)은 JSP 주요 구성요소 중 하나로 다음과 같은 기능을 지원함
∘JSP 페이지간 흐름 제어
∘자바 애플릿 지원
∘자바 빈즈 컴포넌트와 JSP 상호작용 지원
∙useBean 액션은 JSP에서 자바 빈즈 클래스와의 연동을 지원해주는 액션
∙include 액션은 단순히 페이지를 포함하는 것뿐만 아니라 파라미터를 포함될 페이지로 전달하는 것이 가능함
∘사용 예 ) <jsp:param name=“user” value=“홍길동” />
∎ 액션의 종류
include 액션 : 다른 파일을 불러온다는 측면에서 include 지시어와 개념이 유사. 호출
∙include 지시어는 해당 파일을 포함시킨 후 컴파일하는 것에 비해, include 액션은 실행 시점에서 해당 파일을 호출하여 그 결과를 포함한다는 점에서 차이가 있음
∙동적으로 파일들을 핸들링 하기 때문에 과도한 사용은 성능상에 문제를 줄 수 있음
∙include 액션은 동적인 페이지 를 포함시킬 경우에 사용하는 것이 좋고, include 지시어는 잘 바뀌지 않는 정적인
페이지를 포함 할 때 사용하는 것이 좋음
<jsp:include page=“포함할 파일_이름” />
∙예) 요청 쪽 <jsp:include page=“footer.jsp”>
<jsp:param name=“email” value=“test@test.net” />
<jsp:param name=“tel” value=“000-000-0000” />
</jsp:include>
∙응답 쪽 <%=request.getParameter("email")%>
<%=request.getParameter("tel")%>
forward 액션 : 요청 페이지를 다른 페이지로 전환할 때 사용. 전환
∙response 내장객체의 sendRedirect()와 유사 하지만 포워드된 페이지에 파라미터를 전달할 수 있다는 점에서 차이가 있음
∙브라우저 URL 창에는 최초 요청 페이지가 표시되기 때문에 처리 페이지 정보를 숨기거나 MVC 패턴의 컨트롤러와 같이 특정 기능 수행 후 다른 페이지로 이동해야 하는 경우 유용하게 사용할 수 있음
<jsp:forward page=“포워딩할 파일_이름” />
∙사용 예) <jsp:forward page=“footer.jsp” />
<jsp:param name=“email” value=“test@test.net” />
<jsp:param name=“tel” value=“000-000-0000” />
</jsp:forward>
plugin 액션 : 웹 브라우저에서 자바 플러그인을 사용하여 자바 애플릿이나 자바 빈즈 컴포넌트를 실행 할 수 있게 함
∙plugin 액션을 사용하면 자동으로 <OBJECT> 혹은 <EMBED>와 같은 태그를 통해 애플릿 등을 실행하도록 한다. 일반적으로 애플릿을
사용하는 경우가 드물기 때문에 참고만 할 것
useBean 액션 : 액션에서 가장 중요한 부분
∙사용법 <jsp:useBean id="변수_이름" class="빈즈 클래스_이름"/>
<jsp:setProperty name="변수_이름" property="속성_이름"/>
<jsp:getProperty name="변수_이름" property="속성_이름"/>
∙useBean 액션은 빈즈 클래스를 사용하기 위한 구문이며 class 에 지정된 자바 빈즈 클래스를 id 라는 이름으로 사용할
수 있도록 해준다.
∙get/setProperty 액션은 브라우저에서 빈즈 클래스의 멤버 변수로 값을 저장하거나 가져오기 위한 구문 이다.
∙get/setProperty는 빈즈 클래스의 getter/setter 메서드와 연동된다.
선언 : JSP 페이지에서 메서드나 멤버변수를 선언하기 위한 구문
∙JSP 가 서블릿으로 변환된 자바 코드에서는 모든 내용이 _jspService() 메서드에 들어가기 때문에 JSP 에서 선언한 변수는 로컬변수가 되고 메서드 안에서 다른 메서드를 선언하는 자바 문법상 잘못된 것이므로 컴파일 에러가 발생하게 됨
∙<%! %>는 JSP 페이지에서 이러한 제약 사항 없이 멤버변수와 메서드 선언을 가능하게 함
∙구조적으로 JSP 에서 자바 코드를 사용하는 것은 권장되지 않기 때문에 선언문의 사용 역시 권장되지 않음
∙사용 예) <%! // 멤버변수 선언이나 메서드 선언이 올 수 있다.
String str = "test";
public boolean check() {
return false; } %>
표현식 : <%= %>를 사용해서 간단한 데이터 출력이나 메서드 호출 등에 이용
∙코드 마지막에 ‘;(세미콜론)’을 사용하지 않는다는 것에 주의하도록 한다.
∙표현식은 결국 out.println() 으로 변환되기 때문에 out.println()의 인자로서 적합한 형태로 사용해야 함
∙메서드 호출, 변수출력, 사칙연산 및 문자열 결합 등이 가능
∙표현식 보다는 표현언어(Expression Lanugage) 사용을 권장
∙사용 예 메서드 호출 : <%= calculator() %>
변수 출력 : <%= result %>
사칙 연산과 문자열 결합 : <%= “i+2=“+(i+2)+”입니다” %>
스크립트릿 : JSP 문서 내에서 자바 코드를 기술할 수 있는 부분으로 JSP의 가장 큰 특징 중 하나
∙초기 JSP 발전에 큰 기여를 하였으나 지금은 JSP내에서 스크립트릿 사용은 권장되지 않음
∙JSP 내에서 화면과 프로그램이 섞여 있으면 유지보수가 힘들고 디자이너들과의 협업이 어려움
∙MVC 패턴에 따라 웹 프로그램을 개발하게 되면 JSP는 View의 역할을 하게 되고 표현언어, JSTL, 커스텀 태그 라이브러리, JSP빈즈가 주로 사용
∙그러나 JSP의 가장 큰 특징이며 유용한 부분이기도 하므로 자유자재로 사용할 수 있어야 함
∙UI(AWT, Swing 등) 을 제외한 거의 모든 자바 클래스 라이브러리를 사용한 프로그래밍이 가능함
∙사용 예 <% // 로컬 변수 선언이나 프로그램 로직이 올 수 있다.
String str = "test";
for (int i=0; i < 10; i++) {
out.println(i); } %>
6장
JSP 내장객체 : JSP 내장객체란 ‘JSP 내에서 선언하지 않고 사용할 수 있는 객체’라는 의미에서 붙여진 이름
∙구조적으로는 JSP가 서블릿 형태로 자동 변환된 코드 내에 포함되어 있는 멤버변수, 메서드 매개변수 등의 각종 참조 변수(객체)를 말함
JSP 내장객체의 구조적 특징 : 서블릿으로 변경된 JSP 코드는 모두 _jspService() 메서드에 위치함
∙메서드 매개변수인 request, response 를 비롯한 pageContext, session, application, page, config, out 등 메서드 내에서 참조할
수 있는 참조변수들이 내장객체가 됨
내장객체를 이용한 속성 관리 기법
∙내장객체가 단순히 특정한 기능을 제공하는 컨테이너 관리 객체라는 점 외에도 한 가지 특징이 있음
∙page, request, session, application 내장객체를 이용한 속성 관리 기법
∙이들 내장객체는 각자 지정된 생명주기가 있으며 setAttribute( ), getAttribute( )라는 메서드를 통해 해당 생명주기 동안 자바 객체를
유지하는 기능을 제공한다.
request 내장객체 : 사용자 요청과 관련된 기능을 제공하는 내장객체로 javax.servlet.http.HttpServletRequest 클래스에 대한 참조 변수
∙주로 클라이언트에서 서버로 전달되는 정보를 처리하기 위해 사용
∙대표적으로 HTML 폼을 통해 입력된 값을 JSP에서 가져올 때 사용
∙page 지시어 및 한글 캐릭터셋 변환
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
∘한글 캐릭터셋 변환은 HTML 폼에서 POST 방식으로 전달된 한글 데이터의 처리를 위해 필요.
∘폼 입력값 가져오기
<td>이름</td>
<td><%=request.getParameter("username") %></td>
∘getParameter() 메서드는 파라미터의 이름과 일치하는 HTML form 요소 입력 값을 가져옴
∘입력 데이터 유형에 상관없이 String 형태로 값을 취함
∙request.getParameterValues() 는 파라미터 이름과 일치하는 데이터의 문자열 배열을 가지고 옴
∙가지고 온 배열 데이터는 for 문을 통해 출력함getRemoteAddr() 메서드는 접속 클라이언트 컴퓨터의 ip 주소를 가지고 옴.
∙getMethod() 는 HTML 폼에서 데이터를 전달한 방법을 알려줌.
∙Cookie 는 서버의 요청에 따라 웹 브라우저가 클라이언트에 저장하는 작은 데이터로 비 연결형 프로토콜인 HTTP의 문제점 해결을
위해 고안된 방법으로 getCookies(), cookie[].getName(), cookie[].getValue() 등의 메서드로 쿠키 정보에 접근이 가능함
∙보안 및 사용성 문제로 인해 쿠키보다는 session 사용이 권장됨
response 내장객체 : request와 반대되는 개념으로, 사용자 응답과 관련된 기능을 제공
∙사용자 요청(request)을 처리하고 응답을 다른 페이지로 전달하는 등의 기능을 제공
∙javax.servlet.http.HttpServletResponse 객체에 대한 참조 변수로, request에 만큼 많이 사용되지는 않으나 setContentType, sendRedirect와 같은 메서드는 잘 알아두어야 함
forward 액션과 response.sendRedirect() 의 차이점
∙forward 액션은 최종적으로 전달되는 페이지에 파라미터(HTML 폼 입력값 등)를 함께 전달함
∙sendRedirect() 는 단순히 지정된 페이지로 최종 화면이 이동됨
∙forward 액션은 브라우저 URL에 최초 요청된 페이지 URL이 나타나고 sendRedirect() 는 최종 전달된 페이지의 URL이 표시됨
out 내장객체 : 출력 스트림으로써, 사용자 웹 브라우저로 출력하기 위한 내장 객체임
∙여러 예제에서 살펴본 것처럼 스크립트릿에서 브라우저로 텍스트를 출력하는 데 사용
∙out은 javax.servlet.jsp.JspWriter 객체의 참조 변수로, 버퍼 관련 메서드와 출력 관련 메서드로 구성되며 out을 이용해서 출력한
내용은 서버의 콘솔이 아닌 사용자에 전달됨
∙println 을 제외한 버퍼관련 메서드들은 JSP 컨텐츠를 서버에서 클라이언트로 전달 할 때 원활한 출력 스트림 활용을 위해 제공되는
것으로 일반적으로 사용하는 경우는 많지 않음
∙기본 설정된 버퍼 및 남아 있는 버퍼 크기를 구할 수 있음
∙flush() 메서드는 버퍼를 비우는 메서드
∙clear() 메서드는 내용 삭제
∙close() 메서드는 출력 스트림을 닫아 내용을 출력시키지 않음
session 내장객체
∙HTTP 프로토콜이 비연결형 프로토콜이기 때문에 한 페이지가 출력된 다음에는 클라이언트와 서버의 연결이 끊어짐
∙따라서 한번 로그인한 사용자가 로그아웃할 때까지 페이지를 이동해도 보관해야 할 정보가 있다면 이에 대한 처리가 매우 곤란해짐
∙이러한 HTTP 프로토콜 문제점을 해결하려고 나온 것이 쿠키와 세션
∙session 은 javax.servlet.http.HttpSession 인터페이스의 참조 변수
∙session 은 접속하는 사용자 별로 따로 생성되며 일정시간 유지되고 소멸 됨
∙이러한 세션의 특징을 이용해 setAttribute() 메서드를 이용해 임의의 값을 저장해 놓고 활용할 수 있음
∙세션이 주로 사용되는 경우는 다음과 같다.
➊ 사용자 로그인 후 세션을 설정하고 일정 시간이 지난 경우 다시 사용자 인증을 요구 할 때
➋ 쇼핑몰에서 장바구니 기능을 구현할 때
➌사용자의 페이지 이동 동선 등 웹 페이지 트래킹 분석 기능 등을 구현할 때
∙세션 설정 여부 확인
if(session.isNew()) {
out.println(“<script> alert(‘세션이 해제되어 다시 설정합니다.’) </script>”);
session.setAttribute(“login”, “홍길동”); }
∘세션은 브라우저 실행 후 서버 접속 시 생성되어 일정시간 유지됨
∘여기서는 생성된 세션이 없는 경우 세션에 login 이라는 key 값으로 “홍길동” 을 저장
∙세션 설정값 가져오기
# <%= session.getAttribute(“login”) %>님 환영합니다.!!<BR>
∘세션에 설정된 값은 getAttribute() 메서드를 이용해 key 값으로 가져올 수 있음
∙세션 유지 시간
∘기본 세션 유지 시간은 1,800초(약 30분) 이며 setMaxInactiveInterval() 을 이용해 변경할 수 있음
2. 세션 유지시간 : <%= session.getMaxInactiveInterval() %> <BR>
config : 서블릿이 최초로 메모리에 적재될 때 컨테이너는 서블릿 초기화와 관련된 정보를 읽고javax.servlet.ServletConfig 객체에 저장
∙config는 바로 ServletConfig 클래스에 대한 참조 변수로 web.xml 에 설정된 초기화 파라미터를 참조하기 위한 용도로 사용할 수 있음
application : 웹 애플리케이션(컨텍스트) 전체를 관리하는 객체로 application 객체를 통해 각 서블릿이나 JSP에서 공유하려고 하는
각종 정보를 설정하고 참조할 수 있음
∙application은 javax.servlet.ServletContext 객체에 대한 참조 변수로써, config 객체를 통해 생성
∙ServletContext 객체는 컨테이너와 관련된 여러 정보를 제공하며, application 참조 변수를 통해서 서블릿이 실행되는 환경이나
서버 자원과 관련한 정보 를 얻거나 로그 파일을 기록하는 작업 등을 수행함
∙application 내장객체는 일반적으로 톰캣의 시작과 종료 라이프사이클을 가짐
∙유형별로 많은 메서드를 제공하므로 주로 관리 기능의 웹 애플리케이션 개발에 유용함
page : JSP 컨테이너에서 생성된 서블릿 인스턴스 객체를 참조하는 참조 변수며, JSP에서 자기 자신을 참조할 때 사용 됨
∙JSP 스크립트 언어가 자바가 아니라면 유용하게 사용할 수 있지만, 자바인 경우 page 참조 변수를 통하지 않고도 생성된 서블릿
클래스의 멤버변수나 메서드에 직접 접근할 수 있음. 따라서 page 참조 변수는 거의 사용하지 않음
pageContext : javax.servlet.jsp.PageContext 인스턴스에 대한 참조 변수로, 다른 모든 내장객체에 대한 프로그램적인 접근 방법을 제공함
∙많이 사용하는 형태는 HTTP 요청을 처리하는 제어권을 다른 페이지로 넘길 때 사용하는 것으로 forward 액션과 동일한 기능을 제공함
(forward 액션의 내부 구현 코드로 이해할 수 있다.)
∙forward() 메서드는 forward 액션과 동일한 기능을 함
➊ forward() 메서드 사용 : pageContext.forward(“HelloWorld.jsp”)
➋ forward 액션 사용 : <jsp:forward page=“HelloWorld.jsp” />
∙include() 메서드는 include 액션과 동일한 기능을 한다.
➊ include() 메서드 사용 : <% out.flush();
pageContext.include(“HelloWorld.jsp”); %>
➋ include 액션 사용 : <jsp:include page=“HelloWorld.jsp” flush=true />
Application, Session, Request 차이점
➊ application은 모든 사용자가 공유하는 데이터를 저장할 수 있으며 톰캣이 종료될 때 까지 데이터를 유지할 수 있음
➋ session의 경우 사용자마다 분리된 저장 영역이 있으며 Page1, Page2, Page3 모두에서 공유되는 정보를 관리할 수 있음. 물론 이
데이터는 각자 공유 영역에서 관리되며 사용자 간에는 공유되지 않음
➌ 페이지 흐름이 Page1, Page2, Page3순으로 진행된다고 할 때, 한 페이지에서 다른 페이지로 데이터를 전달하려면 request 내장객체를
이용해야 한다(맨 아래의 user1에 해당한다). page 마다 생성됨
∙request, session, application 은 각각 생성 시점과 소멸시점이 다르며 이를 잘 이해하고 적절한 내장객체를 이용해야 함
∙각각의 내장객체는 모두 getAttribute(), setAttribute() 메서드를 통해 속성을 저장하거나 가져올 수 있음
request, session, application을 이용한 속성 관리
∙request, session, application은 맵 형태의 속성 관리 기능을 제공
∙속성을 저장하기 위해서는 setAttribute(String name, Object value) 형태를 취함
∙반대로 속성에 저장된 값을 가져오는 getAttribute(String name) 메서드는 name에 해당하는 Object 를 리턴
∙리턴 되는 타입이 Object 이므로 속성을 가지고 올 때에는 적절한 형 변환이 필요함
∙예를 들어 page1에서 session.setAttribute("name,"홍길동")으로 문자열 객체를 저장한다면 page3에서는
session.getAttribute("name")으로 저장된 값을 참조할 수 있음
컨테이너 기반 프로그램의 특징과 JSP 내장객체
∙최신의 프로그램 아키텍처의 특징 중 하나는 컨테이너를 기반으로 한 구조
∙프로그램 관점에서 컨테이너란 프로그램 실행에 관여하면서 모듈화된 프로그램을 실행할 수 있게 하고 프로그램 간의 원활한 데이터(객체) 교환을 지원하는 소프트웨어를 말함
∙JSP에서 내장객체를 이용한 속성 관리가 가능한 것은 JSP와 빈즈 객체들이 톰캣이라고 하는 컨테이너에 의해 관리되고 실행되기 때문임
∙웹 프로그램도 컨테이너 기반이며 대표적인 프레임워크인 스프링 역시 컨테이너 기반의 프로그램 모델이 된다. 이러한 컨테이너 기반
프로그램의 장점은 다음과 같음
➊ 프로그램의 모듈화가 용이함
➋ 독립적으로 실행되는 모듈 간의 데이터 교환이 용이함
➌ 개별 프로그램에서 화면/상태 전환 시 데이터를 유지/관리하기 용이함
➍ JSP에서는 컨테이너에 의해 관리되는 내장객체를 통해 임의의 객체를 각각의 생명주기 시점에 따라 공유할 수 있음
MVC 패턴과 JSP 내장객체
∙MVC 패턴은 프로그램을 Model, View, Controller 세가지 역할로 구분해 구현하는 소프트웨어 디자인 패턴을 말함
∙MVC 패턴에 따르면 JSP는 뷰의 역할만 수행해야 함. 즉 화면에 데이터를 출력하는 기능만 제공해야 한다는 것인데, 문제는 컨트롤러에서
처리한 데이터(예를 들면 데이터베이스로부터 가져온)를 어떻게 JSP로 전달해야 하는지에 대한 것
∙이처럼 MVC 패턴을 사용하게 되면 JSP는 별도로 데이터를 가지고 오는 로직 없이 데이터를 출력할 수 있어야 하는데 이때 JSP
내장객체를 이용한 속성 관리가 사용됨
∙예를 들어, 컨트롤러에서 처리한 데이터는 request.setAttribute( )를 이용해서 저장하고 화면에 보여질 JSP로 포워딩 하면 해당 JSP에서는 request 내장객체를 통해 데이터를 참조할 수 있으므로 완전한 MVC 패턴의 구현을 구현할 수 있음
∙뷰를 효과적으로 구성하는 방법은 <jsp:useBean>, <jsp:getProperty>, 표현식을 사용하는 것이나 표현 언어(Expression Language)와
JSTL을 이용할 경우 더욱 편리하게 뷰를 구현할 수 있음
7장
빈즈 : 특정한 일을 독립적으로 수행하는 컴포넌트를 의미함
∙원래 자바에서는 GUI(Graphic User Interface), 즉 창이나 버튼, 스크롤바 등 화면을 구성하는 다양한 위젯을 제작하려고 빈즈를 만듬
∙J2EE가 발표되면서 각각 엔터프라이즈 자바 빈즈(EJB : Enterprise Java Beans)와 JSP에서 사용하는 JSP 빈즈로 나뉘어 개념이 확장됨
이들의 용도는 다르지만 프로그램 모듈화를 위한 컴포넌트라는 기본 전제는 같다.
자바 빈즈
∙일반적으로 컴포넌트라고 하면 다른 무언가를 만들기 위한 부품을 말한다. 컴포넌트는 각각 독립적인 기능이 있으며, 컴포넌트 조합을
통해 다양한 형태의 결과물을 만들 수 있다. 예를 들어, 레고 블록이나 예전의 컴포넌트 오디오 등을 생각해볼 수 있음
∙이때 각각의 모듈을 서로 조합하려면 규격화된 인터페이스가 있어야 한다. 레고의 경우에는 튀어나온 부분들이 다른 블록의 아래쪽에
결합이 되는 구조고, 컴포넌트 오디오는 일반 스테레오 케이블이나 HDMI, 광케이블 등으로 서로 연결됨
JSP 빈즈 : JSP와 연동하기 위해 만들어진 컴포넌트 클래스
∙컨테이너에 위치하며, JSP에 데이터베이스 연동 등 프로그램적 요소를 모듈화할 수 있도록 도와줌
∙데이터 처리와 공용화된 기능을 제공하기 때문에 빈즈를 잘 활용하면 프로그램의 중복을 줄이고 더욱 원활하게 유지·보수할 수 있음
∙따라서 가능하면 JSP 코드 내에 스크립트릿을 사용하는 것보다는 빈즈를 만들어 사용하는 것이 좋음
∎일반적인 jsp 구현에서 빈즈
∙MVC 패턴에 기반해 프로그램 개발시에는 개별 JSP에서 빈즈에 접근하는 것 보다는 컨트롤러에서 빈즈와 연동하고 request, session,
application 등 내장객체의 속성 관리 기능을 이용해 해당 뷰(JSP)에 빈즈 객체를 전달하는 방법이 권장됨
∎MVC 패턴을 적용한 경우에서의 빈즈 사용
엔터프라이즈 자바 빈즈(Enterprise Java Beans, 이하 EJB)
∙애플리케이션에서 비즈니스 로직을 구현하려는 컴포넌트 모델로, Java EE(Java Enterprise Edition)의 핵심
∙Java EE는 보안을 중시하고 규모가 크며 확장 및 다른 시스템과의 상호·운용을 필요로 하는 애플리케이션 개발에 필요한 핵심 기술.
∙상당수의 금융기관, 증권사, 이동통신사 등의 업무 시스템들이 Java EE를 기반으로 개발됨
∙여러 장점에도 불구하고 개발의 복잡성, 컨테이너 간 호환성 등 여러 문제로 인해, 그 대안이 지속적으로 논의 됨
∙JPA(Java Persistence API)를 핵심으로 하는 Java EE 5가 발표되면서(최신 버전은 JavaEE 7) 기존 엔티티빈(EJB 빈 유형 중 하나)의
상당 부분이 대체됨
∙JSP도 JavaEE 의 프레젠테이션 레이어의 한 부분으로 볼 수 있음
빈즈 연동 개요
∙JSP빈즈는 JSP에서 사용할 수 있는 자바 컴포넌트로 빈즈 액션과 결합해 웹 프로그램을 더욱 간편하고 단순한 구조로 개발 할 수 있게 해줌
∙빈즈도 자바 클래스이기 때문에 JSP 파일의 스크립트릿 부분에서 인스턴스를 만들어 사용할 수 있음 그러나 일반 클래스와 다를 바
없다면 굳이 빈즈라는 이름을 붙일 필요가 없을 것
∙빈즈는 일반 클래스처럼 사용할 수도 있지만, JSP 빈즈만의 특징적인 요소를 잘 활용하면 더욱 편하게 프로그램을 작성할 수 있음
∙일반적으로 빈즈를 사용할 경우, 사용자 입력 처리에 필요한 HTML이나 JSP와 폼의 액션에 연결된 JSP 파일이 있어야 하며, 폼을
처리하는 JSP 파일에서 참조할 빈즈 클래스도 필요함. 물론 경우에 따라 결과를 보여주는 HTML이나 JSP 파일이 필요할 수도 있음
➊ 사용자 입력을 받기 위한 HTML 폼 입력 값은 각각의 form 요소의 name 속성 값(value)을 통해 a.jsp로 전달됨
➋ a.jsp는 useBean 액션을 이용해 빈즈 클래스를 불러오고 setProperty를 통해 폼으로부터 전달받은 값을 빈즈 클래스의
멤버변수의 값으로 전달함
➌ 이때 빈즈 클래스의 setter 메서드들이 자동으로 호출됨
➍ 빈즈 클래스 값을 참조하려면 getter 메서드를 사용함
➎ 결과를 보여주기 위한 b.jsp에서는 a.jsp와 마찬가지로 useBean 액션을 이용해 빈즈 클래스를 참조하고 getProperty를
이용해 멤버변수 값을 출력함
DB연동 3가지 방법
➊ 데이터베이스 연동을 포함해서 데이터와 여러 기능을 함께 구현하는 방법(DO, DAO 클래스의 통합 형태)
빈즈 내부에 데이터베이스 접속과 관련한 정보를 포함하여 입력, 출력, 삭제와 같은 모든 데이터베이스 처리 로직을 갖는 형태. 쉽고
빠르게 개발할 수 있는 장점 때문에 비교적 간단한 프로그램 구현에 이용된다. 일반적인 JSP에서의 빈즈 활용이 여기에 해당
➋ 데이터 매핑과 데이터베이스 처리를 분리해서 구현하는 방법(DO, DAO 클래스의 분리 형태)
Data Object와 DAO(Data Access Object)를 분리한 형태로, DO 클래스에는 테이블과 대응할 수 있는 필드 관련 기능만 존재함.
데이터베이스 접속과 관련한 정보와 입력, 출력, 삭제와 같은 기능은 DAO라는 별도 클래스에 구현함. ➊보다 처음에는 구현이 어렵지만 데이터와 비즈니스 로직을 분리하기 때문에 유지보수에 유리하다는 장점이 있음. 이 방법은 DAO 패턴으로 불리기도 하며, 주로MVC 패턴과 함께 사용된다. 대부분의 프로젝트에 적합한 방법이다. 따라서 처음부터 이 방법으로 프로그래밍 습관을 들이는 것이 좋음
➌ 별도의 O-R 매핑 프레임워크를 사용하는 방법
➋ 에서 실질적인 데이터베이스 처리를 담당하는 DAO 대신 O-R 매핑 프레임워크(O-R Mapping Framework)를 사용하는 방식.
O-R 매핑이란 빈즈(도메인) 객체와 데이터베이스 테이블의 칼럼을 자동으로 연결하고, 이들의 값을 동기화하며 상태를 유지하는 메커니즘을 제공함으로써 개발의 생산성과 안정성을 높일 수 있는 방법임
빈즈 클래스 구조 : 기본적으로 빈즈 클래스는 자바 클래스이므로, 일반적인 자바 클래스 구성을 따름
∙JSP 액션과 연동하기 위해 필요한 몇 가지 필수 구성의 차이가 있지만 이는 문법적인 제약이 아니기 때문에 규칙을 따르지 않더라도
컴파일 오류가 발생하지는 않음
∙빈즈는 매개변수가 없는 기본 생성자를 요구하므로 만일 매개변수가 있는 생성자를 구현하였다면 기본 생성자를 명시적으로 선언해 주어야
문제가 발생하지 않음
∙빈즈 클래스의 일반적인 구조는 멤버변수, getter/setter 메서드임
class xxxBean {
// 멤버변수 : 데이터베이스 테이블의 칼럼 이름과 매칭된다.
private String xxx;
// get, set 메서드 : 멤버변수와 매칭된다.
public String getXxx() {
return xxx; }
public setXxx(String xxx) {
his.xxx = xxx; } }
JSP에서 빈즈 선언 : 선언하는 방법은 ‘5장. JSP 기본문법’에서 배운 <jsp:useBean> 액션을 사용하는 것
∙<jsp:useBean id="mybean" scope="request" class="MyBean" />
∙useBean 액션은 다음과 같은 자바 코드로 변경된다. id, class, scope의 의미를 좀 더 자세히 알 수 있음
MyBean mybean = (MyBean)request.getAttribute("mybean");
if(mybean == null) {
mybean = new MyBean();
request.setAttribute("mybean", mybean); }
page scope인 경우
<%
MyBean mybean = new MyBean();
%>JSP에서 빈즈 속성 설정
∙JSP 에서 빈즈를 선언한 다음, setProperty, getProperty 액션을 통해 빈즈 값을 설정하고 가져올 수 있음
jsp:setProperty name="mybean" property="userid" />
<jsp:setProperty name="mybean" property="userpasswd" />
∙입력항목이 많은 경우 모든 멤버변수에 대해 setProperty를 할 필요 없이 property=“*” 를 사용하면 됨
∙setProperty는 다음과 같은 자바 소스 코드로 변환되며 스크립트릿에서도 동일하게 사용할 수 있음
<%
mybean.setUserid(request.getParameter("username"));
mybean.setPasswd(request.getParameter("userpasswd"));
%>
빈즈 에서 JSP로 속성 데이터 가져오기
∙빈즈에 설정되어 있는 값은 getProperty를 이용해 읽어 올 수 있음
∙앞에서 setProperty로 설정된 값은 다음과 같이 JSP에서 가져올 수 있음
<jsp:getProperty name="mybean" property="username" />
<jsp:getProperty name="mybean" property="userpasswd" />
∙getProperty 는 화면에 데이터를 출력하는 용도로 사용하기 때문에 HTML과 함께 쓰는 경우가 많음
<TR><TD>이름</TD>
<TD><jsp:getProperty name="mybean" property="username" /></TD></TR>
∙코드가 길어 불편한 경우 <%= %>을 사용할 수도 있다.
<TR><TD>ID</TD>
<TD><%= mybean.getUsername() %></TD></TR>
∙추후 표현언어를 배우게 되면 $ {mybean.username} 과 같이 사용하게 됨
∙HTML 폼(login_form.html)
<td> 아이디</td>
<td><input type="text" name="userid" size=10></td>
</tr>
∘입력 항목의 name 속성값을 빈즈 클래스의 멤버변수명과 일치 시켜야 함.
∙폼 처리를 위한 JSP (login.jsp)
<jsp:useBean id="login" class="jspbook.ch07.LoginBean" scope="page" />
<jsp:setProperty name=:login" property="*" />
∘useBean 액션과 setProperty를 이용해 HTML 폼 값을 빈즈 클래스 멤버변수로 매핑.
JSP 명령어 모음
∙<%@ %> : 지시어(모든 지시어에 사용) ∙<%= %> : 표현식 ∙<% %> : 스크릿트립 ∙<%! %> : 선언
∙<jsp: /> : 액션(모든 액션이 사용)
HTML 명령어 모음
∙<p> : 문단나누기 ∙<br> : 개행 ∙<hr> : 헤드라인 ∙<table></table> : 테이블 생성
∙<center></center> : 중앙정렬 ∙<tr></tr> : 테이블 안에 한줄 생성 ∙<td></td> : 한 줄 안에 칸 생성
∙<form> name = “form1“ method = “post“ action =“result.jsp“>
<input type=“text“ or “submit“ or “checkbox“ or “reset“ or “password“ name=“submit“ value=“전송”> </form>
∘값을 저장해 Server에 던지기 위한 것으로, 보내는 방식(method)과 이름(name), 액션(이동할 jsp주소. 데이터를 보낼 곳)을 지정함
∘input은 값을 저장하기 위해 선언하는 것으로 여러 타입을 사용. name은 input의 실제 이름이고, value는 화면에 보여주는 이름
∙라디오박스 <select name="operator“>
<option selected>+</option>
<option>-</option>
<option>*</option>
<option>/</option> </select>
400번대 에러는 Client Error(사용자 에러), 500번대는 Server Error(관리자측 에러)