우선 아래 코드 부터 이해를 해야 한다

<jsp:include page="test.jsp" flush="true">

<%@ include file="파일의위치(url)" %>


선자는 compile이 끝난 결과물을 include 시키는 것이고,

후자는 page 전체가 compile 되기 이전에 소스코드를 먼저 include 후 compile 되는 것을 말한다.


이런경우 사용되어지는 대표적인 예가 공통변수를 사용하여 모든 페이지에 체크를 해야 하는 경우,


해당공통 변수를 include한 후 사용하면 된다.


JSPF란 그냥 후자처럼 사용하는 JSP를 JSPF 확장자로 선언한 뒤 web.xml에 선언하여 모든 JSP 페이지 내에 

자동으로 Include 되게 해주는 하나의 방법뿐이다.


예를들면


webConstraint.jspf >> 내용


<%page pageEncoding="UTF-8%>

<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core"%>

...

...



들을 web.xml

<jsp-config>

<jsp-property-group>

<url-pattern>*.jsp</url-pattern>

<include-prelude>/web/jsp/common/webConstraint.jspf</include-prelude>

</jsp-property-group>

</jsp-config>


해서 사용 하면 된다

우리가 보통 게시판 검색이라던가 어떤 text form에서 값을 넘길 때,

jsp든 sever page든 모두 UTF-8로 인코딩 선언을 해놓아도 값 들이 깨지는 경우가 있다..


이럴 경우는 이렇게 해보자.


1. 우선 JSP 페이지의 인코딩을 모두 같은 인코딩방식으로 선언 해 준다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>


2. 해당 프로젝트의 web.xml 설정

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

<init-param>

       <param-name>struts.i18n.encoding</param-name>  

       <param-value>UTF-8</param-value>

</init-param>

</filter>

참고로 본인은 Struts2를 개발 하여서 저 filter 태그 안에 init-param 태그를 선언 해준다 (<init-param>으로 부터 아래 4줄)


3. tomcat 및 weblogic Was의 server.xml

여기가 제일 중요하다.


<Connector connectionTimeout="20000" port="10000" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />


아 그런데, 본인은 위 설정만 해줘도 되더라. (이상하게 아래 코드를 넣으니 에러가 났다.. 그이유는 모르겠다)


<Connector executor="tomcatThreadPool"

               port="8080" protocol="HTTP/1.1" 

               connectionTimeout="20000" 

               redirectPort="8443" 

useBodyEncodingForURI="true"/>


우선은 위설정 해보고 안되면 밑 설정을 해보되 둘다 했을 때 에러 날 시, 위 Connector만 설정 해보자.

객체지향 프로그래밍 (Object-Oriented Programming) 캡슐화 (Encapsulation)

캡슐화(Encapsulation)는 클래스의 꼭 필요한 부분만 (필드 또는 메소드) 외부에 접근할 수 있도록 공개하고 그 외에는 접근하지 못하도록 접근을 차단하는 정보은닉(Inforamion Hiding)의 개념이다. 접근 제어자(Access Modifier)라고 하는 키워드를 통해서 클래스의 정보를 통제할 수 있다. 접근 제어자의 종류에는 private, protected, public이 있고 아무것도 명시 하지 않을 수도 있다.


접근 제어자는 필드와 메소드에 사용할 수 있는데, 기본적으로 필드는 private, protected를 쓰도록 하고 굳이 public으로 필드에 접근 시키고 싶다면 getter/setter 메소드를 만들어서 접근하도록 한다. 메소드는 필요에 따라 다 쓰면 된다.


명칭에서도 의미하듯이 private는 내부에서만 사용이 가능하고 외부에서는 접근이 제한된다. public은 외부에서 접근이 가능하다.

protected는 다른 클래스에서 참조할 때 private로 작용하고 상속(Inheritance)받은 클래스에서는 public 으로 동작되게 한다.


기존 필드에 있는 매개변수 들은 이름 왼쪽에 private를 모두 붙여주고, getter/setter 메소드에는 모두 public을 붙여주면 된다.

getter/setter 메소드는 필드에 선언된 변수(Variable)에 값을 저장하거나(set) 가져오는(get) 역할을 하는 메소드이다.


this.variable 처럼 this. 키워드는 클래스 자신의 객체를 의미하는 키워드이다. 위의 예에서는 setter에서 파라미터로 넘겨오는 변수와 필드에 있는 변수를 구분시켜준다.


좀더 부가적인 개념인 POJO에 대한 글도 함께 읽기를 권고한다.

Servlet 과 JSP

동적 HTML을 구성하는 방법은 여러가지가 있다

Perl , 
PHP ,
JSP나 Servlet을 사용하기도 한다


자바가 가진 네트워크 프로그램에서 장점이나, 프로그램의 깔끔함은 저주받은 I/O 성능에 비해 아주 대단하다 할 수 있으므로 JSP나 Servlet을 이용하지 않을 이유가 없다


JSP를 이해하기 위해서는 Servlet을 먼저 이해해야 한다

Servlet은 동적으로 HTML을 생성하는 자바 프로그램이라고 볼 수 있다.


서블릿은 동작 원리가 정해져 있다

메모리에 최초 로딩 될 때 수행 되어져야 하는 내용의 것들이 init()에 작성되고,

실제 Client에 제공하는 서비스 내용이 Service()에 작성되며, 메모리에서 해제 될 때 수행 되어지는 것들이 destroy()에 작성 된다


서블릿의 init()과 destroy()에서 하는 일은 고정적인 일이다

모든 서블릿에 대해서 공통적으로 수행하는 일들이기 때문에 기본 Servlet class에서 위 메소드는 정의 되어 있다

Client의 요청에 따라 실제 서비스를 해야 하는 것은 요구에 따라 다 다르기 때문에 service() 메소드는 따로 프로그래머가 정의를 해야 한다

사용자 2명이 동시에 서버에 요청을 보내면, service를 수행하는 쓰레드가 2개 만들어져 동작한다


그런데, 자바코드로 HTML Page를 만들어 내면 코드 내부의 HTML이 직관적이지 못하다는 문제가 생긴다

테이블을 만들기 위해 for문과 print문이 반복되는 것은 그래도 이해 할 만 하지만,

조금 더 복잡한 테이블의 경우 코드 사이즈가 길어지더라도 HTML 코드로 만들었을 때가 오히려 더 직관적으로 이해하기 쉽다


JSP는 이런 문제점을 해결하기 위한 대안이라고 할 수 있다

그러므로 짐작하는 바와 같이 JSP는 자바 코드와 HTML 코드를 함께 쓸 수 있게 되어 있다

JSP는 기본적으로 HTML 코드에 바탕을 두고 있고, 자바 코드를 삽입할 수 있는 영역을 할당 해준다고 보는 편이 쉽다


디자이너나 퍼블리셔가 표현하고자 하는 페이지 형태는 HTML 코드를 이용해 만든다

그리고 동적으로 바뀌는 부분들만 개발자가 자바 코드를 이용해 페이지에 작업한다

이것이 JSP를 사용하는 목적이다


JSP Container (웹 컨테이너의 한 부류==웹로직, 톰캣)는 JSP 페이지를 바로 이해하지는 못한다

JSP Container는 Servlet만 이해 할 수 있으며, JSP 파일에 대해서는 사전에 Servlet Class로 변환하는 과정을 거친다

위에서 설명한 Servlet 동작 원리와 함께 정리하면 JSP Container는 JSP 파일이 변경이 되었거나 새로 만들어져서 Servlet Class로 변환해야 하는지를 확인하고, 그런 경우 Servlet Class로 변환한 뒤 메모리에 적재한다

메모리에 적재될 때 최초 init() 메소드를 수행하고 요청에 따라서 servlet() 메소드가 쓰레드로 요청을 수행한다. 메모리에 해제되면서 destroy() 메소드를 수행한다


하나의 JSP 페이지가 하나의 Servlet Class로 변환된다는 점에 주목할 필요가 있다.
JSP에서 자바 코드를 삽입하는 부분은 3가지이다.
선언문, 스크립트릿, 표현식이 그 3가지 이다. 
선언문과 스크립트릿의 차이는 JSP가 표현하는 Servlet Class의 멤버변수나 멤버 함수, 로컬변수를 다루는 차이라고 생각하면 된다.

1) 선언문
선언문은 Servlet Class의 멤버 변수나 멤버 함수를 선언한다.
선언문의 형식은 다음과 같다.
<%!
선언문 내용
%>

2) 스크립트릿
스크립트릿은 Servlet Class의 Service()에서 사용되는 지역 변수나 루틴을 표현한다.
스크립트릿의 형식은 다음과 같다.
<%
스크립트릿 내용
%>

3) 표현식
표현식은 Servlet Class의 변수나 메서드 결과 값을 화면에 출력하는 역할을 한다.
표현식의 형식은 다음과 같다.
<%= 변수 혹은 메서드 %>

위 요소를 사용한 다음 예제를 보고 정리한다.
<html>
<body>
<%!
String str = "No";
%>

<%
int i = 0;
if(str == "NO")
i = 1;
else
i = 2;
%>

<%= (i == 1) ? "Good Job" : "No Way"%>
</body>
</html>


http://www.thinkonweb.com/jspbook/lecture/Chapter03.pdf - 참조

EJB (Enterprise JavaBean) ?

Enterprise JavaBean (EJB)은 재활용 가능한 포터블 J2EE 컴포넌트이다. EJB는 비즈니스 로직을 인캡슐레이트 하는 메소드들로 구성되어 있다. 한 예로, EJB가 데이터베이스의 고객 데이터 업데이트를 위한 메소드를 포함하는 비즈니스 로직을 구현하고 있을 수 있다. 다양한 원격/로컬 클라이언트에서 이 메소드를 호출하는 것이 가능하다. 또 EJB는 컨테이너 내부에서 실행되므로, 개발자들이 트랜잭션 지원, 보안, 원격 오브젝트 접근과 같은 복잡하고 까다로운 문제를 신경 쓰지 않고도 빈 내부에 포함된 비즈니스 로직에만 집중 할 수 있게 한다.

EJB는 POJO(Plain Old Java Object)의 형태로 개발되며, 개발자들은 메타데이터 주석(Metadata Annotation)을 이용하여 이 빈들이 어떻게 관리되는지 정의 할 수 있다.


EJB는 윈도우의 COM/DCOM과 대비되는 기술로 대량 처리환경에서의 분산컴퓨팅을 원활하게 하기 위한 기술이다. 일반적으로 프리젠테이션 계층(웹 서버)을 담당하는 머신 A와 비즈니스로직을 처리하는 머신 B 그리고 퍼시스턴스 계층(DB)인 C머신으로 구성된다. A머신은 복수개가 될 수 있으며, 유저입장에서 볼 때에 웹 서버이지만, EJB 기술적 관점으로 볼 때에는 EJB 클라이언트라고 할 수 있다. 당연히 B는 EJB 서버가 된다.


Web Browser(user) - EJB Client(A) - EJB Server(B) - DB Server(C)


A는 EJB클라이언트이기 때문에 Remote Home Interface 및 Remote Interface를 작성한다.

B는 EJB 서버이기 때문에 Session Bean을 작성한다.


세션 빈은 구축 대상 업무를 처리하는 비즈니스 로직이라 생각하면 된다.

리모트 인터페이스는 세션 빈을 원격에서 호출할 수 있도록 해주는 stub와 같은 역할을 해주는 인터페이스이다. 이름이 원격 인터페이스임을 상기하라.


리모트 홈 인터페이스는 리모트 인터페이스의 실체를 생성하여 리턴해 준다. 리모트인터페이스를 만들어 준다고 이해하면 된다.

B의 서버에는 세션빈 이외에도 엔티티 빈이 존재한다.

엔티티 빈은 세션빈과 다르게 로컬환경에서 사용된다. 즉 B서버에만 있으며 A에서의 직접 호출이 불가능하다는 말이다. 따라서 세션빈에 의해 간접적으로 호출되게 된다. 엔티티빈은 일반적으로 DB상의 하나의 테이블과 일치되며, 이 테이블의 선택/갱신/입력/삭제에 관련한 작업을 수행하게 된다. 엔테티 빈은 세션빈의 리모트 인터페이스/리모트홈 인터페이스와 대배되는 로컬 인터페이스/로컬 홈 인터페이스를 보유하고 있다.


J2EE

자바(Java)는 Sun Microsystems 에서 개발된 언어 플랫폼이고, 현재 Ver. 2 이다.

(흔히 java2 라고 부른다.

정확히 Java 2 Platform, Enterprise Edition 이다.


배경을 보자면, 썬(Sun)은 Java 2가 나오면서 플랫폼별로 3개의 Java Version 을 따로 만들었다. 가장 작은 버전인 J2ME는 Micro Edtion이라고 해서 핸드폰이나 PDA등 휴대용 단말기를 위한 자바 플랫폼이고, 요즘 핸드폰에서 게임하고 그런 것들이 해당 된다.


표준인 J2SE는 Standard Edtion 이다. 보통 PC에서 쓰는 일반적인 에디션이다.

J2EE는 Enterprise Edition 이다.

대형 서버에서 돌아가도록 여러가지 부가 기능들이 많이 들어가 있는 에디션이다.

웹 서버 (WS)

클라이언트 요청을 받아 HTML이나 오브젝트를 HTTP Protocol을 이용하여 전송하는 것

user가 Client로 request를 보내오면 그 명령에 대한 처리를 실행하고 다시 user에게 response를 보내주는 역할


하지만, 사용자가 요청한 것들 중에 웹 서버 자체적으로 처리 할 수 없는 것들을 WebLogic이나, Tomcat과 같은 웹 컨테이너나 php 모듈과 같이 처리 할 수 있는 곳으로 넘겨 처리 결과를 받은 후, 사용자에게 넘겨주는 역할도 수행


웹 서버만 구축된 서버는 웹페이지, 이미지 등 정적인 페이지를 생성 하지만, Jsp 컨테이너가 탑재되어 있는 웹 어플리케이션 서버는 jsp 페이지를 컴파일해 동적인 페이지를 생성한다.


따라서 웹 서버는 일반 웹 문서를, 웹 어플리케이션 서버는 jsp 페이지 등을 양분하여 서버 부담을 줄이는 역할을 한다


웹 컨테이너 (Web Container)

Jsp와 Servlet을 이용하는 웹 응용 프로그램은 자바 언어를 이용해서 작성 할 수 있는데 Jsp와 Servlet을 실행시킬 수 있는 소프트웨어를 웹 컨테이너(web Container) 혹은 서블릿 컨테이너(Sevlet Container) 라고 한다.


Sevlet 컨테이너, Jsp 컨테이너, EJB 컨테이너 등의 종류가 있으며,

대표적인 웹 컨테이너(web Container)로는 웹로직(JSP 실행 가능), 자카르타 Tomcat, Resin 등이 있다.

웹 서버(ws)에서 jsp를 요청하면 웹로직에서는 jsp파일을 servlet으로 변환하여 컴파일을 수행하며, 서블릿의 수행 결과를 웹 서버에 전달하게 된다.


Servlet Container

서블릿을 동작시킬 수 있는 환경을 제공하는 서버 프로그램

즉, Http 요청을 받아 해당 서블릿을 동작시키고, 그 결과를 사용자 브라우저로 전달하는 역할

Http 파라미터 파싱, 결과 전달 컨트롤, Forwarding, Redirecting 기능 제공

개발한 서블릿을 컨테이너에 등록하면 컨테이너가 알아서 처리한다


Jsp Container / Engin

서블릿 컨테이너가 Jsp 컨테이너가 된다.

즉, Jsp는 서블릿으로 변환된 후 실행되는데 이 Jsp를 서블릿으로 컴파일 해주는 것이 Jsp 서블릿/엔진 이다.


웹 컨테이너는 웹 응용프로그램을 위해 보안, 병행성 관리, 라이프 사이클 관리 등의 서비스를 제공 한다.

1. 보안(Security)

사용자 인증과 제한된 사용자만 접근 할 수 있도록 지원

2. 병행성 관리(Concurrency management)

여러 개의 작업이 동시에 이루어지는 경우에 쓰레드를 통해서 작업이 보다 효과적으로 이루어지도록 지원

3. 라이프 사이클 관리(Life Cycle management)

웹 응용 프로그램이 생성되고, 실행되고, 삭제되는 라이프 사이클 전 과정을 지원


웹 어플리케이션 서버 (Web Application Server)

웹서버(ws) + 웹 컨테이너(Web Container)

웹상에서 사용하는 컴포넌트들을 올려놓고 사용하게 되는 서버

EJB(Enterprise JavaBeans) 와 같은 빈들이 올라가게 되며, 서버에 따라 웹에 필요한 많은 기능들을 포함하고 있다

+ Recent posts