20220627-0001-3
20220627-0002-77.

SELECT '20220627-0001-3' AS RQST_NO_SEQ FROM DUAL
   UNION ALL
   SELECT '20220627-0002-77' AS RQST_NO_SEQ FROM DUAL

 

/

SELECT REGEXP_SUBSTR( RQST_NO_SEQ , '[^-]+', 1, 1) AS RQST_NO_1
      ,REGEXP_SUBSTR( RQST_NO_SEQ , '[^-]+', 1, 2) AS RQST_NO_2
      ,REGEXP_SUBSTR( RQST_NO_SEQ , '[^-]+', 1, 3) AS RQST_NO_3
 FROM (SELECT '20220627-0001-3' AS RQST_NO_SEQ FROM DUAL
   UNION ALL
   SELECT '20220627-0002-77' AS RQST_NO_SEQ FROM DUAL);

 

--결과

 

 

'정규식' 카테고리의 다른 글

정규식 숫자 제외하기 eval사용 하기.  (0) 2013.08.30
정규식 .  (0) 2012.08.24
정규식 .  (0) 2012.08.24
이메일 정규식  (0) 2012.08.08
Posted by 사라링

조건데이터 생성

//조회조건 생성
for (ir = 0; ir < this.ds_grup.getRowCount(); ir++) {

this.strUntCd += this.ds_grup.getColumn(ir, "BUDG_GRUP_CD") + ",";

}
this.ds_search.setColumn(0, "SCH_BUDG_GRUP_CD2", this.strUntCd);

 

//.xml 에 동적쿼리

<isNotEmpty property="SCH_BUDG_GRUP_CD2">
  AND B.BUDG_GRUP_CD IN ( SELECT  REGEXP_SUBSTR(v, '[^,]+', 1, LEVEL)  AS LIST FROM  (SELECT #SCH_BUDG_GRUP_CD2# v FROM dual) CONNECT BY LEVEL <![CDATA[<=]]> LENGTH(v) - LENGTH(REPLACE(v, ',')))
</isNotEmpty>

 

/*

파라미터 값 : 'B2022-0020,B2022-0098,'

 

쿼리시 적용

 

*/

 

 

Posted by 사라링


/* 그리드 쉬프트키로 멀티선택
 * e : Grid01_oncellclick의 이벤트 e
 * dsId : 데이터셋 ex) this.ds_list
 * columnId : 체크박스 ex) isChecked
 */
this.fn_act_shiftCheck = function (e, dsId, columnId) 
{
if (e.shiftkey) {

var chk = 0;

if ((e.row >= e.oldrow && dsId.getCaseCount(columnId + "!='1'", e.oldrow, e.row+1) > 0)
 || (e.oldrow >= e.row && dsId.getCaseCount(columnId + "!='1'", e.row, e.oldrow+1) > 0)) {
chk = 1;
} else {
chk = 0;
}

dsId.set_enableevent(false);
for (var i=0; i<dsId.getRowCount(); i++) {

if ((e.row >= e.oldrow && e.row >= i && i >= e.oldrow)
 || (e.oldrow >= e.row && e.oldrow >= i && i >= e.row)) {
dsId.setColumn(i, columnId, chk);
}
}
dsId.set_enableevent(true);
}
};

/* 그리드의  event 온셀클릭  아래와 같이 실행

this.Grid01_oncellclick = function(obj:nexacro.Grid,e:nexacro.GridClickEventInfo)
{
       this.fn_act_shiftCheck(e,this.ds_list,"isChecked");
};

 

*/

 

시작점 체크 

Shift + 체크

 

범위 체크 

 

Posted by 사라링

✓, ✔, ☑

 

특수문자랑 그림문자 기호

✿ ☺ ☻ ☹ ☼ ☂ ☃ ⌇ ⚛ ⌨ ✆ ☎  ⌘ ⌥ ⇧ ↩ ✞ ✡ ☭ ← → ↑ ↓ ➫ ⬇ ⬆ ☜ ☞ ☝ ☟ ✍ ✎ ✌ ☮ ✔ ★ ☆ ♺ ⚑ ⚐ ✉ ✄ ⌲ ✈ ♦ ♣ ♠ ♥ ❤ ♡ ♪ ♩ ♫ ♬ ♯ ♀ ♂ ⚢ ⚣ ❑ ❒ ◈ ◐ ◑ ✖ ∞ « » ‹ › “ ” ‘ ’ „ ‚ – — | ⁄ \ [ ] { } § ¶ ¡ ¿ ‽ ⁂ ※ ± × ~ ≈ ÷ ≠ π † ‡ ¥ € $ ¢ £ ß © ® @ ™ ° ‰ … · • ● ▲ ▼ ◀ ▶ ◢ ◣ ◥ ◤ △ ▽ ◿ ◺ ◹ ◸ ▴ ▾ ◂ ▸ ▵ ▿ ◃ ▹ ◁ ▷ ◅ ▻ ◬ ⟁ ⧋ ⧊ ⊿ ∆ ∇ ◭ ◮ ⧩ ⧨ ⌔ ⟐ ◇ ◆ ◈ ⬖ ⬗ ⬘ ⬙ ⬠ ⬡ ⎔ ⋄ ◊ ⧫ ⬢ ⬣ ▰ ▪ ◼ ▮ ◾ ▗ ▖ ■ ∎ ▃ ▄ ▅ ▆ ▇ █ ▌ ▐ ▍ ▎ ▉ ▊ ▋ ❘ ❙ ❚ ▀ ▘ ▝ ▙ ▚ ▛ ▜ ▟ ▞ ░ ▒ ▓ ▂ ▁ ▬ ▔ ▫ ▯ ▭ ▱ ◽ □ ◻ ▢ ⊞ ⊡ ⊟ ⊠ ▣ ▤ ▥ ▦ ⬚ ▧ ▨ ▩ ⬓ ◧ ⬒ ◨ ◩ ◪ ⬔ ⬕ ❏ ❐ ❑ ❒ ⧈ ◰ ◱ ◳ ◲ ◫ ⧇ ⧅ ⧄ ⍁ ⍂ ⟡ ⧉○ ◌ ◍ ◎ ◯ ❍ ◉ ⦾ ⊙ ⦿ ⊜ ⊖ ⊘ ⊚ ⊛ ⊝ ● ⚫ ⦁ ◐ ◑ ◒ ◓ ◔ ◕ ⦶ ⦸ ◵ ◴ ◶ ◷ ⊕ ⊗ ⦇ ⦈ ⦉ ⦊ ❨ ❩ ⸨ ⸩ ◖ ◗ ❪ ❫ ❮ ❯ ❬ ❭ ❰ ❱ ⊏ ⊐ ⊑ ⊒ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ⋒ ⋓ ⋐ ⋑ ⥰ ╰ ╮ ╭ ╯ ⌒ ⥿ ⥾ ⥽ ⥼ ⥊ ⥋ ⥌ ⥍ ⥎ ⥐ ⥑ ⥏ ╳ ✕ ⤫ ⤬ ╱ ╲ ⧸ ⧹ ⌓◦ ❖ ✖ ✚ ✜ ⧓ ⧗ ⧑ ⧒ ⧖ _ ⚊ ╴ ╼ ╾ ‐ ⁃ ‑ ‒ - – ⎯ — ― ╶ ╺ ╸ ─ ━ ┄ ┅ ┈ ┉ ╌ ╍ ═ ≣ ≡ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ╵ ╷ ╹ ╻ │ ▕ ▏ ┃ ┆ ┇ ┊ ╎ ┋ ╿ ╽ ⌞ ⌟ ⌜ ⌝ ⌊ ⌋ ⌈ ⌉ ⌋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╏ ║ ╔ ╒ ╓ ╕ ╖ ╗ ╚ ╘ ╙ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬

 

특수문자랑 그림문자 기호

⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⓿ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇

¹ ² ³ ↉ ½ ⅓ ¼ ⅕ ⅙ ⅐ ⅛ ⅑ ⅒ ⅔ ⅖ ¾ ⅗ ⅜ ⅘ ⅚ ⅝ ⅞∞ ⟀ ⟁ ⟂ ⟃ ⟄ ⟇ ⟈ ⟉ ⟊ ⟐ ⟑ ⟒ ⟓ ⟔ ⟕ ⟖ ⟗ ⟘ ⟙ ⟚ ⟛ ⟜ ⟝ ⟞ ⟟ ⟠ ⟡ ⟢ ⟣ ⟤ ⟥ ⟦ ⟧ ⟨ ⟩ ⟪ ⟫ ⦀

Posted by 사라링

By KBK

 

서비스 만들때 특수문자 사용 어떻게
안됨, xml 에서 직접 생성

탭 내부에서 줌인아웃 시 화면 안보이는거
버그

컴퍼넌트 클릭 시 가운데 + 기능무엇
머 맞추는 건데 잇음

큇뷰 사용 시 매번 run 누르는 창 떠야하나
하단에서 체크해제

복사하고 싶은 컴퍼넌트 잡고 ctrl + 마우스 드래그

컴퍼넌트 잡고 ctrl + shift + 마우스 드래구 : 라인맞추기

복사 후 ctrl + shift + v : 원하는 옵셕 복사붙여넣기

크기+너비 똑같이 맞추기, 여백 맞추기 툴에서 가능 align 

손모양 Move : form 음수좌표 가능

오른쪽 상단 Step : 하나의 from에서 여러 form으로 표현

마우스영역 컴퍼넌트 선택 설정 : tools > options > Form Design > general > select type >Select Part 에서 설정

= 셀렉트 올은 영역 전체를 드래그 해야 선택 되고 셀렉트 파트는 일부분만 드래그 해도 선택 됨 



App Infomation == global

외부엔진연계 > lib 폴더에 추가작업 진행

TypeDefinition > Objects > 컴퍼넌트 초기 사이즈 수정 가능, PrefixID 도 

Generate > Regenerate : 전체 제너레이트

바인드 여부 확인 : ctrl + b

컴퍼넌트 생성 과 동시에 바인딩 : ctrl + dataset

expr 표현식
1. 사칙연산
EMPL_ID + FULL_NAME

2. 예약어
currow + 1

3. 데이터셋 메소드(대소문자 구분 중요)
comp.parent.ds_emp.getRowCount()
dataset.getSum()
나머지 메소드 찾는 방법 : F1 > Data Object >
getCaseSum ?!

4. 삼항연산자
조건 ? 참 : 거짓

5. 함수호출(로직 또는 통신으로 인한 속도저하 유의)
- 내부함수
- nexacro API 함수

keystring
G:  그룹핑    S:  정렬
+  오름차순  -  내림차순
ex) G:+GENDER,+MARRIED


영역 머지 시 alt 누르고 선택

row 고정 : this.grd_list.setFixedRow(row);

  
fittocontents
Menu 의 내부 컨텐츠영역이 컨텐츠 내용에 맞게 
자동조정되는 영역을 설정하는 속성


Posted by 사라링

windy 실시간 기상 영상

2019. 10. 9. 17:36

'HTML5.0' 카테고리의 다른 글

HTML --> PDF 파일로 변환 하기 . 펌) 정윤재님 노트  (0) 2013.04.05
div 불투명 깔기 . 소스  (0) 2012.06.08
html animation  (0) 2012.06.08
div의 overflow 및 postion  (0) 2012.06.07
캔버스 위에 div 를 올리자.  (0) 2012.06.05
Posted by 사라링

넥사크로 사용중 갑자기 너무 느려질 경우 .. 

( 넥사 화면 전환 이나 Properties 값을 입력 중에 비정상 적으로 느려 지는 경우) 

 

재설치 하더라도 라이센스 및 옵션 관련 정보 등을 apps 쪽에 저장 되기 때문에 그쪽을 별도로 지우지 않는 이상

 

소용이 없다. 따라서 해당 폴더를 찾아 지우거나. 옵션을 초기화 해야 한다. 

 

tools - > options 

 

에서 왼쪽 하단의 옵션 설정 값을 디폴트 값으로 변경 해 보자. 

 

이유:  예상 하건데.  정확히 알수는 없었지만. 옵션 기능을 체크 하여 수정 중에 Generate 쪽이나 표현 항목 중에 비정상적인 동작을 하는 옵션이 있어 실수로 해당 사항을 체크 하는 경우 도저히 사용 할수 없을 정도로 느려 지는 현상이 발생

한다. ( 넥사크로만 느려진다면 100% 의심 할만 하다) 

 

해결 : 지우거나 옵션을 찾아 보려고 하지 말고 초기화 하자. 라이센스 나 General 쪽의  Generate 등의 경로는 유지 되니 ..

 

 

 

Posted by 사라링

넥사크로 라디오 박스 적용 하기 




처음 라디오 박스를 그리면 위와 같은 형태로 나오는데

해당 오브젝트에 두개의 컬럼을 가지는 데이터셋을 바인딩 해야만 일반적인 라디오 박스형태로 보일수 있다. 




ds_code_01

라디오박스의 형태를 처리하기 위해 데이터셋을 생성 한 이후에 아래와 같이 바인딩 한다. 


실제데이터가 아닌 형태설정에 데이터 셋을 바인딩 하는것을 주의 해야 한다.

쿼리에서 가져오는 실제데이터는 바인딩이 아니라 지정이다.(마지막에 처리)

순서는 innerdataset -> codecolumn-> datacolumn 순으로 지정 

value 의 값은 기본 값

direction 은 세로(기본) 로 보여줄지 가로로 보여줄지를 결정 


여기 까지 처리되었다면 아래와 같이 정상적인 라디오 박스를 볼수 있다. 





라디오 박스는 실제 값을 가져 와야 함으로 실제 데이터를 가져오는 값을 bind.info - > appearance.value 에 지정 한다. 


끝. ! 




Posted by 사라링



문제:

넥사크로  디자인 작업(inputBox 추가)-> 데이터 셋을 바인드->  DB조회시 input 박스가 모두 디스에이블 처리 되어 문제 발생 



위와 같이 그린 이후 조회문을 추가 하니 



실제 화면 에서 아래와 같이 모두 디스에이블 처리가 되어 문제 가발생 


원인 및 처리 : 넥사크로의 데이터 셋은 기본적으로 row 형태로 되어 있기 때문에 

일반적인 map 형태의 데이터가 확실하더라도  조회  데이터가 한건도 없는 경우 row가 없기 때문에 disabled 처리 된것으로 예상 된다. 


따라서 조회건이 한건 도 없을 가능 성이 있는 경우에는 강제로 insertRow 처리 해야 한다 아래와 같이. 


if(this.ds_main_frc.getRowCount() < 1){

this.ds_main_frc.insertRow();

}

끝.




Posted by 사라링

서론 없이 본론만 말해 보자. 


구매한 모니터(MB16AC)가 노트북에 따라. 바로 연동 되는것도 있고 연동 되지 않는것도 있었다. 


대부분의 블로그에서는 자동 연동 안되면 사이트에서 드라이브를 다운 받아 설치 하라고만 되어 있어 ASUS 에서 해당 기기 OS 를 선택하여 나오는 두개의


드라이브를 아무리 설치 해도 인식이 되지 않는 것이였다... 


알고 보니 + 버튼을 눌라 밑에 숨겨져 있던 드라이버를 찾아 설치 해야 하는 것이였다...


https://www.asus.com/kr/Monitors/MB16AC/HelpDesk_Download/




해당 화면에서 더보기 나 . 모두 표시 버튼을 누루면 


해당 다운 받은 것이 추가로 되어 있다. 해당 것이 바로 실제로 DP ALT 모드를 지원 하지 않는 노트북 에서 반드시 "필수" 로 다운 받아 설치 해야 하는 

드라이버 이다. 


일단 2018년 12월 7일부 자 제공 드라이브를 블로그에 링크를 추가 토록 한다. 


1. 모니터 지원 드라이브 (MB16AC/MB16xB)

   

2. 연결되어 있는 모니터(ASUS)의 설정을 PC 에서 변경 가능한 위젯  




끝!!!!!!!!!!!!





'문제점 해결' 카테고리의 다른 글

JAVA Could not generate DH keypair  (1) 2016.05.04
통신보안 SSL 이란. IBM 발취  (0) 2012.10.19
Posted by 사라링

언제 부턴가.. 이클립스 에서 아이바티스 의 자동 완성 기능이 정상적으로 처리가 되지 않아 확인결과


기존 url 이 ( http://www.ibatis.com/dtd/sql-map-2.dtd  <-- 기존 )


지원을 하지 않아 발생 하며 , 지원이 되는 url 로 바꾸더라도 


최근 사이트의 경우 망분리로 인하여 외부 네트워크가 되지 않아 자동 완성이 안되는 상황이 많아 정리 토록 함. 


기존 xml 파일의 경우  아이바티스나 마이바티스 사용하는 경우 (예시는 아이바티스)


최상단에 . 


 <?xml version="1.0" encoding="euc-kr"?>

<!DOCTYPE sqlMap

PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"

"http://www.ibatis.com/dtd/sql-map-2.dtd">


와 같이 정의가 되어 있는데 . 기존의 경로가 다르거나 외부 접근이 안되는 경우 자동 완성이 안되는 것이다. 



접근이 가능한 경우 위 상단에 표시 되겠지만 현재 정상적으로 처리가 되지 않기 때문에 표시가 되지 않는다. 


따라서 dtd 파일을 로컬 PC 에 다운 받아 설정 하는 것이 가장 이상적이다. 


다운 경로 . http://ibatis.apache.org/dtd/

 

sql-map-2.dtd



해당 경로 에서 직접 sql-map-2.dtd 파일을 다운 받은 경우 이제 이클립스 에 등록을 해야 한다. 


preference > xml > xml catalog 

설정 에서 user specified enteris 에 포함을 시켜야 한다. 



입력 하는 부분은 두가지 인데 location  은 localpc 에 다운받은 dtd 파일을 넣으면 되고 (워크스페이스에 없다면 file system 클릭)

(공통 관리자가 workspace 에 포함 시키는 것도 좋은 방법 일듯 하다. 추가는 알아서 해야 겠지만.. 워크스페이스 경로는 개발자 마다 다름으로 xml 에 정의는 힘들듯.. )


key 부분에는 기존의 PUBLIC 으로 정의 되는 부분을 넣으면 된다. 

-//iBATIS.com//DTD SQL Map 2.0//EN




위와 같이 정상적으로 등록이 완료 되면 ( 자동완성이 안되는 경우 eclipse 종료후 다시 시작) 


 ctrl+space 가 안되는 


상황에서 하단과 같이 



정상적으로 아이바티스의 자동 완성기능이 작동 됨을 확인 할수 있다. 


끝!!!! 





Posted by 사라링

로또 생성 쿼리

2017. 2. 3. 17:12

SELECT A.GAME

        ,SUM (DECODE (RNUM, 1, LTNO, 0)) NUM1

        ,SUM (DECODE (RNUM, 2, LTNO, 0)) NUM2

        ,SUM (DECODE (RNUM, 3, LTNO, 0)) NUM3

        ,SUM (DECODE (RNUM, 4, LTNO, 0)) NUM4

        ,SUM (DECODE (RNUM, 5, LTNO, 0)) NUM5

        ,SUM (DECODE (RNUM, 6, LTNO, 0)) NUM6

    FROM (SELECT GAME

                ,LTNO

                ,RANK () OVER (PARTITION BY GAME ORDER BY DBMS_RANDOM.VALUE)

                    RNUM

            FROM (    SELECT CEIL (LEVEL / 45) GAME, MOD (LEVEL - 1, 45) + 1 LTNO

                        FROM DUAL

                  CONNECT BY LEVEL <= 9999

                    ORDER BY 1, DBMS_RANDOM.VALUE)) A

        ,(    SELECT LEVEL GAME

                FROM DUAL

          CONNECT BY LEVEL < 6) B 

   WHERE A.GAME = B.GAME

GROUP BY A.GAME

ORDER BY A.GAME

Posted by 사라링


//VO 객체의 독립성을 유지 하기 위해 변경 처리. 

//사용법은 주석 확인. 



package module.common.otherinterface ;


import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;


import com.base.SystemException;

import com.component.parameter.IParameterManagement;

import com.framework.core.Workspace;


/**

 * 각 프로세스(메소드 단위) 시간 1/10000 단위로 점검 프로그램 

 * procTSOBegin -> procTSOWork procTSOWork procTSOWork(프로세스 숫자 만큼) -> procTSOEnd

 * 

 * 1. 로직 instance 호출

 *  ProcessTimeSysOut procTSO = new ProcessTimeSysOut();

 * 

 * 2. 최초 호출

 *  procTSO.procTSOBegin("국내출장);

 * 

 * 3. 각 프로세스 단위로 각 각 사이에 계속 추가. 

 *    procTSO.procTSOWork("신규:신청번호 채번 or 기 신청서 변경 체크");

 *    .

 *    .

 *    procTSO.procTSOWork("출장신청기본/출장예산정보");

 *    .

 *    .

 *    procTSO.procTSOWork("출장자 및 여비정보");

 *    

 * 4. 로직 instance 종료

 *    procTSO.procTSOEnd();

 * 

 * 싱글톤 패턴 구현

 * @since 1.0

 */

public class ProcessTimeSysOut extends Workspace {

PTSOVO ptsovo;

//private static ProcessTimeSysOut procTSO;

/* 복수의 프로그램에서 사용 가능 함에 따라 싱글톤 패턴 사용시 프로세스 누적 시간등이 혼합될 가능성이 있어

 *  싱글톤 패턴 해제함.

 * 

 * private ProcessTimeSysOut(){}

public static ProcessTimeSysOut getInstance(){

if(procTSO==null){

procTSO = new ProcessTimeSysOut();

procTSO.proCnt = 0;

procTSO.fullTime = 0;

procTSO.beforTime = 0;

}

return procTSO;

}

*/

//프로세스 최초시작 및 타이틀 설정

public void procTSOBegin(String processNameParam){

long time = System.currentTimeMillis(); 

this.ptsovo = new PTSOVO();

this.ptsovo.setProcTSOKEY(time);

System.out.println("============================"+processNameParam+" 프로세스 검토 로직 시작 ============================\n");

System.out.println("process key number : "+this.ptsovo.getProcTSOKEY());

this.ptsovo.setBeforTime(time);

this.ptsovo.setProcTitle(processNameParam);

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

System.out.println("시작 시간 : "+dayTime.format(new Date(time))+"\n");

}

//프로세스 내의 작업 구분 요청(out 처리)

public void procTSOWork(String workName){

if(this.ptsovo!=null){

long nowtTime  = System.currentTimeMillis(); 

long processTime  = nowtTime - this.ptsovo.getBeforTime();

this.ptsovo.setFullTime(this.ptsovo.getFullTime()+processTime); 

this.ptsovo.setProCnt(this.ptsovo.getProCnt()+1);

//하단 sysout도출시 내용의 길이는 변경 하지 않도록 처리(30글자).

System.out.println(String.format("%03d",this.ptsovo.getProCnt())+"("+this.ptsovo.getProcTSOKEY()+")||"+this.ptsovo.getProcTitle()+" ==> "+String.format("%-30s",workName)+"======>"+processTime+" / "+this.ptsovo.getFullTime()+"\n");

this.ptsovo.setBeforTime(nowtTime);

}

}

//프로세스 검토 종료 로직

public void procTSOEnd(){

if(this.ptsovo!=null){

System.out.println("process key number : "+ptsovo.getProcTSOKEY());

long time = System.currentTimeMillis(); 

//최초 시작시 프로세스 시작 시간을 넣도록 함.

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

System.out.println("종료 시간 : "+dayTime.format(new Date(time)));

System.out.println("총 누적 시간: " +this.ptsovo.getFullTime());

System.out.println("검토 프로세스 숫자: "+this.ptsovo.getProCnt()+"\n");

System.out.println("============================"+this.ptsovo.getProcTitle()+" 프로세스 검토 로직 종료 ============================\n");

System.out.println();

}

}


}




package module.common.otherinterface;


import java.math.BigDecimal;

import java.util.ArrayList;


import module.mis.trans.TransItem;

import module.mis.trans.TransVat;




public class PTSOVO {// 프로세스 분석 구조 객체

private int  proCnt = 0;  //프로세스 순번 

private long fullTime =0; //총 누적 소요 시간 

private long beforTime=0; //프로세스 시작 시간

private long procTSOKEY =0 ; //프로세스 생성시 주요키 값 (차후 조회시 대상 키값을 기준으로 조회 할수 있도록 처리.

private String procTitle ;  //프로세스 타이틀

public int getProCnt() {

return proCnt;

}

public void setProCnt(int proCnt) {

this.proCnt = proCnt;

}

public long getFullTime() {

return fullTime;

}

public void setFullTime(long fullTime) {

this.fullTime = fullTime;

}

public long getBeforTime() {

return beforTime;

}

public void setBeforTime(long beforTime) {

this.beforTime = beforTime;

}

public long getProcTSOKEY() {

return procTSOKEY;

}

public void setProcTSOKEY(long procTSOKEY) {

this.procTSOKEY = procTSOKEY;

}

public String getProcTitle() {

return procTitle;

}

public void setProcTitle(String procTitle) {

this.procTitle = procTitle;

}

}















//선언 및 만들어둬야 할것 소스 . 


//class 전역 변수 


int  proCnt = 0;  //프로세스 순번 

long fullTime =0; //총 누적 소요 시간 

long beforTime=0; //프로세스 시작 시간


//class 내 추가메소드 / 별도의 class 로 만들어 외부 접근 해도 무방


public void proTimeSysOut(String processNameParam,String type){

//시작 처리 type : S

if("S".equals(type)){

System.out.println("============================"+processNameParam+" 프로세스 검토 로직 시작 ============================\n");

long time = System.currentTimeMillis(); 

//최초 시작시 프로세스 시작 시간을 넣도록 함.

beforTime = time; 

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

System.out.println("시작 시간 : "+dayTime.format(new Date(time))+"\n");

//종료 처리 type : E 

}else if("E".equals(type)){

System.out.println("============================"+processNameParam+" 프로세스 검토 로직 종료 ============================\n");

long time = System.currentTimeMillis(); 

//최초 시작시 프로세스 시작 시간을 넣도록 함.

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

System.out.println("종료 시간 : "+dayTime.format(new Date(time))+"\n");

System.out.println("총 누적 시간: " +fullTime+"\n");

System.out.println("검토 프로세스 숫자: "+proCnt);

//종료시 전역 변수 long ,cnt 값을 초기화 한다. 

proCnt = 0;  //프로세스 순번 

fullTime =0; //총 누적 소요 시간 

beforTime=0; //프로세스 시작 시간

//각 프로세스 검토 type : P

}else if("P".equals(type)) {

if(beforTime==0){

System.out.println("프로세스 검토 로직 시작 이 누락 되었습니다.");

}else {

long nowtTime  = System.currentTimeMillis(); 

long processTime  = nowtTime - beforTime;

fullTime += processTime;

//하단 sysout도출시 내용의 길이는 변경 하지 않도록 처리(30글자).

System.out.println(String.format("%03d",++proCnt)+"||"+String.format("%-30s",processNameParam)+"======>"+processTime+" / "+fullTime+"\n");

beforTime = nowtTime;

}

}

}



// 사용법!!!


//성능 검증내 에서 해당 메소드를 호출 . 

//최초

  proTimeSysOut("국내출장","S");


// 각프로세스 마다 첫번째 파라미터에 프로세스 명을 입력  2번째 파라미터는 무조건 "P"

proTimeSysOut("신규:신청번호 채번 or 기 신청서 변경 체크","P");


//종료 

   proTimeSysOut("국내출장","E");




// sysout log 확인시. 아래와 같이 나오면 정상. 



[16. 9. 23   13:20:31:458 KST] 00000272 SystemOut     O ======================================

[16. 9. 23   13:20:31:458 KST] 00000272 SystemOut     O [ module.mis.hrm.main.Hrm_4071]

[16. 9. 23   13:20:31:458 KST] 00000272 SystemOut     O [2016.09.23 13:20:31(458)]

[16. 9. 23   13:20:31:458 KST] 00000272 ExtendAction  I module.common.action.ExtendAction execute 트랜잭션 시작.....

[16. 9. 23   13:20:31:459 KST] 00000272 SystemOut     O [ tmSetTrpRqst ] Transaction Start

[16. 9. 23   13:20:31:459 KST] 00000272 SystemOut     O ============================국내출장 프로세스 검토 로직 시작 ============================


[16. 9. 23   13:20:31:459 KST] 00000272 SystemOut     O 시작 시간 : 2016-20-23 01:20:31


[16. 9. 23   13:20:31:500 KST] 00000272 SystemOut     O 001||신규:신청번호 채번 or 기 신청서 변경 체크     ======>41 / 41


[16. 9. 23   13:20:31:781 KST] 00000272 SystemOut     O 002||출장신청기본/출장예산정보                 ======>281 / 322


[16. 9. 23   13:20:31:964 KST] 00000272 SystemOut     O 003||출장자 및 여비정보                    ======>183 / 505


[16. 9. 23   13:20:32:006 KST] 00000272 SystemOut     O 004||출장지 및 경유지                     ======>41 / 546


[16. 9. 23   13:20:32:055 KST] 00000272 SystemOut     O 005||출장내용                          ======>50 / 596


[16. 9. 23   13:20:32:055 KST] 00000272 SystemOut     O 006||첨부파일 저장                       ======>0 / 596






'JAVA' 카테고리의 다른 글

펌) immutable 이란  (0) 2013.10.15
grid I U D 포멧 JAVA 셋팅 [티폼 기준]  (0) 2013.06.27
디폴트 생성자에 대하여 알아 봅시닥.  (0) 2012.07.10
Swing - windowBuilder 설치 하기.  (0) 2012.06.13
패키지 컴파일러  (0) 2012.05.15
Posted by 사라링

오라클 락 & 킬 lock kill

2016. 8. 12. 14:28

프로젝트에서 LOCK 이 자주 걸리는 문제가 발생하여 연구하던 중에 아래의 sql 문을 이용하여 lock 세션을 찾아서 관리할 수 있다는 것을 알았다. 그러나 이 SQL 은 System 유저만이 사용할 수 있다는  제약이 있다. 

LOCK 이 발생하게 되면 프로그램이 동작하다가 멈추고 기다리게 된다. 원인을 파악하는데 시간이 허비하게 되는데 알고 보니 테이블에 LOCK이 걸린 것이었다면 허탈함을 금할 수 없다.  자주 LOCK 이 걸리는 테이블이라면 SELECT 할 때 WAIT 타임을 1 정도로 주면 1초동안 LOCK 이 풀리기를 대기하다가 오류 처리되므로 개발자가 쉽게 LOCK 걸린 상황을 인지할 수 있다. 

-- 락걸린 테이블 확인 
SELECT  DO.OBJECT_NAME, DO.OWNER, DO.OBJECT_TYPE, DO.OWNER,
        VO.XIDUSN, VO.SESSION_ID, VO.LOCKED_MODE
FROM    V$LOCKED_OBJECT VO, DBA_OBJECTS DO
WHERE   VO.OBJECT_ID = DO.OBJECT_ID;

-- 해당 테이블에 LOCK 이 걸렸는지.
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
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' AND C.OBJECT_NAME IN ('TB_CO_GENO');

-- 락발생 사용자와 SQL, OBJECT 조회
SELECT DISTINCT X.SESSION_ID, A.SERIAL#, D.OBJECT_NAME, A.MACHINE, A.TERMINAL,
                A.PROGRAM, B.ADDRESS, B.PIECE, B.SQL_TEXT
FROM V$LOCKED_OBJECT X, V$SESSION A, V$SQLTEXT B, DBA_OBJECTS D
WHERE X.SESSION_ID = A.SID AND 
X.OBJECT_ID = D.OBJECT_ID AND A.SQL_ADDRESS = B.ADDRESS 
ORDER BY B.ADDRESS, B.PIECE;

-- 현재 접속자의 SQL 분석
SELECT DISTINCT A.SID, A.SERIAL#,
       A.MACHINE, A.TERMINAL, A.PROGRAM,
       B.ADDRESS, B.PIECE, B.SQL_TEXT
FROM  V$SESSION A, V$SQLTEXT B
WHERE A.SQL_ADDRESS = B.ADDRESS
ORDER BY A.SID, A.SERIAL#, B.ADDRESS, B.PIECE


-- 락 세션 죽이기
  SELECT A.SID,   A.SERIAL#
  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'
   AND C.OBJECT_NAME = 'TB_CO_GENO'
   
SID SERIAL#
--- -------
5   1
6   1

2. 다음 명령으로 SESSION들을 KILL한다.  ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#';
SQL> alter system kill session '5, 1';
SQL> alter system kill session '6, 1';


-- 락 세션 죽이는 sql 문 
SELECT DISTINCT X.SESSION_ID, A.SERIAL#, D.OBJECT_NAME, A.MACHINE, A.TERMINAL,
       A.PROGRAM, A.LOGON_TIME, 'ALTER SYSTEM KILL SESSION'''||A.SID||', '||A.SERIAL#||''';'
FROM GV$LOCKED_OBJECT X, GV$SESSION A, DBA_OBJECTS D
WHERE  X.SESSION_ID = A.SID AND X.OBJECT_ID = D.OBJECT_ID
ORDER BY LOGON_TIME;

Posted by 사라링

/* 테이블 컬럼 찾기 */
/* [sqlmap/mapper/com/cmm/sql-comcmm525.xml] selectTableList */SELECT   A.TABLE_NAME        ,B.COMMENTSFROM     ALL_TABLES A        ,ALL_TAB_COMMENTS BWHERE    A.TABLE_NAME = B.TABLE_NAMEAND      A.OWNER = B.OWNERAND      B.OWNER = 'USRFRMOWN'AND      ( A.TABLE_NAME NOT LIKE 'TEST%' AND A.TABLE_NAME NOT LIKE '%TEST' )AND      ( A.TABLE_NAME NOT LIKE 'TEMP%' AND A.TABLE_NAME NOT LIKE '%TEMP' )AND      A.TABLE_NAME LIKE '%%'AND      B.COMMENTS LIKE '%%'ORDER BY TABLE_NAME
/* [sqlmap/mapper/com/cmm/sql-comcmm525.xml] selectColumnList */SELECT   A.TABLE_NAME        ,(SELECT COMMENTS FROM ALL_TAB_COMMENTS WHERE TABLE_NAME = A.TABLE_NAME AND OWNER='USRFRMOWN') AS TABLE_COMMENTS        ,A.COLUMN_NAME        ,B.COMMENTS        ,CASE WHEN C.COLUMN_NAME IS NOT NULL THEN 'PK' END AS PK_YN        ,A.DATA_TYPE        ,A.DATA_LENGTH        ,A.DATA_PRECISION        ,A.DATA_SCALE        ,A.NULLABLE        ,A.COLUMN_IDFROM     ALL_TAB_COLUMNS A        ,ALL_COL_COMMENTS B        ,(    SELECT B.TABLE_NAME                    ,B.COLUMN_NAME              FROM   ALL_CONSTRAINTS A                    ,ALL_CONS_COLUMNS B              WHERE  A.OWNER = B.OWNER              AND    A.TABLE_NAME = B.TABLE_NAME              AND    A.CONSTRAINT_NAME = B.CONSTRAINT_NAME              AND    A.CONSTRAINT_TYPE ='P'              AND    A.OWNER = 'USRFRMOWN' ) CWHERE    A.OWNER = 'USRFRMOWN'AND      A.OWNER = B.OWNERAND      A.TABLE_NAME = B.TABLE_NAME(+)AND      A.COLUMN_NAME = B.COLUMN_NAME(+)AND      A.TABLE_NAME = C.TABLE_NAME(+)AND      A.COLUMN_NAME = C.COLUMN_NAME(+)AND      A.TABLE_NAME LIKE '%%'—AND      A.COLUMN_NAME LIKE '%LINK_RPRJ_NO%'—AND      A.COLUMN_NAME IN ('RSCHFND_APLY_NO','PROOF_SEQ')AND      B.COMMENTS LIKE '%매입%번호%'ORDER BY A.TABLE_NAME

Posted by 사라링

대상 사이트 에서 url 창에 넣어 실행 하거나 즐겨 찾기로 설정 하여 사용 하면 됨. 



javascript: function naver(q){ void(z=q.body.appendChild(q.createElement('script'))); void(z.language='javascript'); void(z.type='text/javascript'); void(z.src='http://userscripts.org/scripts/source/61326.user.js');} function selfw(w) { try{naver(w.document);} catch(e){} for (var i =0; i <w.frames.length; i++) { try{ selfw(w.frames[i]); } catch(e){} } } selfw(self);(function() { var e, i, all; document.onselectstart = null; document.oncontextmenu = null; all = document.getElementsByTagName("*"); for (i = 0; i < all.length; i += 1) { e = all[i]; e.onselectstart = null; e.oncontextmenu = null; } })();

Posted by 사라링

이클립스 에서 SVN 연결중  DH keypair 에러가 발생. 

url 이 https:// 인 ssl 보완 으로 되어 있음. 


JAVA Could not generate DH keypair

Icon

javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair

Cause

Icon

 

클라이언트 측 JAVA 버전이 7 이하 인 경우

아파치 버전 2.4.7부터 mod_ssl 1024비트 이상의 DH 파라미터를 사용하나 
JAVA 7이나 이하 버전은 1024비트 이상의 DH를 지원하지 않음

Reference: http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh

Resolution

Icon


방법1: 클라이언트 측 JAVA 8 업데이트

방법2: 서버 측 인증서에 DH 파라미터 추가 

DH 파라미터 추가

인증서파일 내용 마지막에 아래 내용을 추가
-----BEGIN DH PARAMETERS-----
MIGHAoGBAP//////////yQ/aoiFowjTExmKLgNwc0SkCTgiKZ8x0Agu+pjsTmyJR
Sgh5jjQE3e+VGbPNOkMbMCsKbfJfFDdP4TVtbVHCReSFtXZiXn7G9ExC6aY37WsL
/1y29Aa37e44a/taiZ+lrp8kEXxLH+ZJKGZR7OZTgf//////////AgEC
-----END DH PARAMETERS-----
인증서 파일 위치
아파치홈/conf/extra/httpd-ssl.conf
// SSLCertificateFile "/certificate/ssl.crt" 인증서 위치


'문제점 해결' 카테고리의 다른 글

MB16AC 휴대용 모니터 드라이버 설치기.  (0) 2018.12.07
통신보안 SSL 이란. IBM 발취  (0) 2012.10.19
Posted by 사라링

트러스트 폼 에서 발생 했으나 자바스크립트 로직상 일반 html 에서도 동일한 증상이 일어 날것으로 예상. 


문제 발생 멀쩡 하게 사용 하던 팝업창 에서 

자식창 데이터 클릭 -> 부모창에 데이터 전송 과정에서 exception 처리로 인한 오류 발생


기존 opener  호출 함수. 

function doFg1DblClick(){

if(!fGridReturn("fg1")) return;

var obj = doc.addGrid("fg1").getRowObj(fg1.row);   // 선택된 그리드의 데이터를 OBJECT 로 변환 하는 함수.

try{

opener.javascript.popNrnd(obj);              // 부모창의 함수를 호출

}catch(exception){

alert(exceptioni);

}

window.close();

}


alert 창으로 아래와 같은 오류를 출력. 하지만 데이터는 이상없이 부모창으로 insert 처리 됨. ( 메시지내용은 실제론 단순 alert 이 아님으로 아래와 같이 캡쳐됨)





해당과 같은 오류의 상세 내역을 확인 하기 위해 exception 내용을 상세 하게 확인 할수 있는 추가 구현. 


기존 alert(exception); ====>을 


var output = '';

for (var i in exception) {

output += i + ' : ' + exception[i] + '\n';

}

alert(output);

으로 변경 





더 알수가 없게 되었다.. (하지만 해당 구문은 자바스크립트 오류 확인시  많은 도움이 될것 같다.)

해당과 관련 미친듯이 google 을 찾아본 결과 opener 함수 내에서 실행되는 함수 중에 구현 되지 않은 함수가 있는 경우 스크립트 오류가 아닌

object 오류나 syntax 오류로 표기 될수 있다는 글을 확인 했고 

자식창및 부모창을 번갈아 가며 다른 파일로 호출 테스트 해 본 결과 자식창이 아닌 부모창에 문제가 있다는 것을 확인


확인해본 결과 함수 호출 과정에서 기존에 사용 하던 js 파일을 제거 하고 해당 기능과 관련된 공통 기능 js 파일을 스크립트 하는 과정에서 실제 사용 한 

함수를 누락 하게 되어 발생 한 문제 였다. 


부모창 의 함수  (자식창에서 opener 로 호출 하는)

function popNrnd(obj){

fg1.valueMatrix(fg1.row, fg1.colRef("MNS_PROJ_CD_YN")) = "Y";

fg1.valueMatrix(fg1.row, fg1.colRef("RESPERSONNO")) = obj.RESPERSONNO; //부처사업코드

fg1.valueMatrix(fg1.row, fg1.colRef("PRJNAME")) = obj.PRJNAME; //부처과제명

fg1.valueMatrix(fg1.row, fg1.colRef("MNS_PROJ_CD")) = obj.PRJNO; //협약일련번호

fSetFlag("fg1",fg1.row);     //  <== 문제를 발생 시킨 누락 함수. 

model.refresh();

}


위와 같이 지역함수 안에 구현된 function 의 경우 호출 대상이 자신(부모)인 경우에는 function  누락 으로 인한 스크립트 오류가 발생 하지만 

자신이 아닌 자식창에서 호출할 경우 제대로 스크립트 오류가 발생 하지 않는 상태로 exception 처리 됨을 확인 할수 있었다. 












Posted by 사라링


1. 증상
오라클 특정 유저 패스워드 변경 후 처음에는 로그인이 잘 되었는데 어느순간 부터 ORA-28000 : the account is locked 오류 발생

2. 원인
특정 유저 패스워드 변경 후 수시로 DB에 접속하는 프로그램에서 변경된 패스워드를 반영하지 않았음. 프로그램에서 계속 잘못된 패스워드로 접속을 시도하였고 오라클 설정에 따라 자동으로 특정 유저가 LOCK됨.



3. 해결방법

1) USER 패스워드 만료 상태 확인하기

1. system계정으로 로그인 하여 다음을 입력 한다.
C:\> sqlplus "/as sysdba" --system계정으로 로그인
...
SQL> select * from dba_users; --DB유저 정보 확인하기

SELECT USERNAME, 
             ACCOUNT_STATUS,
             TO_CHAR(LOCK_DATE,'YYYY.MM.DD HH24:MI') LOCK_DATE           
    FROM DBA_USERS
  WHERE USERNAME = '계정';

2. ACCOUNT_STATUS컬럼을 확인한다.
- OPEN : 정상
- LOCKED(TIMED) : 패스워드 설정 횟수 이상 잘못입력하여 잠김
- EXPIRED & LOCKED : 패스워드 기간이 만료되어 잠김
...
접속 시 오류난 유저의 ACCOUNT_STATUS컬럼을 보면 LOCKED(TIMED)으로 되어 있을 것 이다.


2) LOCK걸린 유저 UNLOCK하기

1. system계정으로 로그인 하여 다음을 입력 한다.
C:\> sqlplus "/as sysdab" --system계정으로 로그인
...
SQL> alter user 유저명 account unlock; --LOCK걸린 유저 UNLOCK하기

2. LOCK되었던 유저로 로그인을 확인한다.

3. 패스워드 변경
ALTER USER SYSTEM IDENTIFIED BY ****;



3. 결과
우리가 은행에서 현금 인출할 때 비밀번호를 3번이상 잘못 입력하면 은행에 가서 풀어야 하는 것처럼 오라클도 이러한 기능을 제공을 하는 것 같다.
보안상 좋은 기능이지만 어찌보면 굉장히 위험한 기능인 것 같다. 외부에서 누군가가 악한 마음을 갖고 잘못된 패스워드로
계속 접근을 시도해서 유저를 LOCK시켜 버린다면... 에효... 물론 이에 대한 해결방안이 있겠지만... 나중에 찾아봐야겠다.

4. 추가로 알아보기
그럼 과연 몇번 패스워드 입력을 실패하면 LOCK이 걸릴까? 한번 알아보았음.

1) 패스워드 LOCK횟수 확인하기

1. system계정으로 로그인 하여 다음을 입력 한다.
C:\> sqlplus "/as sysdab" --system계정으로 로그인
...
SQL> SELECT U.USERNAME,P.PROFILE, P.RESOURCE_NAME, P.LIMIT 
FROM DBA_USERS U, DBA_PROFILES P WHERE P.PROFILE=U.PROFILE 
AND RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS';
...

2. 위 sql문을 입력 하면 계정별로 몇번의 패스워드 실패시 LOCK이 되는지 확인할 수 있다.


Posted by 사라링

1. 다운로드 할 파일 주소에서 파일 이름 취득.

2. 파일 주소로 접속해 파일을 읽어들임.

3. 읽어들인 파일을 다운로드 디렉토리에 1.에서 취득한 파일 이름으로 쓰기.

4. 종료.

 

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

public class FileUrlDownload {
 /**
  * 버퍼 사이즈
  */
 final static int size = 1024;

 /**
  * fileAddress에서 파일을 읽어, 다운로드 디렉토리에 다운로드
  * 
  * @param fileAddress
  * @param localFileName
  * @param downloadDir
  */
 public static void fileUrlReadAndDownload(String fileAddress,
   String localFileName, String downloadDir) {
  OutputStream outStream = null;
  URLConnection uCon = null;

  InputStream is = null;
  try {

   System.out.println("-------Download Start------");

   URL Url;
   byte[] buf;
   int byteRead;
   int byteWritten = 0;
   Url = new URL("fileAddress);
   outStream = new BufferedOutputStream(new FileOutputStream(
     downloadDir + "\\" + localFileName));

   uCon = Url.openConnection();
   is = uCon.getInputStream();
   buf = new byte[size];
   while ((byteRead = is.read(buf)) != -1) {
    outStream.write(buf, 0, byteRead);
    byteWritten += byteRead;
   }

   System.out.println("Download Successfully.");
   System.out.println("File name : " + localFileName);
   System.out.println("of bytes  : " + byteWritten);
   System.out.println("-------Download End--------");

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    is.close();
    outStream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

 /**
  * 
  * @param fileAddress
  * @param downloadDir
  */
 public static void fileUrlDownload(String fileAddress, String downloadDir) {

  int slashIndex = fileAddress.lastIndexOf('/');
  int periodIndex = fileAddress.lastIndexOf('.');

  // 파일 어드레스에서 마지막에 있는 파일이름을 취득
  String fileName = fileAddress.substring(slashIndex + 1);

  if (periodIndex >= 1 && slashIndex >= 0
    && slashIndex < fileAddress.length() - 1) {
   fileUrlReadAndDownload(fileAddress, fileName, downloadDir);
  } else {
   System.err.println("path or file name NG.");
  }
 }

 /**
  * main
  * 
  * @param args
  */
 public static void main(String[] args) {

  // 파일 어드레스
  String url = "http://localhost/download/index.php";
  // 다운로드 디렉토리
  String downDir = "C:/Temp";

  // 다운로드 호출
  fileUrlDownload(url, downDir);

 }
}

 

저는 localhost/download/index.php란 파일을 다운로드하는 샘플 소스입니다.

실행하면 아래와 같이 출력됩니다.

-------Download Start------
Download Successfully.
File name : index.php
of bytes  : 2605
-------Download End--------



Posted by 사라링

BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :