'98..Etc'에 해당되는 글 370건

  1. 2009.06.27 Tomcat 5 JNDI DataSource를 통한 DB 커넥션 풀 사용
  2. 2009.06.27 Apache 2 + Tomcat 5.x mod_jk 1.2 연동시 한글 문제
  3. 2009.06.27 [Tomcat4,5]DBCP configure
  4. 2009.06.27 DBCP의 POOL 상태를 모니터링 하는 페이지 1
  5. 2009.06.27 [Tomcat5.5] DBCP configure
  6. 2009.06.22 웹상에서 제우스 로그보기
  7. 2009.06.22 제우스(JEUS), WebtoB 관리를 위한 주요 명령어 및 alias 요약
  8. 2009.06.21 [Tomcat 6.0] Connection Pool - DBCP 사용하기
  9. 2009.06.21 ultraedit, editplus 편집툴 세로열 편집시 유용한 팁입니다. 1
  10. 2009.06.19 tomcat5.0 에서 datasource 설정하기
  11. 2009.06.19 eclipse 3.3 europa + mysql Connection Pool 설정시 오류 및 설정 방법
  12. 2009.06.13 Apress Pro Apache Tomcat 6
  13. 2009.06.13 apache_java_tomcat_mod_jk
  14. 2009.06.08 jstl에서 clob 처리 하기..
  15. 2009.06.02 Windows 2003 서버 FTP 서비스 설치
  16. 2009.06.02 JEUS설치하기
  17. 2009.06.02 jeus 설치
  18. 2009.05.18 ** resin 설치법 **
  19. 2009.05.09 국민권익위원회
  20. 2009.05.06 resin 4.0 documentation
  21. 2009.05.04 기본 화면 메뉴 만들기(Flash Professional만 해당)
  22. 2009.04.28 tomcat5 1
  23. 2009.04.24 log4j
  24. 2009.04.22 Tomcat 5 JNDI DataSource를 통한 DB 커넥션 풀 사용
  25. 2009.04.14 IPlanet 6.1 인증서 설치 매뉴얼
  26. 2009.04.10 Weblogic 8.1.5 + Sun Java System Web Server 6.1 SP6 연동
  27. 2009.04.10 WebLogic Platform 8.1 Installation
  28. 2009.04.10 WebLogic Server 8.1을 설치
  29. 2009.04.07 블러그 소스 코드 부분 깔끔 편집 - syntaxhighlighter
  30. 2009.04.06 WAS에 대해서 모든 것을 말한다.
98..Etc/Tomcat2009. 6. 27. 01:16
반응형

Tomcat 5 JNDI DataSource를 통한 DB 커넥션 풀 사용

 

 

 

이미 눈치 채셨겠지만, 요즘 내가 RDBMS 배우기에 열을 올리고 있다.
지금까지는 JSP/Servlet에서 직접 커넥션을 맺거나, 컨텍스트내에 커넥션 라이브러리를 두고 호출에서 사용했는데, 바꿔야겠다.
JNDI
통한 커넥션 사용은 J2EE 표준이고, 현존하는 거의 모든 컨테이너가 지원한다고 한다.

 

JNDI 서버에 설정하는 방법은 WAS 별로 다르지만, 사용하는 것은 모두 동일하므로 호환성에 문제도 없다.

 

글은 Jakarta DBCP 커넥션 Tomcat JNDI 설정을 통해 데이터베이스 커넥션 풀을 사용하는 방법이다.

 

JNDI 커넥션 풀에 관한 자세한 설명이 JavaServer Pages 3rd ed. 실려있다. 너무 좋다. 읽어보라고 강력하게 권하고 싶다.

 

기본적으로 필요한 라이브러리

  • commons-dbcp.jar
  • commons-collections.jar
  • commons-pool.jar

예제 JDBC 드라이버

  • Oracle 9i classes12.jar

JNDI Naming Resource 설정

1.       라이브러리들을 $CATALINA_HOME/common/lib 복사한다. 이외 디렉토리에 두면 안된다. ZIP 파일은 JAR 확장자를 바꿔야 한다. 톰캣은 JAR파일만 클래스패스에 추가한다.

2.       Connection 풀을 이용할 경우에는 ResultSet Connection 객체를 필히 직접 닫아 줘야만 한다.

3.       $CATALINA_HOME/conf/server.xml 혹은 컨텍스트별 XML 파일의 <Context> 자식 요소로 다음을 추가한다.

4.                <Resource name="jdbc/forumDb" auth="Container" type="javax.sql.DataSource"/>

5.                <!-- Resource name 속성을 이용해서 어플리케이션에서

6.                                javax.sql.DataSource 객체를 얻어가게 된다. -->

7.               

8.               

9.                <!-- 자세한 파라미터 설정은

10.               http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jndi-datasource-examples-howto.html 참조 -->

11.            <ResourceParams name="jdbc/forumDb">

12.              <parameter>

13.                <name>factory</name>

14.                <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

15.              </parameter>

16.           

17.              <parameter>

18.                <name>maxActive</name>

19.                <value>100</value>

20.              </parameter>

21.           

22.              <parameter>

23.                <name>maxIdle</name>

24.                <value>30</value>

25.              </parameter>

26.           

27.              <parameter>

28.                <name>maxWait</name>

29.                <value>10000</value>

30.              </parameter>

31.           

32.                              <!-- DB 사용자명과 비밀번호 설정 -->

33.              <parameter>

34.               <name>username</name>

35.               <value>dbuser</value>

36.              </parameter>

37.              <parameter>

38.               <name>password</name>

39.               <value>dbpasswd</value>

40.              </parameter>

41.           

42.                              <!-- JDBC 드라이버 클래스 -->

43.              <parameter>

44.                 <name>driverClassName</name>

45.                 <value>oracle.jdbc.driver.OracleDriver</value>

46.              </parameter>

47.             

48.                              <!-- JDBC 접속 URL -->

49.              <parameter>

50.                <name>url</name>

51.                <value>jdbc:oracle:thin:@dbhost:1521:ORA</value>

52.              </parameter>

53.           

54.                  <!-- 커넥션에 문제 없는지 테스트하는 쿼리 -->

55.              <parameter>

56.                <name>validationQuery</name>

57.                <value>select sysdate</value>

58.              </parameter>

59.            </ResourceParams>

 

60.    어플리케이션의 web.xml파일에 다음을 추가하여 JNDI 리소스를 사용할 있도록 한다.

61.                              <resource-ref>

62.                                                   <description>Forum DB Connection</description>

63.                                                   <!-- 다음이 바로 리소스의 이름 -->

64.                                                   <res-ref-name>jdbc/forumDb</res-ref-name>

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

66.                                                   <res-auth>Container</res-auth>

67.                              </resource-ref>

 

JSP/Servlet 에서 사용하기

이제 다음과 같이 JNDI 이용해 DataSource 객체를 얻고, 객체에서 커넥션을 얻어오면 된다.

 

다음은 서블릿을 작성하고, 서블릿에서 DB커넥션을 얻고, 쿼리를 날린 , 결과를 JSP 파일에 포워딩하여 JSTL 이용해 출력하는 것이다.

 

1.       예제 테이블과 데이터 SQL - 오라클 계정으로 다음과 같은 데이터를 생성했다고 가정하면

2.              create table test (

3.                                  num NUMBER NOT NULL,

4.                                  name VARCHAR2(16) NOT NULL

5.              );

6.               

7.              truncate table test;

8.               

9.              insert into test values(1,'영희');

10.          insert into test values(2, '철수');

11.          insert into test values(3, '미숙');

12.          commit;

 

13.    test.JndiDataSourceTestServlet 소스

14.          package test;

15.           

16.          import java.io.IOException;

17.          import java.sql.Connection;

18.          import java.sql.ResultSet;

19.          import java.sql.SQLException;

20.          import java.sql.Statement;

21.          import java.util.ArrayList;

22.          import java.util.HashMap;

23.          import java.util.List;

24.          import java.util.Map;

25.           

26.          import javax.naming.Context;

27.          import javax.naming.InitialContext;

28.          import javax.naming.NamingException;

29.          import javax.servlet.RequestDispatcher;

30.          import javax.servlet.ServletException;

31.          import javax.servlet.http.HttpServlet;

32.          import javax.servlet.http.HttpServletRequest;

33.          import javax.servlet.http.HttpServletResponse;

34.          import javax.sql.DataSource;

35.           

36.          public class JndiDataSourceTestServlet extends HttpServlet {

37.           

38.              protected void doGet(HttpServletRequest request,

39.                      HttpServletResponse response) throws ServletException, IOException {

40.           

41.                  Connection conn = null;

42.                  ResultSet rs = null;

43.                  Statement stmt = null;

44.           

45.                  try {

46.                      // 커넥션을 얻기 위한 전초작업. 부분을 메소드화 하면 되겠다. ------------

47.                      Context initContext = new InitialContext();

48.                      Context envContext = (Context)initContext.lookup("java:/comp/env");

49.                      DataSource ds = (DataSource)envContext.lookup("jdbc/forumDb");

50.                     

51.                      // 커넥션 얻기

52.                       conn = ds.getConnection();

53.                      //------------------------------------------------------------------

54.                     

55.                      String sql = "SELECT * from test";

56.                      stmt = conn.createStatement();

57.                     

58.                      rs = stmt.executeQuery(sql);

59.                     

60.                      List results = new ArrayList();

61.                     

62.                      while (rs.next()) {

63.                          Map row = new HashMap();

64.                         

65.                          row.put("num", rs.getString("num"));

66.                          row.put("name", rs.getString("name"));

67.                         

68.                          results.add(row);

69.                      }

70.                     

71.                      request.setAttribute("results", results);

72.                     

73.                      RequestDispatcher rd = request.getRequestDispatcher("/dbtest.jsp");

74.                      rd.forward(request, response);

75.                     

76.                  } catch (NamingException e) {

77.                      throw new ServletException("JNDI 부분 오류", e);

78.                  } catch (Exception e) {

79.                      throw new ServletException("뭔가 다른 부분 오류", e);

80.                  } finally {

81.                      // 리소스를 필히 반환할 !

82.                      if (rs != null) { try { rs.close(); } catch (Exception ignored) {} }

83.                      if (stmt != null) { try { stmt.close(); } catch (Exception ignored) {} }

84.                      if (conn != null) { try { conn.close(); } catch (Exception ignored) {} }

85.                  }

86.              }

87.          }

88.    web.xml 서블릿 등록

89.                              <servlet>

90.                                                   <servlet-name>dbtest.svl</servlet-name>

91.                                                   <servlet-class>test.JndiDataSourceTestServlet</servlet-class>

92.                              </servlet>

93.                              <servlet-mapping>

94.                                                   <servlet-name>dbtest.svl</servlet-name>

95.                                                   <url-pattern>/dbtest.svl</url-pattern>

96.                              </servlet-mapping>

97.    /dbtest.jsp 소스

98.          <%@ page contentType="text/html" pageEncoding="EUC-KR" %>

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

100.       <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

101.        

102.       <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">

103.       <html>

104.       <head>

105.       <title>JNDI DataSource Test</title>

106.       </head>

107.                        <body                  bgcolor="#FFFFFF">

108.                           <h2>Results</h2>

109.                          

110.                           <c:forEach var="row" items="${results}">

111.                                                                    NUM : ${row.num}<br />

112.                                                                    Name : ${row.name}<br />

113.                                                                    <hr />

114.                           </c:forEach>

115.       </body>

116.       </html>

 

117.이제 브라우저에서 "/dbtest.svl" 호출해보면 결과를 있다.

 

전역적인 JNDI 리소스 이용

<Resource> <ResourceParams> 요소를 server.xml <GlobalNamingResources> 자식노드로 옮기면 특정 어플리케이션이 아니라, 톰캣에 설치된 전체 어플리케이션에서 사용 있게 된다. 하지만 어플리케이션 "<Context>" 다음과 같은 설정을 해야 한다.

                    <ResourceLink

                                         name="jdbc/forumDb"

                                         global="jdbc/forumDb"

                                         type="javax.sql.DataSource"

                      />

 

아니면 server.xml에서 <Host> 요소의 자식으로 다음을 추가하면 컨텍스트별 설정 필요없이 전체 어플리케이션 컨텍스트에서 GlobalNamingResources 지정된 JNDI 리소스를 사용할 있다.

 

                    <DefaultContext>

                                         <ResourceLink

                                                             name="jdbc/forumDb"

                                                             global="jdbc/forumDb"

                                                             type="javax.sql.DataSource"

                                           />

        </DefaultContext>

 

문제가 생겼어요!

1.       DB 커넥션이 간혹 끊어져요.
Tomcat
작동중인 JVM 가비지 컬렉션을 , 시간이 JNDI Resource 파라미터로 설정한 maxWait보다 길게 경우 DB 커넥션이 끊어질 있다.
CATALINA_OPTS=-verbose:gc
옵션을 주면 $CATALINA_HOME/logs/catalina.out 가비지 컬렉션 상황이 기록된다. 거기에 GC 작업에 걸린 시간도 나오니 그것을 참조로 maxWait 파라미터를 늘려주면 된다. 보통 10~15초로 주면 된다.
GC
시간은 거의 99% 이상 1 이내에 끝나야 하나보다..

2.       무작위로 커넥션이 close 되요.
그건.. Connection 객체를 이상 close 했기 때문이다.
DB Connection Pool
close() 호출할 정말로 닫는 것이 아니라, 단지 재사용할 있다고 표시만 뿐이다.
커넥션을 사용하다가 close()하면 다른 쓰레드이서 커넥션을 있는데, 이걸 현재 쓰레드에서 계속 잡고 있다가 다시 close() 해버리면, 다른 쓰레드에서 사용중에 close()됐다고 나와 버리게 되는 거다.

3.                  conn.close();

4.                  conn = null;

위와 같이 커넥션을 close() 뒤에 바로 null 설정하여 절대로 다시 사용할 없게 만들면 이런 실수는 생기지 않을 것이다.

Tomcat 5.5 예제

        <Resource name="jdbc/myDbResource" auth="Container" type="javax.sql.DataSource"

               maxActive="10" maxIdle="5" maxWait="10000"

               username="ao" password="ao"

               driverClassName="com.mysql.jdbc.Driver"

               url="jdbc:mysql://localhost:3306/myWebApp"

 

               removeAbandoned="true"

               removeAbandonedTimeout="60"

               logAbandoned="true"

               validationQuery="select 1"

               testOnBorrow="true"

               testWhileIdle="true"

               timeBetweenEvictionRunsMillis="10000"

               minEvictableIdleTimeMillis="60000"

       />

 

저기서 removeAbandoned 리소스 반환에 실패한 (혹은 안한) 커넥션을 자동으로 닫아주는 것이다.

 

validationQuery 커넥션이 살아 있는지 테스트하는 코드이다.

 

MySQL, Connector/J Tomcat 5 예제

http://dev.mysql.com/doc/connector/j/en/cj-tomcat-config.html 나온 내용임.

<Context ....>

 

  ...

 

  <Resource name="jdbc/MySQLDB"

               auth="Container"

               type="javax.sql.DataSource"/>

 

  <!-- The name you used above, must match _exactly_ here!

 

       The connection pool will be bound into JNDI with the name

       "java:/comp/env/jdbc/MySQLDB"

  -->

 

  <ResourceParams name="jdbc/MySQLDB">

    <parameter>

      <name>factory</name>

      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

    </parameter>

 

    <!-- Don't set this any higher than max_connections on your

         MySQL server, usually this should be a 10 or a few 10's

         of connections, not hundreds or thousands -->

 

    <parameter>

      <name>maxActive</name>

      <value>10</value>

    </parameter>

 

        <!-- You don't want to many idle connections hanging around

         if you can avoid it, onl    y enough to soak up a spike in

         the load -->

 

    <parameter>

      <name>maxIdle</name>

      <value>5</value>

    </parameter>

 

    <!-- Don't use autoReconnect=true, it's going away eventually

         and it's a crutch for older connection pools that couldn't

         test connections. You need to decide if your application is

         supposed to deal with SQLExceptions (hint, it should), and

         how much of a performance penalty you're willing to pay

         to ensure 'freshness' of the connection -->

 

    <parameter>

      <name>validationQuery</name>

      <value>SELECT 1</value>

    </parameter>

 

   <!-- The most conservative approach is to test connections

        before they're given to your application. For most applications

        this is okay, the query used above is very small and takes

        no real server resources to process, other than the time used

        to traverse the network.

 

        If you have a high-load application you'll need to rely on

        something else. -->

 

    <parameter>

      <name>testOnBorrow</name>

      <value>true</value>

    </parameter>

 

   <!-- Otherwise, or in addition to testOnBorrow, you can test

        while connections are sitting idle -->

 

    <parameter>

      <name>testWhileIdle</name>

      <value>true</value>

    </parameter>

 

    <!-- You have to set this value, otherwise even though

         you've asked connections to be tested while idle,

         the idle evicter thread will never run -->

 

    <parameter>

      <name>timeBetweenEvictionRunsMillis</name>

      <value>10000</value>

    </parameter>

 

    <!-- Don't allow connections to hang out idle too long,

         never longer than what wait_timeout is set to on the

         server...A few minutes or even fraction of a minute

         is sometimes okay here, it depends on your application

         and how much spikey load it will see -->

 

    <parameter>

      <name>minEvictableIdleTimeMillis</name>

      <value>60000</value>

    </parameter>

 

    <!-- Username and password used when connecting to MySQL -->

 

    <parameter>

     <name>username</name>

     <value>someuser</value>

    </parameter>

 

    <parameter>

     <name>password</name>

     <value>somepass</value>

    </parameter>

 

    <!-- Class name for the Connector/J driver -->

 

    <parameter>

       <name>driverClassName</name>

       <value>com.mysql.jdbc.Driver</value>

    </parameter>

 

    <!-- The JDBC connection url for connecting to MySQL, notice

         that if you want to pass any other MySQL-specific parameters

         you should pass them here in the URL, setting them using the

         parameter tags above will have no effect, you will also

         need to use & to separate parameter values as the

         ampersand is a reserved character in XML -->

 

    <parameter>

      <name>url</name>

      <value>jdbc:mysql://localhost:3306/test</value>

    </parameter>

 

  </ResourceParams>

</Context>

 

Oracle 만을 위한 JNDI 설정

원문 : http://www.microdeveloper.com/html/JNDI_Orcl_Tomcat1p.html

 

1) Modify the server.xml file
In<CATALINA_HOME>/conf/server.xml between <GlobalNamingResources> and </GlobalNamingResources> add the following

   <Resource name="jdbc/<alias>"

   auth="Cont   ainer"

   type="oracle.jdbc.pool.OracleDataSource"

   driverClassName="oracle.jdbc.driver.OracleDriver"

   factory="oracle.jdbc.pool.OracleDataSourceFactory"

   url="jdbc:oracle:thin:@<host>:<port>:<sid>"

   [user=<user>]

   [password=<password>]

   maxActive="20"

   maxIdle="10"

   maxWait="-1" />

   

 

Example

<!-- Global JNDI resources -->

 <GlobalNamingResources>

 

 <!-- Test entry for demonstration purposes -->

 <Environment name="simpl   eVal   ue" type="java.lang.Integer" value="30"/>

 

 <!-- Editable user database that can also be used by

   UserDatabaseRealm to authenticate users -->

 <Resource name="UserDatabase" auth="Container"

   type="org.apache.catalina.UserDatabase"

   description="User database that can be updated and saved"

   factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

   pathname="conf/tomcat-users.xml" />

    <!-- Every connection to 'db1' uses the same user -->

 <Resource name="jdbc/db1"

   auth="Container"

   type="oracle.jdbc.pool.OracleDataSource"

   driverClassName="oracle.jdbc.driver.OracleDriver"

   factory="oracle.jdbc.pool.OracleDataSourceFactory"

   url="jdbc:oracle:thin:@oracle.microdeveloper.com:1521:db1"

   user="scott"

   password="tiger"

   maxActive="20"

   maxIdle="10"

   maxWait="-1" />

    <!-- Every connection to 'db2' must provide a username and password -->  <Resource name="jdbc/db2"

   auth="Container"

   type="oracle.jdbc.pool.OracleDataSource"

   driverClassName="oracle.jdbc.driver.OracleDriver"

   factory="oracle.jdbc.pool.OracleDataSourceFactory"

   url="jdbc:oracle:thin:@oracle.microdeveloper.com:1521:db2"

   maxActive="20"

   maxIdle="10"

   maxWait="-1" />

</GlobalNamingResources>

 

2) Modify the context.xml file
In <CATALINA_HOME>/conf/context.xml between <Context> and </Context> add the following for each entry in the JNDI resource list:

<ResourceLink global="jdbc/<alias>" name="jdbc/<alias>" type="oracle.jdbc.pool.OracleDataSource"/>

 

Example

<!-- The contents of this file will be loaded for each web application -->

 <Context>

 

 <!-- Default set of monitored resources -->

 <WatchedResource>WEB-INF/web.xml</WatchedResource>

 <WatchedResource>META-INF/context.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->

 <!--

 <Manager pathname="" />

   -->

 <ResourceLink global="jdbc/db1" name="jdbc/db1" type="oracle.jdbc.pool.OracleDataSource"/>

 <ResourceLink global="jdbc/db2" name="jdbc/db2" type="oracle.jdbc.pool.OracleDataSource"/>

 </Context>

 

3) Modify the context's web.xml file (5.0.x step only - not necessary for 5.5.x)
In the <CONTEXT>/WEB-INF/web.xml between <web-app> and </web-app> add the following:

<resource-ref>

   <description><Your Description></description>

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

   <res-type>oracle.jdbc.pool.OracleDataSource</res-type>

   <res-auth>Container</res-auth>

</resource-ref>

 

Example

 

<resource-ref>

   <description>Oracle Development Datasource</description>

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

   <res-type>oracle.jdbc.pool.OracleDataSource</res-type>

   <res-auth>Container</res-auth>

</resource-ref>

 

<resource-ref>

   <description>Oracle Development Datasource</description>

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

   <res-type>oracle.jdbc.pool.OracleDataSource</res-type>

   <res-auth>Container</res-auth>

</resource-ref>

 

 

4) Restart Tomcat

 

Posted by 1010
98..Etc/Tomcat2009. 6. 27. 01:15
반응형

Apache 2 + Tomcat 5.x mod_jk 1.2 연동시 한글 문제


Apache 2 + Tomcat 5.x mod_jk 1.2 연동시 GET 방식으로 넘어온 파라미터의 한글이 몽땅 깨져버리는 문제가 발생합니다.

이 문제의 해결 책은

<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" URIEncoding="euc-kr"/>

server.xml의 jk 커넥터 부분에도 URIEncoding을 추가해주는 것입니다. 

Posted by 1010
98..Etc/Tomcat2009. 6. 27. 01:14
반응형

1. $TOMCAT_HOME/conf/server.xml(Tomcat4) or

    $TOMCAT_HOME/conf/Catalina/host/context.xml(Tomcat5)


   <Resource name="jdbc/obcon" auth="Container" type="javax.sql.DataSource"/>
   <ResourceParams name="jdbc/obcon">
        <parameter>
            <name>username</name>
            <value>club</value>
        </parameter>
        <parameter>
            <name>password</name>
            <value>obcl</value>
        </parameter>
        <parameter>
            <name>driverClassName</name>
            <value>oracle.jdbc.driver.OracleDriver</value>
        </parameter>
        <parameter>
            <name>url</name>
            <value>jdbc:oracle:thin:@172.16.1.17:1526:ORA8</value>
        </parameter>
        <parameter>
            <name>removeAbandoned</name>
            <value>true</value>
        </parameter>
        <parameter>
            <name>removeAbandonedTimeout</name>
            <value>60</value>
        </parameter>
        <parameter>
            <name>logAbandoned</name>
            <value>true</value>
        </parameter>
        <parameter>
            <name>maxActive</name>

            <value>20</value>
        </parameter>
        <parameter>
            <name>maxIdle</name>
            <value>10</value>
        </parameter>
        <parameter>
            <name>minIdle</name>
            <value>5</value>
         </parameter>
        <parameter>
            <name>maxWait</name>
            <value>10000</value>
        </parameter>
    </ResourceParams>


2. $WEB_ROOT/WEB-INF/web.xml


    <resource-ref>
        <res-ref-name>jdbc/obcon</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>


** jdbc jar 파일이 $TOMCAT_HOME/common/lib 에 위치할 것.

Posted by 1010
98..Etc/Tomcat2009. 6. 27. 01:06
반응형

DBCP의 POOL 상태를 모니터링 하는 페이지

톰캣에 default 로 설치된 dbcp 라이브러리를 이용하면 org.apache.tomcat.dbcp.dbcp.*

이고 일반적인 dbcp를 다운받아 사용할경우 org.apache.commons.dbcp.* 로 import 하도록 한다.


<%@ page language="java" contentType="text/html; charset=EUC-KR" %>
<%@ page import="
    javax.naming.*,
    javax.sql.*,
    org.apache.tomcat.dbcp.dbcp.*"
%>
<%
 Context initContext = new InitialContext();
 Context envContext  = (Context)initContext.lookup("java:/comp/env");
 DataSource ds   = (DataSource)envContext.lookup("jdbc/mydb");
 
 BasicDataSource bds = (BasicDataSource)ds;
 String dbname  = "caelum";
 
 try {
   int bdsNumActive  = bds.getNumActive();
   int bdsMaxActive  = bds.getMaxActive();
   int bdsNumIdle   = bds.getNumIdle();
   long bdsMaxWait  = bds.getMaxWait();
   
   String fontcolor  = "";
   
   if (bdsNumActive <= 400) {
    fontcolor = "<font color='green'>";
   } else if (bdsNumActive > 400 && bdsNumActive <= 500) {
    fontcolor = "<font color='orange'>";
   } else {
    fontcolor = "<font color='red'>";
   }
%>
   <table cellpadding='3' cellspacing='0' border='1'>
    <tr>
     <td colspan='4' align='center'><b><%=dbname%></b> DataSource</td>
    </tr>
    <tr>
     <td height='24' align='center' alt='connections that are processing'># Active Connections</td>
     <td height='24' align='center' alt='total size of pool'>Maximum Active Connections</td>
     <td height='24' align='center' alt='connections that are idle in the pool'># of Idle Connections</td>
     <td height='24' align='center'>Maxium Wait period before timeout</td>
    </tr>
    <tr>
     <td align='right'><%=fontcolor%><%=bdsNumActive%></font></td>
     <td align='right'><%=bdsMaxActive%></td>
     <td align='right'><%=bdsNumIdle%></td>
     <td align='right'><%=bdsMaxWait%></td>
    </tr>
   </table>
<%
 } catch(Exception e) {
  out.println(e.toString());
 }
%>

Posted by 1010
98..Etc/Tomcat2009. 6. 27. 01:05
반응형

Tomcat 5.5에서는 기존에 사용하던 ResourceParams 태그를 지원하지 않습니다.

대신 다음과 같이 설정합니다.


- server.xml

 <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
   maxActive="100"
   maxIdle="30"
   maxWait="10000"
   username="test"
   password="1234"
   driverClassName="com.mysql.jdbc.Driver"
   url="jdbc:mysql://localhost:3306/test?autoReconnect=true"
   removeAbandoned="true"
   removeAbandonedTimeout="60"
   logAbandoned="true"
 />

<Context ~>

<ResourceLink name="jdbc/mydb" global="jdbc/mydb" type="javax.sql.DataSource"/>

</Context>


-web.xml

  <resource-ref>
   <description>Oracle Datasource example</description>
   <res-ref-name>jdbc/mydb</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
 </resource-ref>

Posted by 1010
98..Etc/70.JEUS2009. 6. 22. 14:04
반응형

------------------------------------------

tail_log_ajax.jsp

------------------------------------------


<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.io.*" %>
<%!
public String toKorean(String param) {
 try{
  //param=new String(param.getBytes("ISO-8859-1"),"EUC-KR");
 }catch(Exception e){
 }
 return param;
}
%>

<%
response.setHeader("Pragma","No-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0);
response.setHeader ("Cache-Control", "no-cache");
%>

<%
//로그파일명
String log_filename = request.getParameter("log_filename") == null ? "": request.getParameter("log_filename");
long end_point = (request.getParameter("end_point")==null)? 0:Long.parseLong(request.getParameter("end_point")+"");
//로그파일이 있는 디렉토리
String log_dir = request.getParameter("log_dir");
if(log_dir==null||log_dir.length()==0){
 log_dir = "/home/jeus5/logs/vmstest/";
}

StringBuffer sb = new StringBuffer();
RandomAccessFile read_file = new RandomAccessFile(log_dir+"/"+log_filename, "r");
long str_length = read_file.length();
long start_point = (end_point>0)?end_point:str_length;
read_file.seek(start_point);  
String str;
long file_point = start_point;
while((str = read_file.readLine()) != null){
 sb.append(toKorean(str)+"\n");
 file_point = read_file.getFilePointer();
 read_file.seek(file_point);  
}
read_file.close();
String log_data = sb.toString();
out.print(file_point+","+log_data);
%>



-------------------------------------------


--------------------------------------------

tail_log.jsp

--------------------------------------------


<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.io.*" %>
<%!
public String toKorean(String param) {
 try{
  //param=new String(param.getBytes("ISO-8859-1"),"EUC-KR");
 }catch(Exception e){
 }
 return param;
}
%>

<%
//로그파일이 있는 디렉토리
String log_dir = request.getParameter("log_dir");
if(log_dir==null||log_dir.length()==0){
 log_dir = "/home/jeus5/logs/vmstest/";
}

//화면에 나타낼 로그파일 길이
long log_length = 100000;
//로그파일명
String log_filename = request.getParameter("log_filename") == null ? "": request.getParameter("log_filename");

// 디렉토리인 객체를 생성
File myDir = new File(log_dir);
// 디렉토리의 내용 구하기
File[] list_files = myDir.listFiles();

//파일시작위치
long start_point = 0;
//파일끝위치
long end_point = 0;
//파일내용
String log_data = "";
if(!log_filename.equals("")){
 StringBuffer sb = new StringBuffer();
 RandomAccessFile read_file = new RandomAccessFile(log_dir+"/"+log_filename, "r");
 //파일 길이를 구한다.
 long str_length = read_file.length();
 //파일을 읽을 위치를 정한다.
 start_point = (str_length<log_length)?0:(str_length-log_length);
 read_file.seek(start_point);  
 String str;
 end_point = str_length;
 while((str = read_file.readLine()) != null){
  sb.append(toKorean(str)+"\n");
  //파일을 읽고 마지막 위치를 알아낸다.
  end_point = read_file.getFilePointer();
  read_file.seek(end_point);  
 }
 read_file.close();
 //파일내용
 log_data = sb.toString();
}
%>

<HTML>
<HEAD>
<title>로그파일보기</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<style type="text/css">
<!--
a {text-decoration:none; color: black;}
a:link {text-decoration:none; color: black;}
a:visited {text-decoration:none; color: black;}
a:active {text-decoration:none; color: black;}
a:hover {text-decoration:none; color:black;}
body,table,tr,td {  font-family: "굴림"; font-size: 9pt; font-style: normal; color: black;}
-->
</style>
<script>
 //ajax를 위한 함수입니다.
 function getXmlHttpRequest(){
  var xmlhttp = false;
  // Mozilla/Safari
  if (window.xmlhttpuest) {
    xmlhttp = new xmlhttpuest();
  }
  // IE
  else if (window.ActiveXObject) {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  return xmlhttp;
 }
</script>
</head>

<body>
<table border="0" cellspacing="0" cellpadding="0" width="100%" height="100%">
 <tr height="10%">
  <td align="left" valign="bottom">
   <table border="0" cellspacing="0" cellpadding="0">
   <form name="fileform" method="post" action="tail_log.jsp">
    <tr>
     <td align="left" valign="bottom" height="20">
      로그파일을 tail -f 명령어 처럼 보여줍니다.
     </td>
    </tr>
    <tr>
     <td>
      <select id="log_dir" name="log_dir" onChange="window.Location='tail_log.jsp?log_dir='+this.options[this.selectedIndex].value">
      <option value="/home/jeus5/logs/vmstest/">개발서버      
      </select><script>document.fileform.log_dir.value="<%=log_dir%>";</script>
      <select name="log_filename">
       <option value="">파일선택</option>
       <%
       if (list_files != null) {
        for (int i = 0; i < list_files.length; i++) {
         if(!list_files[i].isDirectory()){
          String filename = list_files[i].getName();
          filename = filename.substring(filename.lastIndexOf("/")+1,filename.length());
       %>
       <option value="<%=filename%>" <%=log_filename.equals(filename)?"selected":""%>><%=filename%></option>
       <%
         }
        }
       }
       %>
      </select>
     </td>
     <td>
      <input type="submit" value="로그파일보기">
     </td>
    </tr>
   </form>
   </table>
  </td>
 </tr>
 <tr height="90%">
  <td>
   <table border="0" cellspacing="0" cellpadding="0" width="100%" height="100%">
   <form name="logform">
    <tr>
     <td><!--textarea id="log_data_area" name="log_data" style="width:100%;height:100%;"></textarea--><xmp id="log_data" name="log_data" style="text-overflow:ellipsis;overflow:auto;border:1 solid #000000;width:1300;height:100%"><%=log_data%>
     </xmp></td>
    </tr>
   </form>
   </table>
  </td>
 </tr>
</table>
<%
if(!log_filename.equals("")){
%>
<script>
 var end_point = <%=end_point%>;
function include_ajax_repeat(){
  var url = 'tail_log_ajax.jsp?log_filename=<%=log_filename%>&end_point='+end_point;
  //alert(url);
  var xmlhttp = getXmlHttpRequest();
  if(url){
   xmlhttp.open("GET", url, true);
   xmlhttp.onreadystatechange = function() {
    if(xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
      var resText = xmlhttp.responseText;
      //마지막 위치
      end_point = resText.substring(0,resText.indexOf(','));
      //새로운 로그 데이타
      var data = resText.substring(resText.indexOf(',')+1,resText.length);
      log_data.innerText = log_data.innerText + data;
      //일정한 양의 로그데이타만 남긴다.
      if(log_data.innerText.length><%=log_length%>) log_data.innerText = log_data.innerText.substring(log_data.innerText.length-<%=log_length%>);
      //스크롤 이동
      document.getElementById('log_data').scrollTop=document.getElementById('log_data').scrollHeight+<%=log_length%>;
      xmlhttp = null;
     } else {
      //alert("Error loading "+url+", "+xmlhttp.status+"("+xmlhttp.statusText+")");
      top.window.title="Error loading "+url+", "+xmlhttp.status+"("+xmlhttp.statusText+")";
      xmlhttp = null;
     }
    }
   }
   xmlhttp.send(null);
  } 
  setTimeout("include_ajax_repeat()", 2000);//msec 마다 서버와 통신함
  return false;
 }
 function include_ajax_repeat_old(){
  var url = 'tail_log_ajax.jsp?log_filename=<%=log_filename%>&end_point='+end_point;
  //alert(url);
  var xmlhttp = getXmlHttpRequest();
  if(url){
   xmlhttp.open("GET", url, true);
   xmlhttp.onreadystatechange = function() {
    if(xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
      var resText = xmlhttp.responseText;
      //마지막 위치
      end_point = resText.substring(0,resText.indexOf(','));
      //새로운 로그 데이타
      var log_data = resText.substring(resText.indexOf(',')+1,resText.length);
      document.logform.log_data.value = document.logform.log_data.value + log_data;
      //일정한 양의 로그데이타만 남긴다.
      if(document.logform.log_data.value.length><%=log_length%>) document.logform.log_data.value = document.logform.log_data.value.substring(document.logform.log_data.value.length-<%=log_length%>);
      //스크롤 이동
      document.getElementById('log_data_area').scrollTop=document.getElementById('log_data_area').scrollHeight+<%=log_length%>;
     } else {
      //alert("Error loading "+url+", "+xmlhttp.status+"("+xmlhttp.statusText+")");
      top.window.document.title="Error loading "+url+", "+xmlhttp.status+"("+xmlhttp.statusText+")";
     }
    }
   }
   xmlhttp.send(null);
  }
  setTimeout("include_ajax_repeat()", 2000);//msec 마다 서버와 통신함
  return false;
 }
 include_ajax_repeat();
</script>
<%
}
%>
</body>
</html>


---------------------------------------------------------


출처 : http://realcool.egloos.com/4778358

*** 주의사항

Clustering 환경에서는 경로를 반드시 파일로 부터 읽어 와야 한다.

안그럼 무자게 많은 error 가 발생함.

Posted by 1010
98..Etc/70.JEUS2009. 6. 22. 14:00
반응형

JEUS 5.0을 버전을 기준으로 하고 설치시 입력한 JEUS 관리자의 비밀번호는 jeusadmin이라고 전제한다.

JEUS 구동

주로 jboot, jdown이란 이름으로 스크립트를 작성하여 실행한다. 이 파일들의 실제 명령행은 다음과 같다.

  • jboot: jeus -Uadministrator -Pjeusadmin
  • jdown: jeusadmin -Uadministrator -Pjeusadmin jeusexit

jeusadmin console

jeusadmin 콘솔툴을 이용하여 JEUS 컨테이너기동/종료, 엔진리스트확인 등 JEUS 엔진의 상태를 제어 및 점검한다.

  • 콘솔 실행: jeusadmin 'hostname' -Uadministrator -Pjeusadmin
  • 명령 목록
    • allenglist: jeusadmin의 allenglist 명령은 현재 각 컨테이너의 엔진기동 상태를 보여준다.
    • downcon <container-name>: 지정된 컨테이너를 종료시킨다.
    • startcon <container-name>: 지정된 컨테이너를 기동시킨다.
    • pidlist: JEUS의 엔진 프로세스를 확인한다.

webadmin console

webadmin 콘솔은 JEUS의 컨테이너 내부에 기동된 서블릿 엔진의 상태를 모니터링하기 위한 명령프롬프트이다.

  • 콘솔 실행: webadmin <container-name> -Uadministrator -Pjeusadmin
  • 명령 목록
    • ti: ti는 Thread Information의 약자로 JEUS 서블릿 엔진의 컨텍스트그룹 내부의 Worker Thread의 상태를 체크하기 위한 명령어이다.
    • st -m: 현재 Container의 JVM Memory 사용 현황
    • st -r: 설정한 Context로 들어온 요청 count와 평균처리시간
    • st -s: 현재 유지하고 있는 세션 객체의 수

webadmin 반복 모니터링

webadmin 내의 모니터링 명령어를 주기적으로 자동실행하게 하려면 다음과 같은 형식으로 명령어를 실행한다.

  • <command> -i 주기(초) -k 횟수
  • 예) ti -i 2 -k 10 : ti 명령어를 2초 간격으로 10번 수행

dbpooladmin console

dbpooladmin 콘솔은 컨테이너별로 할당된 Database Pool의 상태를 모니터링하기 위한 명령프롬프트이다.

  • 콘솔 실행: dbpooladmin<container-name> -Uadministrator -Pjeusadmin
  • 명령 목록
    • Info: 해당 컨테이너에서 관리되고 있는 Database Pool의 정보가 표시된다.
    • min, max 값은 JEUSMain.xml에 설정한 Pool의 최소/최대값이며 current는 현재 풀에 보관되고 있는 실제 커넥션의 수, idle의 풀에 보관되고 있는 커넥션중, 사용가능한 개수를 의미한다.

JEUS 웹 관리자

http://hostname:9744/webadmin 로 접속하여 administrator/jeusadmin 계정으로 로그인한다.

사용자 삽입 이미지

JEUS 웹 관리자

JEUS 장애 처리

JEUS 프로세스ID (PID) 확인

JEUS의 엔진 프로세스는 다음과 같이 2가지 방법으로 확인할 수 있다.

  • ps -ef | grep java
    • -Xmx512m 이후 부분을 확인하여 JEUS Manager 프로세스임을 확인한다.
    • [-D컨테이너이름]을 이용하여 컨테이너 프로세스임을 확인한다.
  • jeusadmin 콘솔툴을 이용한 PID 확인
    • pidlist: pidlist 명령을 사용하여 PID를 확인한다.

JAVA Dump

  • 덤프 생성: kill -3 [JEUS-PID]
  • 덤프 확인: JEUS JAVA프로세스에서 생성한 덤프는 JeusServerLog에서 확인한다.
    • 예) vi $JEUS_HOME/logs/`hostname`/JeusServer_20070201.log
WebtoB 운영 및 관리

WebtoB 구동

  • wsboot
  • wsdown-I : ps -ef을 이용하여 wsm, hth, htl, html 등의 프로세스가 나타나지 않으면 정상 종료

wsadmin console

WebtoB 시스템을 관리하기 위해서 wsadmin이라는 프로그램이 제공된다. wsadmin 프로그램은 UNIX 환경의 shell과 비슷한 Command Interpreter 이다. 즉, 항상 프롬프트상태로 대기중이다가 입력되는 명령어를 해석하여 이를 실행하게 된다. 여러 Node를 한 Domain으로 사용하는 경우 wsadmin으로 전체를 중앙관리가 가능하며 각 Node 별로 로컬에서만도 관리가 가능하다.

  • wsadmin
  • 명령 목록
    • ci: 요청에 대한 현재 클라이언트 정보를 표시한다. HTH당 접속한 클라이언트의 KeepAlive 되어있는 개수를 보여준다. WebtoB단에 요청을 보내고 HTTP Session의 KeepAliveTimeout 전까지 유지되고 있는 클라이언트의 총 개수 정보이다.
    • ci -s: 현재 클라이언트의 전체 수를 표시한다.
    • si: 웹서버 환경설정 파일에서 *SERVER 절에 선언한 서버들의 수행정보를 보여준다.
    • st -s: 웹서버 환경설정 파일에서 *SERVER, *URI, *EXT 절에 설정한 서비스의 상태가 보인다.
    • st -p: WebtoB 프로세스의 상태를 표시한다. 주로 JEUS-WebtoB간 연동 상태를 확인할 때 사용한다.

wsadmin 명령 연속 보기

ci, st -s, st -p, si 등의 명령어를 다음과 같이 수행하면 주기적으로 WebtoB의 상태를 모니터링할 수 있다.

  • r -i <시간(초)> -k <횟수> <명령>
  • 예) r -i 1 -k 1000 st -s
JEUS alias 설정

.profile 참고

...
export JEUS_HOME=/jeus
...
#### JEUS alias ####
alias ja='jeusadmin `hostname` -Uadministrator -Pjeusadmin'
alias ea='ejbadmin `hostname`_ejb_engine1 -Uadministrator -Pjeusadmin'
alias wa='webadmin `hostname`_container1 -Uadministrator -Pjeusadmin'
alias da='dbpooladmin `hostname`_container1 -Uadministrator -Pjeusadmin'
alias ti='webadmin `hostname`_servlet_engine1 -Uadministrator -Pjeusadmin ti -i 3 -k 100000'
alias ss='webadmin `hostname`_servlet_engine1 -Uadministrator -Pjeusadmin st -s -i 3 -k 100000'
alias sd='webadmin `hostname`_servlet_engine1 -Uadministrator -Pjeusadmin st -d -i 3 -k 100000'
alias di='dbpooladmin `hostname`_container1 -Uadministrator -Pjeusadmin info -i 3 -k 100000'

alias jcfg='cd ${JEUS_HOME}/config/`hostname`'
alias jbin='cd ${JEUS_HOME}/bin'
alias scfg='cd ${JEUS_HOME}/config/`hostname`/`hostname`_servlet_engine1'
alias ecfg='cd ${JEUS_HOME}/config/`hostname`/`hostname`_ejb_engine1'

alias jhome='cd ${JEUS_HOME}'
alias lhome='cd ${JEUS_HOME}/logs'

alias jlog='tail -f ${JEUS_HOME}/logs/`hostname`/JeusServer_`date +%Y%m%d`.log'
alias alog='tail -f ${JEUS_HOME}/logs/`hostname`_servlet_engine1/MyGroup/accesslog/access_`date +%Y%m%d`.log'
alias elog='tail -f ${JEUS_HOME}/logs/`hostname`_servlet_engine1/MyGroup/errorlog/error_`date +%Y%m%d`.log'
alias ulog='tail -f ${JEUS_HOME}/logs/`hostname`_servlet_engine1/MyGroup/userlog/user_`date +%Y%m%d`.log'

...
http://kyungseo.pe.kr/blog/102 
Posted by 1010
98..Etc/Tomcat2009. 6. 21. 04:52
반응형




JSP를 처음 접하고 Connection Pool 부분에서 막히더군요. 거의 이틀 동안 삽질한듯 싶네요 ㅠ.ㅜ.

이러한 일이 다시 일어나지 않기를 기원하며 이렇게 글을 올립니다.

다른 강좌들 보단 최대한 자세히 쓰려고 노력했으니 분명히 도움이 되시리라 생각됩니다.

 

그리고 이 문제로 몇 일동안 힘들어했던 저에게 정말 많은 도움을 주셨던 기로로님에게 감사의 말씀을 드립니다.

 

 

 

 

 

 

 

 

본 강좌는 Eclipse J2EE, Tomcat 6.0 과 My-SQL 기준으로 작성된 것임을 미리 알려드립니다.

그리고 Tomcat의 버전이 맞지 않으면 설정 환경이 조금씩 다를 수 있다는 것 또한 알려드립니다.




1. 첨부된 파일들을 다운 받는다.

   



2. 다음 순서대로 받은 파일들을 해당 폴더에 넣는다.

 


commons-collections-3.1.jar

commons-dbcp-1.2.1.jar

commons-pool-1.2.jar

 

이 파일들을 자신이 이클립스에서 만들어둔 프로젝트/WebContent/WEB-INF/lib 폴더에 복사한다..


mysql-connector-java-3.0.14-production-bin.jar

 

그리고 위의 JDBC 라이브러리는 설치된 톰캣의 lib 폴더 안에 복사한다.

 



3. 프로젝트/WebContent/META-INF 폴더에 context.xml 파일을 생성한다.

 

<?xml version="1.0" encoding="UTF-8"?>

<Context path="/프로젝트" docBase="프로젝트" reloadable="true">
   
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

   

    <Resource name="jdbc/임의의 DBCP명"
               auth="Container"
               type="javax.sql.DataSource"
               driverClassName="드라이브명"
               url="DB URL"

               username="DB 아이디"
               password="DB 비밀번호"

               <!-- 사용 하고 있는 커넥션의 최대수 -->
               maxActive="20"
               <!-- 사용 안하고 있는 커넥션의 최대수 -->

               maxIdle="10"

               <!-- 커넥션을 열기위해 최대 기다리는 시간 "-1" 이라면 무기한 기다림 -->
               maxWait="-1"
    />
   
</Context>



4. 프로젝트/WebContent/WEB-INF 폴더에 web.xml 파일의 web-app 태그 안에 코드를 추가한다.


<web-app .... 이하 중략...>

<resource-ref>        
    <description>MySQL DB Connection</description>        
    <res-ref-name>jdbc/임의의 DBCP명</res-ref-name>        
    <res-type>javax.sql.DataSource</res-type>        
    <res-auth>Container</res-auth>   
</resource-ref>


</web-app>



 

5. DBCPTest.jsp 실행하기.


<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="java.sql.*, javax.naming.*, javax.naming.Context, javax.naming.InitialContext, javax.sql.DataSource" %>
<html>
<head>
    <title>DBCP Test</title>
</head>
<body>
<%
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
   
    try {
        Context initCtx = new InitialContext();
        Context envCtx = (Context)initCtx.lookup("java:/comp/env");
        DataSource ds = (DataSource)envCtx.lookup("jdbc/임의의 DBCP명");       
        conn = ds.getConnection();
       
        out.write("DBCP Connection..<br><br>");
       
        String sQuery = "select 1 + 1";
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sQuery);
       
        while (rs.next())
        {
            out.write("1 + 1 = " + rs.getString(1) + "<br>");
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    } finally {
        if (rs != null) try {rs.close(); } catch (Exception ex2) {}
        if (stmt != null) try {stmt.close(); } catch (Exception ex3) {}
        if (conn != null) try {conn.close(); } catch (Exception ex4) {}
    }

%>
</body>
</html>

 


[ 결과 화면 ]

 




Posted by 1010
98..Etc/Etc...2009. 6. 21. 04:31
반응형

사용자 삽입 이미지
ucilist.txt등을 만들기 위해 텍스트 편집할 때 여러 줄의 값을 동시에 편집할 때 유용한 팁입니다.

 

활용팁 같은 게시판에 올려야 하는데, 권한이 없어 글쓰기가 안되네여.

D2용도외에도 유용히 사용하세요.


만약 다음 내용의 앞에 특정 문자열을 추가한다고 하면,
d2jam
haptic

iTouch Style CA

iTouch Style NCA 
 
[UltraEdit]
1.       Alt+C 키 누름
2.       마우스로 맨 앞을 여러줄 선택
3.       메뉴의 [열]-[열 삽입/채우기]
4.       입력박스에 삽입할 내용 입력 : 예) <UCI name="
5.       편집결과는 아래와 같습니다.
<UCI name="d2jam
<UCI name="haptic
<UCI name="iTouch Style CA
<UCI name="iTouch Style NCA


 
[EditPlus]
1.       Editplus는 따로 단축키를 아래와 같이 먼저 설정해줘야 합니다.(최초 한번)
A.        메뉴의 [도구]-[기본설정]에서 키보드의 [편집] 유형에서 [EditFillColumn]을 선택합니다.
B.       새 단축키 누르기를 클릭한 후 Ctrl+Shift+Z 키를 누릅니다.
C.       [할당] 버튼을 클릭하고 [확인] 버튼을 눌러서 닫습니다.

사용자 삽입 이미지

명령이 한글로 나올 경우 아래와 같이 나옵니다.

2.       Alt+C를 누르면 현재 커서부터 마우스를 이동한 줄까지 영역이 선택됩니다.
3.       Ctrl+Shift+Z 키를 누릅니다.
4.       문자열 입력박스에 삽입할 내용 입력 : 예)  <UCI name="

5.       편집결과는 아래와 같습니다.
<UCI name="d2jam
<UCI name="haptic
<UCI name="iTouch Style CA
<UCI name="iTouch Style NCA

Posted by 1010
98..Etc/Tomcat2009. 6. 19. 15:44
반응형
  1. tomcat5.0 에서 datasource 설정하기

강좌보기

Posted by 1010
98..Etc/Etc...2009. 6. 19. 15:18
반응형
책만 보고 설정을 하다 보니 아래 오류가 나와서 알아보니 tomcat 버젼 별 설정과

eclipse 는 설정이 다르더라 .

javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

블로그를 한 100여개 넘도록 알아보니 대충 문제는 알겠는데

문제 해결은 안되고 이것저것 해보다가 6시간만에 문제 해결 ;;



우선 톰켓 5.5* 이상 부터는 Connection Pool 설정시에 server.xml 과 web.xml 에

별도로 내용을 설정할 필요없이 context.xml 설정만 하면 된다 .

eclipse europa 를 쓰면서 답답한 것은 기존 것과 패턴이 많이 바뀌면서

인터넷에 자료가 너무 없다. 해서 다른이에게 도움이 될까해서 남겨놓는다.




일단 http://commons.apache.org/ 사이트에서 아래 commons 파일을 다운 받아서

1. commons-pool-1.4.jar
2. commons-dbcp-1.2.2.jar
3. commons-collections-3.2.jar

C:\workspace\study\WebContent\WEB-INF\lib 에 복사한다.

나는 eclipse 3.3 europa wtp all-in-one 를 설치해서 사용한다.

europa 에서 Dynamic Web Project 로 jsp 파일을 만들게 되면

WebContent 에 jsp 파일이 저장된다.

 
C:\tomcat\conf 안에 보면 context.xml 파일이 있다.

이 파일을 복사해서

C:\workspace\Servers\Tomcat v5.5 Server at localhost-config 안에 복사한다.

현재 나는 eclipse + tomcat 5.5 + mysql 를 설치하여 사용한다.

자신이 사용하는 편한 편집기로 context.xml 을 연 후에

각자의 설치 사항에 맞게 설정하면 된다. 나는 editplus를 사용했다.

그림을 클릭하면 크게 보임

사용자 삽입 이미지


위와 같이
 
<Resource name="jdbc/jsptest"
                  auth="Container"
                  type="javax.sql.DataSource"
                  driverClassName="com.mysql.jdbc.Driver"
                  loginTimeout="10"
                  maxWait="5000"
                  username="jspid"
                  password="0310"
                  testOnBorrow="true"
                  url="jdbc:mysql://localhost:3306/jsptest"
        ></Resource>

를 추가하고 저장하면 설정은 끝이다.

매우 간단한 방법인데 기존 방법대로 설정을 하면서 현재 패치에 적용이 안되는

문제로 참 많은 고생을 하였다.

더더군다나 내가 초보자라 더 어려웠는지도 모르겠다
Posted by 1010
98..Etc/Tomcat2009. 6. 13. 16:11
반응형
Apress Pro Apache Tomcat 6


Posted by 1010
98..Etc/Tomcat2009. 6. 13. 16:09
반응형
Posted by 1010
98..Etc/JSTL2009. 6. 8. 14:43
반응형

http://flexdocs.kr/ 의 3D 방명록을 기반으로 게시판을 작성해 봤다.
php로 되어있는 게시판 소스를 보고 jstl로 바꿔보면 어떨가 해서 시작했는데
귀차니즘의 압박으로 인해 웹으로 운영되고 있는 현재 게시판 기능 중
조회기능만을 AIR로 구현하는데 만족.

작업하면서 얻게된 몇가지 팁을 공유해 보자.

첫째. JSTL, CLOB
jstl로 clob데이터 처리가 되지 않는다-_-;;; 결국 꽁수를 써야 하는데,
나는 오라클디벨로퍼 페이지에 게시된 내용을 참고했다.


<c:set value="${rs.rows[0].content}" var="content" scope="request"/>
<%
oracle.sql.CLOB clob=(oracle.sql.CLOB)request.getAttribute("content");
StringBuffer clobString = new StringBuffer();      
int y;          
char ac[] = new char[4096];          
java.io.Reader reader = clob.getCharacterStream();          
while ((y = reader.read(ac, 0, 4096)) != -1) {
 String buff = new String(ac,0,y);
 clobString.append(buff);
}
request.setAttribute("content1", clobString.toString());
%>
<contents><![CDATA[${content1}]]></contents>

1. clob을 request에 박아두고
2. jsp에서 clob코드를 이용하여 스트링생성
3. 생성된 스트링을 request에 새팅
4. el에서 request를 읽어옴

일련의 과정을 통해서 알게된 점은

1. 지저분 하지만 jstl과 jsp 간에 데이터 통신은 request객체를 사용한다.
2. html 데이터를 xml로 표현할때는 <!CDATA[]]>를 사용한다.
3. clob은 쓰기 어렵다 -_-

둘째, trace()를 적극 활용하자.
서버에서 던져준 xml을 클라이언트가 어떻게 처리하고 있는지 몰라서 상당히 애 먹었다.
변수에 trace 먹여서 디버그로 돌리면 그냥 죽죽 나오는데,
이걸몰라서 프로그래밍 상당히 곤란
xml 파싱을 trace를 통해 겨우 해결했다.


var xmlArticle:XMLList = e.result.articles.article;
    view_idx.text = xmlArticle.@idx;
    view_hname.text = xmlArticle.hname;
    view_contents.htmlText = xmlArticle.contents;
   
    var xmlComments:XMLList = xmlArticle.comments.comment;
    acdp.removeAll();
       
    for(i=0; i < xmlComments.length(); i++)
    {
     var xmlComment:XML = xmlComments[i];
     //trace(xmlComment);
     acdp.addItem({
      comments : xmlComment.contents
     });        
    } 
   

xml, xmllist 객체 두개가 아직도 헷갈린다.
이해하려 노력하지 말고 그냥 맘편히 trace에서 나오는거 보고 적당히 처리하자-_-


세째, reference
jstl은 처음 써봤는데 역시 j2ee튜토리얼이 가장 큰 도움이 됐다.
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html

AIR도 처음인데 flex/air 한글화 문서를 참조했다.
http://flexdocs.kr/

NEXT.
spring, hibernate로 확장 -_-;;


reader.zip

Posted by 1010
98..Etc/Server2009. 6. 2. 18:32
반응형

인터넷 정보 서비스 및 FTP 서비스 설치

FTP는 IIS(Microsoft Internet Information Services)에 의존하기 때문에 IIS와 FTP 서비스가 컴퓨터에 설치되어 있어야 합니다. IIS와 FTP 서비스를 설치하려면 다음과 같이 하십시오.

참고: Microsoft Server 2003 제품군에서는 IIS를 설치할 때 FTP 서비스가 기본적으로 설치되지 않습니다. 컴퓨터에 IIS를 이미 설치했다면 Control PanelAdd or Remove Programs 도구를 사용하여 FTP 서비스를 설치해야 합니다.

  1. Start를 누르고 Control Panel을 가리킨 다음 Add or Remove Programs를 누릅니다.
  2. Add/Remove Windows Components를 누릅니다.
  3. Components 목록에서 Internet Information Services (IIS)를 누르고(이 때 확인란은 선택하지 않음) Details를 누릅니다.
  4. 다음 확인란을 아직 선택하지 않았으면 선택합니다.

    Common Files
    File Transfer Protocol (FTP) Service
    Internet Information Services Manager

  5. 설치할 그 밖의 다른 IIS 관련 서비스나 하위 구성 요소 옆에 있는 확인란을 선택한 다음 OK를 누릅니다.
  6. Next를 누릅니다.
  7. 메시지가 나타나면 Windows Server 2003 CD-ROM을 컴퓨터의 CD-ROM 또는 DVD-ROM 드라이브에 넣거나 해당 파일 위치의 경로를 제공한 다음 OK를 누릅니다.
  8. Finish를 누릅니다.

이제 IIS와 FTP 서비스가 설치되었습니다. FTP 서비스를 사용하려면 먼저 구성해야 합니다.

FTP 서비스 구성

익명 연결만을 허용하도록 FTP 서비스를 구성하려면 다음과 같이 하십시오.

  1. Internet Information Services Manager를 시작하거나 IIS 스냅인을 엽니다.
  2. Server_name(여기서 Server_name은 서버 이름임)을 확장합니다.
  3. FTP Sites를 확장합니다.
  4. Default FTP Site를 마우스 오른쪽 단추로 누른 다음 Properties를 누릅니다.
  5. Security Accounts 탭을 누릅니다.
  6. 아직 선택하지 않았다면 Allow Anonymous Connections 확인란을 선택한 다음 Allow only anonymous connections 확인란을 선택합니다.

    Allow only anonymous connections 확인란을 선택한 경우 익명 연결만을 허용하도록 FTP 서비스를 구성합니다. 사용자는 사용자 이름과 암호를 사용해서 로그온할 수 없습니다.
  7. Home Directory 탭을 누릅니다.
  8. 아직 선택하지 않았다면 ReadLog visits 확인란을 선택한 다음 아직 선택 취소하지 않았다면 Write 확인란을 선택 취소합니다.
  9. OK를 누릅니다.
  10. Internet Information Services Manager를 종료하거나 IIS 스냅인을 닫습니다.

이제 들어오는 FTP 요청을 받아들이도록 FTP 서버가 구성되었습니다. 사용 가능하게 만드려는 파일을 액세스용 FTP 게시 폴더에 복사하거나 이동합니다. 기본 폴더는 drive:\Inetpub\Ftproot(여기서 drive는 IIS가 설치되어 있는 드라이브임)입니다.



출처 : http://support.microsoft.com/default.aspx?scid=kb;ko;323384

Posted by 1010
98..Etc/70.JEUS2009. 6. 2. 12:54
반응형

안녕하세요~ 은양입니다.


이번시간에 할 내용은 JEUS설치하기입니다.


http://www.tmax.co.kr 여기에서 받으시면 되구요.. JEUS6.0까지 나온듯 한데...


여기에서 사용할 버젼은 JEUS5.0입니다.



자, 그럼 설치를 시작해 볼까요..?


이미지를 클릭하시면 원본크기로 보실수 있습니다.

처음 실행파일을 실행하면 나오는 화면인데요..


그냥 아무생각없이 NEXT..



이미지를 클릭하시면 원본크기로 보실수 있습니다.



동의하시고.. NEXT!!


이미지를 클릭하시면 원본크기로 보실수 있습니다.

제우스 설치폴더 지정하는건데요..


그냥 기본폴더를 사용하겠습니다. NEXT!!


이미지를 클릭하시면 원본크기로 보실수 있습니다.

Full Install 선택하시고.. NEXT!!


이미지를 클릭하시면 원본크기로 보실수 있습니다.


그러면 위와같이 윈도우 시작시 서비스 시작할꺼냐고 묻는데요...  "NO" 선택하죠..


이미지를 클릭하시면 원본크기로 보실수 있습니다.

JDK 설치폴더를 지정합니다..

당연히 JDK먼저 설치후에 JEUS를 설치해야겠죠..? ^^

NEXT!!


이미지를 클릭하시면 원본크기로 보실수 있습니다.

패스워드를 물어보네요

AJAXMASTER 라고 해볼께요.. 뭐, 패스워드는 아무렇게나 넣어도 상관없습니다.

단, 7자 이상...

NEXT


이미지를 클릭하시면 원본크기로 보실수 있습니다.

여태까지 입력했던 사항 확인하시구요

Install ~~


이미지를 클릭하시면 원본크기로 보실수 있습니다.

자.. 설치가 진행중입니다..


이미지를 클릭하시면 원본크기로 보실수 있습니다.

완료되면 QuickStart할거냐고 물어보는데.. 그냥 나중에 보죠..

NO!!


이미지를 클릭하시면 원본크기로 보실수 있습니다.


자, 여기까지 됐다면.. JEUS는 성공적으로 설치가 되었습니다.



실제 폴더로 한번 가볼까요..


이미지를 클릭하시면 원본크기로 보실수 있습니다.

TmaxSoft 밑에 JEUS5.0 폴더 밑에 webhome 밑에 app_home밑에 한번 가보시죠...

여기가 앞으로 실제 작업을 하게될 폴더입니다.


자, 이제 설치를 하였으니 실행을 시켜야겠죠...


시작-실행-cmd 로 명령프롬프트 콘솔창을 실행시키겠습니다.


이미지를 클릭하시면 원본크기로 보실수 있습니다.


실행시킨후에 JEUS라고 쳐보겠습니다.


이미지를 클릭하시면 원본크기로 보실수 있습니다.

그러면, 위와같이 뭐라고뭐라고 막 실행한후에 마지막부분에


JeusServer is Ready라는 문구를 볼수 있을겁니다.  여기까지 되었다면 정상적으로 Jeus Server까지 실행이 된것이죠...^^




자, 이제 인터넷 익스플로워를 하나 띄운후에요....


다음과 같이 입력해 봅니다.


http://localhost:9744/webadmin


이미지를 클릭하시면 원본크기로 보실수 있습니다.

그러면 위와같은 화면이 보일텐데요..


USER NAME에는 administrator을 넣구요

PASSWORD에는 위에서 설치할때 주었던 패스워드 기억나시죠....

저는 AJAXMASTER라고 했었는데요.. 그것을 넣어주면 됩니다.. 그리고 OK!!


이미지를 클릭하시면 원본크기로 보실수 있습니다.


성공적으로 로그인이 되었다면 위와같은 화면을 볼수 있을겁니다.


여기에서 제우스 노드트리에 보면 자기 컴퓨터 이름이 보이는데요..  오른쪽 버튼을 눌러보면


JEUS 노드제어라는것이 있습니다.  이것을 클릭..!!


이미지를 클릭하시면 원본크기로 보실수 있습니다.

그러면 위와같이 가능한 노드가 나오는데요.. 자기 컴퓨터 이름 체크하후에 "확인" 버튼을 눌러줍니다.


이미지를 클릭하시면 원본크기로 보실수 있습니다.

위와같이 성공적으로 부트되었다는 메세지가 뜨죠..?


이제 실제 접속을 해보겠습니다.


http://localhost:8088/


이미지를 클릭하시면 원본크기로 보실수 있습니다.

어떻습니까... 위와같은 화면이 보이시나요? ㅋ


자, 이제 저위에 제우스웹관리자에서 다운 및 종료를 해보시구요...


실제 이과정은 Command 창에서 실행할 수 있습니다.



도스창을 하나더 실행시키구요.. 다음과 같이 입력합니다.

jeusadmin 자기컴퓨터이름  <== 요렇게 입력하면되죠..

이미지를 클릭하시면 원본크기로 보실수 있습니다.


이 화면에서.. 다음과 같이 아이디,암호를 입력합니다.

이미지를 클릭하시면 원본크기로 보실수 있습니다.

아이디는 administrator이구요

패스워드는 AJAXMASTER이겠죠..


이상태에서 boot라고 입력하면 이전에 띄워놓았던 도스창화면이 막 바뀌면서 실제 부트가 될것입니다.


그리고, 부트가 완료되면


이미지를 클릭하시면 원본크기로 보실수 있습니다.


위와같이 boot done이라는 메세지가 보이게 되는거죠....


종료하고 싶을때는 "down"이라고 치시면 되구요..  완료후에 나갈때는 "exit" 하면 됩니다.



자, 여기까지 한후에 다시 http://localhost:8088/로 테스트 해보시구요..


오늘은 여기까지만 하구요.. 다음시간에는 DB를 하나 만든후에 Connection Pool 연결하는 방법에 대해서

소개해드리겠습니다. 그럼 이만..ㅃㅃ

출처 : http://club.paran.com/club/home.do?clubid=eypgworld-bbsView.do?menuno=2922748-clubno=1078741-bbs_no=0QWZk

Posted by 1010
98..Etc/70.JEUS2009. 6. 2. 12:50
반응형

jeus 설치


.jeus 나 sh 를 사용해 해당 파일을 실행.

5 : 테스트나 일반적 용도시

6 : 웹서비스 할 때, HP-UX는 꼭 Jesu 6버전...버그 있어서


JDK는 무조건 1.5 (1.4도 상관없으나, 1.6은 지원 안함)

1.5가 성능이 좋음.

유닉스 시스템이 많다.


설치시 2가지 중요..

dependency와 dB 로그 최소 10 G 이상의 DB공간

UTF-8 : 가장많이 사용하나 ,,, 일본어와 중국어 는 깨지는 수가 있음. 일본어는 그나마 괜찮음.

ex) LANG=ko_KR.euckr ; export LANG
LC_ALL=ko_KR.euckr ; export LC_ALL


ProFrame 설치하면 JEUS 설정 파일이 수정된다.

백업하라.

cp -rp dest source

cp -rp config config.20080804

rp 레커시브하게 권한으로? 백업?

항상 백업하라. 날짜를 붙이면 편하다.


설치시 설치 폴더에서 simpleInstall.sh를 실행하라.


Oracle 버전에 따라 수정해야한다.

MS-SQL은 지원하지 않는다.(드라이버에 버그)


1.Install Directory
proframe_dir=/home/proframe/proframe -> ProFrame 설치경로. 압축해제시 나온 proframe 디렉토리의 Full Path를 입력
jeus_dir=/home/proframe/jeus5 -> 설치해 놓은 JEUS 의 설치경로( ${JEUS_HOME} 과 동일)
2. DB 관련 설정
# DB Info
DB_VENDOR=oracle -> DB 의 Vendor 를 설정한다. DB 에 따라서 사용되는 Query 및 DB 접속정보가 결정된다.
db_oracle_9i=false -> 사용하려는 DB 가 Oracle 9i 인 경우에는 true 로 설정하고, 그 외에는 false 로 둔다.
dbserverip=192.168.0.0 -> DB Server 의 IP
dbserverport=1521 -> DB 의 Service Port
dbserverid=proframe -> ProFrame 4 Java용으로 DB 에 생성한 User
dbserverpwd=proframe -> ProFrame 4 Java용으로 DB 에 생성한 User 의 Password
dbserversid=ora10 -> DB Server 의 ID. Oracle 의 경우 SID, 다른 DB 의 경우 Service Name 또는 Server Name
3. ProFrame WAS 의 포트정보 설정
# ProFrame Port Info
pfm_admin_port=9876 -> ProFrame 4 Java의 admin이 사용할 Port. http://서버IP:9876/proframeAdmin으로 접속한다.
devsvr_port=33323 -> ProFrame 4 Java의 통합개발서버가 사용할 Port.
ProBuilder에서 Project 생성시 사용하는 Port
ippr_port=5020 -> ProFrame 4 Java의 통합개발서버가 변경사항 발생시 Notify 를 주는 port
4. 그 외의 설정들은 특별한 문제가 없다면 기본값을 그대로 사용한다.




1.개발 아키텍쳐 개요


2.통합 개발 환경 관리 - 통합 개발 서버



메모리 1G 이상..

하드디스크 1G이상 ..여유공간.


145번 패치 설치

현재 160번 까지 나옴.


33323

test10 / test10

PROJECT_TEST10



5.오브젝트 생성


PO : pattern Object



1.로컬 디버거

로컬에서 디버깅을 할수 있다..

하지만 로컬 디버깅 할 소스와 파일들을 모두 다운 받아 재구성 해야한다. (패치나와도 다시해야함)


제우스 설정과 , 환경설정 파일 다운 받는다.

Windows\System32\dirvers\etc\hosts 파일을 열어 프로프레임 설치 서버 IP 와 HostName입력




DBIO

  • DataBase Input/Output
    - 데이터베이스를 쉽고 일관된 API로 접근할 수 있도록 해주며 업무컴포넌트 개
    발시에 데이터베이스 벤더에 관계없이 코딩할 수 있도록 해준다.

DTO


- Data Transfer Object
- Java Object, DBIO 를 호출하기 위한 IN, OUT 객체로 사용된다.


BO

- Business Object
- 비즈니스 기능을 수행하는 재사용성의 단위로서 Service Object에서 레퍼런스
호출 되며 정보 처리 및 계산 그리고 DBIO 호출 후 데이터 가공 등을 수행한다.



DTO

Data Transfer Object
- Java Object, DBIO 를 호출하기 위한 IN, OUT 객체로 사용된다.


SO

- Service Object - 외부에 오퍼레이션을 노출할 수 있는 리소스 단위로서 단위
트랜잭션 수행의 단위이며 IPPR을 통해 분기되어 호출된다.주로 Business
Object를 Orchestration(통합)하는 Flow 중심 어플리케이션이다.


PROMAPPER

입출력 전문을 정의하고 전문클래스를 생성하고 전문데이타를 받아서 객체로 변
환하거나 객체를 전문데이타로 변환하는 등의 일을 수행한다.




EMB

Enterprise Module Bus의 약자로 서비스 모듈이 만들어지면, 그 모듈들을 조합하
여 다양한 새로운 서비스를 만들 수 있는 서비스 기반의 아키텍처이다.


메가 플로우 마이크로 플로우, 인터 soa intra soa



Deployment Descriptor

  • Service Object 작성이 끝나면 Deployment Descripter를 실행해야 한다.
    - 개발 어플리케이션에 대한 명세


어플리케이션

  • 업무적으로 연관있는 서비스를 그룹핑하여 패키징, Deploy하는 단위.
    (EJB Class 의 DD 명세를 작성하는 것과 의미적으로 유사하다.)
    어플리케이션을 생성하고





2.서비스 작성 절차

1 Service 설계 - 서비스 처리에 대한 설계서 작성
- DTO Class에서 사용하는 멤버 변수의 이름을 메타 시스템에 등록
- DTO Class 구조정의


2.DTO 객체정의

3 DBIO 정의


4 BO 정의


5 SO 정의


DTO(Data Transfer Object)


1. 개요
- DTO는 클래스 호출을 위하여 의미 있는 값을 전달할 수 있는 구조를 정의
2. 메타등록
- 사용할 변수는 사전에 메타에 등록되어야 한다. 보통 DB CRUD를 위해 사용되므
로 DB에 정의된 칼럼을 사전에 메타 시스템에 등록하여 사용하는 것을 권장한다.
- 메타를 등록하려면 ProframeAdmin 에 접속한 후
Integrated Development Server > Meta Management 화면을
이용하면 된다.



4. DBIO(DataBase Input/Output)

  1. 개요
    - ProFrame에서 제공하는 데이터베이스 접근에 관한 표준적인 방법으로 데이터베
    이스의 데이터를 Control 하는 Class이다.
    2. 특징
    ⓐ DB 접근 방식을 표준화한다. ⓑ DB 접근 시 일괄된 에러 처리를 지원한다.
    ⓒ DBMS 벤더에 대한 의존성을 배제할 수 있다.
    ⓓ 중복된 데이터 베이스 프로그램을 최소화한다.
    ⓔ 업무로직과 DB 접근 로직에 신경 쓰지 않고 업무로직에 전념할 수 있다.
    ⓕ Tool을 이용하여 생산성 향상시키고 오류 가능성을 줄여준다.


Persist SELET/UPDATE/INSERT/DELETE 단일테이블

View SELECT(조인, 서브쿼리) 여러 테이블

Execute INSERT/UPDATE/DELETE Persist 에서 지원할 수 없는 범위에서 수행


5.BO(Business Object)

1. 개요
- 비즈니스 기능을 수행하는 재사용성의 단위로서 Service Object 에서 레퍼런스 호
출되며, 정보 처리 및 계산 그리고 DBIO 호출 후 데이터 가공 등을 수행한다.
2. BO 작성하기
- 패키지탐색기 > 오른쪽 마우스클릭 > 새로작성 > Business Object
- Add on Operation : public 메소드 생성
- BO의 입출력 DTO를 선택
- 생성된 public method를 더블 클릭하여 EMB 디자이너 창으로 이동
- EMB 디자이너 창에서 Palette을 열어서 inner 모듈 등록
- Object Pool을 검색하여 등록된 DBIO를 Drag&Drop
- DBIO 선택 후 속성창에서 DBIO Call을 설정


6.SO(Service Object)

  1. 개요
    - 외부에 오퍼레이션을 노출할 수 있는 리소스 단위로서 단위 트랜잭션 수행의 단위
    이며 IPPR을 통해 분기되어 호출, BO를 Orchestration 하는 Flow 중심 어플리케
    이션이다.
    2. SO 작성하기
    - 패키지탐색기 > 오른쪽 마우스클릭 > 새로작성 > Service Object
    - Add on Operation : public 메소드 생성
    - SO의 입출력 DTO를 선택
    - 생성된 public method를 더블 클릭하여 EMB 디자이너 창으로 이동
    - EMB 디자이너 창에서 Palette을 열어서 inner 모듈 등록
    - Object Pool을 검색하여 등록된 BO를 Drag&Drop

SO가 비즈니스 로직을 오케스트레이션 함 SOA 에서 사용 웹 서비스

BO를


7.Application Deploy

  1. Deployment 절차
    - 작성된 리소스를 모두 커밋
    - Service Object 작성이 끝나면 Deployment Descripter를 실행
    - Deployment Descripter를 한 후에 작업한 프로젝트 Meta-INF에
    proframe-application.xml을 커밋

절차 시험엔 안나옴.

 커밋 : 로컬의 수정 사항을 서버로 전송.

체크인  :  DB 가꼬감.

체크 아웃 :

동기화 : 최신 버전으로 맞춘다.


8.Service Test(1/2)

ppt 4번 ..

Posted by 1010
98..Etc/Resin2009. 5. 18. 18:20
반응형
** resin 설치법 **

1. www.caucho.com ->download
	(http://www.caucho.com/download/index.xtp)
	다운받은 뒤 압축 풀어서 c:\resin 갖다놓기!

2. jar파일 옮겨놓기!
	jsdk23.jar파일을 복사
	(경로) c:\program files\java\jdk1.5\jre\lib\ext에서 jsdk23.jar복사->
		c:\resin\lib 붙여넣기

** resin.conf파일설정 **
1. 커넥션풀 설정하기(ctrl+F:찾기기능 이용)//데이터베이스 연결
	
	<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:@127.0.0.1:1521:orcl"/>
	  <init-param user="system"/>
	  <init-param password="admin"/>
	  <init-param max-connections="20"/>
	  <init-param max-idle-time="30"/>
	</resource-ref>

2. port 설정하기
  <!-- the http port -->
  <http port='80'/> 
  : port='8080'충돌날 경우 다른 포트로 수정
  : port='80'의 경우 http://localhost/경로명 
 
 3. 기준폴더 변경
	<doc-dir>c:\dada</doc-dir>
	dada폴더 밑에 WEB-INF\classes 폴더 생성
	
    3.1 servlet폴더,jsp폴더 각각주기
	<web-app id='myservlet'/>
	dada\myservlet\WEB-INF\classes 폴더생성
	
	<web-app id='jsp'/>

※ 주소창 > http://localhost/myservlet/servlet/HelloServlet

기본적으로 doc바로 아래에 .http .jsp .txt 그림파일 등등 놓는다.
		doc\WEB-INF\classes .java 파일을 놓는다.
		->폴더안에 폴더를 만들 경우 패키지를 추가해야된다.

** tip! **
c:\program files\editplus\template.jsp 만들기
editplus 프로그램 실행 후, 도구-사용자도구구성-jsp추가

	템플릿안에,
	<%@page contentType="text/html;charset=KSC5601"%>
	저장!

** war압축 **
프로그램 실행 할 때 필요한 폴더를 생성한 후 .jsp넣고 WEB-INF\classes 폴더안에 .java
그림파일은 ..\images폴더 생성후 그림파일 넣어서 실행>cmd 
c:\생성한 폴더> jar -cvf(압축풀기:-xvf) 이름.war (엔터) 
압축한 폴더는
c:\resin\webapps 안에 넣어주고
http://localhost/폴더명/첫실행파일명(index.jsp로 저장하지 않은경우)
Posted by 1010
98..Etc/Etc...2009. 5. 9. 11:00
반응형
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript" type="text/JavaScript">
var resultCode = "";
var resultMessage = "";
if (!(resultCode == null || resultCode == "" || resultCode == "0")) {
alert(resultMessage);
}
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
function reset(fileName){
var form = document.cybpsn;
form.fileName.value = null;
}
// 이 chk는 제목 및 내용에서 초기 안내설명을 지우기 위해 사용된다.
// 클릭하면 내용이 지워지는데 ,초기 클릭 후 내용 작성중 다시 클릭을 하면 작성한 내용이 지워지는것을 방지하기 위해서 만들었다.
var chk = 0;
var chk2 = 0;
// 초기값이 0이다.0일때만 지워지고,그 이후로는 chk값이 증가하므로 reset이 되지 않는다.
function resetTitle(){
if(chk == 0){
var form = document.myform;
form.title.value = "";
form.title.reset;
}
chk++;
}
function resetCont(){
if(chk2 == 0){
var form = document.myform;
form.cyb_cont.value = "";
form.cyb_cont.reset;
}
chk2++;
}
String.prototype.trim = function() {
// Use a regular expression to replace leading and trailing
// spaces with the empty string
return this.replace(/(^\s*)|(\s*$)/g, "");
}
function submitForm(){
var form = document.myform;
if (!check()) {
return;
}
form.target = "_self";
form.action = "/acrc/civilinfo/H_NoticeC.do?command=moveToHNotice02";
form.submit();
}
function check() {
var form = document.myform;
if (form.title.value.trim() == "" || chk == 0) {
alert("제목을 입력하십시오");
form.title.focus();
return false;
}
if(form.cyb_cont.value.trim() == "" || chk2 == 0) {
alert("내용을 입력하십시오");
form.cyb_cont.focus();
return false;
}
if(textareaLength('cyb_cont') > 2000) {
alert("내용은 2000자 까지만 입력하실수 있습니다");
form.cyb_cont.focus();
return false;
}
return true;
}
function textareaLength(element) {
var el = document.getElementById(element);
return el.value.length;
}
function disableForm(){
var form = document.myform;
form.title.disabled = true;
form.cyb_cont.disabled = true;
form.disabled = true;
document.infoYn.prvInfoYn.value = "N";
}
function enableForm(){
var form = document.myform;
form.title.disabled = false;
form.cyb_cont.disabled = false;
form.disabled = false;
document.infoYn.prvInfoYn.value = "Y";
}
//-->
</script>
<link href="/acrc/css/contents_style.css" rel="stylesheet" type="text/css">
</head>
<body onload="">
<!---- 본문 테이블 시작 --->
<table width=663 border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="16" colspan="3"><table width="663" border="0" align="center" cellpadding="10"
cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td bgcolor="#FAFAFA">
<table width="564" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="507" class="line">ㆍ사실확인을 위해 <font color="#FF0000">*</font>
는 반드시 입력하여 주시기 바랍니다. <br>
ㆍ접수된 신고 건은 보안을 위해 <strong><font color="#2C74C5">홈페이지에 자료를 남기지 않으므로 수정이나 삭제를 <br>
&nbsp;&nbsp;할 수 없으니 신중하게 작성하여 주십시오.</td>
</tr>
</table>
</td>
</tr>
</table></td>
</tr>
<tr>
<td height="8" colspan="3"> </td>
</tr>
<tr>
<td height="16" colspan="3"> <table width="663" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="16"><img src="../img/tit_sub_bar01_left.gif" width="16" height="24"></td>
<td width="596" bgcolor="42A9C2"><strong><font color="#FFFFFF">신고접수</font></strong></td>
<td width="51" bgcolor="42A9C2"><div align="right"><img src="../img/tit_sub_bar01_right.gif" width="16" height="24"></div></td>
</tr>
<tr>
<td colspan="3"><img src="../img/blank.gif" width="10" height="4"></td>
</tr>
</table></td>
</tr>
<tr>
<td colspan="3"> <form name="myform" method="post" enctype="multipart/form-data">
<input type="hidden" name="cyb_type_cd" value="04002">
<input type="hidden" name="code_nm" value="신고상담">
<input type="hidden" name="fileCheck" value="fileCheck">
<table width="663" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="tb_subject"> <table width="663" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="106" height="27" class="tb_main02">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;제목
<font color="#FF0000">*</font></td>
<td width="566" height="27" class="tb_main"><input name="title" type="text" class="input_text" size="84" value=" * 신고 내용을 잘 나타낼 수 있는 단어로 제목을 작성해 주십시오."
onClick="javaScript:resetTitle();" maxlength="100"></td>
</tr>
<tr>
<td width="106" height="27" class="tb_main02">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;신고내용<font color="#FF0000">
*</font></td>
<td height="27" class="tb_main"><textarea name="cyb_cont" cols="82" rows="15" class="input_text51"
onClick="javaScript:resetCont();" maxlength="2000"> * 부패행위 내용을 6하 원칙에 따라 구체적으로 기술하여 주십시오.
- 누가 : 신고와 관련된 공직자의 소속, 직위, 성명 등을 기재
- 언제 : 부패행위가 발생한 시점을 기재
- 어디서 : 부패행위가 발생한 장소를 기재
- 무엇을ㆍ어떻게 : 혐의대상자의 권한남용,법령위반 행위를 기재
- 왜(~을 위하여) : 자신 또는 제3자가 받은 이익의 내용 등을 기재
</textarea></td>
</tr>
<tr>
<td width="106" height="27" class="tb_main02">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;증거서류1</td>
<td height="27" class="tb_main"> <input type="file" name="formFiles[0]" id="formFiles1" class="input_text" size="68">
</td>
</tr>
<tr>
<td width="106" height="27" class="tb_main02">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;증거서류2</td>
<td height="27" class="tb_main"> <input name="formFiles[1]" type="file" id="formFiles2" class="input_text" size="68">
</td>
</tr>
<tr>
<td width="106" height="27" class="tb_main03">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;증거서류3</td>
<td height="27"> <input name="formFiles[2]" type="file" id="formFiles3" class="input_text" size="68">
</td>
</tr>
</table></td>
</tr>
</table>
</form></td>
</tr>
<tr>
<td width="95" valign="bottom">&nbsp; </td>
<td width="609" valign="bottom"> <img src="../img/btn_next.gif" id="subBtn" width="45" height="20" border="0">
버튼을 누르시고 신고자,혐의대상자 정보를 입력하여 주십시오.</td>
<td width="39"><div align="right">
<p class="btn"><a href="javaScript:submitForm();"><img src="../img/btn_next.gif" id="subBtn" width="45" height="20" border="0"></a></p>
</div></td>
</tr>
<tr>
<td colspan="3">&nbsp;</td>
</tr>
</table>
<!---- 본문 테이블 끝 --->
<script>
parent.pageUrlFrameCalcHeight();
</script>
</body>
</html>
Posted by 1010
98..Etc/Resin2009. 5. 6. 10:55
반응형

resin 4.0 documentation


    Overview

    Resin is a high-performance, scalable Java/PHP application server. We release two versions of Resin: an open source version under the GPL, and a professional version with enhanced performance, clustering, and reliability features.

    Quick Start

    You can start using Resin by simply expanding the archive, and starting Resin with a Java command line.

    Installation

    Resin Web Server
    Apache
    IIS
    Plugin Dispatch
    Linux Boot

    Command-Line

    While most configuration options have been made available in resin.xml, this section describes some common command-line options.

    Configuration

    Resin is a powerful, customizable application server. This section discusses how to configure Resin.

    <cluster> - clustering, caching, load-balancing, and distributed sessions
    <database> - connection pool and database driver configuration
    <host> - virtual hosts
    Ports - HTTP, SSL, addresses and ports
    <resin> - top-level configuration container
    Resource tags - database, classloader, jms, bean, and IoC
    Rewrite - URL rewriting, dispatching, and load-balancing
    <server> - threading, keepalive, timeout, and jvm arguments
    session - servlet sessions
    variables - configuration variables
    <web-app> - servlet and filter configuration
    Index - alphabetical list of tags
    Relax Schema
    Environment
    Resin J2EE
    Resin web.xml
    resin.conf
    J2EE Common
    J2EE web.xml

    Guide: Admin

    Overview and introduction to Resin from an administration perspective.

    Admin

    The /resin-admin web-app provides an administration overview of a Resin server. Resin-Pro users can obtain information across the entire cluster, profile a running Resin instance, and obtain thread dumps and heap dumps.

    All Resin users should familiarize themselves with the thread dump, profile, and heap capabilities.

    Amber

    Amber is Resin's implementation of the JPA 1.0 persistence specification, focusing on simplicity and quality.

    BAM

    BAM (Brokered Agent Messaging) is a simplified messaging API designed around federated, addressable services, model-based messages, and supports both message and rpc-style communication. As an abstraction of the Jabber protocol, it supports instant messaging, queued (SEDA) services, publish/subscribe, interactive games, and event notification applications. BAM supports multiple protocols including local messaging, Hessian protocol and XMPP (Jabber).

    Caching

    Server caching can speed dynamic pages to near-static speeds. When pages created by database queries only change every 15 minutes, e.g. CNN or Wikipedia or Slashdot, Resin can cache the results and serve them like static pages. Because Resin's caching only depends on HTTP headers, it will work for any JSPs, servlet or PHP page.response.

    Resin's caching operates like a proxy cache, looking at HTTP headers to compare hash codes or digests or simply caching for a static amount of time. Since the proxy cache follows the HTTP standards, applications like Mediawiki will automatically see dramatic performance improvement with no extra work. You can even cache REST-style GET requests.

    Because the cache supports advanced headers like "Vary", it can cache different versions of the page depending on the browser's capabilities. Gzip-enabled browsers will get the cached compressed page while more primitive browsers will see the plan page. With "Vary: Cookie", you can return a cached page for anonymous users, and still return a custom page for logged-in users.

    Clustering

    As traffic increases beyond a single server, Resin's clustering lets you add new machines to handle the load and simultaneously improves uptime and reliability by failing over requests from a downed or maintenance server to a backup transparently.

    Database

    Resin provides a robust and tested connection pool that is used to obtain connections to databases.

    Deployment

    Resin provides a wide variety of custom packaging and deployment options.

    EJB 3.0

    Resin's EJB support is integrated with Resin IoC. This integration means plain Java beans can use EJB annotations and interception, EJBs can use Resin IoC annotations, and both kinds of beans can be configured directly from the resin-web.xml or discovered by classpath scanning.

    Embedding

    Resin's embedding API lets developers embed Resin as the web interface for an existing application, simplifies unit testing, and improves IDE integration capabilities. The ResinEmbed JavaDoc gives more details.

    Filters

    Hessian

    Hessian and Burlap are compact binary and XML protocols for applications needing performance without protocol complexity. Hessian is a small binary protocol. Burlap is a matching XML protocol. Providing a web service is as simple as creating a servlet. Using a service is as simple as a JDK Proxy interface.

    Hessian
    Hessian 1.0 spec
    Hessian 2.0 draft spec
    Java Binding
    Burlap

    IoC

    Resin is designed around the Java Dependency Injection specification (JSR-299), an inversion-of-control framework used for all configuration and resources including servlets, EJBs, messaging, remoting, and databases. Applications can take advantage of Java Injection using standard annotations and interfaces.

    Since Resin-IoC is used for servlets, WebBeans and EJBs, any application bean can use EJB annotations like @TransactionAttribute or WebBeans @InterceptionTypes or event @Observes capabilities, in addition to the dependency injection and IoC configuration.

    The dependency injection framework is type-safe, meaning the registry is organized around Java types, not a flat namespace, which gives more power and flexibility for component assembly. Since injection is annotation-based, most components can avoid XML configuration, while XML is still available for components.

    JSF

    As of Resin version 3.1.6 Resin supports JSF 1.2. JSF specification defines a base set components for capturing user input and displaying output. Resin implements the spec from the ground up to take advantage of Resin's unique, high performance features. The two most notable features that make Resin's JSF fast are use of serialization mechanism implemented in Hessian protocol for JSF state handling and a fast-jsf mode of JSP generation.

    Along with the features orientated at performance advantage Resin's JSF offers integration with Web Beans (JSR 299). If you are using JSF's managed bean facility you can go straight to minimizing the amount of XML configuration by using Web Beans defined ways instead (will be shown below).

    JSP

    JSP creates output (such as HTML) from template text and scripting actions. Template text is returned verbatim to the requesting client, and actions are used to fill in dynamic values and do things conditionallly.

    Introduction
    Compilation
    EL
    JSTL
    Directives
    Variables
    Actions
    Applications
    Schema for JSP-2.0 .tld files
    Velocity syntax
    JSP Templates

    Logging

    Resin can perform access logging, specify where JDK logging interface messages go, and redirect the stderr and stdout for your applications.

    Messaging

    Configuration for Resin's JMS provider implementation. The JDBC Queues and Topics provide a persistent messaging store. The Memory Queues and Topics provide a low-overhead memory-based store.

    Performance

    Benchmarks
    JVM Tuning
    Performance FAQ
    Performance Scrapbook
    Tuning

    Quercus/PHP

    Quercus is Caucho Technology's fast, open-source, 100% Java implementation of the PHP language. Performance is 4x mod_php and is comparable with PHP accelerator performance. Quercus uses Resin-IoC/WebBeans to integrate with Resin services.

    Security - Quercus gains security advantages from the JVM platform
    Module Status

    Remoting

    Resin's remoting lets applications write services as plain Java objects and export them with a choice of protocols, including Hessian, Burlap, CXF (SOAP), XFire. Because Resin activates the service as an IoC singleton, the service can use any of Resin's IoC capabilities, including dependency injection, AOP interception, EJB transactions, and event handling.

    For applications which need to use a custom protocol, making a new driver for a protocol is also straightforward.

    Scheduled Tasks

    Resin's <resin:ScheduledTask> capability lets you schedule events using a flexible cron-style trigger. The task can be any Runnable bean, a method specified by EL, or a URL.

    Security

    Server Push

    Resin's server-push (Comet) servlet API enables streaming communication such as reverse AJAX dynamic updates for browser/JavaScript applications. The API encapsulates of the threading and communications issues between the request threads and the rest of the application.

    Servlets

    Servlets are Java classes which service HTTP requests. The only requirement for writing a servlet is that it implements the javax.servlet.Servlet interface.

    Servlets are loaded from the classpath like all Java classes. Normally, users put servlets in WEB-INF/classes so Resin will automatically reload them when they change.

    JSP pages are implemented as Servlets, and tend to be more efficient for pages with lots of text.

    Third-party

    Resin's support for third-party libraries and packages is primarily documented at http://wiki.caucho.com. This section includes links to the most popular packages.

    Troubleshooting

    A list of symptoms and their possible resolution.

    Virtual Hosting

    A Resin server can serve many virtual hosts, each with its own servlets and documents. The configuration is flexible, allowing dynamic host deployment in a hosts directory or using explicit <host> tags for additional control and security, and compatibility with existing Apache sites, enabling easy upgrades and evaluation for PHP servers to Quercus.

    Watchdog

    For reliability and security, Resin servers are started and monitored by a separate Resin watchdog process. The watchdog continually checks the health of the Resin server and restarts the Resin instance if is becomes unresponsive.

    In most cases, the watchdog reads the resin.xml and configures itself automatically, so no extra configuration is required. Certain specialized configurations like ISPs can configure the watchdog to isolate JVMs for protection and security.

    WebApp

    A web application is a self-contained subtree of the web site. It uses Servlets, Filters, JSP, and the functionality provided by Resin and any other java code to provide a response to a client that makes an HTTP request.

    XML and XSLT

    Introduction
    JAXP
    XML Path Language (XPath)
    XSLT Filter
    XSLT
    XPath Functions
Posted by 1010
98..Etc/Etc...2009. 5. 4. 17:40
반응형

기본 화면 메뉴 만들기(Flash Professional만 해당)

이 단원에서는 응용 프로그램의 기본 화면에 메뉴를 만듭니다. 이 메뉴는 Specials, View Video 및 Reservations의 세 가지 옵션으로 구성되어 있습니다.

  1. 테스트 장치 및 내용 형식 선택 (Flash Professional만 해당)에서 저장한 파일을 Flash Professional 8에서 엽니다.
  2. 타임라인 윈도우(윈도우 > 타임라인)의 메뉴 레이어에서 프레임 1을 선택합니다.
  3. 메뉴를 만들기 위해 라이브러리 패널(윈도우 > 라이브러리)을 열고 specials button 심볼을 스테이지로 드래그합니다.

    레스토랑을 소개하는 텍스트 필드(이미 만들어져 있음) 아래에 버튼을 배치합니다.

  4. specials button을 선택한 상태로 속성 관리자에서 인스턴스 이름 텍스트 상자에 specials_btn을 입력합니다.
  5. video button 심볼의 인스턴스를 스테이지로 드래그하여 specials button 아래에 배치합니다.
  6. video button을 선택한 상태로 속성 관리자에서 인스턴스 이름 텍스트 상자에 video_btn을 입력합니다.
  7. reservations button 심볼의 인스턴스를 스테이지로 드래그하여 video button 아래에 배치합니다.
  8. reservations button을 선택한 상태로 속성 관리자에서 인스턴스 이름 텍스트 상자에 reservations_btn을 입력합니다.

    응용 프로그램의 스테이지가 다음 예와 같은 모습이어야 합니다.



  9. 타임라인의 ActionScript 레이어에서 프레임 1을 선택합니다.
  10. 액션 패널(윈도우 > 액션)에 다음 코드를 입력합니다.
    stop();
    _focusrect = false;
    fscommand2("SetSoftKeys", "Set Location", "Exit");
    fscommand2("SetQuality", "high");
    fscommand2("Fullscreen", "true");
    

    이 코드는 다음과 같은 작업을 수행합니다.

  11. 이 프레임에서 재생 헤드를 중단합니다.
  12. Flash Lite에서 기본적으로 현재 포커스를 갖고 있는 버튼 또는 입력 텍스트 필드 주위에 표시되는 포커스 사각형이 나타나지 않도록 합니다(Flash Lite 2.x 응용 프로그램 개발의 초점 사각형 참조).
  13. 응용 프로그램에서 사용할 소프트 키를 등록합니다.
  14. 플레이어의 렌더링 품질을 높게 설정합니다. 기본적으로 Flash Lite는 그래픽 내용을 보통 품질로 렌더링합니다.
  15. 플레이어에서 응용 프로그램을 전체 화면으로 표시하도록 합니다.

    Flash Lite가 전체 화면 모드일 때는 SetSoftKeys 명령에서 지정한 레이블이 표시되지 않습니다. 따라서 스테이지에 사용자 정의 소프트 키 레이블을 추가해야 합니다.

  16. 다음 코드를 추가하여 메뉴 버튼과 선택 포커스에 대한 버튼 이벤트를 처리합니다.
    // 응용 프로그램을 시작할 때와 다른 화면에서
    // 기본 화면으로 돌아올 때 초기 포커스를 
    // 설정합니다.
    if (selectedItem == null) {
        Selection.setFocus (specials_btn);
    } else {
        Selection.setFocus (selectedItem);
    }
    // 각각의 메뉴 버튼에 onPress 이벤트 핸들러를 할당하고
    // selectedItem 변수를 
    // 선택된 버튼 객체로 설정합니다.
    specials_btn.onPress = function () {
        gotoAndStop ("specials");
        selectedItem = this;
    };
    video_btn.onPress = function () {
        gotoAndStop ("video");
        selectedItem = this;
    };
    reservations_btn.onPress = function () {
        if (location_so.data.phoneNumber == undefined) {
        // 사용자가 위치를 지정하지 않았으므로
        // "위치 설정" 화면으로 이동합니다.
            gotoAndStop ("options");
        }
        else {
            // 공유 객체에 번호를 호출합니다.
            var phoneNum = location_so.data.phoneNumber;
            getURL ("tel:" + phoneNum);
        }
        selectedItem = this;
    };
    

    specials_btnvideo_btn이라는 버튼에 할당된 onPress 이벤트 핸들러가 각각 "specials" 및 "video" 프레임으로 재생 헤드를 보냅니다. 위의 단원에 대한 내용은 이 자습 과정의 뒷부분에서 만들 것입니다(스페셜 화면 만들기(Flash Professional만 해당)비디오 화면 만들기(Flash Professional만 해당) 참조).

    사용자가 Reservations 옵션을 선택하면 onPress 핸들러가 location_so 공유 객체에 지정된 전화 번호로 전화를 겁니다.(이 과정의 뒷부분에서 공유 객체를 만들기 위한 코드를 만들 것입니다.) 사용자가 예약 전화를 할 레스토랑 위치를 아직 지정하지 않은 경우에는 응용 프로그램에서 재생 헤드를 "options" 프레임으로 보내어 거기서 사용자가 예약하려는 레스토랑 위치를 선택하도록 합니다.

  17. 이제 다음 코드를 추가하여 왼쪽 및 오른쪽 소프트 키에 대한 키 리스너를 만듭니다.
    Key.removeListener(myListener);
    var myListener:Object = new Object();
    myListener.onKeyDown = function() {
        var keyCode = Key.getCode();
        if (keyCode == ExtendedKey.SOFT1) {
            // 왼쪽 소프트 키 이벤트 처리
            gotoAndStop("options");
        } else if (keyCode == ExtendedKey.SOFT2) {
            // 오른쪽 소프트 키 이벤트 처리 
            fscommand2("Quit");
        }
    };
    Key.addListener(myListener);
    

    이 코드는 키 리스너 객체를 사용하여 왼쪽 및 오른쪽 소프트 키 이벤트를 처리합니다. 사용자가 왼쪽 소프트 키를 누르면 재생 헤드가 "options" 프레임으로 보내지고 오른쪽 소프트 키를 누르면 응용 프로그램이 종료됩니다.

    이벤트 리스너 사용에 대한 자세한 내용은 Flash Lite 2.x 응용 프로그램 개발의 키 수신기를 사용하여 키 누르기 이벤트 처리(Flash Professional만 해당)를 참조하십시오.

  18. 마지막으로 코드를 추가하여 예약하려는 레스토랑의 위치를 저장하는 공유 객체를 초기화합니다.
    // 공유 객체 리스너 함수를 정의합니다.
    function so_listener (the_so:SharedObject) {
        if (the_so.getSize () == 0) {
        // 공유 객체가 존재하지 않으므로 
        // 사용자가 아직 환경 설정을 하지 않았습니다. 
        }
        SharedObject.removeListener ("location");
    }
    // 공유 객체를 만듭니다.
    location_so = SharedObject.getLocal ("location");
    // SharedObject 리스너 객체를 추가합니다.
    SharedObject.addListener ("location", this, "so_listener");
    
  19. 지금까지 만든 작업을 테스트하려면 컨트롤 > 무비 테스트를 선택합니다.

    이때 사용자가 해당 버튼에 포커스를 두고 에뮬레이터의 선택 키 또는 컴퓨터 키보드의 Enter 키를 눌러서 메뉴 항목을 선택할 수 있어야 합니다. 다음 단원에서는 스페셜 화면, 비디오 화면 및 기본 위치를 지정하는 화면을 만들 것입니다.

Posted by 1010
98..Etc/Tomcat2009. 4. 28. 13:24
반응형

목차

1 Apache/Tomcat 연동시 jsp/servlet 은 Tomcat으로, 나머지는 Apache가 처리하게 설정하기
2 TOMCAT5에서 한글넘겨받을때
3 TOMCAT5 에서 Altibase DB Pool 설정
4 Tomcat5 Only 일때 디렉토리 내 심볼릭 링크가 안먹힐 때
5 Apache Tomcat Native library not found on the java.library.path
6 80 포트로 띄우고 싶을때
6.1 ipchains/iptables 이용하기
6.2 JSVC 를 이용하기
6.3 CoyoteConnector
7 @include 로 포함한 페이지의 한글이 깨질 때
8 common-fileupload 사용시 넘겨받은 한글 파라메터가 깨질 때
9 Tomcat 5.x 에서 jsp 내의 스크립틀릿 사용금지하기
10 Tomcat 5.0 -> Tomcat 5.5 이후 forward 된 jsp 에서 request.getRequestURI() 의 값이 이상해진 경우


1 Apache/Tomcat 연동시 jsp/servlet 은 Tomcat으로, 나머지는 Apache가 처리하게 설정하기 #


mod_jk로 연동하는 경우 아파치의 httpd.conf 에

JkMount /* worker1

와 같은 식으로 처리해 버리는 경우가 많은데, 이렇게 하면 jsp/servlet 같은것들 뿐만 아니라 이미지/css/js 같은 static resource 들도 죄다 tomcat 이 처리하게 된다.
기본적으로 static resource 들은 apache 가 처리하도록 하고 jsp/servlet 등의 처리만 Tomcat 이 맡아 처리하는 것이 좋다.
만약 jsp 파일 또는 Struts1/Struts2 만 사용한다면(그리고 확장자를 .do 와 .action 으로 쓴다면) 이런 경우 설정을

JkMount /*.do worker1
JkMount /*.action worker1
JkMount /*.jsp worker1

와 같은 식으로 하면 된다.

물론 worker1 은 jk.properties 에서 worker.list 에 지정한 그 이름으로 맞추어야 한다.


2 TOMCAT5에서 한글넘겨받을때 #


요즘은 웹사이트를 만들때 UTF-8로 인코딩을 하는 경우가 많은데, UTF-8 페이지에서 게시물을 한글로 입력한 다음 jsp 또는 servlet 에서 넘겨받아서 DB 에 저장하거나 할때 한글이 깨지는 경우가 있다. (당근 POST 로 넘기겠지...)

그럴때는 jsp 또는 serlvet 상단에

request.setCharacterEncoding("utf-8");

라고 해주면 깔끔하게 해결된다. (request 가 내장객체로 있으니 뭐.. Servlet 이라면 함수파라메터명에 맞춰서 적어주면 되겠다)
물론 Tomcat4 도 마찬가지.
당연한 이야기지만 setCharacterEncoding 은 request.getParameter 등의 함수를 호출하기 전에 사용되어야 한다.

3 TOMCAT5 에서 Altibase DB Pool 설정 #


며칠동안 삽퍼면서 이것저것 바꿔봤다.

<Resource name="jdbc/mmsgw" auth="Container" type="javax.sql.DataSource"
        driverClassName="Altibase.jdbc.driver.AltibaseDriver"
        url="jdbc:Altibase://xxx.xx.xxx.xxx/mydb"
        initialSize="20"
        maxActive="50"
        maxIdle="20"
        maxWait="5000"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        logAbandoned="true"
        username="user"
        password="passwd"/>

파라메터 뜻은 대충

  • initialSize : 초기 DB Pool 생성시 connection 갯수
  • maxActive : connection 최고 증가 갯수
  • maxIdle : 노는 애들을 제거하지 않고 몇개나 놔둘것인가
  • maxWait : DB Pool 에서 Connection 을 가져올때 얼마나 기다릴 것인가 ( 밀리초 단위 )
  • removeAbandoned : 커넥션 끊어진거 제거해버리고 새로 넣고 어쩌구등등으로 할것인지 말것인지
  • removeAbandonedTimeout : 얼마나 자주 removeAbandoned 를 실행시킬것인지 (초단위)
  • logAbandoned : 처리상황 로깅

이정도?


4 Tomcat5 Only 일때 디렉토리 내 심볼릭 링크가 안먹힐 때 #


apache 등의 웹서버와의 연동 없이 tomcat만으로 웹서버까지 함께 쓸때 symbolic link 를 걸면 정상적으로 URL이 걸리지 않는다.
(404 not found 에러남)

이럴때는 Context 설정할에

allowLinking = "true"

로 설정해주면 된다.

예)
<Context 
path=""
docBase="httpd/html"
reloadable="true"
allowLinking="true"
debug="0">
</Context>

5 Apache Tomcat Native library not found on the java.library.path #


tomcat 을 실행시킬때 저런 에러가 계속 뜨는게 싫고 해결하고 싶다면

APR(Apache Protable Runtime) 을 우선 설치한 다음 설치되어 있는 톰캣 디렉토리의 bin 에 있는

tomcat-native.tar.gz

의 압축을 풀고, 그 아래에서

configure
make
make install

을 차례대로 해주면 된다.

만약 configure 시에 apr 못찾겠다는 오류가 나오면

./configure --with-apr=/usr/local/apr ( 아마 apr을 그냥 설치했으면 저 경로에 설치되었을 것이다 )

로 해주면 넘어간다.

그리고 LD_LIBRARY_PATH 를 apr 설치경로의 lib 로 잡아주면 된다. ( /usr/local/apr/lib 쯤 될것임 )

6 80 포트로 띄우고 싶을때 #


apache 와 같은 웹서버에서는 실행은 root로 하더라도 내부 설정에 User 또는 Group 을 지정할 수가 있는데 반해 tomcat 을 80포트로 띄우기 위해서는 root 로만 가능하다.
80포트를 쓰면서 root가 아닌 계정으로 톰캣을 띄우기 위한 몇가지 방법을 찾아서 정리해본다.
뭐 소스코드를 바꾸느니 어쩌니 하는 말들이 있는데 아무래도 그건 방법이 아니라고 생각한다.

6.1 ipchains/iptables 이용하기 #


ipchains 가 설치되어 있다면 다음과 같이 수정하면 된다.

ipchains -A input -d xx.xx.xxx.xx 80 -p tcp -j REDIRECT 톰캣리스닝포트

iptables 라면

iptables -t nat -A OUTPUT -d localhost -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -d your hostname -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -d your hostname -p tcp --dport 80 -j REDIRECT --to-ports 8080

이런식으로 하면 된다.


6.2 JSVC 를 이용하기 #


쓰고 있는 톰캣이 버전 5.0 이라면 저런거 안하더라도 jsvc 라는 걸로 특정 유저의 권한으로 tomcat 이 동작하도록 할 수 있다.
(jsvc : http://tomcat.apache.org/tomcat-5.5-doc/setup.html )

tomcat5 의 bin 에 보면

jsvc.tar.gz 라는게 있는데 다음 순서로 실행하면 된다.

    cd $CATALINA_HOME/bin
    tar xvfz jsvc.tar.gz
    cd jsvc-src
    autoconf
    ./configure
    make
    cp jsvc ..
    cd ..

실행은

   cd $CATALINA_HOME
    ./bin/jsvc -Djava.endorsed.dirs=./common/endorsed -cp ./bin/bootstrap.jar \
        -outfile ./logs/catalina.out -errfile ./logs/catalina.err \
        org.apache.catalina.startup.Bootstrap

이런식으로 하면 된다.
압축을 푼 디렉토리의 native/ 아래에 보면

Tomcat5.sh

라는 쉘스크립트가 있는데 나중에 /etc/init.d 같은데 넣어서 쓸 수 있도록 만들어준 스크립트다.
이걸 $CATALINA_HOME/bin/ 에다가 복사해 넣고 다음과 같이 살짝 바꿔서 쓰면 편리하다.

JAVA_HOME=/usr/java/jdk1.5.0_12
CATALINA_HOME=/usr/local/tomcat/5.5.23
DAEMON_HOME=/usr/local/tomcat/5.5.23/bin
TOMCAT_USER=사용자ID

# for multi instances adapt those lines.
TMP_DIR=/var/tmp
PID_FILE=/var/tmp/jsvc.pid
CATALINA_BASE=$CATALINA_HOME

CATALINA_OPTS=""
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar

case "$1" in
  start)
    #
    # Start Tomcat
    #
    $DAEMON_HOME/jsvc \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Dcatalina.base=$CATALINA_BASE \
    -Djava.io.tmpdir=$TMP_DIR \
    -wait 10 \
    -pidfile $PID_FILE \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap
    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    exit $?
    ;;

  stop)
    #
    # Stop Tomcat
    #
    $DAEMON_HOME/jsvc \
    -stop \
    -pidfile $PID_FILE \
    org.apache.catalina.startup.Bootstrap
    exit $?
    ;;

  *)
    echo "Usage tomcat.sh start/stop"
    exit 1;;
esac

6.3 CoyoteConnector #


CoyoteConnector 같은걸 쓴다면 HttpConnector 설정을 다음과 같이 바꿔서 해결할 수도 있다고 한다.(확인해보지 못했음)

<Connector
  className="org.apache.catalina.connector.http.HttpConnector"
  port="8080"
  proxyPort="80"
>


7 @include 로 포함한 페이지의 한글이 깨질 때 #


웹에 뒤져보니까 encoding filter 를 추가하는 방법부터 별별 쑈를 다해놨더라.
기본적으로 A.jsp 에서 B.jsp 를 인클루드하는 경우
파일 둘 다 UTF-8로 작성되어 있다면

A.jsp 에서
<%@page contentType="text/html;charset=utf-8"%>
<%@page pageEncoding="utf-8" %>

로 되어 있고
<%
    response.setContentType("text/html;charset=utf-8");
%>

로 되어 있다면

B.jsp 의 최상단에

<%@page pageEncoding="utf-8"%>

한줄만 추가해주면 끝난다.


아.. 물론 매 페이지마다 저런 짓 하기 싫으면 인코딩 세팅하는 필터 하나 구현해서 등록해서 써도 된다.


8 common-fileupload 사용시 넘겨받은 한글 파라메터가 깨질 때 #


resin 이나 다른곳에서도 그런지는 모르겠지만, 아무튼 tomcat5에서 common-fileupload 를 이용해서 넘겨받은 파라메터 중 한글이 깨지는 경우

item.getString();

대신

item.getString(인코딩타입);

을 적어주면 된다.

setCharacterEncoding
pageEncodping
setContentType

을 죄다 UTF-8로 해줘도, multipart/form-data 로 넘어오는 데이터를 실제로 처리하는 common-fileupload 에서는 인코딩이 별도로 먹히는 것 같다.
그럴때는 슬그머니

item.getString("utf-8");

로 적어주면 문제해결됨.

9 Tomcat 5.x 에서 jsp 내의 스크립틀릿 사용금지하기 #

<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>

10 Tomcat 5.0 -> Tomcat 5.5 이후 forward 된 jsp 에서 request.getRequestURI() 의 값이 이상해진 경우 #


해결책부터 적는다면 5.5에서는 getRequestURI() 대신에

request.getAttribute("javax.servlet.forward.request_uri");

를 사용하면 된다.

좀 더 자세하게 언급하자면 톰캣 5.5.7 이전의 구현이 잘못된 것이었고 SRV 8.4 에 따라 수정되었다.


이유가 궁금하신 분들은 아래쪽을 참고하시길.

Tomcat 은 버전별로 구현된 servlet 및 jsp 의 spec 버전이 다른데, Tomcat 5.x 류는 Servlet 2.4와 JSP 2.0 의 규격을 따른다.
Tomcat 6은 각각 2.5/2.1, Tomcat 4 는 2.3/1.2의 규격을 다른다.

Tomcat 5.x 가 따르는 Servlet 2.4 규격의 2.3. ReuqestDispatcher Forward Attribute 를 살펴보면

SRV.8.4 “The path elements of the request object exposed to the target servlet must reflect the path 
used to obtain the RequestDispatcher.”

와 같은 설명이 되어 있는데, getRequestURI 가 path method 인지의 여부가 불분명했기 때문에 getRequestURI() 에 대한 구현이 여러가지로 만들어졌다.

하지만 SRV.4.4 의

SRV.4.4 “It is important to note that, except for URL encoding differences between the request URI and the 
path parts, the following equation is always true: requestURI = contextPath + servletPath + pathInfo”

로 인해서 이 부분은 해결이 되었다.
requestURI 가 저렇게 구성이 되기 때문에 RequestDispatcher 를 통해 forward 된 다음에는 HttpServletRequest.getRequestURI() 의 값이 바뀌어야만 했고, 이로 인해서 client 로부터 들어왔던 원래의 request uri 를 알수가 없게 되었다.

바로 이 부분에서 기존의 Tomcat 5.0 은 이 부분의 구현을 규격대로 하지 않았던 것 같고, Tomcat 5.5 로 넘어오면서 규격대로 제대로 구현이 되며서 문제가 발생한다. ( 프로그래머의 입장에서는 잘 되던 코드가 동작하지 않게 된 것이겠지만... )


이 문제를 해결하기 위해서 규격 2.4에서는 다음의 forward 속성들을 추가했다.

javax.servlet.forward.request_uri
javax.servlet.forward.context_path 
javax.servlet.forward.servlet_path 
javax.servlet.forward.path_info
javax.servlet.forward.query_string

이 값들은 request.getAttribute(); 를 이용해서 가져올 수가 있다.
만약 해당 서블릿이 다른 곳에서도 재사용되는 것이라면 client 에서 요청한 uri 와 실제의 서비스된 uri (포워딩된 uri) 를 알기 이해서 아래와 같이 더블 체크해야 한다.

public void doGet(HttpServletRequest request, HttpServletResponse response)
{
  String uriUsedByClient=(String)
    request.getAttribute("javax.servlet.forward.request_uri");
  if (uriUsedByClient==null)
    uriUsedByClient=request.getRequestURI();
  String uriToServe=(String)
    request.getAttribute("javax.servlet.include.request_uri");
  if (uriToServe==null)
    uroToServer=request.getRequestURI();
  // ...
}

아래의 톰캣 5.5 chage log 를 살펴보면 5.5.7 버전의 Catalina 쪽 수정사항에 해당 부분의 버그가 수정되었다고 기록되어 있습니다.
http://tomcat.apache.org/tomcat-5.5-doc/changelog.html

28222: request.getRequestURL() in forwarded jsp/servlet returns original url rather than new url as per SRV8.4 (markt)


getRequestURL() 과 getRequestURI() 두개 모두 실제tomcat 5.5.7 이후부터는 forward 된 jsp 의 값이 출력되며 request.getAttribute("javax.servlet.forward.request_uri"); 를 써야 한다.
javax.servlet.forward.request_url 같은 속성값은 없다.
Posted by 1010
98..Etc/Log4J2009. 4. 24. 13:26
반응형

로그 찍는 거 별로 안좋아하는데 로그를 찍어보니까 더 좋은 것 같아요 ^^
게다가 log4j라는 매우 우수한 로그찍는 프로그램이 있습니다.
sysout에서 벗어나봅시다-_-; 습관적으로 sysout을-_-(System.out.println()......-_-)

우선 이클립스에서 프로젝트를 하나 만들어봅시다.
log4j를 받아봅시다.
http://logging.apache.org/log4j/1.2/download.html
1.2버전입니다. 받아서 log4j-1.2.15.jar파일을 라이브러리에 추가합시다.

log4j설정파일을 만들어봅시다.
최상위 폴더에다가 log4j.properties파일을 만듭시다.


# Log4j Setting file
log4j.rootLogger=INFO, console

# Daily file log
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=D:/mudchobo/Log/glv.log
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%d{HH:mm:ss}][%-5p](%F:%L) - %m%n

# Console log
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p %l - %m%n

# log level and appender
log4j.logger.com.mudchobo=DEBUG, console
log4j.logger.com.mudchobo.Test=INFO, logfile

대략 내용을 살펴보면 log4j.rootLogger는 최상위 로거입니다.
모든 INFO레벨이상의 로그는 다 console로 찍겠다는 겁니다.
(레벨에는 DEBUG, INFO, WARN, ERROR, FATAL 순인데, 예를 들어 INFO레벨로 지정해두면 logger.debug로 찍는 로그는 나타나지 않습니다. INFO레벨 이상것만 나타납니다.)

console은 아래 #Console log쪽에 보시면
log4j.appender.console <- 요 이름입니다.
요 console은 자세히보면 ConsoleAppender라는 클래스입니다. 이건 말그대로 콘솔에 로그를 찍어준다는 겁니다. layout에는 PatternLayout을 지정할 수 있는데 저 패턴은 뭐 레벨이 뭐고, 클래스가 뭐고, 메시지찍고 뭐 그런 내용입니다. 검색 고고싱-_-;

그리고, 파일에다가 출력 할 수 있는데, DailyRollingFileAppender클래스를 이용합니다. 이눔은 말그대로 매일매일 다른로그를 사용하게 만듭니다. 로그이름이 위와 같이 glv.log라면, 해당로그가 어제날짜인데 로그를 찍으려고 하면 기존에 있던 파일은 glv.log.2008-04-17 이렇게 바꿔줍니다.

아래부분에 보면 log4j.logger. 다음에 패키지명이나 클래스명을 지정해놓고, 로그레벨과 출력할 로그를 지정할 수 있는데요. 해당 클래스나 패키지의 로그는 저걸로 찍겠다는 겁니다. Test클래스는 logfile로 찍힌다는 겁니다.
그리고, rootLogger가 colsole로 지정되어 있기 때문에 console에도 찍히겠죠? ^^

로그를 찍어봅시다.
TestLogging이라는 프로젝트 이름으로 만듭시다.

Test클래스를 만들어봅시다.
Test.java

package com.mudchobo;

import org.apache.log4j.Logger;

public class Test {

 private Logger logger = Logger.getLogger(getClass());
 
 public void println() {
  logger.info("안녕하세요! Test입니다");
 }
}

Test2클래스를 만들어봅시다.
Test2.java

package com.mudchobo;

import org.apache.log4j.Logger;

public class Test2 {

private Logger logger = Logger.getLogger(getClass());
 
 public void println() {
  logger.info("안녕하세요! Test2입니다.");
 }
}

TestLogging클래스를 만들어봅시다. 메인을 만들어야합니다.

package com.mudchobo;

public class TestLogging {

 public static void main(String[] args) {
  Test test = new Test();
  Test2 test2 = new Test2();
  
  test.println();
  test2.println();
 }
}

자 그럼 콘솔에는
INFO  com.mudchobo.Test.println(Test.java:10) - 안녕하세요! Test입니다.
INFO  com.mudchobo.Test.println(Test.java:10) - 안녕하세요! Test입니다.
INFO  com.mudchobo.Test2.println(Test2.java:10) - 안녕하세요! Test2입니다.
INFO  com.mudchobo.Test2.println(Test2.java:10) - 안녕하세요! Test2입니다.
이렇게 출력이 될 것이고 로그파일에는
[19:56:35][INFO ](Test.java:10) - 안녕하세요! Test입니다.
이것만 출력될 것입니다.
위에 콘솔에 두번 찍힌 이유는 Rootlogger도 찍고, 아래 패키지를 지정한 로그도 찍었기 때문이죠.
그리고, 파일에는 한번만 쓰여진 이유는 파일에 쓰는건
log4j.logger.com.mudchobo.Test=INFO, logfile 여기 이 Test클래스 하나죠-_-;
이상입니다-_-;

출처 : http://mudchobo.tomeii.com/tt/category/자바(Java)?page=6
Posted by 1010
98..Etc/Tomcat2009. 4. 22. 14:03
반응형
JNDI를 이용한 커넥션 풀에 대해서 정리해봤습니다.
블로그에 쓴글이라 반말이예요... 양해를 ^^
원문 : http://kr.blog.yahoo.com/kwon37xi/1236540.html

Tomcat 5 JNDI DataSource를 통한 DB 커넥션 풀 사용

이미 눈치 채셨겠지만, 요즘 내가 RDBMS 배우기에 열을 올리고 있다.
지금까지는 JSP/Servlet에서 직접 커넥션을 맺거나, 웹 컨텍스트내에 커넥션 풀 라이브러리를 두고 호출에서 사용했는데, 좀 바꿔야겠다.
JNDI를 통한 커넥션 풀 사용은 J2EE 표준이고, 현존하는 거의 모든 웹 컨테이너가 지원한다고 한다.

JNDI를 서버에 설정하는 방법은 각 WAS 별로 다르지만, 사용하는 것은 모두 동일하므로 호환성에 문제도 없다.

이 글은 Jakarta의 DBCP 커넥션 풀과 Tomcat JNDI 설정을 통해 데이터베이스 커넥션 풀을 사용하는 방법이다.

JNDI와 커넥션 풀에 관한 자세한 설명이 JavaServer Pages 3rd ed.에 실려있다. 이 책 너무 좋다. 꼭 읽어보라고 강력하게 권하고 싶다.

* 참조 URL : http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jndi-datasource-examples-howto.html
이 글은 사실상 저 참조 URL의 번역에 가깝다.
* Tomcat Admin을 이용한 DataSource 설정 : http://www.okjsp.pe.kr/lecture/viewlet/okjsp2005/05_webdev_datasource.html

기본적으로 필요한 라이브러리

* commons-dbcp.jar
* commons-collections.jar
* commons-pool.jar

예제 JDBC 드라이버

* Oracle 9i classes12.jar

JNDI Naming Resource 설정

1. 위 라이브러리들을 $CATALINA_HOME/common/lib 에 복사한다. 그 이외 디렉토리에 두면 안된다. ZIP 파일은 JAR로 확장자를 바꿔야 한다. 톰캣은 JAR파일만 클래스패스에 추가한다.

2. Connection 풀을 이용할 경우에는 ResultSet과 Connection 객체를 필히 직접 닫아 줘야만 한다.

3. $CATALINA_HOME/conf/server.xml 혹은 각 웹 컨텍스트별 XML 파일의 <Context>의 자식 요소로 다음을 추가한다.

<Resource name="jdbc/forumDb" auth="Container" type="javax.sql.DataSource"/>
<!-- Resource의 name 속성을 이용해서 각 어플리케이션에서
javax.sql.DataSource 객체를 얻어가게 된다. -->


<!-- 자세한 파라미터 설정은
http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jndi-datasource-examples-howto.html 참조 -->
<ResourceParams name="jdbc/forumDb">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>

<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>

<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>

<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>

<!-- DB 사용자명과 비밀번호 설정 -->
<parameter>
<name>username</name>
<value>dbuser</value>
</parameter>
<parameter>
<name>password</name>
<value>dbpasswd</value>
</parameter>

<!-- JDBC 드라이버 클래스 -->
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>

<!-- JDBC 접속 URL -->
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@dbhost:1521:ORA</value>
</parameter>
</ResourceParams>


4. 웹 어플리케이션의 web.xml파일에 다음을 추가하여 JNDI 리소스를 사용할 수 있도록 한다.

<resource-ref>
<description>Forum DB Connection</description>
<!-- 다음이 바로 리소스의 이름 -->
<res-ref-name>jdbc/forumDb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>


JSP/Servlet 에서 사용하기
이제 다음과 같이 JNDI를 이용해 DataSource 객체를 얻고, 그 객체에서 커넥션을 얻어오면 된다.

다음은 서블릿을 작성하고, 그 서블릿에서 DB커넥션을 얻고, 쿼리를 날린 뒤, 그 결과를 JSP 파일에 포워딩하여 JSTL을 이용해 출력하는 것이다.

1. 예제 테이블과 데이터 SQL - 오라클 계정으로 다음과 같은 데이터를 생성했다고 가정하면

create table test (
num NUMBER NOT NULL,
name VARCHAR2(16) NOT NULL
);

truncate table test;

insert into test values(1,'영희');
insert into test values(2, '철수');
insert into test values(3, '미숙');
commit;


2. test.JndiDataSourceTestServlet 소스

package test;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class JndiDataSourceTestServlet extends HttpServlet {

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {

Connection conn = null;
ResultSet rs = null;
Statement stmt = null;

try {
// 커넥션을 얻기 위한 전초작업. 이 부분을 메소드화 하면 되겠다. ------------
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/forumDb");

// 커넥션 얻기
conn = ds.getConnection();
//------------------------------------------------------------------

String sql = "SELECT * from test";
stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

List results = new ArrayList();

while (rs.next()) {
Map row = new HashMap();

row.put("num", rs.getString("num"));
row.put("name", rs.getString("name"));

results.add(row);
}

request.setAttribute("results", results);

RequestDispatcher rd = request.getRequestDispatcher("/dbtest.jsp");
rd.forward(request, response);

} catch (NamingException e) {
throw new ServletException("JNDI 부분 오류", e);
} catch (SQLException e) {
throw new ServletException("SQL 부분 오류", e);
} finally {
// 리소스를 필히 반환할 것!
if (rs != null) { try { rs.close(); } catch (Exception ignored) {} }
if (stmt != null) { try { stmt.close(); } catch (Exception ignored) {} }
if (conn != null) { try { conn.close(); } catch (Exception ignored) {} }
}
}
}

3. web.xml에 서블릿 등록

<servlet>
<servlet-name>dbtest.svl</servlet-name>
<servlet-class>test.JndiDataSourceTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dbtest.svl</servlet-name>
<url-pattern>/dbtest.svl</url-pattern>
</servlet-mapping>

4. /dbtest.jsp 소스

<%@ page contentType="text/html" pageEncoding="EUC-KR" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>JNDI DataSource Test</title>
</head>
           <body            bgcolor="#FFFFFF">
<h2>Results</h2>

<c:forEach var="row" items="${results}">
NUM : ${row.num}<br />
Name : ${row.name}<br />
<hr />
</c:forEach>
</body>
</html>


5. 이제 웹 브라우저에서 "/dbtest.svl" 을 호출해보면 결과를 볼 수 있다.


전역적인 JNDI 리소스 이용
<Resource>와 <ResourceParams> 요소를 server.xml의 <GlobalNamingResources> 의 자식노드로 옮기면 특정 웹 어플리케이션이 아니라, 이 톰캣에 설치된 전체 웹 어플리케이션에서 사용 할 수 있게 된다. 하지만 각 웹 어플리케이션 "<Context>"에 다음과 같은 설정을 해야 한다.

<ResourceLink
name="jdbc/forumDb"
global="jdbc/forumDb"
type="javax.sql.DataSource"
/>


아니면 server.xml에서 <Host> 요소의 자식으로 다음을 추가하면 각 컨텍스트별 설정 필요없이 전체 웹 어플리케이션 컨텍스트에서 GlobalNamingResources로 지정된 JNDI 리소스를 사용할 수 있다.

<DefaultContext>
<ResourceLink
name="jdbc/forumDb"
global="jdbc/forumDb"
type="javax.sql.DataSource"
/>
</DefaultContext>


문제가 생겼어요!

1. DB 커넥션이 간혹 끊어져요.
Tomcat이 작동중인 JVM이 가비지 컬렉션을 할 때, 그 시간이 JNDI Resource에 파라미터로 설정한 maxWait보다 길게 갈 경우 DB 커넥션이 끊어질 수 있다.
CATALINA_OPTS=-verbose:gc 옵션을 주면 $CATALINA_HOME/logs/catalina.out에 가비지 컬렉션 상황이 기록된다. 거기에 GC 작업에 걸린 시간도 나오니 그것을 참조로 maxWait 파라미터를 늘려주면 된다. 보통 10~15초로 주면 된다.
GC 시간은 거의 99% 이상 1초 이내에 끝나야 하나보다..

2. 무작위로 커넥션이 close 되요.
그건.. Connection 객체를 두 번 이상 close 했기 때문이다.
DB Connection Pool은 close()를 호출할 때 정말로 닫는 것이 아니라, 단지 재사용할 수 있다고 표시만 할 뿐이다.
커넥션을 사용하다가 close()하면 다른 쓰레드이서 이 커넥션을 쓸 수 있는데, 이걸 현재 쓰레드에서 계속 잡고 있다가 또 다시 close()를 해버리면, 다른 쓰레드에서 사용중에 close()됐다고 나와 버리게 되는 거다.

conn.close();
conn = null;

위와 같이 커넥션을 close()한 뒤에 바로 null 로 설정하여 절대로 다시 사용할 수 없게 만들면 이런 실수는 생기지 않을 것이다.
Posted by 1010
98..Etc/Etc...2009. 4. 14. 17:58
반응형

4.1 하고 6.1 두개..
Posted by 1010
98..Etc/weblogic2009. 4. 10. 15:20
반응형

출처 : http://blog.htdocs.kr/entry/Weblogic-815-Sun-Java-System-Web-Server-61-SP6-연동


1.  Sun Java System Web Server 6.1 SP6 (iPlanet) 설치
다음 URL 에서 다운로드 설치: http://www.sun.com/download/products.xml?id=44d819d9
설치된 파일 위치가 /usr/local/SUNwbsvr 에 있다 가정

2. Weblogic 8.1.6 설치
다음 URL 에서 다운로드 설치: http://commerce.bea.com/showallversions.jsp?family=WLS
설치된 파일 위치가 /usr/local/weblogic 에 있다 가정

3. WebServer 환경설정
SJS Web Server의 Configuration 파일들은 웹서버 홈디렉토리의 https-xxx/config 디렉토리에 위치함.
ex) /usr/local/SUNwbsvr/https-eServer/config

  • 연동에 필요한 라이브러리 파일 복사 - 서버가 다른 곳에 위치한다면 반드시 복사함.
    # cd /usr/local/weblogic/bea/weblogic81/server/lib/linux/i686
    # cp libproxy* /usr/local/SUNwbsvr/plugins

  • magnus.conf 수정 - 한 줄씩 작성
    # cd /usr/local/SUNwbsvr/https-eServer/config
    # vi magnus.conf

    magnus.conf (Language : xml)
    1. # 아래와 같이 마지막 줄에 추가
    2. Init fn="load-modules" funcs="wl_proxy,wl_init" shlib="/usr/local/SUNwbsvr/plugins/libproxy.so"
    3. Init fn="wl_init"

  • obj.conf 수정 - "NameTrans fn=..." 과 "PathCheck fn=..." 사이에 추가
    # vi obj.conf

    obj.conf (Language : xml)
    1. # Weblogic 으로 보내야 할것이 JSP 와 Struts를 사용하므로 DO 를 추가
    2. NameTrans fn=document-root root-"$docroot"
    3. Service method="(GET|HEAD|POST|PUT)" type=text/jsp fn=wl_proxy WebLogicHost=123.45.67.89 WebLogicPort=7001
    4. Service method="(GET|HEAD|POST|PUT)" type=text/do fn=wl_proxy WebLogicHost=123.45.67.89 WebLogicPort=7001
    5. PathCheck fn=unix-uri-clean
    6. #
    7. # Servlet을 사용하면 맨아래 다음 아래와 같이 추가
    8. #
    9. <Object name="weblogic" ppath="*/weblogic/*">
    10. Service fn=wl_proxy WebLogicHost=123.45.67.89 WeblogicPort=7001 PathTrim="/weblogic"
    11. </Object>

  • mime.types 수정
    type=magnus-internal/jsp 부분을 찾아서 text/jsp로 바꿈. (없으면 그냥 추가)

    mime.conf (Language : xml)
    1. type=text/jsp     exts=jsp
    2. type=text/do      exts=do

  • WebLogic 서버 서비스 확인

  • SJS Web Server 재시작
    콘솔을 이용하여 재시작 하거나 직접 시작해줌.
    # /usr/local/SUNwbsvr/https-eServer/start

    [LS ls1] http://123.45.67.89 port 80 ready to accept requests
    startup: server started successfully

    위와 같이 메시지가 보이면 성공
  • WebLogic에 JSP 페이지를 작성한 후 http://123.45.67.89 로 접속하여 작성한 JSP가 나오면 연동 성공

※ 자세한 메뉴얼은 http://www.itadvisor.co.kr 에서 다운받을 수 있음. 
Posted by 1010
98..Etc/weblogic2009. 4. 10. 15:08
반응형

WebLogic Platform 8.1 Installation

Guide and so on



Table of Contents

1. WebLogic Platform 8.1 설치 4
1.1. Windows에서 GUI mode로 설치 4
1.2. Unix에서 Console mode로 설치 8
1.2.1. .bin 설치 파일인 경우 8
1.2.2. .jar 설치 파일인 경우 14
1.3. Silent mode로 설치 15
2. Domain Configuration Wizard로 Domain 생성 16
2.1. Wizard를 시작 16
2.2. 새로운 Domain을 생성 17
2.3. Domain의 종류를 선택 17
2.4. Configuration 방법 선택 18
2.5. Administrative username과 pasword설정 18
2.6. Startup mode와 JDK 선택 19
2.7. Summary 와 Domain 이름을 설정 19
2.8. Domain Configuration 결과 20
3. Apache Plug-In 사용방법 21
3.1. Apache HTTP Server Plug-In 정보 21
3.2. Plug-In의 설치 22
3.2.1. 해당하는 플랫폼용 Shared Object 디렉토리로 이동 22
3.2.2. 사용할 Plug-In파일을 선택 22
3.2.3. mod_so.c module의 상태를 점검 22
3.2.4. Apache HTTP Server용 Plug-In을 설치 23
3.2.4.1. Apache 1.x일 경우 23
3.2.4.2. Apache 2.x일 경우 24
3.2.5. Apache HTTP Server Plug-In을 위한 httpd.conf파일 수정 24
3.2.5.1. httpd.conf파일을 open 24
3.2.5.2. WebLogic Server module 확인 24
3.2.5.3. IfModule 블럭을 추가 24
3.2.5.4. IfModule 블록에 MatchExpression을 추가 24
3.2.5.5. t3와 IIOP를 위한 HTTP tunneling 설정(Optional) 25
3.2.5.6. weblogic.conf파일을 사용한 설정(Optional) 25
3.2.6. httpd.conf파일의 syntax 검증 26
3.3. WebLogic Server를 다시 시작 27
3.4. Apache HTTP server를 다시 시작 28
3.5. Plug-In 테스트 29
3.5.1. 테스트용 JSP 29
3.5.2. Web Application을 생성(Default Web Application으로 설정) 29
3.5.3. Web Application을 배포 30
3.5.4. 테스트 34
4. Default Web Application 설정방법 36
5. JDBC 관련 설정방법 37
5.1. JDBC Connection Pool 37
5.1.1. Start Script의 CLASSPATH에 JDBC driver 추가 37
5.1.2. WebLogic Server를 시작 38
5.1.3. JDBC Connection Pool 설정 39
5.2. DataSource 44

Posted by 1010
98..Etc/weblogic2009. 4. 10. 15:03
반응형
WebLogic Server 8.1을 설치하는 것은 매우 간단하다. BEA 홈페이지에서 설치하고자 하는  OS에 맞는 WebLogic Server 8.1 SP6를 다운 받은 다음에 실행 권한을 주고 실행해 주면 된다.

$ ./server816_linux32.bin
Extracting 0%....................................................................................................100%
Unable to instantiate GUI, defaulting to console mode.

프로그램을 실행시키면 먼저 압축되어 있는 설치 파일의 압축을 제거한 한다. GUI 모드에서 실행했다면 설치가 좀더 쉬운 화면이 보였겠지만 지금은 콘솔에서 설치해서 console mode로 기동한다.

<--------------------- BEA Installer - WebLogic Server 8.1 SP6 -------------------->

Welcome:
--------

This installer will guide you through the installation of WebLogic Server 8.1 SP6. Type "Next" or enter to proceed to the next prompt.  If you want to change data entered previously, type
"Previous".  You may quit the installer at any time by typing "Exit".




Enter [Exit][Next]>


다음으로는 WebLogic 설치에 대한 환영인사가 나타난다. 설치가 싫으면 Exit를 입력하라고 한다. 머 언제든지 설치를 중단할 수 있기 때문에 신경 쓰지 않아도 된다. 우선 Enter를 눌러 설치를 진행한다.

<--------------------- BEA Installer - WebLogic Server 8.1 SP6 -------------------->

BEA Systems License Agreement:
------------------------------

BEA SYSTEMS, INC. SOFTWARE LICENSE AGREEMENT

USE OF SOFTWARE ORDERED FROM BEA SYSTEMS, INC. ("BEA") IS PROVIDED ONLY UNDER LICENSE FROM BEA. PLEASE READ THE FOLLOWING LICENSE CAREFULLY AND INDICATE YOUR ACCEPTANCE BY CLICKING THE ACCEPTANCE
BOX. CERTAIN CAPITALIZED TERMS ARE DEFINED IN SECTION 11.

1.      LICENSE TERMS

a.      WebLogic SDK Use.  The terms of this Section 1(a) are applicable to you if you have registered as a WebLogic SDK customer. Subject to the terms of this Agreement, BEA grants to you a
non-exclusive, non-transferable, royalty-free license to use WebLogic SDK solely for Development Use and Scale-Limited Personal Use for the number of users and/or developers and the number of
CPU's, Servers and/or at the Sites, as specified at the time of registration. Third party software products or modules supplied by BEA, if any, may be used solely with the Software. All rights not specifically granted to you herein are retained by BEA.

...

i.      Territory.  The license grants hereunder are limited to use within the Territory.

Select Option:
    1 - Yes, I agree with the terms of the license
    2 - No, I do not agree with the terms of the license




Enter option number to select OR [Up][Down][Exit][Previous]> 1

WebLogic Server의 라이센스 조항이 나오고 이 라이센스에 동의하면 1번을 누르라고 한다. 동의를 안하면 설치가 중단된다. 선택이 있겠는가 1번을 눌러 설치를 진행한다.

<--------------------- BEA Installer - WebLogic Server 8.1 SP6 -------------------->

Choose BEA Home Directory:
--------------------------

    "BEA Home" = [/app/bea/bea]



Input new BEA Home OR [Exit][Previous][Next]> /app/bea

BEA 홈 디렉토리의 위티를 물어본다. Enter를 입력하면 기본 위치인 /app/bea/bea가 설정되고 변경하고자 한다면 원하는 디렉토리를 입력한다.

<--------------------- BEA Installer - WebLogic Server 8.1 SP6 -------------------->


Choose Install Type:
--------------------

 ->1|Complete
    |Install the complete BEA WebLogic Platform.

   2|Custom Installation
    |Choose software components to install and perform optional configuration.




Enter index number to select OR [Exit][Previous][Next]> 1

전체 설치를 할건지 필요한 컴포넌트만 설치할 것인지를 물어보는 창이 뜬다. 쉽게 설치를 하려면 전체 설치를 선택한다.

<--------------------- BEA Installer - WebLogic Server 8.1 SP6 -------------------->

Choose Product Directory:
-------------------------

    "Product Installation Directory" = [/app/bea/weblogic81]



Input new Product Installation Directory OR [Exit][Previous][Next]>

WebLogic Server 8.1 제품이 설치될 위치를 결정한다. 원하는 위치가 있다면 원하는 위치를 적어준다. 기본은 $WL_HOME/weblogic81로 설정된다.

<--------------------- BEA Installer - WebLogic Server 8.1 SP6 -------------------->

Installing files..

0%          25%          50%          75%          100%
[------------|------------|------------|------------]
[***************************************************]

설치가 진행되며 '*'가 모두 채워지면 파일이 생성되는 등의 설치가 완료된다.

<--------------------- BEA Installer - WebLogic Server 8.1 SP6 -------------------->

Installing JDK....

0%          25%          50%          75%          100%
[------------|------------|------------|------------]
[***************************************************]

설치가 완료된 줄 알았는데.. JDK를 설치 한다고 한다.

<--------------------- BEA Installer - WebLogic Server 8.1 SP6 -------------------->

Installation Complete


Congratulations! WebLogic Server 8.1 SP6 has been successfully installed to /app/bea/weblogic81.


Press any key to continue OR [Exit]>

드디어 설치가 완료되었다. Enter키를 누르면 끝이다.

$ ls -la
total 350860
drwx------ 11 bea  web       4096 2007-11-16 11:53 .
drwxr-xr-x  5 root root      4096 2007-11-15 13:45 ..
-rw-------  1 bea  web       2405 2007-11-16 18:19 .bash_history
-rw-r--r--  1 bea  web         33 2007-11-15 13:45 .bash_logout
-rw-r--r--  1 bea  web        284 2007-11-16 10:09 .bash_profile
-rw-r--r--  1 bea  web        124 2007-11-15 13:45 .bashrc
drwxr-xr-x  2 bea  web       4096 2007-11-16 10:15 bea
drwxr-xr-x  3 bea  web       4096 2007-11-16 10:58 domains
drwxr-xr-x  2 bea  web       4096 2007-11-16 10:10 ext_components
drwxr-xr-x  7 bea  web       4096 2007-11-16 10:10 jdk142_11
drwxr-xr-x 10 bea  web       4096 2007-11-16 10:11 jrockit81sp6_142_10
-rw-r--r--  1 bea  web      11514 2007-11-16 10:10 license.bea
-rw-r--r--  1 bea  web      10467 2007-11-16 10:10 license_scale_limited.bea
drwxr-xr-x  2 bea  web       4096 2007-11-16 10:16 logs
-rw-r--r--  1 bea  web         91 2007-11-16 10:07 .mailcap
-rw-r--r--  1 bea  web        230 2007-11-16 10:07 .mime.types
-rw-r--r--  1 bea  web       1446 2007-11-16 10:11 registry.xml
-rwxr-xr-x  1 bea  web  358708754 2007-11-15 14:16 server816_linux32.bin
-rwxr-xr-x  1 bea  web        851 2007-11-16 10:10 UpdateLicense.sh
drwxr-xr-x  3 bea  web       4096 2007-11-16 10:10 utils
-rw-------  1 bea  web       4902 2007-11-16 11:53 .viminfo
drwxr-xr-x  3 bea  web       4096 2007-11-16 11:13 webapps
drwxr-xr-x  8 bea  web       4096 2007-11-16 10:10 weblogic81
-rw-r--r--  1 bea  web        658 2007-11-15 13:45 .zshrc


설치가 완료되면 위와 같은 디렉토리가 생긴다. 설치된 디렉토리를 보면 WebLogic Server 엔진 디렉토리와 JDK 들이 설치된다.

다음에는 WebLogic Server를 이용하여 Admin Server와 Managed Server를 만들어보기로 한다.
Posted by 1010
98..Etc/Etc...2009. 4. 7. 11:50
반응형

블러그에 글을 올리다가 항상 아쉬웠던 것이 소스코드 편집문제였다

개발툴에 있는 Edit 처럼 사용자 편의대로 편집할수도 없고 여간 불편한게 아니였다.
그러다 SyntaxHighlighter 이라는 자바 스크립트를 알게되었다.

http://code.google.com/p/syntaxhighlighter/
구글 사이트에 가면 소개가 되어있다.

소스는 옆 탭 downloads 를 눌러 받으면 된다.


압축을 풀고 관리자 > 스킨 > HTML/CSS 편집을 클릭한다.


파일 업로드 탭을 선택하고 압축푼 폴더중에 Script., Styles 에 있는 파일을 업로드한다


그리고 HTML/CSS 편집 탭을 클릭하여 Head 부분에 아래와 같은 스크립트
삽입 태그를 넣는다.


<!-- SyntaxHighlighter Include souce Start -->

<link type="text/css" rel="stylesheet" href="./images/SyntaxHighlighter.css"></link>

<script type="text/javascript" src="./images/shCore.js"></script>

<script type="text/javascript" src="./images/shBrushCpp.js"></script> 

<script type="text/javascript" src="./images/shBrushCSharp.js"></script>  

<script type="text/javascript" src="./images/shBrushCss.js"></script>   

<script type="text/javascript" src="./images/shBrushDelphi.js"></script>    

<script type="text/javascript" src="./images/shBrushJava.js"></script>      

<script type="text/javascript" src="./images/shBrushJScript.js"></script>       

<script type="text/javascript" src="./images/shBrushPhp.js"></script>        

<script type="text/javascript" src="./images/shBrushPython.js"></script>         

<script type="text/javascript" src="./images/shBrushRuby.js"></script>          

<script type="text/javascript" src="./images/shBrushSql.js"></script>           

<script type="text/javascript" src="./images/shBrushVb.js"></script>           

<script type="text/javascript" src="./images/shBrushXml.js"></script>             

<script language="javascript">

 dp.SyntaxHighlighter.ClipboardSwf = './images/clipboard.swf';

 dp.SyntaxHighlighter.HighlightAll('code');

</script>

<!-- SyntaxHighlighter Include source End -->

 

지원하는 언어는 다음과 같다

Language

Aliases

C++

cpp, c, c++

C#

c#, c-sharp, csharp

CSS

css

Delphi

delphi, pascal

Java

java

Java Script

js, jscript, javascript

PHP

php

Python

py, python

Ruby

rb, ruby, rails, ror

Sql

sql

VB

vb, vb.net

XML/HTML

xml, html, xhtml, xslt

 

설정값에 따라 표현형식을 바꿀수가 있는데 다음과 같은 속성이 있다

속성

설명

nogutter

Will display no gutter

nocontrols

Will display no controls at the top

collapse

Will collapse the block by default

firstline[value]

Will begin line count at value. Default value is 1.

showcolumns

Will show row columns in the first line.

 

이것들을 한번씩 설정해서 그 변화된 모습을 보면 금방 이해할것같다

화면에서 사용할때는 다음과 같이 태그중간에 코드를 삽입하면된다

class java 가 들어간거보니 stylesheet 에서 java 언어에 대한 값을

적용하는 것이다. 위의 표처럼 원하는 언어를 선택해서 class 값에 넣어주면 된다

<TEXTAREA class="java" name="code" rows=10 cols=50>

  <!-- 소스코드삽입 -->

</TEXTAREA>

 

<PRE class="brush:c#" name="code">

  <!-- 소스코드삽입 -->

</PRE>

버전이 몇부터인지는 모르겠으나 <TEXTAREA> 태그가 안먹는다고 한다.
그럴땐 밑에 PRE 태그를 사용한다.

한번 적용한 모습이다
. 이제 소스 정리가 깔끔하게 되는거 같아 정말 좋다.


한참 미루었던 일을 치루니 일주일 변비가 한꺼번에 분출된거 같아 정말 시원하다
..

역시 일은 미루면 어느모로 보나 손해다 ㅋㅋ


출처 : http://mainia.tistory.com/category/유틸리티

Posted by 1010
98..Etc/Server2009. 4. 6. 14:50
반응형
이 글은 인터넷 검색을 통해서 정리했음을 밝힙니다.

WAS(Web Application Server)란?
-데이터베이스 조회나 일반적인 비즈니스 로직에 대한 처리를 위해 다양한 언어로 개발된 인터넷/인트라넷 환경의 소프트웨어를 지짗한다.
-서버기반의 application system을 위한 최적화된 실행환경을 제공하는 엔진
-Web Server와 DBMS를 연계 3-tier을 구현하는 Middle ware
-Web 비지니스 로직을 구현하는 가장 효과적인 Solution

WAS의 기능
- 환경에서의 최적의 트랜잭션 처리
- 웹 기반 애플리케이션들에 대한 분석 처리
- 분산된 웹 기반 어플리케이션 통합관리
- 웹 환경에서의 트랜잭션 모니터링

WAS의 역할
- 웹서버는 사용자(클라이언트)가 요청을 보내오면 그 명령에 대한 처리를 실행하고 다시 사용자에게 답변을 보내주는 역할을 수행합니다. 그런데 요청한 것들 중에 자체적으로 처리할 수 없는 것들을 톰캣과 같은 컨테이너나 아님 php 모듈과 같이 처리할 수 있는 곳으로 넘겨 처리 결과를 받아와서 사용자에게 넘겨주는 역할을 수행하는게 꼭 해야되는 기능 중에 하나입니다.

톰켓은 jsp를 실행 할 수 있는 컨테이너입니다. 웹서버에서 jsp를 요청하면 톰켓에서는 jsp파일을 servlet으로 변환하여 컴파일을 수행하고 서블릿의 수행 결과를 웹서버에 전달하게 됩니다.

- Tomcat
Java진영 Open Source Group인 Apache Software Foundation에서 공식적으로 사용하고 있는 Servlet-Container입니다.
또 Web server인 Apache의 기능을 내장하고 있어서, 그 자체로도 Web server기능을 할 수 있습니다. 하지만 분명히 톰캣은 WAS입니다.
(참고: IIS의 경우에는 출발은 web server이었는데, WAS로 구분하지 않고 그 자체로 WAS기능으로 포함시켜 왔습니다. 그래서 구분하자면 Web+WAS입니다.)

- 밴더별 WAS
크게 마이크로소프트 플랫폼과 비 마이크로소프트 플랫폼으로 나뉘어 볼 수 있다.
비 마이크로소프트 플랫폼은 유닉스나 솔라리스 등의 운영체제에 오라클 DBMS, 그리고 별도의 미들웨어 제품을 얹어서 사용하며, 이 때문에 비 마이크로 소프트 플랫폼은 하나같이 표준 J2EE스펙을 완벽하게 준수한다는 사실을 장점으로 내세움.

- JSP가 컴파일되어 Servlet에 적재되는 시점
더 자세한 정보는 링크를 통해..

[출처] JSP가 컴파일되어 Servlet Container에 적재되는 시점|작성자 행복마녀

http://blog.naver.com/tjddhr1168/10026420652

클라이언트에서 JSP를 요청했을 때 해당 JSP의 Servlet 객체가 Servlet 컨테이너에 있는지 없는지 검사하게 되고, 있다면 바로 실행에 들어가지만 없다면 다시 Servlet 생성루틴을 거치게 됩니다. 만약, 여러분이 JSP파일을 수정하였다면 Java Server Page는 수정 검사루틴을 가지고 있기 때문에 JSP파일이 수정되었는지 검사한 후 수정되었다면 .jsp파일을 .class로 컴파일하고 Servlet Container에 다시 적재하는 과정을 밟게 됩니다. 다음의 그림은 JSP실행루틴을 도식화한 그림입니다.

사용자 삽입 이미지
위의 그림은 JSP의 작업 흐름도를 보여 주고 있습니다. 제일 먼저 Webserver나 Servlet 엔진에서 클라이언트의 요청을 받게 됩니다. 서버에서 요청을 받게되면 바로 JSP Handler즉, JSP Container Process라고 불리우는 루틴을 거치게 되면서 Servlet 객체존재여부와 파일변경여부를 확인하게 됩니다. 변경되었다면 새로 source파일을 생성하고 그리고 compile과정을 거쳐 실행하게 되고 그리고 이미 로딩되어 있는데 변경처리되지 않았다면 기존에 존재하는 것을 이용하게 됩니다. 로딩을 하지않았다면 처음부터 로딩을 시작하여 source파일을 만들고 compile과정을 거쳐 새로 실행합니다. 다른 서블릿들도 Servlet Container에 적재하는 과정을 반복하게 됩니다.
Posted by 1010