'Language/JSP'에 해당되는 글 49건

  1. 2013.12.15 JSP 내부 _jspService 메서드의구조
  2. 2013.12.09 [WAS]와 [웹서버(Web Server)] 의 차이
  3. 2013.11.27 JDBC Internal - 타임아웃의 이해
  4. 2013.11.27 tomcat dbcp option 커넥션풀 옵션
  5. 2013.11.19 omcat out of memory 메모리 설정
  6. 2013.11.18 Procedure Call
  7. 2013.11.11 jsp db 연결 및 실행
  8. 2013.07.10 JAX-RS TUTORIALS
  9. 2013.07.10 Configuring JAX-RS services in container with Spring configuration file.
  10. 2013.04.23 인코딩 - 8859_1의 비밀(?)

JSP 내부 _jspService 메서드의구조

Language/JSP 2013. 12. 15. 03:01

07 JSP 내부 _jspService 메서드의구조

 

그럼 _jspService()메서드의 내부를 살펴 보도록 하겠습니다. 이 _jspService()메서드는 매개변수로 request와 response를 갖습니다. request는 HttpServletRequest형을 갖으며 response는 HttpServletResponse형을 갖습니다. 우선 앞에서 언급했듯이 jsp의 <% %>의 내용과 html태그들이 이 메서드 안에 삽입됩니다. 그리고 여러 개의 지역 변수들이 선언되고 사용됩니다. _jspService 의 구성요소를 살펴보면 다음과 같습니다.

 

_jspService의 구성

n         매개변수2개

1.        HttpServletRequest request

2.        HttpServletResponse response

n         필요한 지역변수

1.        PageContext pageContext = null;

2.        HttpSession session = null;

3.        ServletContext application = null;

4.        ServletConfig config = null;

5.        JspWriter out = null;

6.        Object page = this;

7.        JspFactory _jspxFactory = null;

8.        String  _value = null;

n         지역변수초기화

1.        _jspxFactory = JspFactory.getDefaultFactory();

2.        pageContext = _jspxFactory.getPageContext(this, request, response, "", true, 8192, true);

3.        application = pageContext.getServletContext();

4.        config = pageContext.getServletConfig();

5.        session = pageContext.getSession();

6.        out = pageContext.getOut();

 

 위의 모든 변수들은 제각각 _jspService내에 중요한 역할을 하며 앞으로도 계속 사용되는 변수들입니다. 위의 초기화 된 변수와 매개변수들을 내장객체라고 부릅니다. 그럼 _jspService메서드 부분을 직접 보면서 설명해 나가겠습니다. hello.jsp에 해당하는 _jspService메서드 부분은 아래와 같습니다.

 

hello.jsp

Hello World! JSP를 테스트하기 위한 예제

<html><head><title>Hello JSP</title></head><body>

<h1> Hello JSP Test</h1>

<%

out.println("<font color=blue>Hello World! JSP</font>");

%>

</body></html>

 

_jspService메서드 부분

  public void _jspService(HttpServletRequest request, HttpServletResponse  response) 
        
throws java.io.IOException, ServletException { 
        JspFactory _jspxFactory = 
null
        PageContext pageContext = 
null
        HttpSession session = 
null
        ServletContext application = 
null
        ServletConfig config = 
null
        JspWriter out = 
null
        Object page = 
this
        String  _value = 
null
        
try 
            
if (_jspx_inited == false) { 
                
synchronized (this) { 
                    
if (_jspx_inited == false) { 
                        _jspx_init(); 
                        _jspx_inited = 
true
                    } 
                } 
            } 
            _jspxFactory = JspFactory.getDefaultFactory(); 
            response.setContentType(
"text/html;charset=ISO-8859-1"); 
            pageContext = _jspxFactory.getPageContext(this, request, response,
"",true, 8192true); 
            application = pageContext.getServletContext(); 
            config = pageContext.getServletConfig(); 
            session = pageContext.getSession(); 
            out = pageContext.getOut(); 
            
// HTML // begin [file="/hello.jsp";from=(0,0);to=(2,0)] 
            
out.write("<html><head><title>Hello JSP</title></head><body>\r\n<h1> Hello JSP Test</h1>\r\n"); 
            
// end 
            // begin [file="/hello.jsp";from=(2,2);to=(4,0)] 
                  
out.println("<font color=blue>Hello World! JSP</font>"); 
            
// end 
            // HTML // begin [file="/hello.jsp";from=(4,2);to=(8,0)] 
                
out.write("\r\n</body></html>\r\n\r\n\r\n"); 
            
// end 
        
catch (Throwable t) { 
            
if (out != null && out.getBufferSize() != 0
                out.clearBuffer(); 
            
if (pageContext != null) pageContext.handlePageException(t); 
        } 
finally 
            
if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext); 
        } 
   }

 

 우선 메서드를 보면 IOException, ServletException이 선언되어 있습니다. 자동으로 jsp파일을 Servlet파일로 바꿔주는 것인 만큼 자세히 신경 쓰지 않아도 되겠지만, 이렇게 Exception 선언이 되어 있다는 정도는 알고 있는 것이 좋습니다.

 

 그리고 메서드 내부에서 지역 변수를 선언하고 있습니다. 이 선언된 객체변수를 초기화 한 후 _jspService메서드 내에서 사용하고 있습니다. 지역객체변수와 jsp에서 사용되는 태그사이에는 미묘한 관계가 있습니다.

 

<% %>태그와 _jspService의 지역변수

n        jsp문서의 <%  %>태그 안에 들어 있는 부분은 _jspService메서드안에 삽입된다.

n        <%  %> 내에서 _jspService메서드 내의 지역변수를 모두 사용할 수 있다.

 

여기에 선언된 pageContext, session, application, config, out, page와 매개변수 request, response를 우리는 내장객체라 부릅니다. <% %>태그 내에서는 _jspService에 존재하는 out객체를 이용하여 클라이언트로 println을 하고 있습니다. 이것은 <% %>태그 내의 모든 내용이 _jspService내의 지역변수 아래 쪽에 위치하기 때문에 가능한 일입니다.

 

JSP 내장객체

ServletRequest request (HttpServletRequest request) : 클라이언트의 http요청을 담고 있는 객체

ServletResponse response (HttpServletResponse response) : 클라이언트로 응답을 전송할 객체

PageContext pageContext : 다른 내장객체를 얻거나, 요청을 처리할 제어권을 다른 페이지로 위임하는 객체

HttpSession session : 클라이언트와 서버와의 세션데이터를 가지고 있는 객체

ServletContext application : Web application이 실행되는 실행 환경에 대한 정보를 담고 있는 객체

JspWriter out : Servlet이 요청을 처리하여 응답을 전송할 때 전송할 응답에 대한 출력 스트림 객체

ServletConfig config : Servlet 객체가 참조하게 될 초기 설정 데이터에 대한 정보를 담고 있는 객체

Object page (HttpJspPage) : Servlet 객체를 참조하는 레퍼런스

Throwable exception : 예외가 발생할 경우 에러 페이지에 전달되는 객체






출처 - http://www.jabook.com/jabook_original/book_jbjsp01/jbjsp01_html/10000_30000_70000__10000_30000_70000.html

:

[WAS]와 [웹서버(Web Server)] 의 차이

Language/JSP 2013. 12. 9. 15:43

■ 웹 서버(Web Server)
 - 클라이언트의 요청을 받아 HTML이나 오브젝트를 HTTP 프로토콜을 이용해 전송하는 것.
   사용자가 클라이언트로 요청을 보내오면 그 명령에 대한 처리를 실행하고 다시 사용자에게 답변을 보내준다.
 - 사용자가 요청한 것들 중에 웹 서버 자체적으로 처리할 수 없는 것들을 톰캣과 같은 컨테이너나 PHP 모듈과
   같이 처리할 수 있는 곳으로 넘겨 처리 결과를 받아와서 사용자에게 넘겨주는 역할도 수행한다.
 - 웹 서버만 구축된 서버는 웹 페이지, 이미지 등 정적인 페이지를 생성하지만,
   JSP 컨테이너가 탑재되어 있는 WAS는 JSP 페이지를 컴파일 해 동적인 페이지를 생성한다.
 - 웹 서버는 웹 문서를, WAS는 JSP 페이지 등을 양분하여 서버 부담을 줄이는 것이 가능하다.
 - Apache, IIS(Internet Information Server), WebtoB 등


■ 웹 어플리케이션 서버(Web Application Server / WAS)
 -  웹 서버 + 웹 컨테이너.
 -  웹상에서 사용하는 컴포넌트들을 올려놓고 사용하게 되는 서버
 - EJB와 같은 빈들이 올라가게 되며, 서버에 따라 웹에 필요한 많은 기능들을 포함하고 있다.
 - J2EE 스펙을 구현한 서버(JSP / Servlet Container와 EJB Container 로서의 기능)
 - 가장 많이 사용하는 WAS는 BEA사의 Web Logic, IBM사의 Web Sphere, T-max사의 Jeus, Tomcat, Redhot사의 JBoss 등이 있다.)
 - Tomcat은 JSP / Servlet Container의 기능을 구현했으나 EJB Container로서의 기능은 없다.
    따라서 Tomcat은 Was가 아니라는 사람들도 있다.



■ 컨테이너(Containner)
 - JSP와 서블릿을 이용하는 웹 응용 프로그램은 자바 언어를 이용해서 작성할 수 있는데,
   JSP와 서블릿을 실행시킬 수 있는 소프트웨어를 웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고 한다.
 - Servlet 컨테이너, JSP 컨테이너, EJB 컨테이너 등의 종류가 있으며, 대표적인 웹 컨테이너로는
   자카르타 톰캣(JSP), RESIN, Web Logic, WebtoB 등이 있다.
 - 웹 서버에서 JSP를 요청하면 톰캣에서는 JSP 파일을 서블릿으로 변환하여 컴파일을 수행하고,
   서블릿의 수행결과를 웹 서버에서 전달하게 된다. 


 
 웹 서버와 WAS의 차이점
 - 웹 서버와 WAS를 구별 짓는 것은 동적 서버 콘텐츠를 수행하는가? 만약 수행한다면 WAS로 보면 된다.
 - 웹 서버 : 정적인 HTML이나 이미지를 제공하는 서버.
   WAS : 동적인 처리를 담당하는 서버. 



■ 웹 서버와 WAS의 일반적인 구성
 - 사용자가 브라우저에서 요청을 하게 되면 다음과 같이 웹 서버와 WAS 서버를 거쳐 응답이 돌아오게 된다.
   사용자 요청(웹 브라우저) -> 웹 서버 -> WAS(동적 처리) -> 웹 서버 -> 사용자 응답 메세지(웹 브라우저)

=============================================================================================================================



 

웹서버와 WAS의 차이

 

 구분
 설 명 
 
 웹 서버
 Web Client(웹 브라우저)에게 제공하는 컨텐츠를 제공하는 서버.

정적인 HTML 혹은 jpeg나 gif같은 이미지를 HTTP프로토콜을 통해 웹 브라우저로 제공.
 
 WAS
 Server단에서 어플리케이션을 동작할 수 있도록 지원.

일반적으로 컨테이너라는 용어로 사용됨.

Servlet, JSP, ASP, PHP 등의 프로그램으로 사용됨. 
 

 

Background

 

초기 web: 이미지 혹은 단순 HTML

현재: 게시판, 방명록 등 Server-Client간 상호대화하는 페이지를 제공.

       -> 내부 어플리케이션을 동작시킬 수 있는 컨테이너를 내장.

            동적인 요구에 대응하기 위해 이에 적합한 형태로 변화.

 

각 사이트가 많은 사용자에게 원활한 서비스를 제공하기 위해 기능적인 layer를 나누게 됨.

-> 여기서 웹서버와 WAS의 구분이 나타나게 됨.

 

 

 

* 웹 서버와 WAS의 기능적 분류를 통해 효과적 분산을 유도한 예

 

정적인 데이터(image, CSS, js-javascript- 파일 등의 리소스)는 구조족으로 앞에 존재하는 웹 서버에서 처리하고

WAS로 서비스 요청이 넘어가지 않게 한다.

동적인 데이터는 WAS가 처리한다. WAS는 웹 어플리케이션의 수행에 집중할 수 있다.

 

Extended Description

 

- 웹서버 기능

  1. Clustering 기능: 사용자 요청이 발생하면 상황에 따라 각각의 WAS에 요청을 넘김.

  2. Cache 기능: css, js, image 등의 리소스 파일을 가지고 있다가 was를 거치지 않고 사용자에게 직접 넘김.

                      사용자는 cache period동안 전달받은 리소스를 사용함.

 

- WAS 기능

  Servlet 페이지를 html 형태로 변환함.

  예를 들어 jsp의 경우 jsp를 WAS에서 java class파일로 컴파일 후 html형태의 페이지를 사용자에게 전달하게 됨.

 

 

 

 

 

 

 

 

----------추가-------------------

 

Web Server

웹서버는 클라이언트/서버 모델과 웹의 HTTP를 사용하여 웹 페이지가 들어 있는 

파일을 사용자들에게 제공하는 프로그램이다. 

웹사이트가 운영되고 있는 인터넷상의 모든 컴퓨터들에는 모두 웹서버 프로그램이 설치되어 있다.

가장 보편적인 웹서버들로는 32 비트 윈도우와 유닉스 기반의 운영체계에서 모두 쓸 수 있는 아파치와, 

윈도우 NT에 딸려 나오는 IIS, 그리고 넷스케이프의 엔터프라이즈 서버 등이 있다.

그밖에 네트웨어 운영체계를 쓰는 사용자들을 위한 노벨의 웹서버,

주로 IBM의 OS/390과 AS/400 고객들을 위한 IBM의 로터스 도미노 서버를 비롯, 다른 웹서버들도 있다.

웹서버들은 흔히 전자우편FTP 파일의 다운로드, 그리고 웹페이지 구축, 발간 등에 필요한 인터넷 및 

인트라넷과 관련된 프로그램들의 커다란 패키지의 일부로서 나온다.

웹서버를 고를 때 고려해야할 사항으로는, 운영체계나 다른 서버들과 얼마나 잘 어울려 동작할 것이냐 하는 것과,

서버 측의 프로그래밍, 퍼블리싱, 검색엔진 등을 처리하는 능력, 그리고 함께 따라오는 구축도구 등이 있다.


 WAS (Web Application Server)
웹과 기업의 기간 시스템 사이에 위치하면서, 웹 기반 분산 시스템 개발을 쉽게 도와주고

안정적인 트랙잰션 처리를 보장해 주는 일종의 미들웨어 소프트웨어 서버.

3계층 웹 컴퓨팅 환경에서 기존 클라이언트/서버 환경의 애플리케이션 서버와 같은 역할을 하며, 

클라이언트와 서버 환경에서 트랜잭션 처리및 다른 기존 시스템 간의 

애플리케이션 연동을 등을 주된 기능으로 하고 있다. 

요즘들어서는 WAS는 주로 데이터베이스 조회나 일반적인 비즈니스 로직에 대한 처리를

위해 다양한 언어로 개발된 인터넷/인트라넷환경의 소프트웨어로 많이 불리운다. 

자바스크립트나 JSP 등과 같은 스크립트 및 서비스들은 대개 최신의 데이터를 검색하기

위해데이터베이스에 접근하고, 브라우저 또는 클라이언트 프로그램을 통해 

사용자들에게 검색 결과를 제공한다.

WAS를비롯한 애플리케이션 서버들은, 웹서버 즉 HTTP 서버와 같은 컴퓨터를 공유할 수도 있지만 

별개의 컴퓨터를 독립적으로 사용하는경우도 많다. 대규모 사이트에서는, 오히려 WAS와 웹서버 

등을 위해 여러 대의 컴퓨터가 동원되기도 한다. 
넷스케이프의Netscape Application Server, Bea의 Weblogic Enterprise,

볼랜드의 Appserver,그리고 IBM의 Websphere Application Server 등의 WAS 대표적인 제품들이다.


※Web Server와 WAS와 차이※

- Web Server 의 정의 : Web Client(웹 브라우저)에게 컨텐츠를 제공하는 서버, 

정적인 HTML이나 jpeg, gif 같은 이미지를 HTTP 프로토콜을 통해 웹 브라우저에게 전송하는 역할

- WAS(Web Application Server)의 정의 
   ○ Server 단에서 Application을 동작할 수 있도록 지원함 => Jeus
   ○ 기존 웹 서버와 달리 동적인 요구에 대응하기 위해 적합한 형태로 변화, 

       Web Client(브라우저)에게는 결과값만 전송함.
   ○ Container(컨테이너)라는 용어로 쓰이며, 초창기는 CGI, 그 후에서는 Servlet, 

      , JSP, ASP 등의 프로그램으로 사용됨

- Web Server와 WAS의 구성에 따른 분류
   ○ WAS와 WebServer를 분리하지 않는 경우  
   모든 컨텐츠를 한곳에 집중시켜 웹서버와 WAS의 역할을 동시에 수행, 

   스위치를 통한 로드 밸러싱, 사용자가 적을 경우 효율적
  
   ○  WAS와 WebServer를 분리한 경우 
   웹서버와 WAS의 기능적 분류를 통해 효과적인 분산을 유도,

   정적인 데이터는 웹서버에서 처리, 동적인 데이터는 WAS가 처리
 
   ○  WAS 여러개와 WebServer를 분리한 경우
   WAS단을 프리젠테이션 로직와 비즈니스 로직으로 구분하여 구성, 

   특정 logic의 부하에 따라 적절한 대응할 수 있지만 설계단
   계 유지보수 단계가 복잡해 질 수가 있다. 


 WAS 와 Web Server 종류

   ○ WAS 종류
   tomcat, tMax jeus, BEA Web Logic, IBM Webspere, JBOSS,Bluestone, Gemston,

   inprise, Oracle, PowerTier,Apptivity, silverStream
   ○ Web Server  
    IIS, apache, tMax, WebtoB

   - tomcat
       아파치 소프트웨어 재단의 애플리케이션 서버로서, 자바 서블릿을 실행시키고 JSP 코드가 포함되어

      있는 웹페이지를 만들 어준다. 

      자바 서블릿과 JSP 규격 '참조용 구현'으로 평가되고 있는 톰캣은, 

      개발자들의 개방적 협력 작업의 산물로 바이너리 버전과 코어버전 둘 

      모두를 아파치 웹사이트에서 얻을 수 있다. 톰캣은 자체적으로 보유하고 있는 내부 웹서버와 함께 독립
      적으로 사용 될 수도 있지만 아파치나 넷스케이프 엔터프라이즈 서버, 

      IIS, 마이크로소프트의 PWS 등 다른 웹서버와 함께 사용할 수도 있다. 

      톰캣을 실행시키기 위해서는 jre  1.1  이상에 부합되는 자바 런타입 환경이 필요하다


:

JDBC Internal - 타임아웃의 이해

Language/JSP 2013. 11. 27. 11:55

http://helloworld.naver.com/helloworld/1321

'Language > JSP' 카테고리의 다른 글

JSP 내부 _jspService 메서드의구조  (0) 2013.12.15
[WAS]와 [웹서버(Web Server)] 의 차이  (0) 2013.12.09
tomcat dbcp option 커넥션풀 옵션  (0) 2013.11.27
omcat out of memory 메모리 설정  (0) 2013.11.19
Procedure Call  (0) 2013.11.18
:

tomcat dbcp option 커넥션풀 옵션

Language/JSP 2013. 11. 27. 10:34


tomcat_dbcp_option.xlsx


http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

http://commons.apache.org/proper/commons-pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.html

http://commons.apache.org/proper/commons-dbcp/configuration.html


'Language > JSP' 카테고리의 다른 글

[WAS]와 [웹서버(Web Server)] 의 차이  (0) 2013.12.09
JDBC Internal - 타임아웃의 이해  (0) 2013.11.27
omcat out of memory 메모리 설정  (0) 2013.11.19
Procedure Call  (0) 2013.11.18
jsp db 연결 및 실행  (0) 2013.11.11
:

omcat out of memory 메모리 설정

Language/JSP 2013. 11. 19. 15:19

윈도우용 설정


%root%\bin 

setenv.bat  파일 생성후


set JAVA_OPTS=-Xms256m -Xmx512m


이거 적어줌..


그리고 startup.bat 실행


질답.


1. 어플리케이션 서버에서 필요한 메모리 계산 방법
 - 계산식 : (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
 - 메모리 계산 예
가정 : Java 1.5를 사용중이며 OS가 120MB를, 디폴트 스택사이즈는 0.5M

  • JVM에 1.5GB할당되었을 경우 : (2GB-1.5Gb-120MB)/(1MB) = ~380 threads
  • JVM에 1.0GB할당되었을 경우 : (2GB-1.0Gb-120MB)/(1MB) = ~880 threads
통계적으로 대략 200명의 동시 사용자 수용할 경우 300MB정도 필요하합니다. 이것을 고려해서 메모리를 계산하면 됩니다.

2. Application Server 에러 대처 방안(java.lang.OutOfMemoryError: PermGen space 현상)
  • Tomcat의 경우 v6.0.14이상의 안정적 릴리즈 된것을 선택
  • JDK1.4보다는 1.5, 1.6의 사용을 권고함
  • -XXMaxPermSize 설정을 통해 perm 사이즈를 증가시킴
  • JHat으로 메모리릭 원인을 찾고 JConsole, Lambda probe 등을 통해 메모리 모니터링을 함
  • Application Server운영자는 Garbage Collection에 대한 이해가 있어야 함

3. Tomcat에서 설정 예시

  • 힙메모리 정보를 출력 : -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC

위 설정을 통해 출력되는 로그를 보고 New Generation의 eden 영역, Old Generation 영역, Permanent 영역을 확인하여 각 영역이 작으면 아래와 같은 설정으로 적당 사이즈를 확보해 줍니다.

  • 도출된 설정 : -Xms256m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -XX:SurvivorRatio=5
    -Xms : 최소 힙 싸이즈
    -Xmx : 최대 힙 싸이즈
    -XX:NewSize : New Generation의 최소 싸이즈
    -XX:MaxNewSize : New Generation의 최대 싸이즈
    -XX:MaxPermSize : Permanent Generation의 최대 싸이즈 가 되겠다.
    -XX:SurvivorRatio : 영역비율(New Generation)

결론적으로 적용할 설정은 아래와 같습니다.

  • CATALINA_OPTS="-server -Xss256k -Xms256m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -XX:SurvivorRatio=5 -XX:ReservedCodeCacheSize=128m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true "



출처 - http://blog.daum.net/younhs2002/77

'Language > JSP' 카테고리의 다른 글

JDBC Internal - 타임아웃의 이해  (0) 2013.11.27
tomcat dbcp option 커넥션풀 옵션  (0) 2013.11.27
Procedure Call  (0) 2013.11.18
jsp db 연결 및 실행  (0) 2013.11.11
JAX-RS TUTORIALS  (0) 2013.07.10
:

Procedure Call

Language/JSP 2013. 11. 18. 14:11
// 드라이버 로드
try {
    Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e1) {
    e1.printStackTrace(pw);
}
 
// 연결 클래스 변수 선언
Connection        conn  = null;
CallableStatement cstat = null;
ResultSet         rs    = null;
try {
    conn = DriverManager.getConnection("jdbc:oracle:thin:@아이피:포트:Tnsname", "아이디", "비밀번호");
 
    // 프로시져 콜
    CallableStatement cstat = conn.prepareCall("{CALL 패키지명.프로시져명(?)}");
    // output cursor로 데이터를 받아온다.   
    cstat.registerOutParameter(1, OracleTypes.CURSOR);
    cstat.execute();
 
    rs = (ResultSet)cstat.getObject(1);
     
    if ( rs != null )
    {
        ResultSetMetaData rsmeta = rs.getMetaData();
        int nColumn = rsmeta.getColumnCount();
        out.println("");
        out.println("");
        for (int i = 0; i <= nColumn; i++)
        {
            if ( i == 0 )
                out.println(" 번호 ");
            else
            {
                String strColumnName = rsmeta.getColumnName(i);
                out.println(strColumnName);                
            }
        }//for (int i = 0; i <= nColumn; i++)
        out.println("");
         
        int nRow = 1;
        while (rs.next())
        {
            out.println("");
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i <= nColumn; i++)
            {
                if ( i == 0 )
                    sb.append(  Integer.toString(nRow) );
                else
                    sb.append( rs.getString(i) );
            }
            out.println(sb.toString());
            out.println("");
            nRow++;
        }//while (rs.next())
         
        out.println("");
    }//if ( rs != null )
} catch (SQLException e) {
    e.printStackTrace(pw);
} finally {
    try {rs.close();   } catch (SQLException e) {}
    try {cstat.close();} catch (SQLException e) {}
    try {conn.close(); } catch (SQLException e) {}





:

jsp db 연결 및 실행

Language/JSP 2013. 11. 11. 15:15

<%@ page language="java" 
    contentType="text/html;charset=euc-kr" 
    import="java.util.*,java.io.*,java.sql.*"
%>

<%
    // 드라이버를 위해 웹서버 lib에 sqljdbc4.jar 저장 필요

    String strDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    String strDBConn = "jdbc:sqlserver://IP ADDRESS:1433;DatabaseName=DBNAME";
    String strUserID = "USERID";
    String strUserPW = "USERPASSWORD";


    Class.forName(strDriver);
    Connection objConn = DriverManager.getConnection(strDBConn, strUserID, strUserPW);

    // Statement

     Statement objStmt = objConn.createStatement();
     ResultSet objRS = objStmt.executeQuery("SELECT TOP 5 * FROM TADMIN WITH (NOLOCK)");
 
     while(objRS.next()) {

          out.println(objRS.getString("AdminName") + "<BR>");
     }

    objRS.close();
    objStmt.close();

    // PreparedStatement
    // 쿼리 시 PreparedStatement를 쓰는 것이 좋은데, 이유는 쿼리가 캐시되므로 반복적인 작업에 속도가 유리.

    String strSQL = "SELECT TOP 5 * FROM TADMIN WITH (NOLOCK) WHERE ADMINID = ? ";

    PreparedStatement objPStmt = objConn.prepareStatement(strSQL);
    objPStmt.setString(1, "tiger");

    
    ResultSet objRS2 = objPStmt.executeQuery();
 
    while(objRS2.next()) {

    
        out.println(objRS2.getString("AdminName") + "<BR>");
    }
 
    objRS2.close();
    objPStmt.close();
    objConn.close();
%>    



'Language > JSP' 카테고리의 다른 글

omcat out of memory 메모리 설정  (0) 2013.11.19
Procedure Call  (0) 2013.11.18
JAX-RS TUTORIALS  (0) 2013.07.10
Configuring JAX-RS services in container with Spring configuration file.  (0) 2013.07.10
인코딩 - 8859_1의 비밀(?)  (0) 2013.04.23
:

JAX-RS TUTORIALS

Language/JSP 2013. 7. 10. 13:09

Quick Start

Some quick start examples to use JAX-RS.

Basic Examples

Basic annotations and functions to develop REST service.

File Upload Examples

How to handle multipart data in JAX-RS.

Working with XML

XML support in JAX-RS.

Working with JSON

JSON support in JAX-RS.

RESTful Java clients

Create a RESTful Java client to perform “GET” and “POST” request to manipulate json data.

JAX-RS + Spring

Integrate JAX-RS with Spring framework.

Common Error Messages

Some common error messages in JAX-RS development.




'Language > JSP' 카테고리의 다른 글

Procedure Call  (0) 2013.11.18
jsp db 연결 및 실행  (0) 2013.11.11
Configuring JAX-RS services in container with Spring configuration file.  (0) 2013.07.10
인코딩 - 8859_1의 비밀(?)  (0) 2013.04.23
Tomcat과 한글 인코딩  (0) 2013.04.23
:

Configuring JAX-RS services in container with Spring configuration file.

Language/JSP 2013. 7. 10. 13:07

web.xml

In web.xml one needs to register one or more CXFServlet(s) and link to an application context configuration.

Using Spring ContextLoaderListener

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/beans.xml</param-value>
    </context-param>
 
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
 
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <display-name>CXF Servlet</display-name>
        <servlet-class>
            org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

The application context configuration is shared between all the CXFServlets

Using CXFServlet init parameters

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
<web-app>
    <servlet>
        <servlet-name>CXFServlet1</servlet-name>
        <display-name>CXF Servlet1</display-name>
        <servlet-class>
            org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
                <init-param>
                   <param-name>config-location</param-name>
                   <param-value>/WEB-INF/beans1.xml</param-value>
                </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
        <servlet>
        <servlet-name>CXFServlet2</servlet-name>
        <display-name>CXF Servlet2</display-name>
        <servlet-class>
            org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
                <init-param>
                   <param-name>config-location</param-name>
                   <param-value>/WEB-INF/beans2.xml</param-value>
                </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
 
    <servlet-mapping>
        <servlet-name>CXFServlet1</servlet-name>
        <url-pattern>/1/*</url-pattern>
    </servlet-mapping>
 
        <servlet-mapping>
        <servlet-name>CXFServlet2</servlet-name>
        <url-pattern>/2/*</url-pattern>
    </servlet-mapping>
</web-app>

Each CXFServlet can get a unique application context configuration. Note, no Spring ContextLoaderListener is registered in web.xml in this case.

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
  xmlns:jaxrs="http://cxf.apache.org/jaxrs"
  xsi:schemaLocation="
 
  <!-- do not use import statements if CXFServlet init parameters link to this beans.xml -->
 
  <import resource="classpath:META-INF/cxf/cxf.xml" />
  <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
 
  <jaxrs:server id="customerService" address="/service1">
    <jaxrs:serviceBeans>
      <ref bean="customerBean" />
    </jaxrs:serviceBeans>
  </jaxrs:server>
 
  <bean id="customerBean" class="demo.jaxrs.server.CustomerService" />
</beans>

In the above configuration all resources will be configured as singletons, see below for information on creating per-request resources.


출처 - http://cxf.apache.org/docs/jaxrs-services-configuration.html

'Language > JSP' 카테고리의 다른 글

jsp db 연결 및 실행  (0) 2013.11.11
JAX-RS TUTORIALS  (0) 2013.07.10
인코딩 - 8859_1의 비밀(?)  (0) 2013.04.23
Tomcat과 한글 인코딩  (0) 2013.04.23
JSP pageEncoding속성, 케릭터셋(charset)  (0) 2013.02.13
:

인코딩 - 8859_1의 비밀(?)

Language/JSP 2013. 4. 23. 18:12

Open source로 구해지는 java source code를 들여다 보면 

하고 많은 문자셋들 중에 유독 '8859_1'을 많이 보게 된다.

'아니 저런 특정 문자셋을, 그것도 8비트밖에 지원하지 않는 문자셋을 코드에다 박아 버리면 
 쓰는 사람들은 어쩌란 거지?'

이런 생각이 들 때가 있을 것이다.
한때 나도 그랬었고..

그러나 정말 잘못 쓴 경우도 있겠지만, 많은 경우 '8859_1'의 사용은 나름 합리성을 띄고 있다.
이를 이해하려면 '8859_1'이 다른 문자셋들과 어떻게 다른가를 알아야 한다.

이전 글에서 언급했 듯이, '8859_1'은 1바이트에 해당하는 256개의 코드에 대해, 즉 0x00 ~ 0xff 까지의 모든 코드에 대해 대응되는 문자를 갖고 있다.

반면 8859_1보다 많은 문자를 거느리고 있는 'EUC-KR', 
이것의 확장형인 'MS949' 나 심지어 모든 글자를 다 포함한다고 여겨도 될 만한 'UTF-8' 조차
가진 문자는 확실히 많지만 모든 바이트 열에 대해 대응되는 문자를 갖고 있는 것은 아니다.

이를 확인하기 위해 다음을 실행해 보자.

    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 256; i++) {
            for (int j = 0; j < 256; j++) {
                byte[] bytes = new byte[] {(byte) i, (byte)j };
                String str = new String(bytes, "MS949");
                if (str.charAt(0) == 0xfffd) {
                    System.out.println("for byte sequence{0x" + hex(i) + ", 0x" + hex(j)
                            + "} no character exists... getBytes()[0]=" + str.getBytes("MS949")[0]);
                } else if (str.length() > 1) {
                    // 첫 바이트를 하나의 글자로 인식. i만 취하고 j 루프는 중지.
                    System.out.println("For character{" + hex(i) + "} char = "
                            + str.charAt(0));
                    break;
                } else {
                    System.out.println("for character{" + hex(i) + ", " + hex(j)
                            + "} char = " + str);
                }

            }
        }
    }
    
    /*
     * byte 출력용.
     */
    public static String hex(int i ){
        String hex = Integer.toHexString(i); 
        return (hex.length() > 2) ? hex.substring(hex.length() - 2) : hex;
    }
주루룩 많은 행을 출력하지만 보면 대응되지 않는 글자가 존재함을 알 수 있다.

대략 그림으로 나타내면 다음과 같다.

인식하는 바이트 값이 0x~0x7f 일 경우에는 8859_x 에서 사용되는 글자를 그대로 쓰며 이 때는 한 바이트가 하나의 글자와 매핑된다.
바이트 값이 0x81 이상일 경우에는 그 다음 바이트가 필요하며, 두 바이트를 가지고 하나의 글자를 구성한다. 그리고 이 때 '없는 글자'가 생긴다.
당장 {0x81, 0x00} ~ {0x81, 0x40} 에 해당하는 값에 대해 대응되는 글자가 없다.
없는 글자는 java char로 0xfffd (아마도 UTF-16BE로 {0xff 0xfd} 에 매핑되는 글자) 로 저장되었다가, 다시 MS949로 인코드하면 0x63 글자로 매핑된다. 이 글자가 물음표 '?' 이다
 
모르는 글자를 인코드 할 때 0x63 코드를 매핑하는 것은 Sun JDK에서의 대응 방식이다.
모르는 글자에 대한 대응에는 표준이 없는지 다른 vendor - 이를테면 IBM - 의 JDK에서는 좀 다르게 구현하는 것 같다.
(한편 바이트 값이 0x80이나 0xff 같을 때 이를 디코드하면 그 한 바이트가 '모르는 글자 0xfffd'로 매핑된다. 일반화할 수 있는 규칙은 아닌 것 같다..)
 
다음과 같이 인코드 - 디코드를 많이 거치게 되면 인코드 할 때도, 디코드 할 때도 매핑이 불가한 경우를 만나게 되어 글자들이 깨진다. 이 때의 깨진 글자들은 복구가 절대 안 된다.
그래서 저런 식으로 부주의하게 인코드-디코드를 해 버리면 원래 호환되는 0x00~0x7f 이외의 한글 같은 글자들은 여지없이 깨져 버리고.. 되돌릴 수도 없게 된다.
 
그러나 8859_x 는 모든 바이트 코드에 대한 글자들을 구비하고 있으므로, 이해가 안 되는 이상한 글자로 매핑할 망정 코드를 보존하면서 디코드가 가능하다.
그래서 디코드만 하고, 이를 다시 인코드 할 경우에는 글자 깨짐이 발생하지 않는다.
 
8859_1 뿐만 아니라 8859_2 도 "보관"할 때 가지는 문자가 틀리지만 역시 깨짐 없이 바이트를 보존할 수 있다.
 
물론 그렇게 "보관"한 문자나 인코드가 원활히 되지, 아무 문자열이나 인코드를 하려 한다면
'자기 문자셋에 존재하지 않는 문자를 인코드'하는 경우가 발생해 글자가 깨질 것이다.
이를테면 아래와 같은 경우 당연히 문자셋에 없는 글자를 인코드하려 하므로 글자가 깨진다.
이렇게 되면 '원래 문자열이 2글자였다' 정도 외엔 아무 정보도 남지 않게 된다. (JDK vendor에 따라서는 이마저도 알 수 없게 될 것이다)
 
-----------------------------
 
실제 네트워크를 오가는 데이터는 바이트열의 형태이지만
이를 프로그래밍 언어에서 다룰 때는 문자열로 간주하고 작업할 때가 많다.
그게 편하기 때문이기도 하고,
문자열로서 의미를 가지는 경우가 많기 때문이기도 할 것이다.
 
가장 많이 쓰이는 경우가 웹 어플리케이션에서의 파일 다운로드, 아마도 그 다음이 소켓통신 (헤더를 읽어들이거나 생성할 때) 같은 경우일 것이다.
<< 다운로드 시 설정>>

response.addHeader("Content-disposition", "attachment;filename=" + ... + "" );

이 때 인코딩/디코딩 작업이 필요한데, 디코드 시 바이트들을 깨뜨리지 않고 문자열로 얻고 싶다면 '8859_x'을 쓰는 것이 현명한 방책이라 하겠다.

물론 그 중에서도 많은 서버들이 위의 filename 을 ISO-Latin1(혹은 Latin1, 8859_1) 로 인코딩 해 보내기 때문에 같은 Latin 계열이라도 '8859_1' 즉 'Latin1'을 택하는 것이 좋다.
이는 표준이라고 하는데 문서 확인은 안 해 봤다. (어디 있는지 찾기 정말 힘들던데..)
 
출처 - http://blog.naver.com/anabaral?Redirect=Log&logNo=130043451093


'Language > JSP' 카테고리의 다른 글

JAX-RS TUTORIALS  (0) 2013.07.10
Configuring JAX-RS services in container with Spring configuration file.  (0) 2013.07.10
Tomcat과 한글 인코딩  (0) 2013.04.23
JSP pageEncoding속성, 케릭터셋(charset)  (0) 2013.02.13
mybatis[SqlSession]  (0) 2012.11.07
: