Java/JSP2013. 8. 1. 16:57





http://huikyun.tistory.com/329


많은 분들이 잘 아시겠지만 Windows에는 레지스트리라는 것이 있습니다.


윈도우 레지스트리(Windows Registry)
는 마이크로소프트 윈도 32/64비트 버전과 윈도 모바일 운영 체제의 설정과 선택 항목을 담고 있는 데이터베이스이다.



자바 프로그램 개발시에 Windows Registry 정보를 읽어와야 할 필요가 있을 경우가 있습니다.

필자도 프로그램을 만들다가 Registry 정보를 읽어올 필요가 있어서 자바에서 가능한 방법을 찾아보게 되었습니다.

자바 API를 찾아보니 JDK1.4 버전부터 포함되어 있는 Preferences라는 관련 클래스가 있었습니다.

대략 클래스 정의 문서를 쭈욱 보고 나서 예제 프로그램을 만들어 보았습니다.


import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;

public class TestGetRegInfoByPreferences {
	public static void main(String args[]) {
		final Preferences userRoot = Preferences.userRoot();
		// final Preferences systemRoot = Preferences.systemRoot();

		System.out.println("userRoot.absolutePath() : " + userRoot.absolutePath());
		System.out.println("userRoot.name() : " + userRoot.name());
		System.out.println("userRoot.toString() : " + userRoot.toString());
		System.out.println("userRoot.isUserNode() : " + userRoot.isUserNode());

		try {
			System.out.println("userRoot.childrenNames()");
			String[] childrenNames = userRoot.childrenNames();
			int lenChildrenNames = childrenNames.length;
			for (int i = 0; i < lenChildrenNames; i++)
				System.out.println("childrenNames[" + i + "] : " + childrenNames[i]);

			System.out.println("userRoot.keys()");
			String[] keys = userRoot.keys();
			int lenKeys = keys.length;
			for (int i = 0; i < lenKeys; i++)
				System.out.println("keys[" + i + "] : " + keys[i]);
		} catch (BackingStoreException bse) {
			bse.printStackTrace();
		}
	}
}


실행을 해보니 결과가 참 암담했습니다.

하위에 아무런 children이나 key가 없는데 과연 이것이 "/"라고 할 수 있는 것일까요?

userRoot.absolutePath() : /
userRoot.name() :
userRoot.toString() : User Preference Node: /
userRoot.isUserNode() : true
userRoot.childrenNames()
userRoot.keys()


일단 그래도 포기하지 않고 Windows Registry에 정보를 입력할 수 있는 소스를 만들어 보았습니다.


import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;

public class TestPutRegInfoByPreferences {

	public static void main(String[] args) {
		final Preferences userRoot = Preferences.userRoot();
		// final Preferences systemRoot = Preferences.systemRoot();

		try {
			userRoot.node("Java");
			userRoot.put("Version", "1.6.0");
			userRoot.flush();
		} catch (BackingStoreException bse) {
			bse.printStackTrace();
		}
	}
}


결과는 아래와 같습니다.



이거 userRoot라는 곳의 위치가 혹시???

그래서 인터넷을 살펴보고는 아래와 같은 사실을 알게되었습니다.

Preferences.systemRoot() 위치 = HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

Preferences.userRoot() 위치 = HKEY_CURRENT_USER\Software\JavaSoft\Prefs



"Administrator" 계정을 사용하고 있더라도 프로그램 쪽에서 운영체제에 대한 접근을

무조건 다 허용하지는 말아야할 필요가 있기는 하지만, 이건 뭐 장난하는 것도 아니고...

아무튼 Preferences 클래스는 거의 쓸 수가 없다는 판단으로

자바를 통해 WIndows Registry 접근을 할 수 있는 다른 방법을 찾아 보았습니다.

2편에서 계속됩니다.

2009/12/11 - [Java/Tip & Tech] - [Java]Java로 Windows Registry 정보를 가져오기...2편

Posted by Julyus
Java/JSP2013. 8. 1. 15:02


http://mwultong.blogspot.com/2007/01/javascript-yyyy-mm-dd-hhmmss.html



자바스크립트] 한국식 날짜/시간 문자열 출력; 타임 스탬프 찍기; JavaScript YYYY-MM-DD hh:mm:ss

Thursday, January 18, 2007

현재 날짜와 시간을 2007-01-18 15:03:51 이런 한국식 시간 형식으로 표현하는 것입니다. 실은 한국식 시간이라기보다는 ISO 표준 시간 포맷입니다.

아래 예제에서 getTimeStamp() 라는 함수가 본체입니다.

JavaScript: 현재 날짜/시간 YYYY-MM-DD hh:mm:ss 포맷 함수 예제


파일명: 0.html
<script type="text/javascript">

document.write(getTimeStamp() + '<br />');




function getTimeStamp() {
  var d = new Date();

  var s =
    leadingZeros(d.getFullYear(), 4) + '-' +
    leadingZeros(d.getMonth() + 1, 2) + '-' +
    leadingZeros(d.getDate(), 2) + ' ' +

    leadingZeros(d.getHours(), 2) + ':' +
    leadingZeros(d.getMinutes(), 2) + ':' +
    leadingZeros(d.getSeconds(), 2);

  return s;
}



function leadingZeros(n, digits) {
  var zero = '';
  n = n.toString();

  if (n.length < digits) {
    for (i = 0; i < digits - n.length; i++)
      zero += '0';
  }
  return zero + n;
}

</script>



브라우저 출력 결과:

2007-01-18 15:03:51

위와 같은 형식으로 표시됩니다. (실제로 위의 예제를 HTML 파일로 만들어서 실행해야 현재 시간이 나옵니다.)


1자리 숫자를 2자리로 표현하기 위해서는, 예를 들어 5를 05로 나타내려면 leadingZeros() 함수가 필요합니다: ▶▶ 자바스크립트] 숫자에 공(0), 제로(영) 붙이기/추가. Leading Zero to Number JavaScript

자바스크립트로 오늘 날짜/시간 얻기에 대한 설명: ▶▶ 자바스크립트] 오늘 날짜 시간 구하기, 년월일/시분초 출력; Date Time Print JavaScript

▶▶ 자바스크립트: 영문(미국식) 날짜/시간 문자열 간단히 출력; Time Stamp JavaScript



Posted by Julyus
Java/JSP2013. 8. 1. 11:35


http://blog.naver.com/taekiblue/140005440987
http://www.hanb.co.kr/network/view.html?bi_id=608



자바 프로그램으로 윈도우 레지스트리 다루기

등록일 : 2003년 03월 12일 | 조회수 : 4,407


저자: 한빛 리포터 김영익 

이 기사에서는 윈도우 운영체제에서 핵심적인 레지스트리 정보를 자바 프로그램에서 접근하는 방법을 소개한다. 이 기능은 JDK 1.4에서부터 새로 지원하는 기능으로 윈도우 기반의 자바 개발자에게는 새로운 희소식이 될 것이다. 

레지스트리? 

레지스트리는 윈도우 운영체제에서 아주 중요한 역할을 한다. 레지스트리에 문제가 생기면 부팅이 안되거나 프로그램들이 정상 작동을 하지 않을 정도로 치명적이다. 과연 레지스트리에 무엇이 들어 있길래 그렇게 중요하단 말인가? 우선 레지스트리가 무엇인가 알아보자.

Registry; 레지스트리

레지스트리는 윈도우95 나 윈도우98 및 윈도우NT와 같은 운영체계에서, 부팅시 필요한 정보, 즉 어떤 하드웨어가 장착되어 있는지, 시스템사양이나 선택사항은 무엇인지, 메모리는 어떻게 설정되어 있는지 등을 한 곳에 저장하기 위한 장소이다. 레지스트리는 이전의 윈도우 시스템, 즉 윈도우3.1 에서 사용되던 환경설정 파일(.INI 파일)과 유사하며, 그것을 대치한 것으로 이해하면 된다. 그러나 이전 시스템에서 운영되던 16 비트 응용프로그램들과 호환성을 위해 환경설정 파일(.INI 파일)도 여전히 함께 제공된다. 사용자는 Tweak UI와 같은 제어판 도구를 사용하여 레지스트리를 간접적으로 수정할 수 있으며, 응용프로그램이 설치되거나 삭제될 때마다 레지스트리 정보도 함께 수정된다. 네트웍 환경에서는 레지스트리 정보를 서버에 저장함으로써 개인이나 작업그룹 들의 시스템 정책을 중앙통제식으로 관리할 수도 있다.
(텀즈 용어해설 인용)
간단히 말해 레지스트리는 운영체제와 프로그램에서 필요한 정보를 담고 있는 데이터베이스와 비슷하다고 할 수 있다. 일반적인 윈도우 프로그램들은 레지스트리에 접근 할 수 있지만 자바 프로그램에서는 접근 할 수 없었다. 그 이유는 "자바의 철학"에 위배 되기 때문일 것이다. 자바 프로그램은 모든 운영체제에서 실행 가능 해야 하는데 '윈도우에만 존재하는 레지스트리'라는 것을 지원하지 않는 것은 당연한 일이었다. 게다가 레지스트리는 잘못 건드리면 윈도우 자체가 폭탄처럼 변할 수 도 있기 때문에 상당히 조심스러울 수 밖에 없다. 

하지만 JDK 1.4 버전부터는 일부 제한적으로 레지스트리에 접근 할 수 있도록 그 기능이 추가되었다. 보통 자바 프로그램에서는 프로그램 실행에 필요한 정보들을 파일로 저장해 두었다가 프로그램이 종료된 후 다시 실행하더라도 필요한 정보를 얻도록 하는 방법을 사용했다. 이때 파일을 사용하게 되면 이런 저런 이유로 코딩도 복잡하고 귀찮기 짝이 없다. 특별히 복잡한 정보도 아닌데 여러 모로 프로그래머가 고생을 하는 것이다. 바로 이런 경우에 레지스트리를 사용하면 간단히 해결된다. 아마도 많은 자바 개발자들의 요구 사항으로 인하여 JDK 1.4부터 추가 된 것이 아닌가 싶다. 

그렇다면 과연 자바 프로그램에서 레지스트리를 어떻게 사용할 것인가? 아무리 좋은 기능이 있어도 그 기능을 적절한 곳에 사용하지 못한다면 소용이 없게 된다. 이 기사를 통해서 레지스트리에 스트링 값을 입력하고 읽어오는 간단한 예제를 하나 만들어 보도록 하자. (참고로 예제 작성과 실행은 윈도우 XP에서 이루어졌다. 윈도우 계열 운영체제에서는 대부분 작동하겠지만 윈도우를 제외한 다른 운영체제에서는 예측 할 수 없음을 밝혀두는 바이다.) 

레지스트리를 이용한 사용자 인증 프로그램 

우리가 주로 사용하는 윈도우 운영체제에서는 사용자 계정을 제공한다. 따라서 인증된 사용자가 아니면 사용할 수 없다. 우리가 작성할 예제는 이와 비슷하지만 훨씬 간단한 프로그램이다. 프로그램이 제공하게 될 간단한 기능은 다음과 같다.
  • 프로그램을 처음 사용하는 경우, 이름을 입력 받아 레지스트리에 등록한다.
  • 사용자로부터 이름을 입력 받아서 등록된 이름과 같다면 원하는 작업을 계속 수행한다.
  • 등록된 이름이 아닌 경우라면 그냥 종료된다.
IT 백두대간 자바2, SDK 1.4
프로그램에 대한 설명은 따로 필요 없이 주석을 참고하면 된다. 그리고 컴파일이나 실행에 대해서 잘 모른다면 다른 자바 기초 서적을 참고하기 바란다. 

우선 실행 하기 전에 레지스트리 편집기를 실행한다. 윈도우 2000이나 XP의 경우 실행창에서 "regedit"를 실행하면 된다. 그리고 트리에서 다음과 같은 노드를 찾는다.


현재는 아무런 키 값이 없는 상태이다. 컴파일이 되었으면 이제 프로그램을 실행해보자. 처음 실행을 하면 이름을 입력하라는 메시지가 나온다. 이름을 입력하면 레지스트리에 등록되고 결과를 출력한 후 종료된다.


다시 실행을 하게 되면, 이미 키 값이 존재한다는 메시지가 출력되며 다시 이름을 입력 받는다. 입력 받은 이름과 레지스트리에 등록된 이름을 비교하여 같으면 결과 출력을 하고, 다르다면 에러 메시지를 출력한다.


이번에는 직접 레지스트리 편집기에서 결과를 확인해보자. 그림에서처럼 키와 값이 입력된 것을 확인할 수 있다.


완성된 프로그램의 기능은 이 것이 전부이지만 잘 활용한다면 여러 분야에서 응용할 수 있을 것이다. 

소스 코드는 다음과 같다.
import java.util.prefs.*;
import java.io.*;

public class RegistryTest {
	
	// 키와 값을 출력한다.
	public static void printKeyValue(String key, String value) {
		System.out.println("Key = [" + key + "] , Value = [" + value + "]");
	}
	
	// 해당 노드에 키를 포함하고 있는지 검사한다.
	public static boolean contains(Preferences node, String key) {
		return node.get(key, null) != null;
	}
	
	// 키보드로부터 이름을 입력받는다.
	public static String readName() {
		System.out.println("Input your name.");
		String value = null;
		try {
			InputStreamReader isr = new InputStreamReader(System.in);
			BufferedReader in = new BufferedReader(isr);
			value = in.readLine();
		} catch (IOException e) {
			// 예외 처리...
		}
		return value;
	}
	
	public static void main(String args[]) throws BackingStoreException {
		Preferences userRootPrefs = Preferences.userRoot();
		
		String key = "name"; // 등록할 키 이름
		String value = "";
		String newName = null;
		if (contains(userRootPrefs, key)) { // 이미 키가 존재한다.
			System.out.println("Key already exists !");
			value = userRootPrefs.get(key, "");
			newName = readName(); // 키보드로부터 입력 받은 이름
			if (newName.equals(value)) { 
				// 입력된 이름과 레지스트리에 등록된 이름 같다.
				printKeyValue(key, value);
				// 결과 출력 후, 다른 원하는 작업 수행...
			}
			else {
				// 이름이 다르다, 당신은 누구얏 ?
				System.out.println("Invalid user name !");
			}
		}
		else { // 키가 없으므로 처음 레지스트리에 등록
			value = readName();
			userRootPrefs.put(key, value);
			printKeyValue(key, value);
		}
	}
}
마치면서 

JDK 1.4에서 레지스트리에 접근하도록 지원하는 기능은 아직까지는 제한적이다. 레지스트리의 모든 부분에 접근하지 못한다는 것이 단점이 될 수 도 있다. 그렇지만 이는 단순히 해결될 문제도 아니다. 어떠한 자바 프로그램에서든지 레지스트리의 내용을 함부로 수정했다가는 윈도우 운영체제 자체에 아주 치명적인 손상을 입힐 수 도 있기 때문이다. 비록 이런 문제들이 남아 있기는 하지만 나름대로 필요한 부분에서 유용하게 사용한다면 그것으로 만족하고 싶다. 

참고자료





Posted by Julyus
Java/JSP2010. 7. 29. 20:58

서블릿에서 jsp호출(RequestDispatcher클래스 사용)  프로그래밍 

2007/08/09 12:28

복사http://blog.naver.com/takezer0/50020746417

서블릿에서 jsp호출(RequestDispatcher클래스 사용)

서블릿에서 jsp호출(forward와 include의 두가지 방식)

* 차이점: 두 메소드 모두 jsp페이지를 호출할 수 있는 메소드이지만 forward()메소드를 이용하면

jsp페이지를 호출하는 순간 서블릿 프로그램은 실행을 멈추고 jsp페이지로 넘어가 그곳에서 실행하고 프로그램이 끝나게 되지만 include()메소드를 이용하면 해당 jsp페이지가 실행되고 다시 나머지 서블릿 프로그램이 실행되는 것이다.

1. forward

RequestDispatcher rd = this.getServletContext().getRequestDispatcher("jspFile");

request.setAttribute("name", "value");

rd.forward(request, response);

2. include

RequestDispatcher rd = this.getServletContext().getRequestDispatcher("jspFile");

rd.include(request, response);

Posted by Julyus
2010. 7. 29. 20:50

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Java2009. 10. 15. 15:05

url="jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=000.000.000.000)(PORT=1521))                         (ADDRESS=(PROTOCOL=TCP)(HOST=000.000.000.000)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"

Posted by Julyus
Java2009. 8. 3. 21:45