Basic of JSP
Language/JSP 2012. 11. 2. 11:001. JSP의 개요
- JSP는 HTML로만 이루어진 정적인 웹 페이지의 단점을 보완하여
동적인 웹 페이지를 보다 효울적으로 만들어 줄 수 있는 Server Side Script이다.
JSP내부에서 자바를 그대로 사용할 수 있기 때문에 더욱 효울적이며 스크립트방식으로
프로그램 가능하기 때문에 편리성과 확장성이 매우 뛰어나다.
정적 페이지의 특징(HTML)
- HTML은 정적인 문서. 이미 만들어져 있는 문서
- 클라이언트에서 서버 측에 문서를 요구할 때 서버는 클라이언트에게 이미
작성되어진 문서를 그대로 서비스한다.
동적 페이지의 특징(JSP)
- 원하는 정보를 클라이언트가 요청할 때 서버에서 실시간으로 작업을 처리하여
보다 동적으로 클라이언트에게 서비스한다.
- 서버에서는 데이터베이스 작업이나 클라이언트가 원하는 작업을 대신 처리하고
그 결과만을 클라이언트에게 서비스한다.
참고>>
동적인 페이지는 서버에서 처리하는 메커니즘을 두게 되는데 이때 이용되는 프로그램이
JSP이다. 왜 JSP가 동적인 웹 페이지를 만드는데 효율적인가?
- JSP는 자바를 서버환경에서 사용하는 스크립트 방식의 언어
(즉 서버 페이지내에 자바를 그대로 가져다 사용할수 있다는 것)
- JSP는 사용하는 언어가 자바로 되어 있기 때문에, 자바라는 언어는 어떤 플랫폼이나
어떤 웹 서버에서도 사용가능
- JSP는 단일 스레드로 클라이언트의 요청에 서비스한다.
요청이 있을때마다 프로세스를 생성하는 기존의 CGI와는 달리 하나의 메모리를
공유하면서 서비스되는 원리이며 서버 측에 부하를 줄여준다.
- JSP는 보여주는 부분과 작업 부분을 분리 할수 있음(빈과 스크립트)
2. JSP의 동작
- JSP가 실행되기 위해서는 JSP스크립트가 포함되어진 JSP파일을 Servlet파일로 변환하는
과정을 거침. 즉, Servlet파일은 .java형태로 되어 있으며 자바 파일을 실시간에
컴파일 하게 된다. 그리고 난 다음 Servlet컨테이너는 해당 클래스를 이용하여 객체를 생성,
로딩하게 된다. 이렇게 로딩된 객체는 서비스를 시작할수 있게 된다.
--> JABOOK > 그림 참조.
3. JSP 내부의 주기
- JSP변환 서블릿 프로그램은 jspInit(), _jspService(), jspDestory() 세가지 메서드에
의해서 초기화, 서비스, 파괴의 과정을 거친다.
jspInit 메서드는 단 한번 호출한 후 _jspService 메서드를 서비스 요청이 있을때마다 호출하게 된다.
서블릿 객체가 더 이상 서비스를 하지 않고 있는 경우 메모리에서 제거 되며 이때 호출되어지는
메서드는 jspDestroy메서드이다.
jspDestroy메서드가 호출되면 가비지 콜렉터는 객체의 메모리를 제거하게 된다.
--> JABOOK > JSP 내부의 주기 (그림 참조)
4-5. JSP 에서 생성되는 자바파일 및 자바파일의 구조
- JSP가 실행되면 자바(.java)와 클래스(.class)로 변환되어 그에 따라 페이지를 동적으로 생성.
즉, 미리 준비된 문서가 아닌 새로운 문서를 만들어서 보여준다는 것
참고> jsp 의 실행증거를 테스트하기 위한 예제 - (Hello_jsp.java, Hello_jsp.class)
톰캣에서 실행했을 경우
C:\Tomcat6\work\Catalina\localhost\Jabook3\org\apache\jsp\hello 대략 이러한 경로에
파일이 생성되어집니다.
- Hello_jsp 클래스는 HttpJspBase를 상속받는다.
- 자북에서 말한 hello$jsp 생성자/_jspx_init메서드 비어있다??? <--- 실제 컴파일했을때 조금 다름...(존재하지 않음)
내가 컴파일 한것은 Hello_jsp 생성자는 없고, _jspx_init 도 없다.
단지 _jspInit()만 있을 뿐이다.
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
- _jspService(HttpServletRequest request, HttpServletResponse response)
이안에 jsp파일 내에 직접 작성한 내용들이 out객체에 의해 기록되어 있음
* Servlet은 HttpServlet을 상속 받고 init, service(doGet, doPost), destory를 호출
그리고 JSP는 HttpJspPage로부터 상속을 받고 _jsp_init, _jspService, _jspDestroy를 사용
분명 같은 성질을 가지고 있다는 것을 알수가 있음.
6. _jspService 메서드의 구조
** _jspService 의 구성 **
매개변수 2개
1. HttpServletRequest request
2. HttpServletResponse response
필요한 지역변수
1. PageContext pageContext = null;
2. HttpSession session = null;
3. ServletContext application = null;
4. ServletConfig config = null;
5. JspWriter out = null;
6. Object page = this;
7. JspFactory _jspxFactory = null;
8. String _value = null;
--------- 조금 다른부분도 존재 ----------
* 실제 톰캣에서 컴파일 된 _jspService부분
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
------------------------------------------
지역변수 초기화
1. _jspxFactory = JspFactory.getDefaultFactory();
2. pageContext = _jspxFactory.getPageContext(this, request, response, "", true, 8192, true);
3. application = pageContext.getServletContext();
4. config = pageContext.getServletConfig();
5. session = pageContext.getSession();
6. out = pageContext.getOut();
--------- 조금 다른부분도 존재 ----------
* 실제 톰캣에서 컴파일 된 _jspService부분
pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
------------------------------------------
위의 초기화 된 변수와 매개변수들을 내장객체라고 한다.
_jspService 메서드 내용
1. 우선 IOException, ServletException이 선언
2. 메서드 내부에서 지역 변수를 선언
3. 이 선언된 객체변수를 초기화 한 후 _jspService 메서드 내에서 사용
참고) <% %>태그와 _jspService의 지역변수
- ** jsp문서의 <% %>태그 안에 들어있는 부분은 _jspService메서드안에 삽입 **
- ** <% %> 내에서 _jspService 메서드 내의 지역변수(내장객체)를 모두 사용가능 **
*** JSP 내장객체 ***
ServletRequest request(HttpServletRequest request) : 클라이언트의 http요청을 담고 있는 객체
ServletResponse response(HttpServletResponse response) : 클라이언트로 응답을 전송할 객체
PageContext pageContext : 다른 내장객체를 얻거나, 요청을 처리할 제어권을 다른 페이지로
위임하는 객체
HttpSession session : 클라이언트와 서버와의 세션데이터를 가지고 있는 객체
ServletContext application : Web application이 실행되는 실행 환경에 대한 정보를 담고 있는 객체
JspWriter out : Servlet이 요청을 처리하여 응답을 전송할 때 전송할 응답에 대한 출력 스트림 객체
ServletConfig config : Servlet 객체가 참조하게 될 초기 설정 데이터에 대한 정보를 담고 있는 객체
Object page(HttpJspPage) : Servlet 객체를 참조하는 레퍼런스
Throwable exception : 예외가 발생할 경우 에러 페이지에 전달되는 객체
7. JSP에서 멤버변수와 멤버메서드
질문? jsp파일에 코딩 한 부분은 전부 _jspService 메서드 안으로 들어갈까? 대답: No!!!
- jsp는 실제 실행 될 때 하나의 클래스로 이루어진다. 그 구조는 jspInit, _jspService, jspDestroy
3개의 멤버 메서드로 되어있다. 그리고 <% %> 내의 모든 구문과 html코드들은 전부 _jspService로
들어가지만 클래스의 멤버 메서드와 멤버변수차원에서 클래스내에 삽입할수 있다.
이것을 지원하는 것이 <%! %> 태그이다. 이것을 선언문이라고 부른다.
* jsp에서 클래스의 멤버변수와 멤버메서드를 삽입할 때 사용하는 구문
- <%! %> --> 선언문
- 멤버변수, 멤버메서드를 삽입할 때 사용
- 첨부된 Hello_sum.java를 확인해보변 <%! %>태그에 다른 멤버변수와 메소드가 클래스 내에
삽입되어 있는 것을 확인할수가 있다.
* <%! %> 선언문 태그
- <%! %>를 사용해서 java파일 내의 멤버메서드와 멤버변수를 사용할수 있다.
- <% %>스크립트릿 내에서 멤버변수와 멤버메서드는 자유로이 사용할수 있다.
- <% %>스크립트릿 안에서 사용하는 out객체, 즉 내장객체는 _jspService내의 지역변수이기
때문에 <%! %>선언문 내에 사용할 수 없다.
8. JSP에서 라이브러리 import
- JSP에서 멤버변수와 멤버메서드를 사용하는 법을 알았다면, 한발 더 나아가서
import 하는것도 가능할것이다.
jsp에서 import는 <%@ %> 지시문이라는 태그를 사용한다.
예> JSP에서의 내용이 JAVA의 내용으로 변경된다.
JSP
<%@ page language="java" contentType="text/html; charset=euc-kr"%>
<%@ page import="java.util.Vector"%>
JAVA
response.setContentType("text/html; charset=euc-kr");
import java.util.Vector;
- <%@ %>는 클라이언트로 전송되는 응답에 직접적인 영향을 미치기 보다는 JSP
컨테이너에 페이지정보를 전달하는 데 사용된다. 특히 그 중 많이 사용되는 것이
<%@ page %>인데 이것은 JSP페이지의 속성을 지정을 하는 역할을 한다.
--------------------------------------------------------------------------------------
<%@ page %> 속성
language : jsp파일에서 사용할 스크립트 언어를 지정하는 속성
extends : jsp파일에서 Servlet으로 변환 시 상속할 클래스를 지정하는 속성
import : jsp파일에서 Servlet으로 변환 시 import 할 패키지를 지정하는 속성
session : session을 유지할 것인지 아닌지를 결정하는 속성
buffer : out객체를 사용 할 때 buffer를 얼마의 크기로 사용할 것인지 아닌지의 속성
autoFlush: buffer가 다 채워졌을 경우의 속성
isThreadSafe : 다중 클라이언트 요청을 처리하는 속성
info : 해당 페이지의 기능과 특징에 대한 설명을 지정하는 속성
errorPage : 에러 발생시 에러 페이지를 알려주는 속성
isErrorPage : 해당 페이지가 다른 페이지에서 발생한 예외를 처리할 페이지임을 알려주는 속성
contentType : 해당 jsp파일이 클라이언트로 전송할 응답의 MINE형식을 지정하는 속성
pageEncoding: jsp에서 Encoding시 사용할 character encoding 방식을 지정하는 속성
--------------------------------------------------------------------------------------
9. JSP에서 Bean 사용하기
- Beans는 일종의 특정한 일을 독립적으로 수행하는 컴포넌트.
* 빈을 사용하기 위한 규칙
1. 빈클래스는 agument가 없는 생성자메서드를 가져야한다.
2. 멤버변수는 public 이어서는 안된다.
3. 변수에 대한 접근은 setXxxx()메서드나 getXxxx()메서드를 통해서만 가능하다.
(예외로 Boolean형태의 리턴값을 갖는 메서드는 isXxxx()의 형태를 가짐)
4. setXxxx()메서드, getXxxx()메서드는 항상 public이어야 한다.
참고> jsp에서 클래스를 만들고 import만 잘 시켜준다면 어디에서 불러 사용해도 상관없다.
페이지 지시어를 통해서 jsp안에 import한 후 객체를 생성하듯이 사용하면 된다.
ex) <%@ page import="hello.HelloWorld"%>
10. JSP에서 jspBean태그를 이용하여 빈 사용하기
- JSP에서 객체를 만드는 방법은 두 가지가 있다.
* JSP에서 객체를 만드는 방법
1. 빈을 이용하는 방법
2. new 연산자를 사용하여 객체를 사용하는 방법
JSP액션태그 중의 하나인 userBean 액션태그를 통해서 빈을 로드하는 방법
useBean태그는 새로운 객체를 생성하거나 이미 생성된 객체의 참조를 얻는데 사용
참고> 액션태그를 이용하는 방법과 일반 객체를 생성하는 방법은 같다.
<jsp:useBean id="myhello" class="hello.HelloWorld" scope="request"/>
HelloWorld myhello = new Helloworld();
- 실행을 해보면 new를 통해 자바빈즈를 출력한 것과 별반 차이가 없는 것이 확인가능하다.
JSP코드를 보면 더 간결해진것을 확인할수가 있다.
- useBean --> id: 객체인스턴스를 식별한 이름
class: 패키지이름까지 모두 기술한 클래스의 이름
scope: 빈이 존재할 범위 (scope가 명시되지 않았다면 디폴트값으로 page내에서 빈의 유효성을 가짐)
11. JSP 빈태그를 이용한 매개변수 값의 자동셋팅.
- 빈즈를 사용하기 매개변수 값을 자동으로 셋팅을 위해 두가지 태그를 더 사용
1. jsp:setProperty - 액션태그는 변수를 변경시키는 역할.
2. jsp:getProperty - 액션태그는 빈의 변수에 접근하기 위해서 사용.
* setProperty와 getProperty를 사용하기 위해서는 useBean이 먼저 기술해야 함.
'Language > JSP' 카테고리의 다른 글
SiteMesh와 Freemarker (0) | 2012.11.02 |
---|---|
Core of JSP (0) | 2012.11.02 |
ServletContext와 RequestDispatcher (0) | 2012.11.02 |
스프링 MVC - 뷰 영역 구현 (0) | 2012.10.31 |
web.xml (servlet) (0) | 2012.10.31 |