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보다 나은 점
-
JSP가 Servlet보다 더 많은 기능을 제공한다. (implicit objects, predefined tags, expression language, Custom tags)
-
유지 보수가 쉽다. 비즈니스 로직과 프레젠테이션 로직을 분리하기가 쉽다. (Servlet에서는 그 두가지가 섞여있다)
-
개발이 빠르다. Servlet과 다르게 페이지가 수정된 이후에 다시 컴파일하고 디플로이 할 필요가 없다.
-
코드가 더 적다. JSP에서는 action tags, JSTL, custom tags 같은 코드를 줄여주는 태그들이 있다. EL, implicit objects 들도 있다.
- 웹 어플리케이션란 웹에서 실행되는 응용프로그램을 뜻한다. 예를 들면 인터넷을 통한 은행업무, 인터넷쇼핑, 등등 인터넷에서 하는 여러 서비스가 다 웹 어플리케이션이다. 웹 어플리케이션은 사용자의 요청(Request)을 받고 서버에서 이에 해당하는 요청을 수행하고 요청한 데이터를 응답(Response) 하는 역할을 한다. 웹 어플리케이션의 구성요소는 다음과 같다.
- 웹 브라우저
- 웹 서버 : 클라이언트로부터 요청 받아 서버에 저장된 데이터를 클라이언트에게 전달한다. 주로 정적 컨텐츠를 담당한다.
- 웹 어플리케이션 서버(WAS) : 서버에서 필요한 기능을 수행하고 그 결과를 웹 서버에게 전달한다.
- 데이터베이스 : 서비스에 필요한 데이터를 보관, 갱신 등 관리를 한다.
JSP API
JSP API는 두가지 패키지로 이루어져 있다.
- javax.servlet.jsp
- javax.servlet.jsp.tagext
javax.servlet.jsp
이 패키지는 두가지 인터페이스와 여러 클래스로 이루어져 있다. 두가지 인터페이스들은 다음과 같다.
- JspPage
- HttpJspPage
클래스들은 다음과 같다.
- JspWriter
- PageContext
- JspFactory
- JspEngineInfo
- JspException
- JspError
The JspPage interface
모든 JSP servlet 클래스들은 Servlet인터페이스를 implement한 JspPage 인터페이스를 implement해야 한다. JspPage 인터페이스는 JSP의 두가지 life cycle 메서드를 제공한다.
- public void jspInit(): JSP 페이지가 처음 요청되었을때 불려지는 메서드이다. JSP 페이지의 시작을 의미하고 Servlet 인터페이스의 init()메서드와 동일한 기능이다.
- public void jspDestroy(): JSP 페이지가 끝났을 때 불려지는 메서드이다. JSP 페이지의 수행을 초기화 시킬 때도 쓸 수 있다(?).
The HttpJspPage interface
HttpJspPage 인터페이스는 JSP의 한가지 life cycle 메서드를 제공한다.
- 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