JSP(Java Server Page)

JSP(Java Server Page)

 
목차

1 JSP Introduction
2 Database 연동
3 Session 처리
4 JavaBeans 사용
5 예외처리

JavaServer Page Introduction

1. JavaServer Page 정의

Java Server Pages

l Are text-based documents capable of returning dynamic content to a client browser.
l Can contain a mix of HTML code, programming code, and simple JSP tags
l Allow access to components
l Are an extension of servlet technology.

HTML or XML 같은웹문서를동적으로생성할수있는쉽고강력한방법.

2. Request and Response Mechanism
1) 웹클라언트가 JSP request를웹서버에보냄.
2) 웹서버는 JSP file에대한요청임을확인하고 JSP container 호출.
3) JSP container는 JSP file을 compile하여 servlet source file (.java) 생성.
4) Javs compiler를이용이 source file을 compile하여클래스파일생성.
5) 생성된 servlet class file의 service method를통해 JSP request에대한서비스실행.

The Benefits of Java Server Page

l Support a component model and software reuse through the use of components.
l Recompile automatically when changes are made to the source file
l Simplify page development with tags.
l Provide clear separation of Web content and code.
l Are platform-independent

Note ) 용어정리
Wet developer , Content developer , Web application developer

Java Server Pages Development Preparation

l Web browser
l Web server supporting JSP and Servlet.
JSWDK , Resin , Tomcat , LWS , GNUJSP , JRUN ……
l Text based editer

Java Server Pages Tag

l JSP에서사용하는 Tag는 XML에기초
시작 tag , attributes , body , 종료tag
l 대소문자구별
l 대부분 <% ……….. %> tag 사용.
단 action 는예외

1. Java Server Page(JSP) 문법
HTML, XML 태그 외에 Java Server Page는 다음과 같은 다섯 가지 유형의 정보를 JSP
태그를 사용하여 추가할 수 있다.
이들은 .jsp 화일로부터 .java 화일을 생성할 때 JspCompiler가 이해하는 JSP 태그 정보들로서 서블릿 Java 파일 소스 내에 필요한 사항들을 정의한다.
(1) 지시문(Directives) – 페이지에 대한 전역 정보를 제공한다. import, extends, Error처리 등의
정보를 설정.
(2) 선언문(Declarations) – 해당 페이지로부터 생성된 서블릿의 멤버 변수와 멤버 메쏘드
정의.
(3) Scriptlets – 해당 페이지로부터 생성된 서블릿의 service()메쏘드에 들어가는 자바 실행
문장.
(4) Expressions – Scriptlets과 유사하나 해당 수식의 값이 out.println()을 이용해 출력하는
문장으로 전환.
(5) Actions – JavaBeans 사용, Applet Plug-in 처리등에 대한 정의.

2. 주석처리
(1) 웹 페이지(HTML, XML)에서 사용되는 주석 처리
<!– 주석문 –>
해당 주석문은 JSP로부터 생성된 웹 페이지의 주석문으로 사용되기 때문에 JSP
컨테이너는 번역하지 않고 해당 문장을 그대로 출력한다.
<!– …. <% …. %> …. –>
동적으로 생성되는 웹 페이지의 주석문으로 처리하는 방법도 있다.
(2) JSP 주석문
<%– 주석문 –%>
<%– 과 –%>사이의 문장은 JSP주석문으로 처리되기 때문에 JSP화일에 특별한
주석을 달거나 디버깅시 사용할 수 있다.
<% /** 주석문 **/ %>
Java언어에서 지원하는 주석문 태그를 사용하는 방법

3. Directives
Directives는 JSP 컨테이너에게 정보를 전달하는 데 사용되며 JSP 수행 결과 출력 스트림 상에 출력을 생성하지 않는다.
-. Syntax
<% directive attribute=”value” * %>
-. Directive 종류.
– page
– include
– taglib

(1) page directive
JSP page 전체에 대해 적용되는 속성 지정.
<%@ page [ language=”scriptingLanguage” ]
[ extends=” className” ]
[ import= “importList” ]
[ session= “true|false” ]
[ buffer= “none|sizekb” ]
[ autoFlush= “true|false” ]
[ isThreadSafe = “true|false” ]
[ info = “into_text” ]
[ errorPage = “error_url” ]
[ isErrorPage = “true|false” ]
[ content_type=”ctinfo” ]
%>
page directive는 JSP 페이지 전체에 적용되는 속성들을 적용하기 때문에 page directive 의 위치는 생성되는 Java 파일에 영향을 주지 않는다.
import 속성만 여러번 정의가 가능.

1) language
language 속성은 스크립트 언어를 정의하기 위해 사용한다.
default는 Java언어.
<%@ page language=”java” %>
* JSP의 Life cycle method.
– jspInit() : JSP 페이지 로딩시 처음 호출됨. 서블릿의 init()과 같음.
– jspDestroy() : JSP페이지 객체가 메모리에서 제거될 때 호출. destroy()에서 호출.
– _jspService(HttpServletRequest request,HttpServletResponse response) : 서블릿의
service() 메쏘드와 같은 역할.
이 메쏘드는 JSP 컴파일러에 의해 자동으로 생성되므로 개발자가 정의할 수
없다.

2) import
import변수는 Java언어의 import문을 지원한다. 즉, 해당 JSP 페이지에서 참조하는
package나 class목록을 정의한다. 참조하는 값이 하나 이상일 경우 컴마(,)로 분리
하여 표시할 수 있고 JSP 화일에서 여러 번 정의할 수 있다.
<%@ page import = “java.io.*, java.util.*” %>
<%@ page import = “java.sql.*” %>
Default import package :javax.servlet.*, javax.servlet.http.*, javax.servlet.jsp.*
javax.servlet.jsp.tagext.*

3) session
현재 page에서 ‘session’이라는이름의 implicit object reference 사용여부를 지정.
session은 javax.servlet.http.HttpSession 객체에 대한 JSP 생성 서블릿 에서의 레퍼
런스 변수 이름이다.
default값은 true이며, false로 지정하면 session 변수를 사용할 수 없다.
<%@ page session = “false” %>

4) isThreadSafe
여러 클라이언트로부터 동시에 요청이 들어올 때, 이 속성을 “true”로지정하면
여러요청들을 multiple Invoker 쓰레드로서 동시에 처리한다.
default값은 “true”인데, 동시에 처리하면 영향을 받는 공유 데이터가 있는지 주의
해야 한다. (synchronize문제)
<%@ page isThreadSafe = “false” %>
* false로 지정한 경우가 SingleThreadModel을 구현한 서블릿이 된다.
5) info
현재 page에 대한 정보를 제공하기 위해 지정하는 속성 .
Servlet.getServletInfo()를 통해서 얻을 수 있는 정보이다.
<%@ page info = “xxx JSP ver 1.0” %>

9) isErrorPage
현재 page가 다른 JSP page의 에러 페이지로 사용되고 있는지 알려주는 속성.
이 값이 “true”이면 다른 JSP 페이지에서 발생한 Exception 객체에 대한 레퍼런스
를 ‘exception’이라는 implicit object reference를 사용해 접근할 수 있다.
default 값은 “false”이고, 이 경우엔 ‘exception’ 변수를 사용할 수 없다.
일반적으로 공통 에러 처리 JSP화일에서 사용.
<%@ page isErrorPage = “true” %>

10) errorPage
현재 page에서 catch하지 않는 exception이 발생했을 경우에 보여줄 화면의 url을
지정하는 속성.
<%@ page errorPage = “errorpage.jsp” %>

11) contentType
JSP로 부터 생성된 서블릿 클래스가 동적으로 만들어내는 파일의 MIME type과
문자 엔코딩 방식을 지정한다.
type의 디폴트값은 “text/html”이고, charset은 “ISO-8859-1”이다.
<%@ page contentType = “text/html; charset=KSC5601″ %>

(2) include directive
지정한 file혹은 code를 JSP 페이지 내에 번역 시점에 포함시키고자 할 때 사용할 수
있는 directive다.
<%@ include file=”copyright.html” %>
<%@ include file=”common.jsp” %>

데이터를 JSP 페이지 내에 포함시키는 것은 include Directive말고도 <jsp:include page=….
/> action 요소도 JSP에서 지원한다. include Directive에서 지정한 파일은 해당 JSP 파일내
에 복사되어 들어와 같이 번역되고 <jsp:include page=… /> Action은 실행 시점에 해당 리
소스를 호출하여 수행 결과를 포함하는 방법으로 서로가 의미가 다른다.

(3) taglib directive
custom tag들을 가진 “tag library”를사용할수있도록지정하는 directive
<%@ taglib uri=”http://java.apache.org/tomcat/examples-taglib” prefix=”eg” %>
uri : custom tag들의 library가 있는 uri를 지정
prefix : custom tag를 구분하기 위한 구분자 prefix 명

4. Declarations
JSP 페이지에서 생성된 서블릿 클래스의 member 변수와 메쏘드 정의.
<%! ……… %> tag 지원.
예제 코드
<%!
int totalCount = 1;

private synchronized int getCount() {
return totalCount;
}
private synchronized void incrementCount() {
totalCount ++;
}
%>

Life Cycle을 적용하기 위해서는 jspInit()/jspDestroy()를 <%! %>안에 정의해 줌으로서
JSP에서도 서블릿의 Life Cycle특징을 그대로 사용할 수 있다.
<%!
public void jspInit() {
String fileName = getServletConfig().getInitParameter( “surveyFile” );
….

public void jspDestroy() {
….
%>

5. Scriptlet
Scriptlet은 JSP화일의 HTML tag에 추가 시킨 java코드를 의미.
scriptlet내에 자바언어가 지원하는 어떤 코드도 다 사용 가능.
Scriptlet은 <% 와 %>태그 사이에 정의.
<% scriptlet %>

<html>
….

<br> 쇼핑한 품목들이 다음과 같습니다.
<%
String[] items = cart.getItems();
for (int inx=0; inx < items.length; inx++)
%>
<li> <%= items[inx] %>
<% %>
….
</html>
scriptlet block은 JSP로 부터 생성되는 JSP 서블릿 클래스의 _jspService() 메쏘드 구현부분에 삽입되므로 실질적인 동적 서비스를 담당.
HTML 태그와 적절히 혼용하여 JSP처리 부분을 구현.

6. Expressions
표현되는 값은 String형태로 out 객체에 의해 응답 처리된다.
<%= 과 %>안에 정의.
<%= expression %>

<html>
….
<% EmpModel [] emps = empService.getEmployees(); %>
<table broder=0 witdh=95%>
<th>No <th>사번 <th>이름 <th>부서 <th> 입사일자
<% for ( int inx=0; inx < emps.length; inx ++ ) %>
<tr>
<td> <%= count++ %>
<td> <%= emps[inx].getEmpno() %>
<td> <%= emps[inx].getName() %>
<td> <%= emps[inx].getDept() %>
<td> <%= emps[inx].getHiredate() %>
<% %>
</table>
….
</html>

7. Implict Object Reference

request – 사용자 입력 정보를 읽어 올 수 있는
javax.servlet.http.HttpServletRequest 객체에 대한 참조 변수

response – 사용자 요청에 대한 응답을 처리하는
javax.servlet.http.HttpServletResponse 객체에 대한 참조 변수

pageContext – 현재 page의 context 값을 참조할 수 있는
javax.servlet.jsp.PageContext 객체에 대한 참조 변수

session – 클라이언트의 요청에 의해 생성된 session 정보를 갖고 있는
javax.servlet.http.HttpSession 객체에 대한 참조 변수

application – getServletConfig().getContext()로 얻을 수 있는
javax.servlet.ServletContext 객체에 대한 참조 변수

out – javax.servlet.jsp.JspWriter 객체에 대한 참조 변수
JSP의 _jspService() 메쏘드에서는 PrintWriter와 BufferedWriter의 일부 기능을
구현한 JspWriter 객체를 출력 스트림으로 사용한다.

config – javax.servlet.ServletConfig 객체에 대한 참조 변수

page – client의 요청에 의해 현재 수행되고 있는 class 객체에 대한 참조 변수
java.lang.Object type.

exception – Error JSP page에서 유용하게 사용할 수 있는
java.lang.Throwable 객체에 대한 참조 변수
7. Actions
action은 out 스트림에 영향을 주거나, 객체를 생성, 수정하는 역할을 수행한다.
다음 세가지 action은 java bean객체를 다루는 기능을 가진다.
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
다음의 3가지 action들은 부가적인 기능을 수행한다.
<jsp:include>
<jsp:forward>
<jsp:plugin>

(1) <jsp: include > action의 사용
이 action을 이용하면 다른 uri에 있는 내용을 현재 page에 포함시킬 수 있다.
<%@ include file=”uri” %>로 명기한 페이지(HTML, JSP)는 해당 JSP페이지 내에 복사된 형태로 들어와 같이 번역되고 컴파일되어 하나의 JSP 서블릿을 생성하는 방식이고, <jsp:include page=”uri …> action은 JSP페이지 실행 시점에 해당 uri를 실행 시켜서 그 결과를 포함하는 방식이다. 그럼으로 <jsp:include> Action을 사용할 경우 해당 리소스의 동적 수행 결과를 포함할 수 있는 장점이 있다.
<jsp:include page=”uri” flush=”true” />
또는
<jsp:include page=”uri” flush=”true” >
<jsp:param …. /> *
</jsp:include>

page : 포함시키고자 하는 file의 url. <jsp:param …>을 사용한 경우 해당 파라미터를 요청
시점의 속성값으로 받아들인다.
flush : 반드시 지정해야 하는 속성으로서 현재 JSP1.1 명세에서는 “true”값만사용할수있
음. true는 out buffer의 flush를 의미함.
예) <jsp:include page=”/jsp/include/foo.jsp” flush=”true”/>

include action은 동적인 수행 결과를 포함하기 때문에 HTML, JSP, 서블릿등을 URI에 줄 수가 있다.

다음은 include action 사용예다.

<html>
<body bgcolor=”white”>

<font color=”red”>

<%@ page buffer=”5″ autoFlush=”false” %>

<p>In place evaluation of another JSP which gives you the current time:

<%@ include file=”foo.jsp” %>

<p> <jsp:include page=”/jsp/include/foo.html” flush=”true”/> by including the output of another JSP:

<jsp:include page=”foo.jsp” flush=”true”/>

🙂

</html>

위의 예에서 foo.jsp의 내용이 변경된 경우 include Directive는 동적으로 반영을 못하지만 include action은 변경된 사항을 실행 시점에 반영하는 결과를 알 수 있다.

(2) <jsp: forward > action의 사용
이 action을 이용하면 현재 page의 실행을 종료하고 지정한 다른 page를 실행한 결과를
JSP요청 결과 전체에 포함시켜 돌려 준다.
syntax :
<jsp:forward page=”uri” />
또는
<jsp:forward page=”uri” >
<jsp:param …. /> *
</jsp:forward>
page : 새롭게 실행하려는 page의 url. 파라미터를 준 경우 해당 파라미터를 요청 파라미터
에 포함시켜받아들인다.

forward Action은 RequestDisparcher 클래스의 forward() 메쏘드를 이용한 것과 동일한 형태의 결과를 제공하고, HttpServletResponse의 sendRedirect() 와는 의미상 조금 다르다.
forward()는 해당 요청한 JSP(서블릿) 수행이 종료되고 forward()로 요청된 리소스가 수행되는 형태고 sendRedirect()는 호출 JSP(서블릿)은 계속 수행될 수 있고, 새로운 컨텍스트가 sendRedirect()에 의해 수행된다.

다음은 forward를 이용한 JSP의 사용예다

<!– forward.jsp –>
<html>
<%
double freeMem = Runtime.getRuntime().freeMemory();
double totlMem = Runtime.getRuntime().totalMemory();
double percent = freeMem/totlMem;
if ( percent < 0.5 )
%>
<jsp:forward page=”/jsp/forward/one.jsp”/>
<% else %>
<jsp:forward page=”two.html”/>
<% %>
</html>

Database 연동

1. JDBC (Java Database Connectivity)
Java 환경에서 Database에연결을위한표준 API 제공.
개발자측면에서는 java.sql 패키지의 API 클래스사용법만알면이를지원하는어떠한
Database와도일관된 database 통신을할수있다.
Database 벤더는개발플랫폼에필요한여러가지클라이언트 API 모듈을별도로개발
할필요가없이 JDBC API 클래스만구현하면된다.
2. JDBC Driver
JDBC API를구현한클래스셋.
각 Database 벤더에서제공. ( Oracle의 classes111.zip, classes12.zip 등)

3. java.sql 패키지의 인터페이스
JDBC를 구성하는 java.sql package에는 다음과 같은 interface가 있으며 각 DBMS 제품의JDBC Driver에는 이러한 interface들이 구현 되어 있다.

Driver – DBMS와의 연결을 맺기 위한 인터페이스
Connection – DBMS와의 세션을 유지하는 객체.
Statement – SQL을 처리할 수 있는 객체. 대부분의 SQL처리는 이 인터페이스를 이용
PreparedStatement – Precompile된 SQL을 처리
CallablStatement – Stored Procedure를 처리하는 인터페이스
ResultSet – Statement를 이용한 SQL질의 결과를 나타내는 인터페이스. 일반적으로 Cursor를 의미함. JDBC 2.0에서는 커서 스크롤링 기능이 추가되었음(first(), next(), previes(), last()등). 또한 Update 커서 기능이 추가되고 Fetch 사이즈 결정 및 ResultSet의 크기등의 정보를 제공한다.
ResultSetMetaData – ResultSet의 컬럼 정보를 제공
DatabaseMetaData – Database 전체에 대한 정보를 제공

4. DirverManager
Dirver 객체관리. (Driver Object 등록및삭제등)
메모리에 load된 Driver 객체를찾아 DBMS와 Connection 형성.

5. Oracle JDBC Driver 설치
Oracle 7 Driver : classes111.zip
Oracle 8 Driver : classes12.zip
설치위치 : jdk1.2.2jrelibext
혹은 classpath에 dirver 압축 file 위치설정.

6. Database 연동절차
1) Driver loading.
Class.forName( 걇racle.jdbc.driver.OracleDriver );
2) Connection 객체획득
String jdbcUrl = “jdbc:oracle:thin:@nuriproj.javanuri.com:1521:ora8”;
String user = “scott”;
String password = “tiger”;
Connection conn = DriverManager.getConnection ( jdbcUrl, user, password );
3) Statement 객체획득
Statement stmt = conn.createStatement ();
4) SQL 실행
public ResultSet executeQuery(String sql) : SELECT문 발행시 사용
public int executeUpdate(String sql) : UPDATE/DELETE/INSERT 문 발행시 사용
public boolean execute(String sql) : CREATE등의 DDL(Data Definition Language) 사용
5) 결과를 ResultSet객체로받아처리
Row 간이동 : next( );
Column 간이동 : getXXX( ) XXX: return data type(첫자대문자)

7. JSP에서 JDBC programming
Declaration의 jspInit()에서 database 연결맺고, jspDestroy()에서연결을해제한다.

JSP / Session 처리

Stateless : HTTP 트랜잭션은매번요청에대해독립적이다.
웹브라우저를통한클라이언트의연속적인작업이유지되지않으며, 해당정보
를보관하지않는다.
Data 추적이나사용자인식등의서비스가어렵다.
Stateless의단점을보안하는방법
Cookie or Session
Cookie : cookie를통해 client의정보를 web browser상에저장하는메커니즘.
Session : 하나의브라우저와웹서버간에만들어진 HTTP 트랜잭션들에연관된데이터
집합. (특정 client의정보를웹서버에저장하기위한메커니즘)

1. JSP에서 Session 객체획득
1) Default로 Scriptlet에서 session 이라는 명시적 객체 레퍼런스를 제공하여 HttpSession
객체를 지원한다. GetSession() method를 내부적으로 호출하여 생성한다.
그러나 page Directive에서 <%@ page session=”false” %>로 설정하면 session 객체를
사용할수없다.
2) <% HttpSession session = request.getSession(false); %> 로 session객체 혹은 null return.
2. Login / page access 제한
1) Login : Login 정보를 받아들이는 JSP또는 서블릿에서 사용자 로그인 정보가 정상적
이면 getSession()으로 세션을 새로 생성.
2) Page access 제한 : 로긴한 사용자만이 접근할 수 있는 JSP에서는
getSession(false)로 체크해서 리턴이 null이면 로그인을 하지 않은
상용자로 판단 한다.
JSP에서 위와 같은 로직을 구사하려면 <%@ page session=”false” %> 로 session객체를
getSession()으로 획득하는 것을 방지하고 Scriptlet의 제일 처음 시작에서
<% HttpSession session = request.getSession(false); %> 로 session객체를 getSession(false)로
부터 생성하여 체크하는 로직을 구현할 수 있다.
3. 표준 세션 속성 정보(세션ID나 Context등)를 지원하는 메쏘드
String getId() – HttpSession 객체의 ID를 리턴
boolean isNew() – HttpSession객체가 새로 생성된 것인지를 체크
long getCreationTime() – HttpSession객체가 생성된 시간을 리턴
long getLastAccessedTime()
int getMaxInactiveInterval() – 해당 세션의 유효 시간을 리턴
void setMaxInactiveInterval(int ) – 해당 세션의 유효 시간을 설정. 초단위
void invalidate() – 해당 세션에 bind된 어플리케이션 객체들을 해제시킴.
4. 어플리케이션 데이터를 저장하거나 접근하는 메쏘드
이것은 Hashtable과 마찬가지로 key/value쌍으로 저장하고 key로 value를 검색한다. 여기서 key는 String이고 value는 Object 타입이므로 어떠한 종류의 어플리케이션 데이터도 세션에 저장할 수 있다.
Object getValue(String name) : HttpSession 객체로부터 name값을 갖는 어플리케이션 데
이터를 가져옮.
void putValue(String name, Object value) : HttpSession 객체에 name을 key값으로 해서
value객체를 binding. 이미 같은 이름의 객체가 있는
경우 replace.
String [] getValueNames() – HttpSession 객체에 저장된 어플리케이션 데이터의 key값들
을 String [] 객체로 리턴
void removeValue(String name) – HttpSession 객체에 저장된 어플리케이션 데이터를
name이라는 key값으로 찾아서 삭제
5. Session구현 가이드
(1) 세션은 브라우져상에서 생성되는 것이 아니고 서블릿에서 생성하는 것이다.
브라우져에는 생성된 세션 객체에 대한 ID정보가 보내지고, 요청이 들어왔을 때,
서블릿에서 세션ID를 통해 세션객체와 연결한다.
(2) 브라우져의 요청이 들어왔을 때 서블릿은 URL요청으로 부터 세션ID를 읽어 세
션이 존재하는지를 체크한다.
(3) 세션을 요청하는 모든 서블릿들은 같은 서블릿 컨텍스트 영역에 있을 경우 하
나의 클라이언트당 하나의 세션을 공유하여 사용한다.
(4) 비즈니스 로직에 의해 현재 사용되고 있는 세션을 서블릿에서 무효화 시키는
방법이 제공된다. session.invalidate()를 호출하면 해당세션은 그 즉시 사용이
중지된다.
(5) 세션 객체는 또한 Time out이 되면 무효화된다. 세션 관리자는 주기적으로
생성된 모든 세션 객체의 LastAccessTime을 체크하여 default로 30분이
지난 것은 invalidate()호출을 통해 무효화 시킨다.
(6) 보안을 위해 세션ID 값을 암호화 할 수 있다.
(7) Java Servlet 2.2 명세부터는 분산 서블릿 엔진에서 세션을 공유할 수 있는
방법을 제공하고 있다. 이를 위해 HttpSession의 setAttribute() / putValue()
메쏘드는 Serializable 객체만을 바인딩한다.
Java Beans 사용

JavaBean : Java언어로 개발된 포터블하고, 플랫폼 독립적인 컴포넌트 모델을 의미한다.
컴포넌트란 : 소프트웨어 레고 블록, 또는 부품으로 표현될 수 있는 잘 설계된 독립된
모듈을 의미한다.
JSP에 JavaBeans 컴포넌트를 결합하고자 하는 이유는 웹에서 필요한 공통적인 기능들을 매번 JSP에서 코딩하지 않고 JavaBeans컴포넌트로 개발하여 재사용 하자는 데 의미가 있는 것이다.
1. Introspection
Bean의 속성과 메쏘드를 찾아 제어할 수 있는 특징.
JavaBeans 컴포넌트 명세에서는 Naming Convention을 제시.
2. Customization
개발자는 해당 Bean을 디자인 시점에 자신의 어플리케이션 상황에 적합하도록
커트마이징 할 수 있다.
3. Event
Java 위임형 이벤트 모델을 적용하여 빈과 빈간의 통신과 연결이 가능하다.
즉 Listener 인터페이스 구조로 서로 연결될 수 있다.
4. Properties
Bean은 속성을 가지고 있고, 속성을 핸들링 할 수 있는 get/set 메쏘드를 제공한다. 속
성을 변경하면 자동으로 get/set 메쏘드가 수행될 수 있도록 할 수 있다. 이것은 JSP의
getProperty/setProperty 태그와 관련이 된다.
5. Bean 과 class
Bean도 하나의 Java Class이고, Java Beans API명세에서 제시하는 Naming Convention을 따
름으로서 introspection이 가능한 클래스를 Bean이라고 한다.
6. Naming Convention 예
(1) Bean Property – getXXX() / setXXX() accessor method제공
(i) read-only – getXXX()만 제공
(ii) write-only – setXXX()만 제공
(iii) read/write – getXXX()/setXXX() 제공
(2) Boolean Property – isXXX() / setXXX() access method제공
여기서 XXX는 Property 이름이고 첫 문자는 대문자로 시작
7. JSP에서 다음 세 가지 표준 action 태그는 bean 객체를 다루는 기능을 제공한다.
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>

(1) <jsp:useBean> action의 사용
다음은 <jsp:useBean> action을 사용하는 문법이다.
<jsp:useBean id=”name” scope=”page|request|session|application” typeSpec />
typeSpec :: =class=”className” |
type=”typename” |
class=”className” type=”typeName” |
beanName=”beanName” type=”typeName” |
해당 Action이 body를 가질 경우엔 다음과 같다.
<jsp:useBean id=”name” scope=”page|request|session|application” typeSpec >
body
</jsp:useBean>
▼ id=”name”
선언한 범위 내에서 Bean이나 object 클래스를 참조하는 변수 명을 정의한다.
_jspService() 메쏘드 내에서 해당 Bean객체를 참조하는 로칼 변수를 정의한다고 생각
하면 된다.
▼scope
scope 속성은 선언한 Bean객체의 Life Cycle을 의미한다.
default 값은 page이다.
page : 현재 page의 javax.servlet.jsp.PageContext 로부터 객체를 찾는다.
객체는 현재 요청 기간 동안 살아 있다.
request : 현재 page의 ServletRequest 객체에서 getAttribute( name )메쏘드를
이용해 Bean객체를 찾고, 없으면 새로 객체를 생성해서
setAttribute( “name”, name )으로 저장한다.
session : 현재 page가 소속된 HttpSession object에서 객체를 찾고 없으면, bean
객체를 생성한 후, session에 등록한다. 같은 session의 다른 page에서
같은 bean을 사용하는 경우엔 이미 생성된 bean을 이용하게 된다.
객체는 현재 session기간 동안 살아 있다.
application : 현재 page의 ServletContext object에서 객체를 찾는다.
▼ class
해당 객체가 생성될 class이름을 fully qualified name으로 지정한다.
▼ type
id=”name”에서 정의한 참조 변수의 데이터 타입을 지정한다. class의 type 또는, class의 super class 또는 class가 implement했던 interface등을 지정할 수 있다.
▼ beanName
Bean 클래스 이름을 지정한다.

(2) <jsp:setProperty> action의 사용
이 action을 이용해서 <jsp:useBean>을 통해 생성된 bean객체에 사용자의
HttpRequest를 통해 빈 객체의 속성에 값을 저장할 수 있다.
name: <jsp:useBean>에서 정의한 빈 객체의 name
property : 값을 저장하려는 bean객체의 property 이름을 명시한다.
값이 “*”인경우엔, HttpRequest으로부터 전달된 필드들의 이름과
일치되는 property에 값을 저장한다. null string이 전달되는
경우엔 bean의 property에 아무 영향도 미치지 않는다.
param : bean의 property 이름과 지정하고자 하는 request parameter 이름이
다른 경우 사용한다. 생략하면 property 값과 동일하다고 간주한다.
value : bean property에 지정하고자 하는 값을 지정한다.
여기에는 expression도 사용할 수 있다.
예) <jsp:setProperty name=”results” property=”row” value=”<%= i + 1 %>“ />

(3) <jsp: getProperty > action의 사용
이 action을 이용하면 bean객체의 property값을 쉽게 가져올 수 있다.
해당 property의 getXXX()메쏘드가 있는 경우 사용이 가능하다.
syntax :
<jsp:getProperty name=”beanName” property=”propName” />
name : <jsp:useBean>으로 생성한 bean객체의 이름
property : 값을 읽어 오려는 property의 이름

예외처리

1. Runtime Exception
1) Run-time Exception은복구할수있는 error로 program 실행시에발생한다.
2) JSP에서 exception 정보는 exception 이라는 implicit object reference에의해알아낼수있다.
3) exception reference를이용해 client에게발생한 exception에대한정보를보여줄수있는 JSP를생성할수있다.

2. Creating an Exception Tracking Solution
1) JSP의 scriptlet 이나 components에서 발생할 exception을규정한다.
직접개발한 component가아닐경우는개발자에게발생 exception 정보문의.
2) 각 JSP page에 exception page명을 include 함.
Page directive의 errorPage attribute에 exception 처리 page 명시.
3) exception page 개발.
4) exception page에서 exception reference 이용 exception 정보를얻어냄.
Page directive의 isErrorPage attribute를 ‘ture’ 지정.
5) (Optional) – exception 발생시 user가무슨일을하고있었는지알아낼수있도록추적메커니즘을구현하여라.

3. The exception Implicit Object Reference
<%= exception.toString() %> : exception명출력.
<% exception.printStackTrace() %> : error stream의모든 error list 출력.
<%= exception.getMessage() %> : error의상세정보출력.