SSISO Community

시소당

레진설치(펌)

17.1 서블릿 소개

17.1.1 서블릿이란

17.1.2 서블릿 생명주기

17.1.3 JSP와 다른 개발방법의 비교

17.1.4 환경설정

17.1.4.1 Resin

17.1.4.2 Resin과 Apache 연동

17.2 서블릿 API

17.3 서블릿 개발-

17.1 서블릿 소개

17.1.1 서블릿이란


서블릿은 자바를 기반으로 한 웹 사이트 개발 기술로서, 동적인 웹 페이지를 개발할 수 있는 SUN의 기술이다. 자세한 사항은 http://java.sun.com/products/servlet/index.html를 참고하면 된다.


서블릿은 다음과 같은 장점이 있다.

1) 멀티 스레드

2) 웹서버 독립


사용자가 서블릿을 처음 요청하면 서블릿/JSP 엔진(컨테이너)은 서블릿이 적재되어 있는지를 검사하고 없으면 서블릿 클래스를 적재한 후 객체를 생성한다. 이후의 요청은 멀티 스레드를 서비스한다.

 

 

 

 

 

애플릿은 브라우저에서 실행되는 자바 프로그램이고, 서블릿은 컨테이너에서 실행되는 자바 프로그램이고 실행 결과를 html 형태로 서비스 받는다.


공통사항은 브라우저를 통해서 서비스 받고, 웹 서버를 통해서 서비스 요청을 한다.


17.1.2 서블릿 생명주기


서블릿에서도 애플릿과 유사한 라이프 사이클을 갖는다.


1) 서블릿은 init() 메소드가 처음 초기화를 위해 호출된다.(init() 메소드는 프로그래머가 필요한 경우 직접 구현할 수 있다)


2)클라이언트의 요청이 있을 때마다 service() 메소드가 호출된다.호출된 메소드는 요청을 처리하고 적절한 응답을 생성한다. 서블릿 컨테이너는 그 응답을 클라이언트에게 돌려준다.


3) 서블릿이 일정 시간동안 호출되지 않거나, 컨테이너가 종료 되었을 경우, 자원 해제 등의 마무리 작업을 수행할 destroy() 메소드가 호출된다.(destroy() 메소드도 프로그래머가 직접 구현할 수 있다.)


4) 서블릿의 초기화, 소멸 시점

초기화는 서블릿 컨테이너가 해당 서블릿 페이지의 요청을 처음 받았을때 이루어지고, 소멸은 서블릿 컨테이너가 언로드되거나 해당 페이지의 요청이 한동안 없어서 가비지 컬렉션 될 때 이루어진다


17.1.3 서블릿/JSP와 다른 개발방법의 비교


[표 1] 서블릿/JSP와 다른 기술 비교

웹기술

특성

CGI/Perl

ASP

서블릿/JSP

웹 서버

모든 웹서버

MS IIS,PWS

모든 웹서버

서버와 플랫폼 이식성

X

X

O

재사용성

X

X

O

스크립트 언어

C,Perl

VB Script,JScript

Java

병행성 지원

X

O

O


17.1.4 환경설정


서 블릿과 JSP는 같은 환경설정이 필요하다. 사용되는 서블릿/JSP 컨테이너는 주로 Jakarta-Tomcat, Jrun, Resin, J2EE, Orion 등이 있다. 주로 많이 사용되는 컨테이너는 Jakarta-Tomcat과 Resin 이다. 하지만 Jakarta-Tomcat은 한글을 사용하는데 불편한 점이 많으므로 본 교재에서는 주로 Resin, Apache, MS 기반으로 진행될 것이다. 주로 테스트 작업시에는 Resin만을 이용하고, 정식 서비스에서 아파치와 Resin을 연동한다.


17.1.4.1 Resin

아래의 그림은 Resin을 이용하여 서비스하는 경로를 보여준다.


1) 설치

www.caucho.com에서 Resin을 다운로드 받아 설치(압축해제)한다(resin-2.0.4.zip 4.4M).


2) Resin 실행

C:\resin-2.0.4\bin\httpd.exe를 실행한다.


 

 

 

 

 

 

 

 

 

 

 

 

 

Resin을 실행하면 Resin을 종료/시작할 수 있는 서버 컨트롤 윈도우와 Resin의 실행 상태를 보여주는 서버 콘솔 윈도우가 생성된다.


 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

컨테이너의 콘솔 : 서블릿의 표준출력


3) 테스트

브라우저를 이용하여 http://localhost:8080/이 접속되면 성공적으로 Resin이 설치된 것이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



- servlet 테스트는 Demo 메뉴의 서블릿에서 할 수 있다.


4) 마운트

컨테이너 포함된 html, JSP, 서블릿을 어디에 위치 시키고, 사용자는 브라우저를 통하여 어떻게 서비스 받는가를 정의하는 것이다.


Resin의 기본 문서 디렉토리는 C:\resin-2.0.4\doc이다. 이것은 Resin의 환경 파일(C:\resin-2.0.4\conf\resin.conf)에 아래와 같이 정의되었기 때문이다.


  <app-dir>doc</app-dir>


doc 대신에 다른 디렉토리를 표시하여 기본 문서 디렉토리를 변경할 수 있다.


컨테이너는 루트 디렉토리 하위에 웹 어플리케이션들을 둘 수가 있다.

C:\resin-2.0.4\conf\resin.conf의 내용에서 웹 어플리케이션을 정의한다.

    <web-app id='/'>

    <web-app id='my_app'>

      <servlet-mapping url-pattern='/servlet/*' servlet-name='invoker'/>

    </web-app>

만약, 새로운 웹 어플리케이션을 정의하면 마운트에 필요한 디렉토리 구조를 생성해준다.

자동으로 생성한 웹 어플리케이션을 포함하여 컨테이너가 다시 구동된다.

[2002-12-21 11:40:53.280] initializing application http://localhost:8080/my_app

 

 

 

 

 

 

 

 

 

 

 

 

 

 


컨테이너는 웹 어플리케이션 단위로 html, JSP, 서블릿을 배치 및 서비스 한다.


가) <web-app id='/'>(루트 웹 어플리케이션) 의 예

        (1) Html, JSP등의 문서는 C:\resin-2.0.4\doc에 위치해야 한다.

        URL은 http://localhost:8080/로 접근한다.

                예)

                C:\resin-2.1.0\doc\hello.jsp

                http://localhost:8080/hello.jsp

                C:\resin-2.1.0\doc\hello.html

                http://localhost:8080/hello.html

        

        (2) servlet 클래스는 C:\resin-2.0.4\doc\WEB-INF\classes에 위치해야 한다.

        URL은 http://localhost:8080/servlet/

        서블릿 클래스를 접근할 때는 확장자(.class)를 생략한다.

                예)

                C:\resin-2.1.0\doc\WEB-INF\classes\HelloServlet.class

                URL은 http://localhost:8080/servlet/HelloServlet

        

        (3) JSP bean 클래스는 C:\resin-2.0.4\doc\WEB-INF\classes의 하위 디렉토리에 위치해야 한다.

        


나) <web-app id='my_app'/>(my_app 웹 어플리케이션) 의 예

        (1) Html, JSP등의 문서는 C:\resin-2.0.4\doc\my_app에 위치해야 한다.

        URL은 http://localhost:8080/my_app/

                예)

                C:\resin-2.1.0\doc\my_app\hello.jsp

                URL은 http://localhost:8080/my_app/hello.jsp

        

        (2) servlet 클래스는 C:\resin-2.0.4\doc\my_app\WEB-INF\classes에 위치해야 한다.

        URL은 http://localhost:8080/my_app/servlet/

        서블릿 클래스를 접근할 때는 확장자(.class)를 생략한다.

                예)

                C:\resin-2.1.0\doc\my_app\WEB-INF\classes\HelloServlet.class

                http://localhost:8080/my_app/servlet/HelloServlet

        

        (3) JSP bean 클래스는 C:\resin-2.0.4\doc\WEB-INF\classes의 하위 디렉토리에 위치해야 한다.

        

5) 드라이버 패스 추가

servlet이나 JSP가 사용할 드라이버 클래스나 Jar 파일(예로, DB연결용)을 Resin 실행 환경 클래스 패스에 추가할 필요가 있다.


아래와 같은 방법으로 추가할 수 있다.

- 환경변수 CLASSPATH에 드라이버 추가( JAVHOME\jre\lib\ext 디렉토리에 복사) 후 Resin을 재실행


추가된 드라이버는 도스창에서 아래의 명령어로 확인할 수 있다.

httpd -verbose



17.1.4.2 Resin과 Apache 연동


아래의 그림은 Resin과 Apache를 연동하여 서비스하는 경로를 보여준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



resin.conf에 정의된 servlet-mapping에 해당되는 servlet이나 jsp는 resin을 이용해 서비스하고, 그외의 html등은 apache를 통해 서비스 한다.


1) 설치 및 환경설정

Apache를 설치한다.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


아파치를 실행한다.

 

 

 

 

 

 

위의 페이지 안보이는 경우는 이미 80 포트를 다른 웹서버가 사용하고 있는경우 이므로

서비스를 실행하여 기존의 웹서를 종료한 후에 아파치를 다시 실행하고 테스트한다.


아파치 자체 테스트 : http://localhost/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


C: \resin-2.0.4\bin\setup.exe를 실행하여 연동할 웹 서버를 Apache로 선택한 후 OK를 선택한다.(Apache를 선택해도 Apache 홈 디렉토리 경로를 못 찾을경우는 명시적으로 Apache 홈 디렉토리 경로를 입력한다)

 

 

 

 

 

 

 

 

 

 

 

 


setup이 성공하면 Apache을 환경 파일(C:\apache\conf\httpd.conf)에 아래와 같은 코드가 추가된다.


httpd.conf


LoadModule caucho_module "C:\\resin-2.0.4/srun/win32-1.3.6/mod_caucho.dll"

AddModule mod_caucho.c



<IfModule mod_caucho.c>

  CauchoConfigFile "C:\\resin-2.0.4/conf/resin.conf"

# For security, deployment sites may want to

# comment the following out.

  <Location /caucho-status>

    SetHandler caucho-status

  </Location>

</IfModule>



2) 테스트 및 마운트

Resin을 먼저 실행하고, Apache를 실행한다.

 

 

 

 

 


Html 파일

        C:\apache\htdocs

        http://localhost/

        C:\apache\htdocs\my_app\hello.html

        http://localhost/my_app/hello.html


JSP 파일

        C:\resin-2.0.4\doc\my_app

        http://localhost/my_app/

        C:\resin-2.0.4\doc\my_app\hello.jsp

        http://localhost/my_app/hello.jsp

sevlet 클래스 파일

        C:\resin-2.0.4\doc\my_app\WEB-INF\classes

        http://localhost/my_app/servlet/

        C:\resin-2.0.4\doc\my_app\WEB-INF\classes\HelloServlet.class

        http://localhost/my_app/servlet/HelloServlet

JSP bean 클래스 파일

        C:\resin-2.0.4\doc\WEB-INF\classes의 하위 디렉토리

        http://localhost/servlet/하위디렉토리/


즉, resin.conf에 정의된 servlet-mapping에 해당되는 servlet이나 jsp는 resin을 이용해 서비스하고, 그외의 html등은 apache를 통해 서비스 한다.



3) 마운트 변경

servlet/jsp 파일을 html 파일과 동일한 디렉토리(C:\apache\htdocs)에 위치하고자 한다면 C:\resin-2.0.4\conf\resin.conf을 아래와 같이 변경하면 된다.


resin.conf

#<app-dir>doc</app-dir>

<app-dir>C:\apache\htdocs</app-dir>


Resin의 환경을 변경한 후에는 Apache와 Resin을 재실행 시킨다.


이후에는 마운트 위치는 아래와 같다.

Html/JSP 파일

        C:\apache\htdocs

        http://localhost/

sevlet 클래스 파일

        C:\apache\htdocs\WEB-INF\classes

        http://localhost/servlet/

JSP bean 클래스 파일

        C:\apache\htdocs\WEB-INF\classes의 하위 디렉토리

        http://localhost/servlet/하위디렉토리/



17.2 서블릿 API

1) 문서

        html : C:\resin-2.0.4\doc\javadoc\index.html

        window help : http://www.confluent.fr/javadoc/j2eee.html 의 j2sdkee13.exe

        

2) 클래스 라이브러리

        C:\resin-2.1.0\lib\jsdk23.jar

        서블릿 개발을 위해서는 해당 라이브러리를 클래스 패스(JAVA_HOME/jre/lib/ext)에 추가


3) 주요 클래스


 

 

 

 


서블릿 인터페이스

interface Servlet

public void init(ServletConfig config)

          throws ServletException

public void service(ServletRequest req,

                    ServletResponse res)

             throws ServletException,

                    java.io.IOException

public void destroy()


abstract class GenericServlet implements Servlet, ServletConfig

public java.lang.String getInitParameter(java.lang.String name)


abstract class HttpServlet extends GenericServlet

protected void doGet(HttpServletRequest req,

                     HttpServletResponse resp)

              throws ServletException,

                     java.io.IOException

protected void doPost(HttpServletRequest req,

                      HttpServletResponse resp)

               throws ServletException,

                      java.io.IOException

사용자 상호작용

interface HttpServletRequest extends ServletRequest

public java.lang.String getParameter(java.lang.String name)

public java.util.Enumeration getParameterNames()

public java.lang.String[] getParameterValues(java.lang.String name)


interface HttpServletResponse extends ServletResponse

public void setContentType(java.lang.String type)

public java.io.PrintWriter getWriter()

                              throws java.io.IOException


기타 정보

interface ServletConfig

interface ServletContext

Interface HttpSession

class Cookie


17.3 서블릿 개발

서블릿생성, 배치, 테스트

HttpServlet을 상속받아 서블릿을 정의한다.


1) 한글처리(문서, GetServlet.java, GetServletHan.java)

   - http://localhost:8080/servlet/GetServletHan?a=한글


사용자 입력 쿼리(Query) : 입력값의 길의 제한

자원 중 호출에 대한 질의, 질의가 여러개일 경우 ‘&’로 구분

이름=값[&이름=값]*

http://search.msn.co.kr/results.asp?cfg=SMCINITIAL&RS=CHECKED&v=1&srch=5&FORM=AS5&q=lajsd


2) Get Method(GetServletHan2.java)

   - http://localhost:8080/servlet/GetServletHan2?a=한글

        결과

        당신의 선택 = 한글


3) Post Method(PostServletText.java)

   - PostServletText.html : C:\resin-2.0.4\doc\my_app

        method에 PostServletText.class에 대한 상대경로 지정

                (“/my_app/servlet/PostServletText")

   - PostServletText.class : C:\resin-2.0.4\doc\my_app\WEB-INF\classes

   - http://localhost:8080/my_app/PostServletText.html


4) 라이프 사이클(LifeCycle.java)

클라이언트의 요청마다 유지해야하는 정보는 지역변수로 설정한다.

예) Connection 객체


5) html 컴포넌트(PostServletRadio.java, PostServletCheck.java, PostServletSelect.java,

                PostServletHidden.java, PostServletTextArea.java)

        String[] ServletRequest.getParameterValues("a");       

        Enumeration ServletRequest.getParameterNames();       


6) 파일업로드(UploadTest.java)

cosi.jar를 클래스패스에 추가

UploadTest.html


7) 데이터 유효성 검사(FormChecker.java, PostFormCheckServer.java)

자바스크립트 : check.js, PostFormCheck.html

자바클래스 : FormChecker.java, PostFormCheckServer.html


8) 서블릿 초기화 파라미터(web.xml, ServletParameter.java)

C:\resin-2.0.4\conf\resin.conf의 내용에서 웹 어플리케이션을 정의한다.

    <web-app id='/'>

    <web-app id='java_tut'/>

웹 어플리케이션 단위로 web.xml 파일을 설정할 수 있다.

웹 어플리케이션 디렉토리\WEB-INF\web.xml


9) Redirect(ServletSendRedirect.java)


10) JDBC

컨테이너의 클래스 패스에 JDBC를 추가

Connection 객체는 클라이언트의 연결마다 유지해야하는 정보로 지역변수로 설정한다.

드라이버 패키지 경로설정


Connection Pool : 컨테이너에서 관리

JNDI(Java Naming Directory Interface) POOL 객체를 이용한 DB 연결은 JSP 서버에서 대부분 자체적으로 제공한다. Resin에서 기본으로 제공하는 JNDI POOL 객체는 쉽게 DB 연결 객체를 얻는 방법을 제공한다.


아래와 같이 resin.conf 파일의 <resource-ref>에 필요한 DB 연결 정보를 추가로 입력할 수 있다.

<!--

   - Sample database pool configuration

   - The JDBC name is java:comp/env/jdbc/test

-->

<resource-ref>

  <res-ref-name>jdbc/test</res-ref-name>

  <res-type>javax.sql.DataSource</res-type>

  <init-param driver-name="com.caucho.jdbc.mysql.Driver"/>

  <init-param url="jdbc:mysql_caucho://localhost:3306/test"/>

  <init-param user=""/>

  <init-param password=""/>

  <init-param max-connections="20"/>

  <init-param max-idle-time="30"/>

</resource-ref>


<!-- Oracle POOL Definition start -->

<resource-ref>

  <res-ref-name>jdbc/oracle</res-ref-name>

  <res-type>javax.sql.DataSource</res-type>

  <init-param driver-name="oracle.jdbc.driver.OracleDriver"/>

  <init-param url="jdbc:oracle:thin:@210.119.59.3:1521:kjaiit"/>

  <init-param user="scott"/>

  <init-param password="tiger"/>

  <init-param max-connections="20"/> <!-- Connection 의 최대 개수 -->

  <init-param max-idle-time="30"/> <!-- Connection이 사용되지 않고 반환되지 않는 최대시간 -->

</resource-ref>

<!-- Oracle POOL Definition end -->


Resin 서버에서 기본으로 생성하고 JNDI에 등록한 POOL 객체(com.caucho.sql.DBPool)를 DataSource 형태로 이용한다. POOL 객체는 Connection 객체들을 생성을 해놓고 사용과 반환을 할수 있도록 한다.

- JNDI에 등록한 POOL 객체(com.caucho.sql.DBPool)를 DataSource 형태로 얻기

DataSource(POOL 객체) 변수의 종류는? 인스턴스 -> init()에서 초기화

Connection 변수의 종류는? 지역변수


import javax.sql.*;

import javax.naming.*;


DataSource ocds = null;

try {

        // java:comp/env is the standard location for Resin server objects

        Context ctx = (Context) new InitialContext().lookup("java:comp/env");

        ocds = (DataSource) ctx.lookup("jdbc/oracle");

} catch (NamingException e) {

        e.printStackTrace(System.out);

}


public Connection DataSource.getConnection() throws SQLException

void Connection.close();


DB 연결이 필요한 서블릿이나 JSP에서는 JNDI를 이용하여 DataSource 객체에 대한 참조를 얻은 후 연결 객체를 얻을 수 있다.

[출처] 레진설치(펌)|작성자 어린양이

3616 view

4.0 stars