반응형




+톰캣을 root 계정이 아닌 tomcat 계정으로 실행 하기

우선 tomcat 계정을 생성한다.
# useradd -M tomcat

톰캣 계정 설정 확인
계정을 생성하면 home 디렉토리가 /home/tomcat으로 설정 되며, 이를 CATALINA_HOME으로 변경해준다.

# grep tomcat /etc/passwd
tomcat:x:503:503::/usr/local/tomcat:/bin/bash

실행 스크립트 작성하기 (간략버전)
# vi /etc/rc.d/init.d/tomcat

아래 내용을 작성한다.  ==> 서비스 재시작(restart)시 문제가 발생할 수 있음!!! 주의! (binding fail.) => 서비스 shutdown이 완전히 완료되었는지 확인하는 작업이 필요함.

(아래는 간략 버전이므로 restart는 정확성이 보장 안됨. 다음에 나오는 update 버전 참고)
#!/bin/bash
# Startup script for the Tomcat Server
# chkconfig: 345 50 50
# description: Tomcat is a Web application server.
# processname: java
# directory : CATALINA_HOME=/usr/local/tomcat
. /etc/profile
case "$1" in
    start)
        echo "Starting tomcat: "
        su - tomcat -c $CATALINA_HOME/bin/startup.sh
        ;;
    stop)
        echo "Shutting down tomcat: "
        su - tomcat -c $CATALINA_HOME/bin/shutdown.sh
        ;;
    restart)          # 안전하지 않으니 restart는 하지 말 것.
        echo "Restarting tomcat: "
        su - tomcat -c $CATALINA_HOME/bin/shutdown.sh; su - tomcat -c $CATALINA_HOME/bin/startup.sh
        ;;
    *)
        echo "Usage: service tomcat {start|stop|restart}"
        exit 1
esac
exit 0

소유권을 tomcat으로 변경
# chown tomcat:tomcat tomcat 

tomcat 스크립트에 실행권한 주기
#chmod 755 tomcat

runlevel에 등록
chkconfig에서 add 될 수 있도록 스크립트에 "# chkconfig: 345 50 50" 를 추가한다.
#chkconfig --add tomcat


실제로 리부팅시 톰캣이 tomcat 계정으로 실행되는지 확인한다
# reboot

톰캣 실행시 데몬실행이 tomcat으로 되어 있는지 확인한다.  tomcat이 아닌 root인경우는 잘못된 경우임
# ps -ef | grep tomcat

톰캣 프로세스 수동 시작 및 종료
# service tomcat start
# service tomcat stop



반응형

자주 사용하는 이클립스(eclipse) 단축키


개발툴에서는 단축키 사용이 필수인데, 여러가지를 쓰다보면 가끔 기억이 나지 않을 때가 종종 있습니다. 주로 많이 쓰는 이클립스 단축키들을 정리해봤습니다.



+ 일반적인 기능 단축키

-동일한 파일을 2개 창으로 보기
ctrl+{    ; 좌우로 보기 (ctrl+shift+{) 

-파일2개를 창2개로 보기
추가로 열 파일을 탭에서 드래그하여 원하는 윈도우 박스 위치에 놓는다.


(컨, ^ - 컨트롤 키 ,  쉡-쉬프트 키, @-알트 키)

컨쉽+O ; auto import
컨쉽+T ; 클래스 찾기
컨쉽+위/아래 ; 메소드 이동(위, 아래)
컨쉽+스페이스 ; 파라미터 보기
컨쉽+F ; 자동 코드 들여쓰기 정리. form feed.

컨+O ; 현재소스내에서 메소드나 필드로 이동 ; method
컨+T ; class tree보기/이동 상속관계 ; tree

컨+K ; 찾는 문자열 블록선택후, 연속으로 찾기. 반대방향은 쉽 추가.

컨+D ; delete line
컨+I ; auto indent (one line)



+ 가장 필요한 단축키.  
Code Assit
추적
돌아가기
실행

@+방향키(왼쪽화살표) ; 이전 커서 위치로 이동!!!!!! 소스추적하다가 되돌아갈때 필수!
^+Space ; 코드 파라미터 보기  (sysout 자동풀기)
(리눅스에서는 @+/ )

F3 or  ^클릭 ; 함수 추적
^+F11 ; 실행
^F6 ; 이전 에디터창(소스). 
^Q ; 소스 마지막 수정위치로 이동
^+SHIFT+/ ; 블록 주석처리
^+  / ; 주석처리
^+SHIFT+F ; 코드 정리 (인덴테이션)



+이클립스 (MAC)맥에서 단축키  (Com - 커맨드 키)

(@대신Com)+방향키 ; 이전 커서 위치로 이동
(Com추가)+^+Space ; 코드 파라미터 보기
F3 or  ^+클릭 ; 추적
(FN추가)+^+F11 ; 실행
^F6 ; 이전 에디터창(소스). 
^Q ; 소스 마지막 수정위치로 이동
^H ; 전체 검색

^K ; 다음 찾기. 이전찾기 ^+SHIFT+K




반응형

입력창에 실시간으로 숫자키만 입력 받도록 하고, 출력하는 기능예제입니다.

보통은 onsubmit 이나 onchange에서 처리해도 되지만, 키 타이핑시 마다 즉시 체크하도록 하여 아예 입력이 안 되도록 합니다. 

검사 루틴만 변경하면 원하는 key typing만 받도록 처리할 수 있습니다.

<input id="myinput" onkeypress="javascript:return myFunction(event);" onkeyup="myFunction2();">

</input>

only numbers...

<p id="demo"></p>


<script>

function myFunction(evt) {

  var charCode = (evt.which) ? evt.which : event.keyCode;

        if (charCode > 31 && (charCode < 48 || charCode > 57)) {

            return false;

        }

        return true;

}

function myFunction2() {

    var x = document.getElementById("myinput").value;

    document.getElementById("demo").innerHTML = "You selected: " + x;

}

</script>



반응형


링크 태그인 a를 보면 기본적으로 밑줄이 있고, 방문했던 링크는 색깔도 변한다.

보기에 안 좋을 수 있다.

css를 추가하여 간단하게 깔끔하게 원하는대로 변경할 수 있다.


예)

a:link { color:#0000ff; text-decoration: none;}  

a:visited { color:#0000ff; text-decoration: none;} 

a:hover { color:#cc0000; text-decoration: none;}

a:active { color:#ff0000; text-decoration: none;}


의미는 다음과 같다.

link는 기본 텍스트 색상
visited는 방문했던 적이 있는 링크
hover는 마우스가 해당 링크정보 위로 올라갔을 때
active는 마우스로 클릭하는 순간 짧은 시간 동안.

정리하면 처음에는
link 상태에서 마우스가 위로 올라가면 hover 여기서 클릭하면 active로 짧게 상태로 변경되었다가 visited로 된다.




반응형


frame을 나누어 메뉴페이지와 내용 페이지들을 분리하여 구성하고 있는데, 외부에서 직접 내용 페이지 URL로 접근할때 메뉴 페이지나 상단 타이틀 페이지 등 다른 페이지들이 출력되지 않는 문제가 있다.

frame 내부 페이지 직접 접근시 최상위 페이지로 이동하게 만드는 기능.


서브페이지 코드에 이동할 최상위 페이지를 지정해 둔다. 메뉴 선택을 바로 들어갈 수 있도록 파라미터로 이동 메뉴를 준다.

<script>

// 프레임 페이지 직접 접근 차단. 메인 페이지로 이동

self.onload = function init() {

if ( self==top ) {

self.location = "/?menu=hash" ;

}

}

</script>


최상위 페이지 코드 (index 페이지)
위에서 GET 파라미터로 준 메뉴를 디폴트 페이지로 내용을 설정하는 작업. 
예시)
<frameset cols="200px,*" border="0">
<frame name="menu" src="./menu.php">
<?php
$t = $_GET['menu'] ;
if ( $t && $t!="") {
if ( $t=='link' )
$t='link.php' ;
else if ( $t=='encode')
$t = 'encode.php';
else if ( $t=='hash')
$t = 'hash.php';
else if ( $t=='encrypt')
$t = 'encrypt.php';
else
$t='encode.php' ;
} else
$t='encode.php';
?>
<frame name="right" src=<?php echo "\"$t\"";?> >
</frameset>



반응형


자바스크립트에서 입력필드값을 타이핑시마다 검증하는 방법이다.


예) textarea의 최대 글자수 체크하여 넘지 못하도록 하기. 

이것은 간단하게 속성으로 설정할 수 도 있지만, 여기서는 예제로 해 본 것이다.

검사 부분을 원하는 입력값 형식체크로 변경하여 사용할 수 있다.


<html>

<head>

<script language="javascript">


function checkLength(obj) {

var maxlen = 10; 

if(obj.value.length > maxlen) {

obj.value = obj.value.substring(0,maxlen);

}

}


</script>

</head>

<body>



<form name="form">

<textarea name="content" cols="20" rows="5" onKeyUp="checkLength(this);"></textarea>

<textarea name="content2" maxlength="10"></textarea>

</form>

<body>


</html>




반응형

자바스크립트에서 폼 데이터를 전송시에 입력값 검증을 하는 방법이다.


보통 폼 데이터를 submit(전송, 확인 버튼)을 할 때, 검증을 수행하게 한다.


<form action="aaa.html" method="POST" onsubmit="return formChk();">

<input id='aname' type="text" name="aname">


위와 같이 form에 onsubmit 이벤트에 검사 할 함수를 추가한다.

return은 onsubmit의 리턴값으로 formChk()의 반환값을 그대로 사용하게 한다.

리턴값이 false이면 submit을 취소하게 된다. 


<script>

function formChk() {

// to do : 입력값 검증

if ( $('#aname').val()=='' ) {

alert("input data!") ;

return false ;

}

return true;

}

위와 같이 입력값을  id로 찾을때는 jquery를 사용하여 변수에 접근하면 편리하다.

순수 js를 사용하려면 name으로 element를 찾아 접근하면 된다.

document.forms[0].aname.value

또는

document.getElementByName("aname").value


입력값 검증에서 입력값을 다시 받도록 할 때는 보통 포커스를 입력필드로 이동시킨다.



변수명이 길어지므로 간단하게 함수로 파라미터를 받아 처리하기도 한다.

function formCheck(frm) {

if ( frm.aname.value=="") {

alert("이름을 입력해주세요.") ;

frm.aname.focus() ;

return false ;

}

return true ;

}


<form name="myform" onsubmit="return formCheck(this);">

이렇게 사용한다.


+폼체크에서 많이 체크하는 루틴

var fVal = frm.aname.value;


수(integer) 범위 체크

if ( parseInt(fVal) < 8   || parseInt(fVal)>10 )


빈값 체크

if ( fVal=="" )








반응형



+ 이클립스 버그

+ javax.servlet을 못 찾을 때.

해당 프로젝트의 속성(config)에서 runtime server를 다시 추가하고,
라이브러리 우선 순위를 위로 올려준다. (주로 우선순위 문제이다.)


+ tomcat 서버 추가가 안 될 때.
It is a bug in Eclipse. I had exactly the same problem, also on Ubuntu with Eclipse Java EE Juno.

Here is the workaround that worked for me:

Close Eclipse
In {workspace-directory}/.metadata/.plugins/org.eclipse.core.runtime/.settings delete the following two files:
org.eclipse.wst.server.core.prefs
org.eclipse.jst.server.tomcat.core.prefs
Restart Eclipse

+ ADT Manager가 안보일때
Windows - customize perspective
tool bar visibility와 command groups avaliavility에 adroid sdk and avd manager를 체크한다.


+이클립스 로드시 'd:skin' 요소로 시작하는 부적합한 콘텐츠가 발견되었습니다... 라고 오류날때

오류 메시지에도 보이듯이, "Android Ware(시계같은 Wareable 장치 개발)" 에서 오류가 나는거니, 이거 다 지워 주면된다.
이건 "Android Ware" 의 버그로 알려져 있는데, 나의 경우는 필요가 없으니 지워 버린거고, 필요할 경우 재 설치하면 해결 된다고 한다.

device.xml 에서 "<d:skin>" 항목을 지워주기만 해도 된다는 얘기가 있기도 하다...

주로 삭제해야될 패키지 2개
Android wear arm eabi v7a system image ; 22 1
Android wear intel x86 atom system image ; 22 1



+ 이클립스 실행 실패시.
eclipse.ini 파일을 열고 아래에서 javaw 경로명을 맞추고 -vm 부분을 추가한다.  (주의! -vm 옵션은 반드시 -vmargs보다 위에 있어야 된다.)

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20140116-2212
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
1024M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
1024m
--launcher.defaultAction
openFile
--launcher.appendVmargs

-vm
C:\Program Files\Java\jdk1.7.0_60\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.7
-Xms512m


-Xmx1024m



반응형




+tomcat7


-주의 ; tomcat6에서는 war 배포시 서블릿에 대한 정의를 tomcat6에서는 web.xml에서 지정해주어야 한다.
그러나, tomcat7에서는 web.xml이나 코드내에 @WebServlet 지정자 둘 중에 하나만 지정해야 한다. 중복시, 웹앱이 실행이 되지 않을 수 있다.
/usr/tomcat7/logs/catalina.날짜.log 파일을 열어보면 알 수 있다.

-CentOS에서 java는 오라클 사이트에서 따로 구하지 않아도, 그냥 yum에서 jdk7 버전 깔고, 환경 설정만 해주면 된다.

: /etc/profile에 다음의 스크립트를 추가
# java7
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk.x86_64
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/*:.

# tomcat7
export CATALINA_HOME=/usr/tomcat7

export PATH=$PATH:$CATALINA_HOME/bin:$JAVA_HOME/bin

+ 시작 방식도 좀 다름
tomcat6에서는 service tomcat6 start/stop/restart 등으로 했으나, tomcat7에서는 

startup.sh start/stop  
shutdown.sh

아니면 서비스 스크립트 만들면 동일하게 사용 가능.



+ 서비스 데몬 등록 (부팅시 자동 시작)


# vi /etc/init.d/tomcat 를 실행하여 아래내용을 입력하자  (tomcat7 init.d script 검색)


#!/bin/sh
#
# Tomcat7 auto-start
#
# chkconfig: 2345 90 90
# description: Auto-starts tomcat7
# processname: tomcat7
# pidfile: /var/run/tomcat7.pid
case $1 in
start)
    sh /usr/tomcat7/bin/startup.sh
    ;;
stop)
    sh /usr/tomcat7/bin/shutdown.sh
    ;;
restart)  # 신뢰할 수 없으니 restart 는 사용하지 말 것.
    sh /usr/tomcat7/bin/shutdown.sh
    sh /usr/tomcat7/bin/startup.sh
    ;;
esac
exit 0   


chmod 755 /etc/init.d/tomcat
실행권한 설정

chkconfig --add tomcat


-참고; tomcat 서비스가 안 죽으면 java 프로세스를 죽이면 된다. 주의!!!!
위 restart 커맨드는 절대 신뢰하면 안 됨!!!!! 주의!!!! 가끔 포트를 잡은 상태로 서비스가 종료 될 수 있다. 서비스 시작이 address in use로 되어
실패될 수 있음 !!! 스크립트 변경 필요!!!!!



반응형



+ 톰캣/Java 프로세스 모니터링 감시 / 내려가면 다시 실행. respawn

# cat tomcat_respawn.sh

#!/bin/sh
#tomcat PID 추출
PID=`lsof -itcp:8080 | grep LISTEN | awk 'NR==1 {print $2}'`
NEEDRUN=false

if [ ${PID} > 0 ]
then
     wget -q http://localhost:8080/test/test.jsp
     if [ -f test.jsp ]
     then
          rm -f test.jsp
     else
          NEEDRUN =true
     fi
else
     NEEDRUN =true
fi

if [ ${NEEDRUN} == "true" ]
then
     service tomcat7 restart
fi

위 스크립트를 crontab에 등록한다.
#chkconfig 로 crond가 운영중인지 확인한다.

#crontab -e
또는
/etc/crontab을 수정
  •  * /2 * * * * /etc/tomcat_respawn.sh > /dev/null 2>&1
2분마다 실행됨.


+ 다른 스크립트 (참고)
#!/bin/sh

            while true ; do
                /bin/date
                echo 'checking tomcat'
                if /bin/ps -elf | /bin/grep 'java' | /bin/grep 'j2sdk' then
                :
                echo 'WAS GOOD'
                else
                echo 'WAS BAD'
                /usr/local/tomcat/bin/startup.sh
                fi
                sleep 60
            done



+ Recent posts