금요일, 3월 29
Shadow

#004 JSP로 시작하는 웹 프로그래밍

벌써 세번째 군요. 토요일에 올렸어야 했는데 다음 라이프 체인저 때문에..ㅜㅜ
세번째 시간에는 기본적인 코드 구조와 GET/POST등에 대해서 알아 볼꺼에요

이장에서는 JSP를 사용하는데 필요한 기본적인 지식을 학습합니다. HTML 문서를 생성하는 JSP페이지의 기본 골격을 살펴본뒤, request와, response 객체를 살펴 보고 JSP페이지에서 HTML문서를 생성하는데 기본적인 지식을 배우게 된다.

1. JSP에서 HTML 문서를 생성하는 기본 코드 구조
JSP의 주된 목적은 웹 브라우저에서 보여줄 HTML 문서를 생성하는 것이다.
JSP페이지에 대한 정보를 입혁하는 설정 부분과 실제로 HTML 문서를 생성하는 생성 부분으로 나눌수 있다. JSP의 설정 부분에는

JSP 페이지에 대한 정보가 위치하며, 일반적으로 다음과 같은 정보를 입력한다.
– JSP페이지가 생성하는 문서의 타입
– JSP페이지에서 사용할 커스텀 태그
– JSP페이지에서 사용할 자바 클래스 지정

2. JSP페이지의 구성요소
JSP페이지를 작성할때는 JSP페이지에 대한 정보를 지정해 주는것이 필요하며, 웹 브라우저가 전송한 데이터를 읽어 오는 기능이 필요하며, JSP페이지에서 사용할 데이터를 생성해주는 실행 코드가 필요하며, 웹 브라우저에 문서 데이터를 전송해주는 기능이 필요하다.

-디렉티브
-JSP스크립트
-표현언어
-내장객체
-정작인 데이터
-표준액션 태그
-커스텀 태그와 표준 태그 라이브러리
이 7가지 구성요소들을 익히는 과정이 바로 JSP를 공부하는 과정이라 할수 있다.

2.1 디렉티브
JSP페이지에 대한 설정 정보를 지정할떄 사용한다.
<%@ 디렉티브이름 속성1=”값1″ 속성2=”값2″…. %>
———————————————
<%@ page contentType = “text/html; charset=euc-kr”%>
JSP가 제공하는 디렉티브
– page : JSP가 생성하는 문서의 타입, 출력 버퍼의 크기, 에러 페이지등 JSP  페이지에서 필요하는 정보를 입력한다.
– tablib : JSP 페이지에서 사용할 태그 라이브러리를 지정한다.
– include : JSP페이지의 특정 영역에 다른 문서를 포함 시킨다.
2.2  스크립트 요소
JSP에서 실시간으로 문서의 내용을 생성하기 위해 사용되는 것이 스크립트 요소이다. 사용자가 폼에 입력한 정보를 테이터베이스에 저장할수 있으며, 데이터베이스로 부터 게시글 목록을 읽어와 출력할수도 있다.

JSP스크립트 요소는 다음과 같이 세가지가 있다.
– 표현식 : 값을 출력한다.
– 스크립트릿 : 자바 코드를 실행한다.
– 선언부 : 자바 메서드를 만든다.

2.3 기본 객체 : request, response, session, application, page 등
– 이들을 각각 요청 파ㅁ라미터 읽어오기, 응답 겨로가 전송하기, 세션 처리하기, 웹 어플리케이션 정보 읽어 오기등의 기능을 제공한다.
2.4 표준 액션 태그와 태그 라이브러리
– xml 태그와 같은 모양을 취하며, JSP 페이지에서 특별한 기능을 제공한다.
<jsp:include page =”header.jsp” flush =”true”/>

커스텀 태그는 JSP를 확장시켜 주는 기능으로서 액션 태그와 마찬기지 태그 형태를 제공한다.
일반적으로 커스텀 태그는 JSP 코드에서 중복되는 것들을 모듈화 하거나 또는 스크립트 코드를 사용할때의 소스 코드의 복잡함을 없애기 위해서 사용된다.
커스텀 태그중 별도로 표준화된 태그라이브러리가 있는데 JSTL이라 하며 if-else의 조건문, for구문과 같은 반복 처리 커스텀 태그를 이용해서 구현할수 있도록 도와준다 .

3. page 디렉티브
– JSP페이지에 대한 정보를 입력하기 위해 사용된다. page디럭티브를 사용하면 JSP페이지가 어떤 문서를 생성하는지, 어떤 자바클래스를 사용하는지, 세션을 참여하는지 출력 버퍼의 존재 여부와 같이 JSP페이지를 실행하는데 필요한 정보들을 입력할수있다.
<%@ page contentType=”text/html; charset=euc-kr” %>
<%@ page import=”java.util.Date” %>

page 디렉티브의 속성 – 속성이름(디폴트 속성)
– info(-)
. 페이지 설명

– language(java)
. 스크립트에 사용할 언어, 현재는 자바만 지원합니다.

– contentType(text/html)
. jsp의 출력 형식 지정, 문자 셋을 지정합니다.
. 내용의 형식(text/html)과 문자 코드(EUC-KR, euc-kr, euc_kr(X))를  선언합니다.

– import(-)
. 패키지의 import, 중복 사용가능 합니다.
. 자바에서 패키지를 사용하겠다고 선언하는 것과 같습니다.

– session(true)
. 기본값은 true이며 session값을 유지합니다.
. 회원 로그인등에 사용되며 흔히 session변수라는 변수를 사용하려면  이값이 true 이어야 합니다.

– buffer(최소8kb)
. jsp페이지의 출력크기를 킬로바이트 단위로 지정 합니다. 기본값은 8KB입니다
. 서버가 jsp페이지의 처리결과를 버퍼에 누적했다가 한번에 전송하는 목적으로 사용되는 메모리로 처리속도의 향상을 가져옵니다.    TCP/IP는 안정성을 중시하는 프로토콜로 전송되는 데이터와 관련한 정보가 전송시에 많이 포함이 됩니다. 따라서 많은 횟수의 전송은 불필요한 네트워크 트래픽을 유발하게 됨으로 전송하려는 데이터를 큰 단위로 모은 후 전송하기
위해 버퍼를 이용합니다.

– autoFlush(true)
. 버퍼에 jsp페이지의 내용이 저장되어 다 차게되면 자동으로 클라이언트에게 전송하라는 설정이며 기본값은 true입니다.
. 버퍼가 다 차게되면 자동으로 클라이언트에게로 데이터를 전송하도록 하는 옵션입니다.
. 버퍼가 다 채워지지 않아도 JSP페이지가 다 읽혀지면 자동전송됩니다.

– isThreadSafe(-)
. 하나의 jsp페이지가 동시에 여러 브러우저의 요청을 처리하게 할지를 결정하는 것으로 기본값은 true입니다.
. 하나의 JSP 페이지는 많은 동시접속자를 처리해야 속도가 향상됩니다.
. Thread와 관련된 서비스는 Servlet Container(Tomcat)이 해줍니다.

– errorPage(-)
. 예외 발생시 이동할 페이지를 지정합니다.
예외에 따른 에러와 관련한 안내 문구 출력에 사용됩니다.

– isErrorPage(false)
. WEB의 특성상 에러가 예외가 발생하면 그 관련 코드를 절대로 Client 에게 보여주어서는 안됩니다. 따라서 ERROR 페이지를 따로 제작해야 합니다.
. 현재 페이지는 에러페이지 입니다라는 선언문입니다.
. 에러만 처리하는 페이지를 작성할 때 사용합니다.
. 개발후 운영중에 예외 상황이 발생한 경우 보여주는 페이지입니다.
. exception 객체가 내부적으로 만들어집니다.

– pageEncoding: jsp1.2에 추가된 규약으로 jsp페이지의 문자셋 형식을 지정합니다.(△)
<%@ page pageEncoding=”EUC-KR” contentType=”text/html” %>

3.1.1 contentType 속성과 캐릭터 셋 : text/html, htxt/xml, text/plain
<%@page contentType = “text/html”%>
charset =캐릭터셋 부분은 생략이 가능하다. 생략할 경우 기본 캐릭터셋인 ISO-8859-1을 사용하게 된다.
국내에서 작성된 페이지는 euc-kr나 utf-8로 지정해주어야 한다.
<%@ page contentType=”text/xml; charset=utf-8″>

3.1.2 import 속성
JSP페이지에서 자바의 클래스를 사용하기 우해서는 어떤 자바 클래스를 사용할것인지를 미리 지정해 주어야 하는데, 이럴때 사용하는 것이 import 속성이다.
<%@ page import =”java.util.Calendar”%>
<%@ page import =”java.util.Calendar, java.util.date”%>

4. include directive
– JSP단에서 자바 코드를 각 JSP페이지에서 공유 할 경우에 사용됩니다.
메뉴 같은 페이지는 반복해서 사용됨으로 include의 대상이 됩니다.

– 중복해서 여러페이지에서 사용되는 소스는 특정한 파일에 모아두었다가
내용을 출력하는 페이지에서 포함하여 사용하면 개발에 많은 도움이 됩니다.
(JSP Beans 사용을 절대적으로 권장합니다.)

– 하나의 JSP페이지를 2개이상으로 분리함으로 관련 페이지나 소스가 많아지면 수정이 매우 어려워지게 되는 단점이 있습니다.

– 처리 결과가 합쳐지는 것이 아니라 파일의 소스가 하나의 파일에 합쳐진 다음 실행됩니다.

jsp 소스 + jsp 소스 = 큰 소스 ==> 실행
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

– <%@ include file=”Local URL”%>

– include되는 파일들간에는
“<%@ page contentType=”text/html;charset=euc-kr”%>”이 일치해야하며,
“euc-kr”은 대소문자도 틀려서는 안됩니다.
—————————————————————————————————————-
5. 스크립트 요소
– 스크립트릿
– 표현식
– 선언부

5.1 스크립트릿
<%
자바코드1;
자바코드2;
자바코드3;
%>

<%
int sum =0;
for(int i = 1; i<10; i++)
sum = sum+i;
}
%>

5.2 표현식
– 문장 종결자(‘;’)을 사용할 수 없습니다.
– 오로지 하나의 값만 출력할 수 있습니다.
– <TD>태그안에 데이터베이스의 컬럼값을 출력할 경우에 주로 사용함
– 주석을 붙일 수 없습니다.

<%=값 %>
<%=1+2+3+4+5+6+7+8+9+10%>
===> 출력값 55

5.3 선언부
– <%! …~~~… %>

– 사용하려는 메소드를 선언합니다.

– 선언문안에 선언되지 않는 자바 코드는 전부 _jspService()메소드 내에 선언됩니다.

– 선언문에는 변수를 선언할 수 있으나 전역 변수화 되어 하나의 JSP페이지에 동시접속자가 발생할 경우
전역 변수의 값을 공유하게 되어 변수의 값이 변질되는 문제가 있음으로 사용하지 않습니다.

– JSP가 Servlet으로 변환된 경로
. Tomcat: C:\jsp\tomcat-5.5.15\work\Catalina\localhost\test\org\apache\jsp
. Resin: C:\resin-3.0.14\doc\test\WEB-INF\work

선언부는 JSP페이지의 스크립트릿 이나 표현식에서 사용할수 있는 함수를 작성할때 사용한다.
<%!
public 리턴 티입 메서드이름(파라미터 목록){
자바코드1;
자바코드2;
자바코드3;
return 값;
}
%>

<%!
public int multiply(int a, int b){
int c = a*b;
return c;
}
%>

<%=multiply(10,25)%>
————————> 250 출력

6. request 기본 객체
: request 기본 객체에는 JSP페이지에서 가장 많이 사용되는 기본 객체로웹 브라우저에 웹 사이트의 주소를 입력하면 웹 브라우저는 해당 웹 서버에 연결한 후, 웹 서버에 요청 정보를 전송한다. 클라인언트가 전송한 요청 정보를 제공하는것이 바로 request 기본 객체이다.

request 객체가 제공하는 기능
– 클라이언트와 관련된 정보 읽기 기능
– 서버와 관련된 정보 읽기 기능
– 클라이언트가 전송한 요청 헤더 파라미터 기능
– 클라이언트가 전송한 요청 헤더 읽기 기능
– 클라이언트가 전송한 쿠키 읽기 기능
– 속성 처리 기능

GetRemoteAddr() : 웹 서버에 연결한 클라이언트의 IP를 구한다.
GetContentLength() : 클라이언트가 전송한 요청 정보의 길이를 구한다.
getCharacterEncoding() : 클라이언트가 요청한 정보를 전송할때 사용한 캐릭터의 인코딩을 구한다.
getContentType() : 클라이언트가 요청한 정보를 전송할때 사용하는 컨텐트의 타입을 구한다.
getProtocol() : 클라이언트가 요청한 프로토콜을 구한다.
getMethod() : 웹브라우저가 정보를 전송할때 사용한 방식을 구하낟.
getRequestURI() : 웹 브라우저가 요청한 URL에서 경로를 구한다.
getContexPath() : JSP페이지가 속한 우베 애플리케이션의 컨텍스트의 경로를 구한다.
getServerName() : 연결할때 사용한 서버 이름을 구한다.
getServerPort(): 서버가 실행중인 포트번호를 구한다.

http://localhost:8080/test03/test.jsp
localhost : request.getServerName();
8080 : request.getServerPort();
test03/test.jsp : request.getRequestURI();

7. GET / POST

  • GET은 주소줄에 값이 ?뒤에 쌍으로 이어붙고 POST는 숨겨져서(body안에) 보내진다.
  • GET은 URL에 이어붙기 때문에 길이제한이 있어서 많은양의 데이터는 보내기 어렵고 POST는 많은 양의 보내기에도 적합하다.(역시 용량제한은 있지만)
  • 즉 http://url/bbslist.html?id=5&pagenum=2 같이 하는 것이 GET방식이고 form을 이용해서 submit을 하는 형태가 POST입니다.
GET은 가져오는 것이고 POST는 수행하는 것입니다.

GET은 Select적인 성향을 가지고 있습니다. GET은 서버에서 어떤 데이터를 가져와서 보여준다거나 하는 용도이지 서버의 값이나 상태등을 바꾸지 않습니다. 게시판의 리스트라던지 글보기 기능 같은 것이 이에 해당하죠.(방문자의 로그를 남긴다거나 글읽은 횟수를 올려준다거나 하는건 예외입니다.) 반면에 POST는 서버의 값이나 상태를 바꾸기 위해서 사용합니다. 글쓰기를 하면 글의 내용이 디비에 저장이 되고 수정을 하면 디비값이 수정이 되죠. 이럴 경우에 POST를 사용합니다.
웹의 핵심이라고 할 수 있는 Link문제입니다. 기본적으로 웹에서 모든 리소스는 Link할 수 있는 URL을 가지고 있어야 합니다.(퍼머링크(permalink)1퍼머링크라면 더 좋겠지만 꼭 퍼머링크가 아니라고 하더라도) 그래야 Link를 할 수 있으니까요. 쉽게 말하면 어떤 페이지를 보고 있을때 다른 사람한테 그 주소를 주기 위해서 주소창의 URL을 복사해서 줄 수 있어야 한다는 것입니다. POST를 할 결우에는 값이 내부적으로 전달되기 때문에 URL만 전달할 수 없죠. 글을 저장하는 경우에는 URL을 제공할 필요가 없기 때문에 POST를 해도 상관이 없는 것이고요.

GET : <from action =”test03/test03.jsp” method = “get”>
get 방식은 ? 와 함께 파라미터를 붙여서 전송하는데 파라미터를 전송하는 형식은
?이름1=값1&이름2=값2
http://blog.outsider.ne.kr/139?category=32
HTTP프로토몰에 맞춰 데이터를 전송한다. Get방식으로 요청 파라미터를 전송하는 경우 파라미터가 URI와 함께 전송되는 것을 알수 있다.
GET 방식은 웹 브라우저, 웹 서버 또는 웹 컨테이너에 따라 전송할 수 있는 파라미터 값의 길이에 제한이 있을수 있다.

POST 방식 : <from action =”test03/test03.jsp” method = “post”>
URL에 파라미터가 함께 전송되는 GET 방식과 달리 POST 방식은 데이터 영역을 이용해서 파라미터를 전송한다.
POST 데이터 영역을 이용해서 데이터를 전송하기 때문에 웹 브라우저나 웹 서버 등에 상관없이 전송할 수 있는 파라미터의 길이에 제한이 없다.

※파라미터 값의 인코딩 처리
웹브라우저가 ‘EUC-KR’ 캐릭터 셋을 이용해서 파라미터 값을 인코딩 했다면 웹서버는 ‘EUC-KR’캐릭터 셋을 이용해서 파라미터값을 디코딩 해야 올바른 파라미터 값을 사용할수 있게 된다.

– GET방식으로 파라미터 전송시 인코딩 결정 규칙
<a> 태그의 링크 태그에 쿼리 문자열 추가
: <a href=”viewParameter.jsp?name=홍길동&address=독산동”>링크이름</a>
HTML 폼의 method 속성값을 ‘GET’으로 지정해서 폼을 전송
: <%@ page contentType=”text/html; charset =UTF-8″ %>
웹 브라우저에 주소에 직접 쿼리 문자열 포함한 URL입력

톰캣에서 GET 방식 파라미터를 위한 인코딩 처리하기
: server.xml 파일에서<Connector>의 useBodyEncodingForURI 속성의 값을 true로 지정하는 방법
<connector port=”8080″ protocol =”HTTP/1.1″

connectionTimeout=”20000″
redirectPort=”8443″ />
l
l
v
    <connector port=”8080″ protocol =”HTTP/1.1″

connectionTimeout=”20000″
redirectPort=”8443″
useBodyEncodingForURI=”true”/>
   : server.xml 파일에서 <Connector>의 URIEncoding 속성 값으로 원하는 캐릭터 셋을 지정하는 방법
<connector port=”8080″ protocol =”HTTP/1.1″

connectionTimeout=”20000″
redirectPort=”8443″ />
l
l
v
    <connector port=”8080″ protocol =”HTTP/1.1″

connectionTimeout=”20000″
redirectPort=”8443″
URIEncoding=”euc=kr”/>
요청 헤더 정보의 처리
getHeader(String name) : 지정한 이름의 헤더 값을 구한다.
getHeaders(String name) : 지정한 이름의 헤더 목록을 구한다.
getHeaderNames() : 모든 헤더의 이름을 구한다.
getIntHeader(String name) : 지정한 헤더의 값을 정수 값으로 읽어 온다.
getDateHeader(String name) : 지정한 헤더의 값을 시간 값으로 읽어 온다.8. response 객체
response 기본 객체는 requdst기본 객체와는 정반대의 기능을 수행한다. request객체가 웹브라우저가 전송한 요청 정보를 담고 있는 반면에 respnse 기본 객체는 웹브라우저에 보내는 응답 정보를 담는다.

8.1 웹브라우저에 헤더 정보 전송하기
response객체가 제공하는 메서드들
addDateHeader(String name, long date) : name헤더에 date를 추가한다.
addHeader(String name, String value) : name헤더에 value를 값으로 추가한다.
addIntHeader(String name, int value) : name 헤더에 정수 값을 value를 추가한다.
setDateHeader(String name, long date) : name 헤더의 값을 date로 지정한다.
setHeader*String name, String value) : name 헤더의 값을 value로 지정한다.
setIntHeader(String name, int value) : name 헤더의 값을 정수 값 value로 지정한다.
containsHeader(String name) : 이름이 name인 헤더를 포함하고 있을 경우 ture, 아니면 false를 리턴한다.

* chash 처리
–  cache-control  : 이 헤더의 값을 “No-cache”로 지정하면 웹브라우저는 응답 결과를 캐시에 지정하지 않는다.
–  pragma : 헤더의 값을 “no-cache”로 지정하면 웹 브라우저는 응답 결과를 캐시에 저장하지 않는다.

<%

response.setHeader(“pragma”,”no-cache”);
response.setHeader(“cache-control”,”no-cache”);
%>8.2 리다이렉트를 이용해서 페이지 이동하기
– 리디이렉트기능이란 웹 서버가 웹 브라우저에게 다른 페이지로 이동하려고 지시하는 것을 의미한다.
– 리다이렉트를 지시한 JSP 페이지가 있을경우 웹 브라우저는 실질적으로 요청을 두번하게 된다.
– response 기본 객체는 다음의 메서드를 사용해서 웹 브라우저가 리 다이렉트 하도록 지시할수 있다.
respnse.sendRedirect(String location)
—> <% response.sendRedirect(“/test03/index.jsp”); %>

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.