캠핑과 개발

width height w/h % 대표기종
320 480 66.67% 아이폰3Gs, Android G1
640 960 66.67% 아이폰4
480 800 60.00% 갤럭시S, 넥서스원, Desire
480 854 56.21% 모토로이
540 960 56.25% 아트릭스

출처 : http://www.okjsp.pe.kr/seq/167232

'개발 > Android' 카테고리의 다른 글

[Android] 앱 외장메모리 설치  (0) 2011.05.16
Intent 사용법  (0) 2011.04.21
[Android] 활동주기  (0) 2011.04.13
[Android] 타이틀바 없애기  (0) 2011.04.13


AndroidMainifest.xml
<uses-permission android:name="android.permission.INTERNET" />

main.xml

<EditText android:id="@+id/input_area"
  android:layout_width="fill_parent"
     android:layout_height="wrap_content"
 />

 <Button android:id="@+id/submitBtn"
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content"
  android:text="submit"
 />

<WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" />



java code
private final Handler handler = new Handler();
private static final String JAVASCRIPT_APP_KEY = "WebviewExample";
private TextView lableView = null;  
private Button submitBtn = null;

lableView = (TextView)findViewById(R.id.labelView);
final WebView wv = (WebView)findViewById(R.id.webview);
wv.getSettings().setJavaScriptEnabled(true);
wv.addJavascriptInterface(new AndroidBridge(), JAVASCRIPT_APP_KEY);
wv.loadUrl("url");

//버튼이 눌려질 경우
submitBtn = (Button)findViewById(R.id.submitBtn);
        submitBtn.setOnClickListener(new View.OnClickListener(){
         EditText txt = (EditText)findViewById(R.id.input_area);
         @Override
   public void onClick(View v) {
    wv.loadUrl("javascript:callJavascript('"+txt.getText()+"')");
   }
});

private class AndroidBridge {
     public void callAndroid(final String arg){
      handler.post(new Runnable() {
    @Override
    public void run() {
     Log.i(TAG, "setMessage("+arg+")");
     lableView.setText(arg);
    }
      });
     }
    }



html

<script type="text/javascript">
function callAndroid(){
    window.WebviewExample.callAndroid("android call");
    document.getElementById('area').innerHTML = "android call";
}


function callJavascript(message){
    document.getElementById('area').innerHTML = message;
}
</script>
<a href="#" onclick="callAndroid()">call</a><br/>
<div id="area"></div>

 

'개발 > Javascript' 카테고리의 다른 글

javascript grap library  (0) 2014.03.06
HTML 우클릭 금지와 드레그 금지  (0) 2013.11.05
[jquery] ajax 사용하기  (0) 2010.12.17
javascript 정리  (0) 2010.12.17
[jquery] JQuery Ajax 사용하기  (0) 2010.07.23




onCreate() - 활동의 정적 자료 초기화에 적합
하나의 활동이 처음 시작되면 해당 Active객체의 onCreate() 메서드가 호출한다. onCreate()메서드는 Bundle 객체를 하나의 매개변수로 받는다. 새로 시작된 Activity의 경우에는 null이 전달되어 진다. 주어진 활동이 메모리상의 이유로 삭제 되었다가 다시 시작된 것이라면 이 Bundle객체에는 해당 활동의 이전 상태 정보가 들어 있게 된다. 따라서 활동은 그 정보를 이용해서 이전 상태를 복원할 수 있다. 흔히 onCreate() 메서드에서는 레이아웃과 자료 묶기(data Binding)와 같은 초기 설정 작업을 수행한다.

다음 메서드 - onStart()


onRestart()
액티비티가 정지된 후, 그것이 다시 시작되기 바로 전에 호출 된다. 항상 onStart()가 이어진다.

다음 메서드 - onStart()


onStart()
액티비티가 사용자에게 보여지기 바로 직전에 호출된다. 만약 액티비티가 전경에 오면 onResume(), 또는 이 액티비티가 숨겨지게 되면 onStop()로 이어진다.

다음 메서드 - onResume(), onStop()


onResume() 활동 자료의 초기화 및 준비에 적합
한 활동이 활동 스택의 제일 위에 놓이고 전경 프로세스가 되면 onResume() 메서드가 호출된다. 이 시점에서 활동이 사용자에게 보이지 않을 수도 있지만, 그래도 활동의 실행에 필요한 자원들(독점자원이든 공유 자원이든)을 준비하기에 가장 적합한 곳이 이 메서드이다. 자원들을 유지하는데에는 비용이 많이 들기 때문에, 활동이 전경에 있을 때에만 자원들을 유지하는 것이 바람직하다.

다음 메서드 - onPause()


onPause() - 활동 자료의 중지, 저장, 해제체 적합
다른 활동이 활동 스택의 최상단을 차지하면 현재 활동은 배경으로 밀려나게 된다. 이 때 배경으로 밀려나는 활동의 onPause()메서드가 호출된다. 이 메서드에서 활동은 onResume()메서드에서 재생을 시작한 오디오나 동영상, 애니메이션을 중단 해야 한다. 또한 데이터베이스의 커서(Cusor 객체) 같은 자원들도 비활성화 해야 한다.(커서 같은 자원들이 자동으로 관리하게 두는 대신 직접 관히하는 경우) onPause() 메서드는 활동이 배경에 있는 동안 필요하지 않은 자원들을 해제할 마지막 기회이기도 하다. 이 시점 이후에는 응용프로그램의 실행이 재개되지 않을 수도 있으므로 여기서 중요한 자료를 저장하거나 마무리를 해야 한다.

다음 메서드 - onResume(), onStop()



onStop()
액티비티가 사용자에게 더이상 보여지지 않을 때 호출된다. 이것은 액티비티가 파괴될 것이기 때문에 발생하거나, 또는 다른 액티비티가 재개되어 해당 액티비티를 덮기  때문에 발생한다. 액티비티가 사용자와 상호작용하기 위해 돌아 온다면 onRestart()가 또는 이 액티비타가 사라지기 된다면 onDestory가 이어진다.

다음 메서드 - onReStart(), onDestroy()



onDestroy() - 활동의 정적 자료 파괴에 적합
활동이 파괴되기 직전에 onDestroy() 메서드가 호출된다. onDestroy() 메서드가 호출되는 이유는 두 가지이다. 하나는 활동이 자발적으로 자신의 수명을 끝내려 하기 때문이고, 또 하나는 자원 부족때문에 안드로이드가 활동을 죽이려 하기 때문이다.

다음 메서드 - 없음



그 외 메소드..

onSaveInstanceState() - 활동의 필수적이지 않은 상태를 Bundle에 저장
메모리가 부족해서 운영체제가 활동을 죽이는 경우가 많다면, onSaveInstanceState()메서드 콜백시 Bundle 객체에 상태 정보를 저장하는 것도 한 방법이다. 그러나 onSaveInstanceState()가 모든 상황에서 반드시 호출된다는 보장은 없으므로, 응용프로그램의 실헹에 필수적인 자료들은 onPause() 메서드에서 저장한는 것이 안전하다.
아직 제출이 되지 않은 필드 자료라던가 사용자에 대한 응용 프로그램의 반응성을 높이기 위한 상태 정보 등 필수 적이지 않은 정보를 저장하는 곳으로 적합하다. 이후 사용자가 해당 활동을 다시 활성화하면 그 Bundle이 onCreate() 메서드로 전달된다. 이를 이용해서 활동은 일시정지 전의 상태를 정확히 복원할 수 있다. 또한 onStart() 콜백 메서드 이후에 onRestoreInstanceState() 콜백을 이용해서 이 Bundle의 정보를 읽는 것도 가능한다.

onUserInteraction()
활동이 전경에서 실행되는 동안 키나 터치, 트랙볼 사건이 발생하면 호출 된다. 단, 첫 번째 사건에 대해서만 콜백이 호출된다. 즉, 예를 들어 키 눌림(down), 눌림 유지(pressed), 떼어짐(up) 사건마다 매번 호출되는 것이 아니라 사용자 상호작용이 처음 일어난 시점만 호출된다. 이는 상태 표시줄을 관리하는  데 유용한다.(특히 사용자가 현재 작동을 취소하고자 하는 경우)

onUserLeaveHint()
활동이 사용자 상호작용에 의해(이를테면 안드로이드의 "뒤로" 키이나 "홈" 키를 누르는 등) 배경이 물러날 때에만 onPause() 호출 직전에 한 번 호출된다. 다른 활동이 전경을 차지해서 배경으로 물러나는 경우에는 호출되지 않는다. 
이는 상태 표시줄을 관리하는  데 유용한다.(특히 사용자가 현재 작동을 취소하고자 하는 경우)

'개발 > Android' 카테고리의 다른 글

[Android] 앱 외장메모리 설치  (0) 2011.05.16
Intent 사용법  (0) 2011.04.21
아이폰,안드로이드 기종별 해상도 차이  (0) 2011.04.20
[Android] 타이틀바 없애기  (0) 2011.04.13

JAVA Tip

개발/Java2011. 4. 13. 10:34

1. 띄워쓰기 공백 제거

문자열.replaceAll(\\p{Space}, "");

참고 : http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html


1. 정의된 테마 사용하기


<!--  Status Bar, Title Bar 모두 없앰 -->
<activity
android:name=".MyActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >

<!--  Title Bar 없앰 -->
<activity android:name=".MyActivity"           
android:theme="@android:style/Theme.NoTitleBar"  >




2. 사용자 테마 사용하기

<!-- Title Bar 없는 상태 -->
<item name="windowNoTitle">true</item>

<!-- Status Bar, Title Bar 모두 없는 상태 -->
<item name="windowFullscreen">true</item>




3. JAVA에서 설정하기

import android.content.pm.ActivityInfo

//Title Bar, Status Bar 없앰
setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);

//Title bar 없앰
requestWindowFeature(Window.FEATURE_NO_TITLE);

//Status bar 없앰
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

* Theme 설정과 다른 것은 FullScreen Flag를 주더라도 Title Bar는 남아있다.



4. 화면전환고정 
화면전환 이벤트가 발생해도 무시하고 화면을 고정시키는 방법

Activity 를 상속받은 클래스에서 onCreate() 안에 super.onCreate() 전에 다음 함수를 실행 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

AndroidManifest.xml 파일에..
<activity  android:screenOrientation="landscape"
              android:configChanges="keyboardHidden|orientation">



출처 : http://joojoo.com/394

'개발 > Android' 카테고리의 다른 글

[Android] 앱 외장메모리 설치  (0) 2011.05.16
Intent 사용법  (0) 2011.04.21
아이폰,안드로이드 기종별 해상도 차이  (0) 2011.04.20
[Android] 활동주기  (0) 2011.04.13

* dbname : 데이터베이스명
* dbuser : 사용자 아이디
* dbpassword : 사용자 비밀번호

SHOW DATABASE;
CREATE DATABASE dbname;

USE mysql;

//create user 'username'@'localhost'  identified by 'userpassword';
//create user ' username'@'%'  identified by ' userpassword '; 

INSERT INTO USER(HOST, USER, PASSWORD) VALUES ('localhost', 'dbuser ', PASSWORD('dbpassword'));
INSERT INTO USER(HOST, USER, PASSWORD) VALUES ('127.0.0.1', 'dbuser ', PASSWORD('dbpassword'));
INSERT INTO USER(HOST, USER, PASSWORD) VALUES ('%', 'dbuser ', PASSWORD('dbpassword'));

GRANT ALL PRIVILEGES ON dbname.* TO dbuser@localhost IDENTIFIED BY 'dbpassword';
GRANT ALL PRIVILEGES ON dbname.* TO dbuser@127.0.0.1 IDENTIFIED BY 'dbpassword';
GRANT ALL PRIVILEGES ON dbname.* TO dbuser@'%' IDENTIFIED BY 'dbpassword';  //외부 접속 허용

//GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'localhost' WITH GRANT OPTION;
//GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'127.0.0.1' WITH GRANT OPTION;
//GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'%' WITH GRANT OPTION;


SELECT HOST, USER, PASSWORD FROM USER ORDER BY USER, HOST;

FLUSH PRIVILEGES;

외부에서 접속이 되지 않고 Can't get hostname for your address 라는 메세지가 발생하면 /etc/my.cnf 파일을 열어서
skip-name-resolve 를 추가해주면 된다.

# The MySQL server
[mysqld]
skip-name-resolve


 skip-name-resolve는 client 에서 server로 접속시에 DNS Lookup 과정을 생략해 줍니다. localhost 로 접속하는 경우는 문제가 없지만 IP 로 접속하는 환경에서는 DNS 서버가 느리거나 아님 장애 발생시에 해당 옵션을 설정해 주므로써 DB 접속시에 문제점을 해결하실 수 있습니다.

'개발 > Database' 카테고리의 다른 글

ORACLE 명령문  (0) 2011.08.02
MERGE INTO 사용법  (0) 2011.07.09
오라클 모니터링 SQL  (0) 2011.02.25
Mysql 버전별 DB, USER 생성하기  (0) 2010.12.29
How to install Oracle Client 11g on Windows 7?  (0) 2010.09.27


--1. Buffer Cache Hit Ratio

SELECT ROUND(((1-(SUM(DECODE(name, 'physical reads', value,0))/
(SUM(DECODE(name, 'db block gets', value,0))+
(SUM(DECODE(name, 'consistent gets', value, 0))))))*100),2) || '%' "Buffer Cache Hit Ratio"
FROM V$SYSSTAT;

--2. Library Cache Hit Ratio

SELECT (1-SUM (reloads)/SUM(pins))*100 "Library Cache Hit Ratio"
From V$LIBRARYCACHE;


--3. Data Dictionary Cache Hit Ratio

SELECT (1-SUM(getmisses)/SUM(gets))*100 "Data Dictionary Hit Ratio"
FROM V$ROWCACHE;

 

-- 테이블 스페이스 사용량

SELECT a.tablespace_name,
             a.total "Total(Mb)",
             a.total - b.free "Used(Mb)",
             nvl(b.free,0) "Free(Mb)",
             round((a.total - nvl(b.free,0))*100/total,0)  "Used(%)"
from    (   select     tablespace_name,
                            round((sum(bytes)/1024/1024),0) as total
               from       dba_data_files
               group by tablespace_name) a,
         (     select     tablespace_name,
                             round((sum(bytes)/1024/1024),0) as free
               from        dba_free_space
               group by  tablespace_name) b
where      a.tablespace_name = b.tablespace_name(+)
order by   a.tablespace_name;


--오라클서버의 메모리

select * from v$sgastat

select pool, sum(bytes) "SIZE"
from v$sgastat
where pool = 'shared pool'
group by pool

 

--cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기

select c.sql_text
,b.SID
, b.SERIAL#
,b.machine
,b.OSUSER
,b.logon_time --이 쿼리를 호출한 시간
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
--and a.spid = '675958'
order by c.PIECE


 
--cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기

select c.sql_text
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
and a.spid = '171'
order by c.PIECE

 

--프로세스 아이디를 이용하여 쿼리문 알아내기

select c.sql_text
,b.SID
, b.SERIAL#
,b.machine
,b.OSUSER
,b.logon_time --이 쿼리를 호출한 시간
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
and a.spid = '1708032' --1912870/
order by c.PIECE

--세션 죽이기(SID,SERAIL#)

--ALTER SYSTEM KILL SESSION '8,4093'

--오라클 세션과 관련된 테이블*/

--select count(*) from v$session where machine ='머신이름' and schemaname ='스키마이름'

 

--현재 커서 수 확인

SELECT sid, count(sid) cursor
FROM V$OPEN_CURSOR
WHERE user_name = 'ilips'
GROUP BY sid
ORDER BY cursor DESC

SELECT sql_text, count(sid) cnt
FROM v$OPEN_CURSOR
GROUP BY sql_text
ORDER BY cnt DESC

select * from v$session_wait

select sid, serial#, username, taddr, used_ublk, used_urec
 from v$transaction t, v$session s
 where t.addr = s.taddr;

select *  from sys.v_$open_cursor

 

--V$LOCK 을 사용한 잠금 경합 모니터링

SELECT s.username, s.sid, s.serial#, s.logon_time,
    DECODE(l.type, 'TM', 'TABLE LOCK',
          'TX', 'ROW LOCK',
       NULL) "LOCK LEVEL",
    o.owner, o.object_name, o.object_type
FROM v$session s, v$lock l, dba_objects o
WHERE s.sid = l.sid
AND o.object_id = l.id1
AND s.username IS NOT NULL

 

--락이 걸린 세션 자세히 알아보기

select a.sid, a.serial#,a.username,a.process,b.object_name,
decode(c.lmode,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK",
decode (a.command,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNknown') "SQL",
decode(a.lockwait, NULL,'NO wait','Wait') "STATUS"
from v$session a,dba_objects b, v$lock c
where a.sid=c.sid and b.object_id=c.id1
and c.type='TM'

 

--락이 걸린 세션 간단히 알아보기

select a.sid, a.serial#, b.type, c.object_name, a.program, a.lockwait,
       a.logon_time, a.process, a.osuser, a.terminal
from v$session a, v$lock b, dba_objects c
where a.sid = b.sid
  and b.id1 = c.object_id
  and b.type = 'TM';

select a.sid, a.serial#, a.username, a.process, b.object_name
from v$session a , dba_objects b, v$lock c
where a.sid=c.sid and b.object_id = c.id1
and c.type = 'TM'


--락이 걸린 세션을 찾아 내어 세션을 죽이려고 해도 죽지 않는 경우
--아래 쿼리문으로 OS단의 PROCESS ID를 찾아내어 OS에서 죽인다
--kill -9 프로세스아이디

select substr(s.username,1,11) "ORACLE USER", p.pid "PROCESS ID",
s.sid "SESSION ID", s.serial#, osuser "OS USER",
p.spid "PROC SPID",s.process "SESS SPID", s.lockwait "LOCK WAIT"
from v$process p, v$session s, v$access a
where a.sid=s.sid and
p.addr=s.paddr and
s.username != 'SYS'

--위 쿼리문의 결과가 있다면 락이 걸린 세션이 있다는것이므로 아래의 쿼리문으로 세션을 죽인다

ALTER SYSTEM KILL SESSION '11,39061'

 

 

alter session으로 죽지않는 프로세스 죽이기

1.oracle이 설치된 서버에 텔넷으로 root로 접속한다
2.su -오라클계정
3.sqlplus '/as sysdba''
4.connect system/sys
5.ALTER SYSTEM KILL SESSION '137,1723'


JNI를 사용하여 c 함수를 호출할 때의 실제 라이브러리 파일을 로딩하기 위하여 다음과 같이한다.

  1. 환경 변수 PATH에 포함된 디렉토리에 dll 파일을 카피해 둔다.
  2. java 실행 시 -Djava.library.path=c:\library\path 와 같이 dll 파일이 있는 디렉토리를 설정한다.

그런데 위 방법들이 마땅치 않을 수 있다. 웹 어플리케이션의 경우 필요한 파일 모두를 해당 웹 어플리케이션 디렉토리 밑에 모두 모아두고 싶은 경우이다. 만약 1번의 방법을 사용한다면 해당 dll만 웹하고는 전혀 관계없는 C:\windows 같은 시스템 폴더에 두어야 한다. 혹은 dll이 있는 디렉토리 이름을 환경변수 PATH에 포함시켜야 한다. 역시 깔끔하지 않다. 2번 째 방법을 적용하려면 WAS의 실행 스크립트를 수정하여야 한다. 특정 웹 어플리케이션을 설치하기 위하여 WAS 자체를 건드리는 것은 바람직하지 않다.

실행 시에 System 속성 "java.library.path"를 설정하고, 그 변경된 것이 적용되면 좋겠는데, 실행전에 설정하지 않으면 적용되지 않는다.

java.lang.ClassLoader의 코드를 보면 "java.library.path"에 설정된 값을 초기에 한번 String[] usr_paths에 담아두고 그것을 계속 사용한다. reflection을 사용하여 usr_paths에 원하는 경로를 추가하게 하면 되겠다. 하지만 이런 방법은 바람직하진 않고, 또 어떤 위험성이 있는지도 추측하기 힘든 꼼수다.

아래 코드를 달긴 하지만, 어떤 위험성이 있는지는 아직 파악되지 않았다.
그리고 ClassLoader의 private 속성 usr_paths의 이름이 각 JVM마다 다 똑같다는 것도 확인 안되었고.
무엇 보다도 치명적인 것은 private으로 은닉화시켜 놓은 것은 언제든지 변경될 수 있고, 유지보수가 어렵다는 것이다.
꼼수다운 단점이다.

 public static void loadLibrary(String libraryPath, String libraryName) throws LibraryLoadingException {
     
  // 라이브러리 패스를 추가
     addLibrarayPath(libraryPath);
  // 라이브러리를 로딩    
     System.loadLibrary(libraryName);
     
    }

 private static void addLibrarayPath(String libraryPath) throws LibraryLoadingException {
  
  if(libraryPath==null) { return; }
  if(libraryPath.equals("")) { return; }
  
     Field usrPathsField;
  // ClassLoader의 String[] usr_paths 필드를 구하고
  // usr_paths의 값은 시스템 속성 java.library.path의 값으로 초기에 한번만 설정된다.
  try {
   usrPathsField = getField(ClassLoader.class, "usr_paths");
  } catch (ReflectionFailException e) {
   throw new LibraryLoadingException("library loading failed.", e);
  }

  if(usrPathsField==null) {
   throw new LibraryLoadingException("library loading failed. invalid attribute usr_paths");
  }

  // private으로 선언된 것을 접근 가능하게 바꿔주고.
     usrPathsField.setAccessible(true);
     
     String[] userPaths;
  try {
   // 실제 설정된 값을 구하고
   userPaths = (String[])usrPathsField.get(null);
  } catch (IllegalArgumentException e) {
   throw new LibraryLoadingException("library loading failed.", e);
  } catch (IllegalAccessException e) {
   throw new LibraryLoadingException("library loading failed.", e);
  }
     
  // 만약 추가할 패스가 이미 있다면 더 할일이 없다. 나간다.
     for(int i=0; i<userPaths.length; i++) {
      if(libraryPath.equalsIgnoreCase(userPaths[i])) {
       return;
      }
     }

  // 새로운 패스를 추가하고     
     String[] newUserPaths = new String[userPaths.length+1];
     for(int i=0; i<userPaths.length; i++) {
      newUserPaths[i] = userPaths[i];
     }
     newUserPaths[newUserPaths.length-1] = libraryPath;
     
  // 추가된 패스가 포함된 새로운 값을 설정한다.
     try {
   usrPathsField.set(null, newUserPaths);
  } catch (IllegalArgumentException e) {
   throw new LibraryLoadingException("library loading failed.", e);
  } catch (IllegalAccessException e) {
   throw new LibraryLoadingException("library loading failed.", e);
  }
     
 }


 public static Field getField(Class clazz, String fieldName) throws ReflectionFailException {
  
  if(clazz==null) { return null; }
  if(fieldName==null) { return null; }
  
  Field field = null;
  
  Exception rootException = null;
  try {
   field = clazz.getDeclaredField(fieldName);
   return field;
  } catch (SecurityException e) {
   rootException = e;
  } catch (NoSuchFieldException e) {
   rootException = e;
  }
  
  Class superClass = clazz.getSuperclass();
  while(superClass!=null) {
   try {
    field = superClass.getDeclaredField(fieldName);
    return field;
   } catch (SecurityException e) {
   } catch (NoSuchFieldException e) {
   }
   superClass = superClass.getSuperclass();
  }
  
  throw new ReflectionFailException("getting field "+fieldName+" failed.", rootException);
 }

 


2009/05/11 추가사항

이외에 다른 방법이 있다. System.loadLibrary()는 시스템 속성 "java.library.path"의 값을 사용하기 전에 메소드를 호출한 클래스의 클래스로더의 findLibrary(String libraryName)을 호출한다. 해당 라이브러리의 경로를 반환하는 메소드 이다. 만약 요 메소드의 반환값을 적절히 해주면 해결될 것이다. 가장 합벅적인(?)인 방법이다. 그러나 클래스 로드를 따로 개발해야 한다는 부담이 있다. 더군다나 native 라이브러리를 호출하는 코드를 건드리지 못한다면(다른 곳에서 가져온 라이브러리일 경우) 요 방법은 적용하지 못한다. 실제로 테스트해본 결과 로딩은 되긴 한다. 그러나 라이브러리간의 의존성에서 실패한다. a.dll이 있고 b.dll이 있고, a.dll이 b.dll을 사용하는 경우이다. java 코드에서는 a.dll을 잘 로딩했는데 a.dll이 b.dll을 로딩하지 못하였다. "Can't find dependent libraries" 메시지의 java.lang.UnsatisfiedLinkError가 발생한다. 이러한 것이 내가 작성한 코드의 버그인지 다른 원인인지도 모르는 상태에서 덮어 버렸다.

혹시나 해서 비슷한 코드를 찾아 보았다. theyard라는 프로젝트에 JNILibraryLoader라는 클래스가 있다.(http://code.google.com/p/theyard/source/detail?r=168). 가져다 사용해 보니 훌륭하게 동작한다. 내부를 들여다 보니 System.load(String fileName)을 사용하고 있다. 요메소드가 System.loadLibrary()와 무슨 차이가 있는지는 파악하진 않았다. System.load()가 실패하면 loadLibrary()를 호출한다. 그리고 더 마음에 드는 것은 OS별 라이브러리 파일의 확장자를 알아서 처리해 주고, 라이브러리의 버전까지도 명시할 수 있다. 실제 수정한 코드를 첨부한다. JniLibraryLoader.java 사용방법은 다음과 같다.
JniLibraryLoadder.load("c:/some/path", "myLib");


System.loadLibrary()메소드가 시스템 속성 "java.library.path"의 값을 그때 마다 읽지 않고 한번만 읽고는 그 값을 사용하게 한 것은 무언가 이유가 있을 것 같다. 뭔지는 잘 모르겠는데, 이렇게 처리하는 것이 그 무언지 모르는 위험성을 안고 가는것 같아 찜찜하다.

[출처] http://aploit.egloos.com/4937154

'개발 > Java' 카테고리의 다른 글

Commons-lang, Commons-io 사용 샘플  (0) 2011.06.01
JAVA Tip  (0) 2011.04.13
Velocity의 기본 문법  (0) 2011.02.11
Spring - Quartz를 사용하여 스케쥴러 구현하기  (0) 2011.02.08
EHCache를 이용한 캐시 구현  (0) 2011.01.05

linux - netstat

개발/Linux2011. 2. 14. 17:46

netstat는 시스템의 네트워크 연결 상태(tcp, udp, 소켓연결)을 보여주는 유틸리티입니다.

사용 방법은 netstat [options] 으로 사용하면 됩니다. 

 

* 옵션

 옵션

설명 

 -a

 모든 소켓을 보기. 이 옵션을 안 넣으면 상태가 Established 상태인 것만 나온다. 동일 옵션은 --all

 -c

 현재 실행 명령을 매 초마다 실행. 동일 옵션은 --continuous

    => netstat -anc (해당 명령을 매 초마다 실행.)

    => netstat 10 (-c 옵션이 안 들어가도 해당 숫자만큼 시간이 지난후에 명령어 실행.)

 -e

 확장 정보 추가. User 부분과 Inode 열이 추가된다. 동일 옵션은 --extend

 -g

  멀티캐스트에 대한 그룹별 정보를 보여줌 (IPv4/IPv6). 동일 옵션은 --groups

 -i

 인터페이스별 통계값. -I=(인터페이스명) / --interface=(인터페이스명) 을 하면 해당 인터페이스값만 보기도 가능.

 -l

 대기중인 소켓 리스트만 보여준다. 동일 옵션은 --listening

 -n

 도메인 주소를 읽어들이지 않고 숫자로 출력한다. --numeric-hosts --numeric-ports --numeric-users 명령어가 합쳐진 옵션. 동일 옵션은 --numeric

 --numeric-hosts : 호스트 부분을 IP로 출력.

 --numeric-ports : 포트 부분을 숫자로 출력.

 --numeric-users : 유저 부분을 숫자로 출력(UID).

 -o

연결 대기 시간 표기. 동일 옵션은 --timers

 -p

 PID(프로세서 ID) 와 사용중인 프로그램명이 표시된다. 동일 옵션은 --program

 -r

 라우팅 테이블 보기. 'route' 명령어와 동일. 동일 옵션은 --route

 -s

 프로토콜 요약 정보. 동일 옵션은 --statistics

 -t

 TCP 프로토콜 보기. 연결된 것만 나옴. 동일 옵션은 --tcp

 -u

 UDP 프로토콜 보기. 동일 옵션은 --udp

 -v

 버전 보기.

 -w

 RAW 프로토콜 보기. 동일 옵션은 --raw

 -A

 프로토콜별로 보기. 종류는 inet, unix, ipx, ax25, netrom, ddp 가 있음. 동일 옵션은 --protocol

    => netstat -A inet (TCP 프로토콜 연결 상태만 보기)

    => netstat --protocol=inet (위의 명령어와 동일)

 -M

 마스커레이딩 정보 표시. 동일 옵션은 --masquerade


 

* netstat 상태값

 정보

 설명

 Proto

 프로토콜 종류. TCP / UDP / RAW 가 있음.

 Recv-Q

 해당 프로그램이 현재 받는 바이트 표기.

 Send-Q

 해당 프로그램이 현재 보내는 바이트 표기.

 Local Address

 출발지 주소 및 포트. 자신의 주소 및 포트.

 Foreign Address

 목적지 주소 및 포트.

 State

 포트의 상태

    => CLOSED : 연결이 완전히 종료된 상태

    => CLOSED_WAIT : TCP 연결이 상위 응용프로그램 레벨로부터 연결 종료를 기다리는 상태

    => CLOSING : 흔하지 않으나 주로 확인 메세지가 전송 도중 유실된 상태

    => ESTABLISHED : 연결이 완료된 상태.

    => FIN_WAIT1 : 클라이언트가 서버에게 연결을 끊고자 요청하는 상태(FIN을 보낸 상태)

    => FIN_WAIT2 : 서버가 클라이언트로부터 연결 종료 응답을 기다리는 상태(서버가 클라이언트로 부터 최초로 FIN을 받은 후, 클라이언트에게 ACK을 주었을때)

    => LAST_ACK : 호스트가 원격지 호스트의 연결 종료 요구 승인을 기다리는 상태

    => LISTEN :  대기중인 포트. 포트가 열려 있고 클리이언트의 요청을 기다리는 상태.(대기중 상태)

    => SYN_RECV : 연결 요청을 받은 후에 확인 값을 기다리는 상태.

    => SYN_SENT : 클라이언트가 서버에게 연결을 요청한 상태

    => SYN_RECEIVED :  서버가 클라이언트로부터 접속 요구를 받아 클라이언트에게 응담을 하였지만, 아직 클라이언트에게 확인 메세지를 받지 못한 상태

    => TIME_WAIT : 연결은 종료되었지만 종료된 후 기다리는 상태. 약 1분 정도이며 -o 옵션으로 확인 가능. 시간이 다 지나면 사라짐.

    => UNKNOWN : 소켓의 상태를 알 수 없음.



TCP 플래그

 플래그

설명 

 SYN

Synchronization. 

세션을 설정하는 데 사용되며 초기에 시퀀스 번호를 임의로 생성하여 보냄. 100%는 아니지만 대부분 클라이언트측에서 보내는 플래그 

 ACK

Acknowledgement. 

받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보냄.

ACK의 번호와 응답을 통해 보낸 패켓에 대한 손실을 판단하여 재전송 하거나 다음 패킷을 전송

 FIN

Finish.

세션을 종료시키는데 사용되며, 보낸 사림이 더 이상 보낼 데이터가 없음을 보여줌.

 RST

Reset.

재설정을 하는 과정이며, 양방향에서 동시에 일어나는 중단 작업.

비정상적인 세션 연결 끊기에 해당

 PSH

 Push.

대화형 트래픽에 사용되며, 버퍼가 채워지기를 기다리지 않고 데이터를 전달. 데이터는 버퍼링 없이 바로 위 Layer가 아닌 7 Layer의 응용프로그램으로 바로 전달

 URG

Urgent.

Urgent point가 유효한 것인지를 나타냄. Urgent point란 전송하는 데이터 중에서 긴급히 전달해야 하는 내용이 있을 경우 사용 



기본 사용법

netstat -t 현재 접속중의 포트들의 상태 내용 확인

netstat -nap (열려 있는 모든 포트)

netstat -l 또는 netstat -nap | grep LISTEN (LISTEN 되는 모든 포트)

netstat -nap | grep ESTABLISHED | wc -l ( 모든 서비스 동시 접속자 수)

netstat -nap | grep :80 | grep ESTABLISHED | wc -l ( 웹 동시 접속자 수)

netstat -natc (열려있는 모든 TCP 포트를 일정시간마다 반복 출력한다) 


 

* 예제.

1. 인터넷 연결 상태 보기.


[root@navi-linux ~]# netstat -A inet

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State

tcp        0      0 navi-linux:35212            123.123.123.123:http           ESTABLISHED

tcp        0      0 navi-linux:56976            61-111-58-50.kidc.net:http  ESTABLISHED

tcp        0    314 navi-linux:telnet           231.231.231.231:netcheque     ESTABLISHED

 


2. 통계값 보기 (프로토콜별).


[root@navi-linux ~]# netstat -s

Ip:

    1141245 total packets received

    355 with invalid addresses

    0 forwarded

    0 incoming packets discarded

    1007688 incoming packets delivered

    1050768 requests sent out

    24 dropped because of missing route

Icmp:

    24 ICMP messages received

    0 input ICMP message failed.

    ICMP input histogram:

        destination unreachable: 22

        echo requests: 1

        echo replies: 1

    141 ICMP messages sent

    0 ICMP messages failed

    ICMP output histogram:

        destination unreachable: 135

        echo request: 5

        echo replies: 1

IcmpMsg:

        InType0: 1

        InType3: 22

        InType8: 1

        OutType0: 1

        OutType3: 135

        OutType8: 5

Tcp:

    64013 active connections openings

    16 passive connection openings

    10 failed connection attempts

    12 connection resets received

    6 connections established

    901778 segments received

    941524 segments send out

    2915 segments retransmited

    0 bad segments received.

    163 resets sent

Udp:

    105794 packets received

    4 packets to unknown port received.

    0 packet receive errors

    106216 packets sent

UdpLite:

TcpExt:

    1 ICMP packets dropped because socket was locked

    4112 TCP sockets finished time wait in fast timer

    2 packets rejects in established connections because of timestamp

    111607 delayed acks sent

    12 delayed acks further delayed because of locked socket

    Quick ack mode was activated 901 times

    112 packets directly queued to recvmsg prequeue.

    832 packets directly received from prequeue

    464924 packets header predicted

    48 packets header predicted and directly queued to user

    125499 acknowledgments not containing data received

    1063 predicted acknowledgments

    6 congestion windows recovered after partial ack

    0 TCP data loss events

    2 timeouts after SACK recovery

    393 other TCP timeouts

    901 DSACKs sent for old packets

    78 DSACKs received

    6 connections reset due to unexpected data

    10 connections reset due to early user close

    356 connections aborted due to timeout

    TCPDSACKIgnoredOld: 4

    TCPDSACKIgnoredNoUndo: 6

    TCPSackShiftFallback: 2

IpExt:

    InMcastPkts: 7643

    OutMcastPkts: 42

    InBcastPkts: 124586

    InOctets: 752411380

    OutOctets: 172659736

    InMcastOctets: 2477680

    OutMcastOctets: 11674

    InBcastOctets: 13876218

 

3. 통계값 보기 (인터페이스별).


[root@navi-linux ~]# netstat -i

Kernel Interface table

Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR

Flg

eth0       1500   0  2168579      0      0      0  1053363      0      0      0

BMRU

eth1       1500   0        0      0      0      0        0      0      0      0

BMU

eth2       1500   0        0      0      0      0        0      0      0      0

BMU

lo        16436   0       20      0      0      0       20      0      0      0

LRU

 

4. 열려 있는 TCP 포트 보기.


[root@navi-linux ~]# netstat -lnt -A inet

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN

tcp        0      0 0.0.0.0:34580               0.0.0.0:*                   LISTEN

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN

 

5. 연결된 TCP 포트 보기.


[root@navi-linux ~]# netstat -nt -A inet

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State

tcp        0      0 111.111.111.111:33659         123.123.123.123:80             ESTABLISHED

tcp        0      0 111.111.111.111:56976         61.111.58.50:80             ESTABLISHED

tcp        0    134 112.112.112.112:23            121.121.121.121:4008          ESTABLISHED

 

6. 모든 열려있는 포트 보기.

[root@navi-linux ~]# netstat -ant -A inet


Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State


tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN

tcp        0      0 0.0.0.0:34580               0.0.0.0:*                   LISTEN

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN


tcp        0      0 111.111.111.111:33659         123.123.123.123:80             ESTABLISHED

tcp        0      0 111.111.111.111:56976         61.111.58.50:80             ESTABLISHED

tcp        0    134 112.112.112.112:23            121.121.121.121:4008          ESTABLISHED

 

7. 특정 포트나 호스트 모니터링 하기. (1초마다 80포트(인터넷)를 보기. ':80' 라는 텍스트가 들어간 라인을 보여준다. netstat -A inet -n | grep :80 을 1초마다 실행하는 결과이다.)

[root@navi-linux ~]# netstat -A inet -n -c | grep :80

 

tcp        0      0 111.111.111.111:56214         123.123.123.123:80             ESTABLISHED

tcp        0      0 111.111.111.111:56976         61.111.58.50:80             ESTABLISHED

 

8. 네트워크 자원을 사용중인 프로그램 종료 하기.


[root@navi-linux ~]# netstat -A inet -atp

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address               Foreign Address             Stat

e       PID/Program name

tcp        0      0 *:sunrpc                    *:*                         LIST

EN      856/rpcbind

tcp        0      0 *:34580                     *:*                         LIST

EN      935/rpc.statd

tcp        0      0 *:ssh                       *:*                         LIST

EN      3681/sshd

tcp        0      0 navi-linux:47270            111.111.111.111:http           ESTA

BLISHED 2263/firefox

tcp        0      0 navi-linux:41638            111.111.111.111:http           ESTA

BLISHED 2263/firefox

tcp        0      0 navi-linux:telnet           222.222.222.222:netplan       ESTA

BLISHED 943/in.telnetd: 172

tcp        0      0 navi-linux:46763            111.111.111.111:http           ESTA

BLISHED 2263/firefox

tcp        0      0 navi-linux:47264            111.111.111.111:http           TIME

_WAIT   -

tcp        0      0 navi-linux:52984            123.123.123.123:ftp          ESTA

BLISHED 886/filezilla

tcp        0      0 navi-linux:56581            61-111-58-50.kidc.net:http  ESTA

BLISHED 1857/clock-applet

tcp        0      0 navi-linux:47273            111.111.111.111:http           ESTA

BLISHED 2263/firefox

 

파일질라가 네트워크를 이용중이다. 프로그램을 종료시키자. -p 옵션이 들어가 있어야 한다. 맨 우측 886/filezilla 가 보인다. 왼쪽이 프로세서 ID(PID)이고 오른쪽이 실행이름이다.

 

[root@navi-linux ~]# kill 886

 

kill 명령어로 파일질라의 PID를 입력하여 프로그램을 종료시킨다.

 

[root@navi-linux ~]# netstat -A inet -atp

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address               Foreign Address             Stat

e       PID/Program name

tcp        0      0 *:sunrpc                    *:*                         LIST

EN      856/rpcbind

tcp        0      0 *:34580                     *:*                         LIST

EN      935/rpc.statd

tcp        0      0 *:ssh                       *:*                         LIST

EN      3681/sshd

tcp        0      0 navi-linux:57621            111.111.111.111:http           ESTA

BLISHED 2263/firefox

tcp        0      2 navi-linux:telnet           222.222.222.222:netplan       ESTA

BLISHED 943/in.telnetd: 172

tcp        0      0 navi-linux:42278            111.111.111.111:http           ESTA

BLISHED 2263/firefox

tcp        0      0 navi-linux:52984            123.123.123.123:ftp          TIME

_WAIT   -

tcp        0      0 navi-linux:56581            61-111-58-50.kidc.net:http  ESTA

BLISHED 1857/clock-applet

 

재확인결과 없어져있다. TIME_WAIT 은 연결 종료 후 1분간 보인다.

 

현재 얼마나 많은 네트워크 접속이 있는지 확인하기

while [ true ]

do

net_status=`netstat -t | wc -l`

dt=`date "%Y-%m-%d %H:%M:%S"


echo "${dt} : ${net_status}"

done

결과

2012-02-06 12:03:32 : 5402

2012-02-06 12:03:35 : 5412




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

윈도우용 netstat

시작 - 실행 - cmd 에서 커맨드 입력 상태로 먼저 들어간다.

Netstat활성 TCP 연결, 컴퓨터 수신 포트, 이더넷 통계, IP 라우팅 테이블, IPv4 통계(IP, ICMP, TCP, UDP 프로토콜에 대한 통계), IPv6 통계(IPv6, ICMPv6, IPv6를 통한 TCP, IPv6를 통한 UDP 통계)를 표시합니다. netstat를 매개 변수 없이 사용하면 활성 TCP 연결을 표시합니다.

구문
netstat [-a] [-e] [-n] [-o] [-p Protocol] [-r] [-s] [Interval]

매개 변수
-a
모든 활성 TCP 연결과 컴퓨터가 수신하는 TCP 및 UDP 포트를 표시합니다.
-e
바이트 수 및 보내고 받은 패킷과 같은 이더넷 통계를 표시합니다. 이 매개 변수는 -s와 함께 사용할 수 있습니다.
-n
활성 TCP 연결을 표시합니다. 주소 및 포트 번호는 숫자로 표시되고 이름을 확인하는 작업은 수행하지 않습니다.
- o
활성 TCP 연결을 표시하고 각 연결의 프로세스 ID(PID)를 포함합니다. Windows 작업 관리자의 프로세스 탭에서 PID 기반 응용 프로그램을 찾을 수 있습니다. 이 매개 변수는 -a, -n 및 -p와 함께 사용할 수 있습니다.
-p Protocol
Protocol을 사용하여 지정한 프로토콜의 연결을 표시합니다. 이 경우 Protocol은 tcp, udp, tcpv6, udpv6이 될 수 있습니다. 매개 변수를 -s와 함께 사용하면 프로토콜이 통계를 표시합니다. Protocol은 tcp, udp, icmp, ip, tcpv6, udpv6, icmpv6, ipv6가 될 수 있습니다.
-s
프로토콜에 의해 통계를 표시합니다. 기본적으로 TCP, UDP, ICMP 및 IP 프로토콜에 대한 통계를 표시합니다. IPv6 프로토콜을 설치하면 IPv6를 통한 TCP, IPv6를 통한 UDP, ICMPv6, IPv6 프로토콜에 대한 통계가 표시됩니다. -p 매개 변수는 프로토콜의 집합을 지정하는 데 사용할 수 있습니다.
-r
IP 라우팅 테이블의 내용을 표시합니다. 이것은 route print 명령과 같습니다.
Interval
Interval초마다 선택한 정보를 다시 표시합니다. 통계를 다시 표시하지 않으려면 Ctrl+C를 누릅니다. 이 매개 변수를 생략하면 netstat는 선택한 정보를 한 번만 표시합니다.
/?
명령 프롬프트에서 도움말을 표시합니다.
설명
이 명령과 함께 사용되는 매개 변수는 슬래시(/) 대신 하이픈(-)을 앞에 붙여야 합니다.
netstat는 다음과 같은 정보에 대한 통계를 제공합니다.
Proto
프로토콜(TCP 또는 UDP) 이름입니다.

로컬 주소
사용되고 있는 로컬 컴퓨터의 IP 주소와 포트 번호입니다. -n 매개 변수를 지정하지 않으면 IP 주소 및 포트 이름에 해당하는 로컬 컴퓨터의 이름이 표시됩니다. 포트를 아직 설정하지 않은 경우 포트 번호가 별표(*)로 나타납니다.

외부 주소
소켓이 연결된 원격 컴퓨터의 IP 주소와 포트 번호. -n 매개 변수를 지정하지 않으면 IP 주소 및 포트에 해당하는 이름이 표시됩니다. 포트를 아직 설정하지 않은 경우 포트 번호가 별표(*)로 나타납니다.

(state)
TCP 연결 상태를 표시합니다. 가능한 상태는 아래와 같습니다.

CLOSE_WAIT

CLOSED

ESTABLISHED

FIN_WAIT_1

FIN_WAIT_2

LAST_ACK

LISTEN

SYN_RECEIVED

SYN_SEND

TIMED_WAIT

TCP 연결 상태에 대한 자세한 내용은 RFC 793을 참조하십시오.

이 명령은 인터넷 프로토콜(TCP/IP) 프로토콜이 네트워크 연결의 네트워크 어댑터 속성의 구성 요소로 설치된 경우에만 사용할 수 있습니다.

이더넷 통계 및 모든 프로토콜 통계를 표시하려면 다음과 같이 입력합니다.

netstat -e -s

TCP 및 UDP 프로토콜의 통계를 표시하려면 다음과 같이 입력합니다.

netstat -s -p tcp udp

활성 TCP 연결 및 프로세스 ID를 5초마다 표시하려면 다음과 같이 입력합니다.

nbtstat -o 5

숫자 형식을 사용하여 활성 TCP 연결 및 프로세스 ID를 표시하려면 다음과 같이 입력합니다.

nbtstat -n -o

* 옵션

  -a : 모든 연결 및 열린 포트를 확인한다. 리눅스의 -a 옵션과 동일.

  -b : 현재 연결이 어떤 프로그램이 사용중인지 표시한다. PID(프로세서 ID)도 표시된다. 리눅스의 -p 옵션과 동일.

  -e : 인터페이스의 통계치를 보여준다. 윈도우용은 기본적인것만 나오고 리눅스는 매우 자세히 나온다. 리눅스의 -i 옵션과 동일.

  -n : 주소 및 포트를 숫자 형식으로 표시. 리눅스의 -n 옵션과 동일.

  -o : 현재 연결이 어떤 프로그램이 사용중인지 PID(프로세서 ID)만 표시한다.

  -r : 라우팅 테이블을 표시한다. route print와 동일하다. 리눅스의 -r 옵션과 동일.

  -s : 프로토콜별 통계치를 보여준다. 리눅스의 -s 옵션과 동일.

  -v : -b 옵션과 같이 사용시 아주 자세히 어떤 파일들이 네트워크 연결에 쓰는지 볼 수 있다. 정보 수집을 하여 시간이 오래 걸린다.

  숫자 : 숫자값을 입력하면 해당 초만큼 간격으로 명령을 반복 실행한다. 정지는 Ctrl+C
[출처] 리눅스 명령어 - netstat (네트워크 연결 상태)|작성자 유미화



'개발 > Linux' 카테고리의 다른 글

[명령어] history 이전에 실행된 명령어 출력  (0) 2011.05.25
linux 명령어 - ln 심볼릭 링크  (0) 2011.05.25
linux에 mysql 설치하기  (0) 2010.01.05
vi 사용하기  (0) 2009.09.10
[linux] 시스템(하드웨어) 사양 보기  (0) 2009.02.18

1. VTL(Velocity Template Language) 장점
@ UI 디자이너와 개발자의 병렬 개발 가능
@ 각각의 영역에 집중가능
@ 유지보수 용의
@ JSP,PHP 대체방안 제시


2. VTL 문장은 # 으로 시작하며  변수명은 $ 로 표시한다.
- VTL 문장의 시작은 #으로 시작합니다.
- 변수의 시작은 $로 시작합니다.

# set( $foo = "Velocity")


따라서 다음과 같이 #set($color = "blue") 라고 하면 $color 변수에 String "blue" 값을 담는 VTL 문법이 되겠습니다. 그러면 Hello World 를 출력해보도록 하겠습니다.

<html>
<body>
#set($color = "blue")
내가 좋아하는 색깔은 $color 입니다.
</body>
</html>


*VTL을 실행하기 위해서는 필수적인 Jar 파일이 있습니다. 아래의 Jar 파일을 WEB-INF/lib 안에 복사하세요

velocity-dep-*.jar : velocity 그리고 관련된 클래스 파일
velocity-tools-*.jar : velocity tool
commons-digester
commons-collections
commons-beanutils


3. 주석처리방법
한줄 : ##
여러줄 : #*  *#


VTL에서 주석은 다음과 같이 사용합니다. 일반적으로 주석이라 하면 <!-- --> 을 사용했는데, VTL은 다음과 같은 주석을 사용합니다.

## This is Commnets!!

#*
This is Comments!!
*#



4. 자바객체사용해서 하위 객체 접근이 가능하다
$ custom.Address
$ custom.getAddress()



5. 값을 불러오는 여러가지 방법
$ customer.address 를 다음과 같이 표현할수 있다.
$ getaddress()
$ getAddress()
$ get("address")
$ isAddress()


6. 중간에 변수가 들어가서 잘못 파싱되는것을 방지하기위해 쓰는 방식인데 기본적으로 이렇게 처리하는 버릇을 들이자 
Jack is a $vicemaniac.
Jack is a ${vice}maniac.


7. 값이 없을 시에 공백처리를 원할때
<input type="text" name="email" value="$!email>
좀더 안전하기를 원하면 value="$!{email}"


8. #set 지시자 사용시 큰따옴포("") 안의 내용은 파싱되어 그 결과물을 출력한다.
#set( $template = "$directoryRoot / $templateName")
지시 및 연산 변수의 경우는 다음과 같습니다.

#set( $a= 10 )
#set( $b= 20 )
#set( $value = $a + 1 ) ## 11
#set( $value = $b - 1 ) ## 9
#set( $value = $a * $b ) ## 200
#set( $value = $a / $b ) ## 0.5


9. '' 작은 따옴표는 파싱되지 않고 내용이 그대로 출력되지만

velocity.properties 안의 Stringliterals.interpolote = false 값을 바꿈으로서 파싱이 되도록 설정한다.

10. for 문으로 반복문을 처리하고 싶을때
iterator 와 비슷한 형태의 구조이다.
#foreach($page in $boardList)
<!-- 처리하고자 하는 내용 -->
#end



11. if 문을 쓰고싶을때
#if($velocityCount <= 3)
   $item
#end

그 외 제어문은 다음과 같습니다.

#set($a = 10)

#if($a > 9)
   9보다 큽니다
#elseif($a == 10)
   10과 같습니다
#end


반복문의 경우는 다음과 같습니다.

<ul>
#foreach( $product in $allProducts )
<li>$product.id , $product.name</li>
#end
</ul>


일반적인 foreach와 같습니다. Controller에서 ArrayList 객체를 allProducts로 네임을 정해서 View 단으로 보냈다면 위와 같은 문법으로 allProducts의 객체를 $product로 담고, $product를 통해 각 프로퍼티를 출력할 수 있습니다.

출처 : http://dsstory.tistory.com/105