달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2008. 1. 31. 15:23

Velocity 따라하기 - 1번 예제 - 그거/Tech2008. 1. 31. 15:23


1. velocity-1.5.zip 파일을 다운로드 받아서 압축을 해제한다.
2. velocity-1.5.jar, commons-collections-3.1.jar, commons-lang-2.1.jar 파일을 classpath에 등록한다.
3. example.vm 파일을 생성하여 template을 작성한다.

   #set( ${this} = "Velocity")

   ${this} is great!
  
   #foreach( ${name} in ${list} )
       ${name} is great!
   #end
  
   #set( ${condition} = true)
  
   #if (${condition})
       The condition is true!
   #else
       The condition is false!
   #end


4. Example.java 파일을 생성하여 위에서 작성한 template 파일을 읽어서 처리한다.

   // Velocity 의 환경 설정
   // velocity.properties 파일에는 runtime.log = velocity_example.log 이런 내용이 들어간다.
   Velocity.init("velocity.properties");
  
   // VelocityContext를 만들어서 template 파일에서 사용할 변수를 설정한다.
   VelocityContext context = new VelocityContext();
   // 아래의 "list" 는 template 파일에서 ${list} 로 사용된다.
   context.put("list", XXX);
  
   // template 파일을 지정하여 Template class를 생성한다.
   Template template = Velocity.getTemplate(templageFile);
  
   // rendering 된 template이 출력될 output을 지정한다.
   BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(System.out) );
   template.merge(context, writer);
  
   // rendering 된 template을 출력한다.
   writer.flush();
   writer.close();


5. Example.java 컴파일 하고 실행한다.

$ javac -classpath .;..\..\velocity-1.5.jar Example.java
$ java -classpath .;..\..\velocity-1.5.jar; \
                          ..\..\lib\commons-collections-3.1.jar; \
                          ..\..\lib\commons-lang-2.1.jar \
                          Example example.vm

2008. 1. 31 오후 2:24:49 org.apache.velocity.runtime.log.JdkLogChute log
정보: FileResourceLoader : adding path '.'


Velocity is great!

    ArrayList element 1 is great!
    ArrayList element 2 is great!
    ArrayList element 3 is great!
    ArrayList element 4 is great!


    The condition is true!







:
Posted by 뽀기
2008. 1. 23. 16:56

iBatis 따라하기 2 (중고차 정보) 그거/Tech2008. 1. 23. 16:56


# package

  ibatis.dto                     : DTO 가 있는 package
  ibatis.dao                     : DAO 프로그램이 있는 package
  ibatis.dao.sqlmapdao           : xml 파일 위치
  ibatis.biz                     : DAO, DTO를 사용해서 테스트할 프로그램이 있는 package
  ibatis.properties              : property 파일이 있는 위치

# file

  ibatis.dto.Car.java                             : DTO(자동차에 대한 간단한 정보 저장)
  ibatis.dao.SqlMapFactory.java                   : sql-map-config.xml 파일을 resource로 하는 SqlMapClient 반환
  ibatis.dao.sqlmap.CarDAO.java                   : SqlMapClient의 method들을 wrapping
  ibatis.dao.sqlmap.sql.car.xml                   : sql문이 있는 XML 파일
  ibatis.dao.sqlmap.sql.sql-map-config.xml        : sqlMap 정보(sql문이 있는 XML 파일)와 Transaction 관련 정보 XML 파일
  ibatis.biz.CarTest.java                         : iBatis를 이용해 테스트할 프로그램
  ibatis.properties.sql-map-config.properties     : DB 연결 정보가 있는 파일

# 따라하기 순서

1. 자동차 정보를 저장할 간단한 DTO인 Car.java를 만든다.

   id, company, name, year, price
   물론, getter, setter도 생성해야 한다!

2. iBatis를 이용하여 자동차 정보를 DB에서 조작하는 DAO를 만든다.

   public List<Car> getCarList(int skip, int num) throws SQLException { ... 중략 ... }
   public void insertCar(Car car) throws SQLException { ... 중략 ... }
   public void updateCar(Car car) throws SQLException { ... 중략 ... }
   public void deleteCar(Car car) throws SQLException { ... 중략 ... }
   public Car getCar(String id) throws SQLException { ... 중략 ... }
   SqlMapClient 로 부터 직접 method들을 호출할 수도 있지만, 그냥 Wrapper class를 만들었다.

3. 2번에서 생성한 DAO를 이용하여 DB 조작을 테스트하는 테스트 프로그램을 작성한다.

   insert/update/delete/select 등을 각각 수행해볼 수 있는 프로그램을 작성한다.

   Car car = new Car();
   CarDAO cardao = new CarDAO();

   // insert
   car.setCompany("Hyundai");
   car.setName("Lavita");
   car.setPrice("6,000,000");
   car.setYear("2002");
   cardao.insertCar(car);

   // select
   car = cardao.getCar("1");

   // update
   car.setPrice("8,000,000");
   cardao.update(car);

   // delete
   cardao.delete(car);

4. 테스트 프로그램에서 select/insert/update/delete 등이 호출될 때 iBatis에서 사용하는 sql query 문을 작성한다.

 <select id="getCar" resultClass="car">
  SELECT ID, NAME ... 중략 ...
  
 <insert id="insertCar" parameterClass="car">
  INSERT INTO CAR ... 중략 ...

 <update id="updateCar" parameterClass="car">
  UPDATE CAR SET  ... 중략 ...

 <delete id="deleteCar" parameterClass="car">
  DELETE FROM CAR ... 중략 ...

 <select id="getCarList" resultClass="car">
  SELECT ID, NAME, ... 중략 ...

5. iBatis에서 위에서 정의한 sql query를 사용할 수 있도록 sqlMap 정보를 설정하고, DB 연결 정보를 설정하는 xml 파일을 만든다.

   <sqlMapConfig>
     <properties resource="ibatis/properties/sql-map-config.properties"/>

     ... 중략 ...

     <transactionManager type="JDBC" commitRequired="false">
        <dataSource type="SIMPLE">
    <property name="JDBC.Driver" value="${driver}"/>
    <property name="JDBC.ConnectionURL" value="${url}"/>
    <property name="JDBC.Username" value="${username}"/>
    <property name="JDBC.Password" value="${password}"/>

     ... 중략 ...

     <sqlMap resource="ibatis/dao/sqlmapdao/sql/car.xml"/>

     ... 중략 ...

   </sqlMapConfig>

6. DB 연결 정보를 설정할 properties 파일을 만든다.

   driver=com.mysql.jdbc.Driver
   url=jdbc:mysql://localhost:3306/jsptest
   username=lucky
   password=lucky

7. SqlMapClient 객체를 singleton pattern 을 이용하여 하나의 instance만 생성하여 사용할 수 있도록 한다.

   private static SqlMapClient sqlMap;
  
   static {
      try {
         String resource = "ibatis/dao/sqlmapdao/sql/sql-map-config.xml";
         Reader reader = Resources.getResourceAsReader(resource);
         sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
      } catch(Exception e) {
         e.printStackTrace();
         throw new RuntimeException("Error while initializing SqlMapClient : "  + e);
      }
   }
  
   public static SqlMapClient getInstance() {
      return sqlMap;
   }

8. 3번에서 작성한 테스트 프로그램을 eclipse에서 실행해본다.

   [1] Company = Hyundai, Name = Avante, year = 2001, price = 8,000,000
   [2] Company = Hyundai, Name = Lavita, year = 2002, price = 6,000,000
   [3] Company = Hyundai, Name = Sonata, year = 2006, price = 16,000,000

* 참고사항

  이전에 실행해봤던 예제를 보면, xml/properties 파일들이 default package의 class 파일과 같은 위치에 있었어야 했으나
  이번 예제처럼 package 를 설정하여 class 파일과 구분하여 놓으면
  프로그램 실행할 때 ClassLoader를 기준으로 찾기 때문에

  resource="ibatis/properties/sql-map-config.properties"
  resource="ibatis/dao/sqlmapdao/sql/car.xml"

  위와 같이 가장 상위 package 부터 경로를 작성하면 된다.















'그거 > Tech' 카테고리의 다른 글

Solaris 에서 ISO 이미지 mount 하는 법  (0) 2008.09.09
Velocity 따라하기 - 1번 예제 -  (0) 2008.01.31
iBatis 예제 따라하기~!  (0) 2008.01.22
[JDK 1.4 VS JDK 1.5] Boolean.TRUE 와 true  (0) 2007.11.05
[Network] OSI 7 Layer  (0) 2007.10.31
:
Posted by 뽀기
2008. 1. 22. 17:23

iBatis 예제 따라하기~! 그거/Tech2008. 1. 22. 17:23

iBatis를 해보고자 예제 실습을 따라했다.

# 필요한 파일

1. Member.xml
2. SqlMapConfigExample.properties
3. SqlMapConfigExample.xml
4. Member.java
5. MemberApp.java

# 필요한 것들

1. MySql, Oracle, MSSQL 등등의 DB
2. 1번 DB에 접속할 수 있는 접속 정보(URL, ID, PASSWD, DB Name 등등)



# 실습 순서

1. DB에 접속하여 Member table의 schema를 확인한다
   SQL> desc MEMBER
   (#id#, #passwd#, #name#, #jumin1#, #jumin2#, #email#, #url#, #addr#, #tel_no#, #regdate#)
2. 1번에서 확인한 사항을 바탕으로 DTO(Member.java)를 생성한다.
    private String id;
    ... 중략...
    private String regdate;

    public String getId() {
        return id;
    }
    ...중략...
    public void setId(String id) {
        this.id = id;
    }
    ....중략...
3. SqlMapConfigExample.xml 파일을 만든다.
  <properties resource="SqlMapConfigExample.properties"/>
  <transactionManager type="JDBC" commitRequired="false">
    <dataSource type="SIMPLE">
       <property name="JDBC.Driver" value="${driver}"/>
       <property name="JDBC.ConnectionURL" value="${url}"/>
       <property name="JDBC.Username" value="${username}"/>
       <property name="JDBC.Password" value="${password}"/>
    </dataSource>
  </transactionManager>
  <sqlMap resource="Member.xml"/>
4. SqlMapConfigExample.properties 파일을 생성한다.
   driver=com.mysql.jdbc.Driver
   url=jdbc:mysql://localhost:3306/jsptest
   username=lucky
   password=lucky
5. Member.xml 파일을 생성하여 select, insert, update, delete 를 실행하기 위한 query를 정의한다.
 <select id="getMember" resultClass="Member">
  SELECT ID, PASSWD, NAME, JUMIN1,  ...중략... WHERE ID = #value#
 </select>
 <insert id="insertMember" parameterClass="Member">
  INSERT INTO MEMBER(ID, ...중략...) VALUES(#id#, ...중략...)
 </insert>
 <update id="updateMember" parameterClass="Member">
  UPDATE MEMBER ...중략...
 </update>
 <delete id="deleteMember" parameterClass="Member">
  DELETE ...중략...
 </delete>
6. compile
    $ javac -classpath .;..\..\..\lib\ibatis-2.3.0.677.jar *.java
7. run
    $ java -classpath .;..\..\..\lib\ibatis-2.3.0.677.jar;..\..\..\lib\mysql-connector-java-5.0.4-bin.jar MemberApp


# 주의사항
MemberApp.java 소스 중에

String resource = "SqlMapConfigExample.xml";
Reader reader = Resources.getResourceAsReader(resource);

이런 내용이 있는데, Resources.getResourceAsReader() 이 method가
resource를 classloader 기준으로 찾기 때문에
위의 xml 파일들이 class 파일이 위치한 곳에 같이 있어야 한다.

처음에 eclipse 에서 해보려고, package 만들어서 class 만들고 xml 파일은 다른 폴더에 저장하고 별~~ 삽질을 다 해봤으나 계속 "Could not found resource" 라는 exception만 뱉어냈었다.
eclipse에서의 문제 해결은 못하고, 우선 실행을 해봐야겠기에 전부 한 폴더에 몰아놓고 테스트 했다.











'그거 > Tech' 카테고리의 다른 글

Velocity 따라하기 - 1번 예제 -  (0) 2008.01.31
iBatis 따라하기 2 (중고차 정보)  (0) 2008.01.23
[JDK 1.4 VS JDK 1.5] Boolean.TRUE 와 true  (0) 2007.11.05
[Network] OSI 7 Layer  (0) 2007.10.31
Tomcat에서 JDBC driver 설정~!  (0) 2007.10.22
:
Posted by 뽀기
2007. 11. 5. 10:45

[JDK 1.4 VS JDK 1.5] Boolean.TRUE 와 true 그거/Tech2007. 11. 5. 10:45

public class BooleanTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Boolean bl = new Boolean(true);
 
  if( Boolean.TRUE == true ) {
   System.out.println("# " + Boolean.TRUE );
  } else {
   System.out.println("# " + true);
  }
 }
}



자자자...


1) 위 소스를 JDK 1.4 에서 컴파일 하면~~~~??
2) 위 소스를 JDK 1.5 에서 컴파일 하면~~~~??



<답>
1) Incompatible operand types Boolean and boolean
2) 아~~~~~~~무 이상 없이 잘 됨. ㅋ



<원인>
JDK 1.5 에서는 Autoboxing 기능이 추가됐다.
Object와 primitive type 간에 형변환이 자동이다~~~~


<뽀나스>
  List<Integer> list = new ArrayList<Integer>();
 
  list.add(0, 1);
  list.add(1, 2);
  list.add(2, new Integer(3));
 
  int j = 0;
  for(int i : list) {
   System.out.println("# " + (j++) + " : " +  (i + j));
  }
 }


위 소스를 JDK 1.5 에서 컴파일 하면~~?????

아~~~~~무 문제 없다. ㅋ
Generic을 이용해서 ArrayList에 Integer 만 넣도록 했지만 Autoboxing 기능에 의해
primitive type 인 int 를 넣어도 된다는거! ㅋ

'그거 > Tech' 카테고리의 다른 글

iBatis 따라하기 2 (중고차 정보)  (0) 2008.01.23
iBatis 예제 따라하기~!  (0) 2008.01.22
[Network] OSI 7 Layer  (0) 2007.10.31
Tomcat에서 JDBC driver 설정~!  (0) 2007.10.22
JavaScript를 이용해서 Class 작성하기  (0) 2007.10.16
:
Posted by 뽀기
2007. 10. 31. 11:37

[Network] OSI 7 Layer 그거/Tech2007. 10. 31. 11:37

두 시스템간의 복잡한 통신과정을 여러개의 프로토콜로 나누어 동시에 수행하도록 제안한 컴퓨터 통신 아키텍쳐이다. 프로토콜의 계층화는 상위 계층이 하위 계층의 서비스를 제공받는다는 원리에 근거하며, 계층별로 작업을 분산시킴은 물론, 각 계층이 독립적으로 구현될 수 있도록 해준다.

OSI Reference Model

Layer 7 Application
Layer 6 Presentation
Layer 5 Session
Layer 4 Transport
Layer 3 Network
Layer 2 Data Link
Layer 1 Physical
* OSI : Open System Interconnection

■ Physical Layer (물리 계층)
1과 0의 연속으로 이루어진 비트의 전송에 관여하며, 다음의 4가지 사항에 관한 규정을 다룬다.
□ 기계명세 (mechanical specification) : 통신 장비의 모양 및 치수를 정의
□ 전기적 특성 (electrical characteristic) : 비트 1은 -3V 이하의 전압을, 비트 0은 +3V 이상의 전압을 규정하는 것과 같은 전기적인 성질을 정의
□ 기능명세 (functional specification) : 접속 회로에 데이터, 제어, 타이밍, 접지 등의 의미를 부여
□ 절차명세 (procedural specification) : 기능명세에 근거하여 데이터 전송에 필요한 사건의 순서를 정의

X.21, RS-232C, RS-449/422-A/423-A 등이 물리계층 프로토콜의 예이다.

■ Data Link Layer
통신 경로상의 지점간 (link-to-link)의 오류없는 데이터 전송에 관한 프로토콜이다.
전송되는 비트의 열을 일정 크기 단위의 프레임으로 잘라 전송하고, 전송 도중 잡음으로 인한 오류 여부를 검사하며, 수신측 버퍼의 용량 및 양측의 속도 차이로 인한 데이터 손실이 발생하지 않도록 하는 흐름제어 등을 한다.

HDLC, CSMA/CD, ADCCP, LAP-B 등이 데이터 링크 계층 프로토콜의 예이다.

■ Network Layer
패킷이 송신측으로부터 수신측에 이르기까지의 경로를 설정해주는 기능과 너무 많은 패킷이 한쪽 노드에 집중되는 병목 현상을 방지하기 위한 밀집제어 (Congest control) 기능을 수행한다. 또한 이질적인 네트워크를 연결하는 데서 발생하는 프레임의 크기나 주소 지정방식이 다른 데서 발생하는 문제를 극복해 주는 기능을 수행한다.

IP, X.25 등이 네트워크 계층 프로토콜의 예이다.

■ Transport Layer
수신측에 전달되는 데이터에 오류가 없고 데이터의 순서가 수신측에 그대로 보존되도록 보장하는 연결 서비스 (Connection oriented service) 의 역할을 하는 종단간 (end-to-end) 서비스 계층이다. 한편, 패킷의 순서에 무관하게 수신되며, 에러 처리도 하지 않는 비연결 서비스 (Connectionless service) 와 다중 목적지에 메시지를 전송하는 서비스도 있다.

TCP 와 UDP 는 각각 연결지향 및 비연결지향 트랜스포트 프로토콜의 예이다.

■ Session Layer
두 응용프로그램 (Applications) 간의 연결설정, 이용 및 연결해제 등 대화를 유지하기 위한 구조를 제공한다. 또한 분실 데이터의 복원을 위한 동기화 지점 (sync poing) 을 두어 상위 계층의 오류로 인한 데이터 손실을 회복할 수 있도록 한다.

LU6.2는 잘 알려진 세션 계층 프로토콜이다.

■ Presentation Layer
전송되는 정보의 구문 (syntax) 및 의미 (semantics)에 관여하는 계층으로, 부호화 (encoding), 데이터 압축 (compression), 암호화 (cryptography) 등 3가지 주요 동작을 수행한다.

ANSI.1, XDR 등이 프로토콜의 예이다.

■ Application Layer
네트워크 이용자의 상위 레벨 영역으로, 화면배치, escape sequence 등을 정의하는 네트워크 가상 터미널 (network virtual terminal), 파일전송, 전자우편, 디렉토리 서비스 등 하나의 유용한 작업을 할 수 있도록 한다.

FTAM, TELNET, FTP, SMTP 등이 응용계층 프로토콜의 예이다.

OSI 모델에서의 데이터 전송

사용자 삽입 이미지


송신 측의 프로세스는 전송 데이터를 애플리케이션 계층에 보내고 애플리케이션 계층에서는 여기에 헤더 (null 이 될 수 있다)를 맨 앞에 첨가하여 다시 프레젠테이션 계층에 전달한다. 이때 프레젠테이션 계층에서는 애플리케이션 계층으로부터 보내진 데이터의 어떤 부분이 헤더이고 어떤 부분이 데이터 인지를 알 필요가 없다.

데이터가 물리계층에 도달할 때까지 이러한 과정이 되풀이 되며, 물리계층에서 실제로 수신장치에 데이터가 전송된다. 수신측에서는 전송 데이터가 맨 위의 수신 프로세스에 도달 될 때까지 여러가지 헤더 정보가 하나씩 벗겨져 나가는 과정을 거치게 된다.


다음의 예는 미국에 있는 친구에게 편지 보내는 일을 OSI 7 Layer를 적용시켜서 설명한 것이다. 미국에 있는 친구는 불행하게도 한국어를 모르며, 편지를 보내는 나 또한 영어를 모른다(이 예제는 대학교 시험에 나왔던 문제이기도 하다).

Sending

Receiving

 

Application Layer (Layer 7)

편지를 쓰는 것을 의미한다. 본인이 편지를 읽는다.

Presentation Layer (Layer 6)

한글로 작성한 편지를 미국 친구가 알아 볼 수 있게 영어로 변역하는 작업이다. 편지를 보내는 과정에서 이미 작업을 하였을 경우에는 이과정은 필요가 없다. 만약에 작업을 하지 않았을 경우에는 한국어로 된 편지를 영어로 번역하는 작업을 해야 한다.

Session Layer (Layer 5)

미국 친구의 집 주소를 적는 일이다. 우체부에 의해서 배달되는 작업을 의미한다.

Transport Layer (Layer 4)

우체국에 편지를 접수시키기 위한 절차, 즉 배 또는 비행기 등의 운송수단을 결정하는 등의 일이다. 각 우체국에서 주소에 따라 분류하는 작업을 의미한다.

Network Layer (Layer 3)

우체국에 있는 여러 편지들을 같은 목적지별로 분류하는 작업이다. 해당 주소지에 따라 각각의 편지를 각 우체국으로 분류하는 작업을 의미한다.

Data Link Layer (Layer 2)

해당되는 목적지와 운송 방법에 따라 분류하며, 해당되는 목적지와 직접 연결이 되지 않는 경우 중간 경 유지를 선택하여 분류하는 작업이다. 중간 경유지를 거친 운송물과 그렇지 않은 운송물을 분류한다.

Physical Layer (Layer 1)

실제적으로 편지가 배, 비행기, 자동차 등의 운송순단에 의하여 운송되는 것을 의미한다. 실제적으로 편지가 배, 비행기, 자동차 등의 운송순단에 의하여 운송되는 것을 의미한다.

사용자 삽입 이미지


OSI 모델 계층 구조

OSI 계층

정의

기능

Application Layer

사용자가 OSI 환경을 억세스 할 수 있는 능력을 제공

응용 프로세스간의 정보교환

Presentation Layer

데이터 표현에 차이가 있는 응용 프로세스들에게 연결 제공

정보의 형식설정과 코드변환

Session Layer

응용간 통신에 대한 제어구조를 제공

응용 프로세스간의 송신권 및 동기제어

Transport Layer

노드 대 노드 간의 신뢰성있고 투명한 데이터 전송 제공

송수신 시스템간의 논리적인 접속과 균일한 서비스 제공

Network Layer

상위 계층에게 시스템을 연결하는데 필요한 데이터 전송과 교환 기능 제공

정보교환과 중계기능

Data link Layer

물리적인 링크를 통하여 신뢰성 있는 정보를 전송하는 기능 제공

인접장치간의 정보전송

Physical Layer

구조화되지 않는 비트스트림을 물리적 매체를 통하여 전송

전송매체로의 전기적 신호전송


 




















출처 : 네이버
:
Posted by 뽀기
2007. 10. 22. 11:59

Tomcat에서 JDBC driver 설정~! 그거/Tech2007. 10. 22. 11:59

odjbc14.jar 또는 classes12.zip 등의 JDBC 드라이버 파일을 다음 위치중에 한군데에 복사하면 된당~

# JRE의 library 디렉토리
C:\Program Files\Java\jdk1.5.0_12\jre\lib\ext


# Tomcat의 library 디렉토리
C:\apache-tomcat-5.5.23\common\lib

그러면 Driver Not found 라는 메세지는 나오지 않으리라!

캬캬~~

jre의 lib\ext에 복사해도 된다는 건 첨 알았네 쿠쿠~

'그거 > Tech' 카테고리의 다른 글

[JDK 1.4 VS JDK 1.5] Boolean.TRUE 와 true  (0) 2007.11.05
[Network] OSI 7 Layer  (0) 2007.10.31
JavaScript를 이용해서 Class 작성하기  (0) 2007.10.16
css로 문자열 길이 잘라내기  (0) 2007.07.31
Sun 서버 DNS 설정하기  (0) 2007.05.15
:
Posted by 뽀기
2007. 10. 16. 16:00

JavaScript를 이용해서 Class 작성하기 그거/Tech2007. 10. 16. 16:00

Javascript를 이용해서 class를 작성하려면 function 이라는 키워드를 사용한다.
function 키워드는 함수를 만들때 사용하지만, class를 작성할 때도 사용이 된다.

# 방법 1

 function Student(name, age) {
  this.name = name;
  this.age  = age;
 }

 
 // setName() 이 아님을 주의하라!
 Student.prototype.setName = function(name) {
  this.name = name;
 }

 
 Student.prototype.setAge = function(age) {
  this.age = age;
 }
 
 Student.prototype.getName = function() {
  return this.name;
 }
 
 Student.prototype.getAge = function() {
  return this.age;
 }

class의 기본만 선언하고 해당 class의 method를 추가로 선언하는 방법

 var student = new Student("홍길동", 45);
 alert(professor.name + " : " + professor.age);
 alert(professor.getAge());

# 방법 2

 function Student(name, age) {
  Student.prototype.setName = function(name) {
   this.name = name;
  }
 
  Student.prototype.setAge = function(age) {
   this.age = age;
  }
 
  Student.prototype.getName = function() {
   return this.name;
  }
 
  Student.prototype.getAge = function() {
   return this.age;
  }
 }

 class선언과 동시에 method를 선언하는 방법

 // class 선언에는 Student(name, age) 라고 되어 있지만, 아래처럼 해도 됨
 // 이것이 Javascript의 매력! ㅋㅋ
 var student = new Student();

 student.setName("홍길동");
 student.setAge(29);

 alert(student.getName() + " : " + student.getAge());

 // 아래처럼 하면 undefined 라고 나옴
 alert(student.name);

# 방법 3

 Student = function() {
  var name;
  var age;
 
 
this.setName = function(name) {
   this.name = name;
  }
 
 
this.getName = function() {
   return this.name;
  }
 }

 method 선언 방법


 Student.setName("럭키");
 alert(Student.getName());
 alert(Student.name);



TIP.

위에 보면 prototype 이라는 놈이 있는데 이는 Java에서 모든 객체가 최상위 객체로 Object를 갖고 있는 것과 비슷하다고 생각을 하면 된다.

Java에서 Student.getName() 하면 Student 객체에서 getName()을 찾고
없으면 Object 객체까지 올라가면서 getName() 메소드를 찾는데,
Javascript에서 Student.getName() 이라고 호출을 하면
Student 객체에서 찾고, Student 객체에 없으면 prototype이라는 property에서
getName() 이라는 function을 찾는다. 없으면 undefined(변수일 경우) 또는 ""(메소드일 경우)를 반환한다.

prototype 이라는 property는 인스턴스별로 하나씩 존재하는 것이 아니고,
클래스에 하나가 존재하는 것이다.
아래 예제를 보면 이해하기가 쉬울 듯....

1번째 라인에서 class를 정의한 후에 20번째 라인에서 해당 class의 instance를 만들고,
60번째 라인에서 해당 class에 prototype을 이용해서 method를 추가하면,
추가한 시점 이후부터는 20번째 라인에서 생성한 instance도 해당 method를 사용할 수 있게 된다.
즉,


1  : function Student(name, age) {
2  :
    this.name = name;
3  :
    this.age = age;
4  :
}
.
.
.
20 :
var lucky = new Student("최유복", 30);
.
.
25 : alert(lucky.name);
.
.
60 :
Student.prototype.setName = function(name) {
61 :
    this.name = name;
62 :
}
.
.
.
77 :
lucky.setName("홍길동");
78 :
alert(lucky.name);


이렇듯 prototype은 class 자체에 지정이 되기 때문에 아래와 같이하면 안된다.

function Student(name, age) {
    Student.prototype.name = name;
    Student.prototype.age = age;
}


var lucky = new Student("최유복", 30);
alert(lucky.name); => 최유복 이라고 찍힌다.

var hong  = new Student("홍길동", 24);
alert(lucky.name + " : " + hong.name); => 홍길동 : 홍길동 이라고 찍힌다.

위와 같이 하면 처음엔 "최유복" 이렇게 찍히나 두번째는 lucky.name 까지도 "홍길동"으로 바뀐다.

'그거 > Tech' 카테고리의 다른 글

[Network] OSI 7 Layer  (0) 2007.10.31
Tomcat에서 JDBC driver 설정~!  (0) 2007.10.22
css로 문자열 길이 잘라내기  (0) 2007.07.31
Sun 서버 DNS 설정하기  (0) 2007.05.15
Solaris 시스템 모니터링 방법  (0) 2007.05.11
:
Posted by 뽀기
2007. 7. 31. 16:54

css로 문자열 길이 잘라내기 그거/Tech2007. 7. 31. 16:54


 아래와 같이 하면 된다!

white-space:nowrap; text-overflow : ellipsis; overflow : hidden;


<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=1 cellPadding=0 bgColor=#000000 border=1>
<TR bgColor=#ffffff>
 <TD style="OVERFLOW: hidden; WORD-BREAK: break-all; WHITE-SPACE: nowrap; TEXT-OVERFLOW: ellipsis" width=100>
 
<nobr>
  This is a test hahaha merong good good good
 
</nobr>
 </TD>
</TR>
</TABLE>

그러면

This is a test hahaha merong good good good

이랬던 테이블이

This is a test hahaha merong good good good

이렇게 변한닷.

'그거 > Tech' 카테고리의 다른 글

Tomcat에서 JDBC driver 설정~!  (0) 2007.10.22
JavaScript를 이용해서 Class 작성하기  (0) 2007.10.16
Sun 서버 DNS 설정하기  (0) 2007.05.15
Solaris 시스템 모니터링 방법  (0) 2007.05.11
[펌] SUN 사용 설명서  (0) 2007.05.04
:
Posted by 뽀기
2007. 5. 15. 17:33

Sun 서버 DNS 설정하기 그거/Tech2007. 5. 15. 17:33


01. /etc/nsswitch.dns 파일을 /etc/nsswitch.conf 파일로 copy 한다.
  $ cp /etc/nsswitch.dns /etc/nsswitch.conf

02. /etc/resolve.conf 파일을 vi로 열어서 nameserver <ip address> 를 적어준다.
  $ vi /etc/resolv.conf
     nameserver <ip address>

03. 제대로 설정되었는지 테스트 해본다.
  $ ping sunsolve.sun.com
    sunsolve.sun.com is alive

끝.


:
Posted by 뽀기
2007. 5. 11. 13:57

Solaris 시스템 모니터링 방법 그거/Tech2007. 5. 11. 13:57

눈여겨 보아야 할 5가지 성능 모니터링 영역

1) CPU 관련
- 사용율(또는 idle율): #) 'vmstat 5' 명령 또는 mpstat명령
- run queue: 실행 대기중인 프로세스 수, #) vmstat 명령으로.
r b w swap free re mf pi po fr de sr s0 s1 s2 s3 in sy cs us sy id 1 0 0 10832448 601672 0 539 0 0 0 0 0 37 0 0 0 4437 35853 8429 47 16 37
-->;-- 맨 첫 컬럼('r')...
. 이 숫자를 CPU 수로 나누어서 3 이상이 되면 일단 CPU가 부족하다고 판단한다.

2) Memory 관련
- memory scan rate/sec : #) 'vmstat 5' 명령으로
r b w swap free re mf pi po fr de sr s0 s1 s2 s3 in sy cs us sy id 1 0 0 1083240 601672 0 539 0 0 0 0 0 37 0 0 0 4437 35853 8429 47 16 37
-->; 12번째 컬럼 ('sr') . 이 숫자가 자주(1분에 2~3회) 100이상, 또는 가끔(5분에 2~3회) 400이상 발 견되면 일단 Memory가 부족하다고 판단한다.

3) Disk I/O 관련
- wait rate, service time : #) 'iostat -xn 5' 명령으로
device r/s w/s kr/s kw/s wait actv svc_t %w %b
sd6 0.0 0.0 0.0 0.0 0.0 0.0 2.5 0 0
ssd0 0.0 0.0 3.6 0.3 0.0 0.0 132.7 0 0
-->; 6 번째 컬럼 ('wait')
. 이 숫자가 '0.0' 이상이 발생 하면 일단 병목이 있다고 판단한다.
-->; 8 번째 컬럼 ('svc_t')
. 이 숫자가 100 (0.1 sec) 이하면 양호, 1000 (1 sec) 이상이면 Disk 응답시간에 문제가 있음.

4) Network I/O 관련
- error, collision : #) 'netstat -i 5' 명령으로
packets errs packets errs colls packets errs packets errs colls 2042 0 2101 0 0 4121 0 4180 0 0
-->; 'errs' 컬럼. . 이 숫자가 '0' 이상이 발생 하면 일단 Network(장비,cable등)에 문제가 있 다고 판단한다.
-->; 'colls' 컬럼. . 이 숫자가 전체 packet수(packets컬럼)3~5% 이상이면 Network대역을 늘려야 한다고 판단한다.

5) Process 실행 시간 관련
- %CPU, collision : #) 'prstat 5' 명령으로
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
O hoff35 2235 234 run 20 0 2:54:32 0.5% netstat/4
-->;'CPU' 컬럼 (한 프로세스의 CPU점유율).
. 이 숫자가 10.0% 이상이면 정상적인 프로세스인지 일단 의심한다.


출처 : 동의보감님 블로그
:
Posted by 뽀기