상세 컨텐츠

본문 제목

JSP 기본

프로그래밍/JAVA

by 라제폰 2009. 1. 23. 16:57

본문

JSP 기본

 

웹 서버측의 동적인 HTML 문서 생성의 간편화

자바 서버 페이지용 태그를 포함한 HTML문서의 확장

SSI (Server Side Include)

자바 서버 페이지네에서의 스크립트 언어(자바언어등) 사용

자바 서버 페이지네에서의 서버 컴포넌트(자바빈즈) 호출

 

대개의 자바 서버페디지 지원 서블릿 실행 환경에서 대략 다음과 같이 동작한다.

자바 서버 페이지를 컴파일해주는 서블릿으로 지원된다.

(jsp.jar 파일 및 포함된 컴파일 서블릿 jsp.JspServlet)

자바 서버페이지는 방문시에 파싱되어 서블릿 자바 원시 파일로 변환된다.

변환된 서블릿 원시 파일은 자바 컴파일러를 이용하여 서블릿 클래스 파일로 컴파일된다.

서블릿이 실행되어 실행결과가 웹 클라이언트에 전달된다.

대개의 경우 .jsp 파일의 수정 여부가 검사되어 필요하면 자동적으로 다시 컴파일하여 메모리로 재적재 된다.

한번만 자바 서버 페이지가 파싱되므로 효율적이다.

 

자바 서버 페이지의 SSI

 

자바 서버 페이지네에서 다른 웹 문서(HTML 문서, JSP문서 등등) 및 정보( 현재시각, 마지막수정시각 등등)의 동적인 포함기능

다른 방식의 SSI에 비하여 파싱을 1번만 하므로 성능향상

 

★ config 명령의 태그

문서 생성의 제어

errmsg : 자바 서버 페이지의 파싱 오류가 발생할 경우 웹 클라이언트에게 전송되는 메시지

timefmt : 디폴트 대신에 사용될 출력 날짜 포맷, C함수 strftime에서 사용되는 포맷스트링과 같음

sizefmt : bytes 혹은 abbrev

 

★ incude 명령의 태그

출력될 문서내에 다른 웹 문서의 포함

virtual : 포함될 파일의 디렉토리의 웹 경로이름

file : virtual 태그가 지정된 경우에는 포함될 파일 이름이고 지정되지 않은 경우에는 현재 디렉토리의 상대경로 이름이어야 한다.

 

★ flastmod 명령의 태그

마지막 수정 시각 출력

사용되는 태그는 include 명령의 태그와 같다.

 

★ fsize 명령의 태그

파일의 크기 출력

사용되는 태그는 include 명령에서의 태그와 같다

 

 ★ echo 명령의 태그

환경변수 값의 출력

var : CGI 환경변수 이름 및 SSI 환경 변수 이름이 사용될 수 있다.

DOCUMENT_NAME :  파일이름

DOCUMENT_URI : 문서 경로 이름

QUERY_STRING_UNESCAPED :

DATE_LOCAL : 지역 시간대에 의한 현재 날짜

DATE_GMT : 세계 표준시에 의한 현재 날짜

LAST_MODIFIED : 이 문서의 마지막 수정시간

 

★ exec 명령의 태그

출력될 문서내에 일반 프로그램 혹은 CGI 프로그램 실행 결과의 포함

cmd : 실행시킬 프로그램 이름

cgi : 실행시킬 CGI 프로그램의 경로이름

 

<html><head></head>
<body>
<h1>SSI Test</h1>
<ul>   
  <li> Last Modified Time (SSITest.jsp): <!--# flastmod file="SSITest.jsp" -->
  <li> File Size (SSITest.jsp): <!--# fsize file="SSITest.jsp" -->
  <li> Document Name: <!--# echo var="DOCUMENT_NAME" -->
  <li> Document URI: <!--# echo var="DOCUMENT_URI" -->
  <li> CGI QUERY_STRING: <!--# echo var="QUERY_STRING_UNESCAPED" -->
  <li> Current Local Time: <!--# echo var="DATE_LOCAL" -->
  <li> Current World Time: <!--# echo var="DATE_GMT" -->
  <li> Last Modified Time: <!--# echo var="LAST_MODIFIED" -->
</ul>
<!--#include file="copyright.html" -->
</body>
</html>

 

자바 서버 페이지의 스크립트

 

스크립트 언어를 이용하여 HTML 문서의 동적인 생성

 

★ 자바 서버 페이지 디렉티브 (directive)

자바 서버 페이지 디렉티브를 포함할때에는 파일의 맨 처음 부분에 삽입하여야 한다.

- 문법 (<% variable="value" ...)

- language 변수

- SCRIPT 태그, 스크립트렛 ( <% ... %> ) 스크립트 수식 태그 (<%= ....%>) 등에서 사용될 스크립트 언어

- errorpage 변수

: 웹 문서 생성중에서 오류발생시 전송될 html 문서 혹은 자바 서버페이지

 

★ <SCRIPT> 태그

스크립트에서 사용될 클래스 변수 및 클래스의 메소드 정의

<SCRIPT RUNAT = "client|server">

클래스 변수 혹은 클래스 메소드 정의

</SCRIPT>

RUNAT 의 값은 <SCRIPT> 태그내의 내용이 실행될 위치를 지정하며 "client"(디폴트) 인 경우 <SCRIPT> 태그내의 내용이 서버측에서 처리되지 않고 웹 클라이언트에 그대로 전달된다.

client 인 경우 서버측에서 처리되지 않고 웹 클라이언트에서 처리된다.

 

★ 스크립트릿

스크립트 실행코드

문법 <% .. %>

다음과 같은 미리 정의된 변수를 사용할수 있다.

request : javax.servlet.http.HttpServletRequest 객체

response : javax.servlet.http>httpServletResponse 객체

out : 웹 클라이언트에게 출력 내용이 전달될 java.io.PrinterWriter 객체

in : 웹 클라이언트로 부터 입력 내용을 읽어들일 java.io.BufferedReader 객체

 

★ 스크립트 수식

지정된 스크립트 언어에서의 유효한 임의의 수식

<%= ... %>

수식의 값이 스트링 형식으로 변환되어 포함된다.

 

<%@ language="java" %>
<%@ import="java.io.*,java.util.Hashtable" %>
<script runat="server">
int count = 0;
String clientHost = null;
private int increment()
{
    count++;
    return count;
}
</script>

<html><head></head>
<body>
<h1>Script Test</h1>
<p>
<%
out.println(increment() + "th visit.");
out.println("<p>Client: " + request.getRemoteHost());
%>
<p><%= count %>th visit.
<p>Client: <%= request.getRemoteHost() %>
</body> </html>

 

자바 서버 페이지의 자바 빈즈

 

자바 빈즈를 이용한 HTML 문서의 동적인 생성

자바 빈즈 프로퍼티 값을 설정시켜 실행후, 자바 빈즈 프로퍼티값을 읽어들여 실행결과로 사용한다.

 

★ <USEBEAN> 태그

자바빈즈가 사용되기 위해서는 사용될 자바 빈즈를 <USEBEAN> 태그로 미리 선언하여야 한다.

<USEBEAN NAME="자바 빈즈 인스턴스 이름"

  TYPE="<자바 빈즈 클래스 이름>"

  LIFESPAN="<page|session|application">

  0개이상의 <SETONCREATE> 태그및 <SETFROMREQUEST> 태그

</USEBEAN>

( <userbean name="clock" type="calendar.JspCalendar" lifespan="page"> </userbean> )

 

★ <SETONCREATE> 태그

자바 빈즈가 생성될 당시 자바 빈즈 프로퍼티를 통한 입력 매개변수 전달을 통한 초기화

<SETONCREATE BEANPROPERTY="프로퍼티 이름" VALUE="프로퍼티 값">

 

★ <SETFROMREQUEST> 태그

자바 서버 페이지로 요청이 들어올때 마다 자바 빈즈 프로퍼티의 값을 요청 매개변수의 값으로 설정

- <SETFROMREQUEST BEANPROPERTY="*">

: 요청 매개변수와 같은 이름을 갖는 모든 자바 빈즈의 프로퍼티의 값을 요청 매개변수의 값으로 설정한다.

- <SETFROMREQUEST BEANPROPERTY="프로퍼티이름">

: 주어진 이름의 요청 매개변수 값을 같은 이름의 자바 빈즈 프로퍼티 값으로 설정한다.

- <SETFROMREQUEST BEANPROPERTY="프로퍼티이름" PARAMNAME="요청변수이름">

: 주어진 요청 매개변수 이름의 값을 주어진 자바 빈즈 프로퍼티 이름의 값으로 저장한다.

 

<userbean name="foobar" type="FooClass" lifespan="page">

<setfromrequest beanproperty="foobarProperty" paramname="empl>

<setoncreate beanproperty="foobarProperty" value="Salaried">

</usebean>

 

★ <INCLUDEIF> 태그

특정 자바 서버 페이지 블락을 자바 빈즈 프로퍼티 값이 특정 조건을 만족하는 경우에만 HTML문서에 포함시킨다.

<INCLUDEIF PROPERTY="bean[:property]+"

  VALUE="valuetomatch" CASE="sensitive|insensitive

  MATCH="null|exact|contains|startwith|endswith">

</INCLUDEIF>

 

★ <EXCLUDEIF> 태그

특정 자바 서버 페이지 블락을 자바 빈즈 프로퍼티 값이 특정 조건을 만족하는 경우 생성될 HTML 문서에서 제외 시킨다.

<EXCLUDEIF PROPERTY="bean[:property]+"

  VALUE="valuetomatch" CASE="sensitive|insensitive

  MATCH="null|exact|contains|startwith|endswith">

</EXCLUDEIF>

 

★ request 자바빈즈

CGI 환경변수, 요청매개변수, 요청 헤더정보를 제공하는 자바 빈즈

기본적으로 제공된다.

CGI 환경변수 빈즈 프로퍼티

: request:contentLength,  request:contentType,  request:protocol  ,  request:schme

  request:serverName,   request:serverPort,    request:remoteAddr, request:remoteHost

  request:realPath,   request:characterEncoding, request:method,  request:requestURI

  request:servletPath,    request:pathInfo,    request:pathTranslated,  request:queryString,

  request:remoteUser

 

★ 요청 매개변수 빈즈 프로퍼티

request:params:name

 

★ request:headers:user-agent 등등

 

자바 CGI 프로그래밍

 

서블릿 실행 환경을 사용하기 곤란한 경우

서블릿을 많이 사용하지 않는경우

 

단점

현저한 성능저하( 가느앟면 오래 걸리는 작업에 대해서만 사용한다.)

 

자바 CGI 프로그램을 호출해주는 별도의 CGI 프로그램이 부가적으로 필요

대개의 경우 스크립트(sh.....bat)로 만든다.

CGI 환경변수 값들을 시스템 프로퍼티 혹은 프로그램 인자의 형태로 넘겨주어야 한다.

서블랫 패키지의 javax.servlet.http.HttpUtils 클래스를 사용하면 편리하다.

 

실행예

CGITest.html, CGITest.cgi, CGITest.class 파일을 웹서버에 위치

(웹 서버설정에 따라서 CGI 프로그램이 cgi-bin 디렉토리에 위치해야 한다.)

CGITest.cgi 파일을 실행가능하게 만든다. chmod+x CGITest.cgi

<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Form CGI Test</title>
<body><h1>Form CGI Test</h1>
<p><form action="CGITest.cgi" method="GET">
<table>
<tr><td>사용자 이름:</td>
<td><input type="TEXT" name="user" size=10></td></tr>
<tr><td>호스트 이름:</td>
<td><input type="TEXT" name="host" size=10></td></tr>
</table>
<input type="SUBMIT" value="눌러 보세요">,
</form></body> </html>

#!/bin/sh
JAVA=/usr/local/jdk1.2/bin/java
CLASS=`basename $0 .cgi`
CLASSPATH=.:/usr/local/lib/jsdk/lib/jsdk.jar
export CLASSPATH
$JAVA \
-DREMOTE_HOST=$REMOTE_HOST \
-DREMOTE_USER=$REMOTE_USER \
-DHTTP_USER_AGENT=$HTTP_USER_AGENT \
-DHTTP_HOST=$HTTP_HOST \
-DGATEWAY_INTERFACE=$GATEWAY_INTERFACE \
-DHTTP_CONNECTION=$HTTP_CONNECTION \
-DSERVER_SOFTWARE=$SERVER_SOFTWARE \
-DREQUEST_METHOD=$REQUEST_METHOD \
-DSERVER_NAME=$SERVER_NAME \
-DSCRIPT_NAME=$SCRIPT_NAME \
-DSERVER_PORT=$SERVER_PORT \
-DSERVER_PROTOCOL=$SERVER_PROTOCOL \
-DREMOTE_ADDR=$REMOTE_ADDR \
-DDOCUMENT_ROOT=$DOCUMENT_ROOT \
-DPATH_TRANSLATED=$PATH_TRANSLATED \
-DQUERY_STRING=$QUERY_STRING \
-DCONTENT_LENGTH=$CONTENT_LENGTH \
$CLASS

import javax.servlet.http.HttpUtils;
import java.io.*;
import java.util.Hashtable;

public class CGITest
{
    public static void main(String[] args)
        throws IOException
    {
        Hashtable qs = HttpUtils.parseQueryString(
            System.getProperty("QUERY_STRING"));
        String user = (String) qs.get("user");
        String host = (String) qs.get("host");
        OutputStreamWriter out
            = new OutputStreamWriter(System.out, "KSC5601");
        out.write("Content-Type: text/html; charset=euc-kr\r\n\r\n");
        out.write("<html><head><title>Form CGI Test</title></head>");
        out.write("<body><h1>");
        out.write(host + "의 핑거 결과: </h1><pre>\r\n");
        out.flush();
        out.write("핑거를 실행하는 부분은 생략...");
        out.write("</pre></body></html>\r\n");
        out.close();
    }
}


관련글 더보기