JSP 정리 1

Updated:

JSP란?

JSP 란 Java Server Pages 의 약자로 HTML 코드에 Java 코드를 넣어(보통 <% 자바코드 %> 의 형식으로 사용된다) 동적 웹페이지를 구현할 수 있도록한 서버페이지이다. 서버페이지는 서버에서 실행되는 페이지를 의미한다. JSP를 제외한 다른 서버 페이지의 예로는 ASP, PHP등이 있다. 서버페이지가 필요한 이유는 클라이언트에서만 동작하는 기존의 HTML 페이지에서는 서버에 저장된 데이터에 접근할 수 없기 때문이다. 따라서 JSP페이지는 HTML 페이지로부터 원하는 작업에 대한 요청(request)을 받고 서버의 데이터에 접근하여 요청 대한 서비스를 수행한 후 그 결과를 다시 HTML 페이지에 넘겨주는(response) 역할을 하게 된다. JSP를 발표한 선마이크로시스템사에서 제공하는 JSP 문서에 의하면 JSP는 “답변(responese) 을 만들기 위해 요청(request)을 어떻게 처리할 것이지를 길수하는 텍스트기반의 문서”라고 정의되어있다.

정적 웹 페이지 vs 동적 웹 페이지

정적 웹 페이지

정적 웹 페이지는 항상 같은 내용을 표시하는 웹 페이지이다. 정적 웹 페이지는 웹 서버에 미리 저장된 파일(HTML 파일, 이미지, 자바스크립트 파일 등)이 그대로 전달되는 웹 페이지이다. 정적 웹 페이지의 웹 서버는 사용자의 요청에 해당하게 되는 웹 페이지를 보여주게 되고 사용자는 서버에 저장된 데이터가 변경되지 않는 한 고정된 웹 페이지를 보게 된다.

동적 웹 페이지

동적 웹 페이지는 서버에 있는 데이터들을 스크립트에 의해 가공처리한 후 생성되어 전달되는 웹 페이지이다. 서버는 사용자의 요청을 해석하여 데이터를 가공한 후 생성되는 웹 페이지를 보내게 된다. 사용자는 상황, 시간, 요청 등에 따라 달라지는 웹 페이지를 보게 된다. 동적 웹 페이지의 예로는 커뮤니티 사이트의 게시글이나 포털 사이트의 웹툰 등이 있다. 2000년대 초반까지만 해도 정적 웹 페이지가 많았지만 웹 생태계가 발전하면서 사용자나 서비스 제공자의 요구를 충족시키기 위해 동적 웹 페이지로 많이 넘어가게 되었다. 예를 들어 쇼핑몰 운영자의 경우 정적인 웹 페이지의 경우 상품을 등록하거나 제거할 때, 회원관리 할 때, 상품 재고 관리할 때 등 그때마다 정적 웹 페이지를 제작해줘야 하지만 동적 웹 페이지를 구축하면 상품 등록 및 관리, 회원 가입 등에 해당하는 스크립트만 작성하고 자동으로 페이지가 생성되게 해주면 사이트 관리 비용이나 편의성 면이 높아지게 된다.

동적 웹 페이지의 경우 정적 웹 페이지와 다르게 서버 내부에서 추가적인 작업을 위한 모듈들이 필요하다. 대표적인 예로 PHP(스크립트 처리기)와 MySQL(DB)을 들 수 있다. 따라서 서버를 구성할 때 해당 모듈들을 설치해야 하고 직접 서버를 만드는 것이 아닌 웹 호스팅을 사용할 때도 해당 모듈들을 제공하는 서비스를 선택해야 한다(대부분의 웹 호스팅은 PHP와 MySQL을 제공한다). 이러한 모듈들은 서버의 자원(CPU, 메모리 등)을 이용하기 때문에 비용이 들게 된다. 또 정적 웹 페이지에 비해 추가적인 작업이 이루어지기 때문에 당연히 더 느리다. 하지만 웹 사이트 구축과 운영/관리 관점에서 보면 구조화된 웹사이트의 구축과 관리의 용이성 때문에 전체적으로 비용이 더 절감된 다고 할 수 있다. 정적인 웹 페이지의 경우 같은 코드가 포함되어 있는 경우에도 각각 따로 저장되지만 동적 웹 페이지는 중복 코드는 하나의 파일로 만들고 스크립트로 불러올 수 있게 된다.

장점과 단점

  정적 웹 페이지 동적 웹 페이지
장점 빠르고 비용이 적게 든다 서비스가 다양하고 관리가 쉽다
(웹사이트의 구조에 따라서 추가/수정/삭제 등 용이)
단점 서비스가 한정적이고 관리가 힘들다.
(추가/수정/삭제 모두 수동).
상대적으로 느리고 추가 비용이 든다
(서버 비용 혹은 웹페이지가 느려지는 부분)

JSP vs Servlet

JSP와 Servlet 모두 웹 어플리케이션(아래 설명 참고)을 만드는 기술이다. 차이가 있다면 JSP는 HTML 문서 안에 Java코드가 들어가는 반면에 Servlet은 자바 코드 안에 HTML을 포함하고 있다는 점이다.

JSP가 Servlet보다 나은 점

  1. JSP가 Servlet보다 더 많은 기능을 제공한다. (implicit objects, predefined tags, expression language, Custom tags)

  2. 유지 보수가 쉽다. 비즈니스 로직과 프레젠테이션 로직을 분리하기가 쉽다. (Servlet에서는 그 두가지가 섞여있다)

  3. 개발이 빠르다. Servlet과 다르게 페이지가 수정된 이후에 다시 컴파일하고 디플로이 할 필요가 없다.

  4. 코드가 더 적다. JSP에서는 action tags, JSTL, custom tags 같은 코드를 줄여주는 태그들이 있다. EL, implicit objects 들도 있다.

  • 웹 어플리케이션란 웹에서 실행되는 응용프로그램을 뜻한다. 예를 들면 인터넷을 통한 은행업무, 인터넷쇼핑, 등등 인터넷에서 하는 여러 서비스가 다 웹 어플리케이션이다. 웹 어플리케이션은 사용자의 요청(Request)을 받고 서버에서 이에 해당하는 요청을 수행하고 요청한 데이터를 응답(Response) 하는 역할을 한다. 웹 어플리케이션의 구성요소는 다음과 같다.
    • 웹 브라우저
    • 웹 서버 : 클라이언트로부터 요청 받아 서버에 저장된 데이터를 클라이언트에게 전달한다. 주로 정적 컨텐츠를 담당한다.
    • 웹 어플리케이션 서버(WAS) : 서버에서 필요한 기능을 수행하고 그 결과를 웹 서버에게 전달한다.
    • 데이터베이스 : 서비스에 필요한 데이터를 보관, 갱신 등 관리를 한다.

JSP API

JSP API는 두가지 패키지로 이루어져 있다.

  1. javax.servlet.jsp
  2. javax.servlet.jsp.tagext

javax.servlet.jsp

이 패키지는 두가지 인터페이스와 여러 클래스로 이루어져 있다. 두가지 인터페이스들은 다음과 같다.

  1. JspPage
  2. HttpJspPage

클래스들은 다음과 같다.

  • JspWriter
  • PageContext
  • JspFactory
  • JspEngineInfo
  • JspException
  • JspError

The JspPage interface

모든 JSP servlet 클래스들은 Servlet인터페이스를 implement한 JspPage 인터페이스를 implement해야 한다. JspPage 인터페이스는 JSP의 두가지 life cycle 메서드를 제공한다.

  1. public void jspInit(): JSP 페이지가 처음 요청되었을때 불려지는 메서드이다. JSP 페이지의 시작을 의미하고 Servlet 인터페이스의 init()메서드와 동일한 기능이다.
  2. public void jspDestroy(): JSP 페이지가 끝났을 때 불려지는 메서드이다. JSP 페이지의 수행을 초기화 시킬 때도 쓸 수 있다(?).

The HttpJspPage interface

HttpJspPage 인터페이스는 JSP의 한가지 life cycle 메서드를 제공한다.

  1. public void _jspService(): JSP 페이지에 대한 요청이 컨테이너로 들어왔을 때 불려지는 메서드이다. 요청을 수행할 때 사용된다. _ 밑줄은 이 메서드를 override할 수 없다는 것을 의미한다.

JSP 문법

JSP scripting elements

JSP에서는 scripting element를 이용해 JSP 페이지 안에 Java 코드를 쓸 수 있다. scripting element는 세가지 종류가 있다.

JSP scriptlet tag

scriptlet tag는 JSP안에서 자바 소스 코드를 실행하기 위해 사용된다. 문법은 다음과 같다.

<% java source code %>

<html>  
<body>  
<% out.print("welcome to jsp"); %>  <!-- displaying a welcome message -->
</body>  
</html>  

예시

index.html - 사용자 이름 입력 받고 welcome.jsp로 보낸다.

<html>  
<body>  
<form action="welcome.jsp">  
<input type="text" name="uname">  
<input type="submit" value="go"><br/>  
</form>  
</body>  
</html>  

welcome.jsp - 사용자 이름을 프린트한다.

<html>  
<body>  
<%  
String name=request.getParameter("uname");  
out.print("welcome "+name);  
%>  
</form>  
</body>  
</html>
JSP expression tag

expression tag는 JSP 페이지에서 출력할 때 사용된다. 이 태그를 사용하면 출력이 되기 때문에 out.print()를 사용할 필요가 없다. 보통 변수나 함수의 값을 출력할 때 사용된다. 문법은 다음과 같다.

<%= statement %>

예시

index.html - 사용자 이름 입력 받고 welcome.jsp로 보낸다.

<html>  
<body>  
<form action="welcome.jsp">  
<input type="text" name="uname"><br/>  
<input type="submit" value="go">  
</form>  
</body>  
</html>  

welcome.jsp - 사용자 이름을 프린트한다.

<html>  
<body>  
<%= "Welcome "+request.getParameter("uname") %>  
</body>  
</html>  
JSP declaration tag

declaration tag는 JSP 페이지에서 필드나 메서드를 선언할 때 사용된다. 문법은 다음과 같다.

<%! field or method declaration %>

Scriptlet Tag와 Declaration Tag의 차이점

Jsp Scriptlet Tag Jsp Declaration Tag
변수만 선언 가능(메서드 x) 변수와 메서드 둘 다 선언 가능
scriptlet tag에서의 선언은 _jspService() 메서드 안에 위치하게 됨 declaration tag에서의 선언은 _jspService() 메서드 밖에 위치하게 됨

예시

<html>  
<body>  
<%! int data=50; %>  
<%= "Value of the variable is:"+data %>  
</body>  
</html>  
<html>  
<body>  
<%!   
int cube(int n){  
return n*n*n*;  
}  
%>  
<%= "Cube of 3 is:"+cube(3) %>  
</body>  
</html>  

9 Implicit Objects

Implicit Objects는 한국어로 암시적/묵시적 객체라는 뜻으로 자바 객체이다. 보통 내장 객체라고 많이 한다. 내장 객체라는 뜻은 개발자가 명시적으로 선언하지 않아도 JSP 컨테이너에서 제공하는 객체라는 뜻이다. 그래서 이 내장 객체를 Pre-defined object(사전정의 객체)라고 표현하기도 한다.

내장 객체 설명
request 파라미터를 포함한 요청 정보를 담고 있는 객체
response 요청에 대한 응답 정보를 담고 있는 객체
out 페이지 내용을 담고 있는 출력 스트림 객체
session 세션 정보를 담고 있는 객체(한 사람이 브라우저를 통해 로그인한 경우 다른페이지를 가도 로그인 정보를 가지고 있는 경우 - (한 개인이 유지해야 할 변수) - 두번째로 큰 Scope
application 어플리케이션 Context의 모든 페이지가 공유할 데이터를 다고 있는 객체(서버(톰캣)가 동작하고 나서부터 계속 유지되어야 하는 변수(전체 사용자들이 공유할 수 있는 변수) - 가장 큰 Scope)
config JSP 페이지의 서블릿 설정 데이터 초기화 정보 객체
page 고성능 JspWriter와 같은 서버 특정 기능의 사용을 캡슐화
pagecontext 현재 페이지에서만 사용할 수 있는 변수 (세번째로 큰 Scope)
exception JSP 페이지의 서블릿 실행 시 처리하지 못한 예외 객체
  • request, response, session 같은건 php, asp에서도 동일하다.
JSP Request

javax.servlet.http.HttpServletRequest 또는 javax.servlet.HttpServletRequest 타입의 내장 객체로 웹 컨테이너에 의해 만들어지고 각 파라미터를 포함한 각 JSP 요청 정보를 담고 있는 객체이다.

index.html

<form action="welcome.jsp">  
<input type="text" name="uname">  
<input type="submit" value="go"><br/>  
</form>  

welcome.jsp

<%   
String name=request.getParameter("uname");  
out.print("welcome "+name);  
%>  
JSP Response

javax.servlet.http.HttpServletResponse 또는 javax.servlet.HttpServletResponse 타입의 내장 객체로 웹 컨테이너에 의해 만들어지고 각 JSP 요청에 대한 응답 정보를 담고 있는 객체이다.

index.html

<form action="welcome.jsp">  
<input type="text" name="uname">  
<input type="submit" value="go"><br/>  
</form>  

welcome.jsp

<%   
response.sendRedirect("http://www.google.com");  
%>  

결과

JSP Config

javax.servlet.ServletConfig타입의 객체로 JSP 페이지의 서블릿 설정 데이터 초기화 정보 객체이다. 많이 쓰이는 객체는 아니다.

index.html

<form action="welcome.jsp">  
<input type="text" name="uname">  
<input type="submit" value="go"><br/>  
</form>  

web.xml

<web-app>  
  
<servlet>  
<servlet-name>sonoojaiswal</servlet-name>  
<jsp-file>/welcome.jsp</jsp-file>  
  
<init-param>  
<param-name>dname</param-name>  
<param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value>  
</init-param>  
  
</servlet>  
  <!-- 서블렛은 서버에서 동작시키는 클래스를 의미한다. 이 안에있는 파라미터의 값을 불러오고자 할때 사용하는게 config. -->
  
<servlet-mapping>  
<servlet-name>sonoojaiswal</servlet-name>  
<url-pattern>/welcome</url-pattern>  
</servlet-mapping>  
  
</web-app>  

welcome.jsp

<%   
out.print("Welcome "+request.getParameter("uname"));  
  
String driver=config.getInitParameter("dname");  
out.print("driver name is="+driver);  
%>  
JSP Application

javax.servlet.ServletConfig타입의 객체로 어플리케이션 Context의 모든 페이지가 공유할 데이터를 다고 있는 객체이다.

index.html

<form action="welcome">  
<input type="text" name="uname">  
<input type="submit" value="go"><br/>  
</form>  

web.xml

<web-app>  
  
<servlet>  
<servlet-name>sonoojaiswal</servlet-name>  
<jsp-file>/welcome.jsp</jsp-file>  
</servlet>  
  
<servlet-mapping>  
<servlet-name>sonoojaiswal</servlet-name>  
<url-pattern>/welcome</url-pattern>  
</servlet-mapping>  
  
<context-param>  
<param-name>dname</param-name>  
<param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value>  
</context-param>  
  
</web-app>  

welcome.jsp

<%    
out.print("Welcome "+request.getParameter("uname"));  
  
String driver=application.getInitParameter("dname");  
out.print("driver name is="+driver);  
%>  
JSP Session

javax.servlet.http.HttpSession타입의 객체로 세션 정보를 담고 있는 객체이다. 개발자는 이 객체를 이용해 세션의 attribute을 set, get, remove하거나 세션 정보를 가져올 수 있다.

index.html

<html>  
<body>  
<form action="welcome.jsp">  
<input type="text" name="uname">  
<input type="submit" value="go"><br/>  
</form>  
</body>  
</html> 

welcome.jsp

<html>  
<body>  
<%   
  
String name=request.getParameter("uname");  
out.print("Welcome "+name);  
  
session.setAttribute("user",name);  // set session attribute here
  
<a href="second.jsp">second jsp page</a>  
  
%>  
</body>  
</html>  

second.jsp

<html>  
<body>  
<%   
  
String name=(String)session.getAttribute("user");  // get session attribute here
out.print("Hello " + name);  
  
%>  
</body>  
</html>  
JSP PageContext

javax.servlet.jsp.PageContext타입의 객체로 JSP 페이지 실행에 필요한 Context 정보를 담고 있는 객체이다.

  • page
  • request
  • session
  • application

위의 4개의 영역에 대해 atrribute을 set, get, remove 할 수 있다.

index.html

<html>  
<body>  
<form action="welcome.jsp">  
<input type="text" name="uname">  
<input type="submit" value="go"><br/>  
</form>  
</body>  
</html>  

welcome.jsp

<html>  
<body>  
<%   
  
String name=request.getParameter("uname");  
out.print("Welcome "+name);  
  
pageContext.setAttribute("user",name,PageContext.SESSION_SCOPE); // 세션 영역의 attribute set
  
<a href="second.jsp">second jsp page</a>  
  
%>  
</body>  
</html>  

second.jsp

<html>  
<body>  
<%   
  
String name=(String)pageContext.getAttribute("user",PageContext.SESSION_SCOPE); // 세션 영역의 대해 attribute get 
out.print("Hello "+name);  
  
%>  
</body>  
</html>  
JSP Page

java.lang.Object 타입의 객체로 JSP 실제 페이지를 참고하고 있는 객체이다. 이 페이지의 객체는 실제로 자바에서 나오는 this의 동의어라고 보면 된다. 보통 이 객체는 자동으로 생성된 servlet 클래스의 레퍼런스를 할당하게 된다.

Object page=this;

<% (HttpServlet)page.log("message"); %>
Since, it is of type Object it is less used because you can use this object directly in jsp.For example:
<% this.log("message"); %>
JSP Exception

java.lang.Throwable타입의 객체로 JSP 페이지의 서블릿 실행 시 처리하지 못한 예외 객체이다. Exception을 프린트 하기 위해 사용된다. 에러가 있는 페이지에서만 사용할 수 있다.

error.jsp

<%@ page isErrorPage="true" %>  
<html>  
<body>  
  
Sorry following exception occured:<%= exception %>  
  
</body>  
</html>  

출처

Leave a comment