'심오한 세상/Java; Java FX;'에 해당되는 글 8건

  1. JAVA Date 날짜 계산 CLASS
  2. IE에서 엑셀 다운로드 구현시 에러가 나는경우 (3)
  3. Empty package가 보이지 않는다면...
  4. Java Collections API에 대해 모르고 있던 5가지 사항, Part 1 (1)
  5. 리눅스에 JDK 설치하기 (1)
  6. 자바에서interface와abstract에관해
  7. 클래스 이름을 이용하여 클래스를 생성하는 방법
  8. ResourceBundle의 활용

JAVA Date 날짜 계산 CLASS



http://magefister.blog.me/50096917826 
항상 자바 날짜 계산하는 방법을 기억하지 못해서 찾아다녔었는데.
여기에 잘 정리가 되어 있군요.
이제 고민않고 저기로 가면 되겠습니다. 
저작자 표시 비영리 변경 금지
신고

IE에서 엑셀 다운로드 구현시 에러가 나는경우



IE환경에서 page Context Type을 이용한 excel downloading 구현하였습니다. 그런데 다음과 같은 에러가 뜨더군요.


혹시나 싶어서 구글크롬에서 다운로드를 해봤습니다.
근데 다운로드가 잘되네요.
아~~이놈의 IE 정말;;; 세션 문제 이후 나를 계속 괴롭히네요.

그래서 기존에 사용하던 잘되던 소스를 뒤지고 뒤졌습니다.
일단 위 에러는 response.setHeader("Pragma", "public"); 와 같이 해서 처리했습니다.
하지만 읽기에도 아직 부자연스럽네요.

좀더 찾아봐야겠습니다.
현재까지 제가 적용해본 옵션은 아래와 같습니다.
빨간 글씨는 제가 변경해서 성공한(?) 부분입니다.
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Pragma", "public");
response.setHeader("Expires", "0");
response.setHeader("Content-Disposition", "attachment; filename=downloadExcelFile.xls");
response.setHeader("Content-Description", "JSP Generated Data");
response.setHeader("Cache-Control", "max-age=0");
인터넷 검색을 해보니, 이 같은 이슈가 많이 존재하는 것 같습니다.

아래는 제가 참고한 사이트에서 가져온 내용입니다.
죄송하지만..저도 살짝 참고 링크로 ^^

1.구글신 검색 참고사이트

2.html header에 대한 더 많은 정보를 원하시면 (그러나 영어의 압박 ;;;)
좀더 깔끔한 정리 : http://www.mnot.net/cache_docs/


저작자 표시 비영리 변경 금지
신고

Empty package가 보이지 않는다면...



eclipse에서 package를 만들었는데 만든게 보이지 않더군요.
그래서 이것저것 찾아봤는데, 아래와 같은 것이 있더군요.


살포시 Empty packages의 앞에 체크박스의 체크를 없애면, empty package가 나타납니다.
자~~ 이제 package 만들고 사라졌따고 당황하지 말자고요.
저만 그랬나요 ㅡ,.ㅡ;;;

아래는 eclipse 처음 깔고 살펴본 형태입니다. 참고하세요.


저작자 표시 비영리 변경 금지
신고

Java Collections API에 대해 모르고 있던 5가지 사항, Part 1



부제 : Java Collections 사용자 정의 및 확장하기

http://www.ibm.com/developerworks/kr/library/j-5things2.html

IBM 기술문서에 올라온 자료입니다.
배열보다 유용한 Collections에 대한 내용입니다.

1. Collections 트럼프 배열
배열의 성능은 Java Collections 라이브러리의 성능에 미치지 못하고 있다고 합니다.
따라서, 배열을 Collections 클래스로 최대한 빨리 변환해서 사용하라고 권장하고 있습니다.
아래는 배열을 변환하는 방법입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
public class ArrayToList {
    public static void main(String[] args){
        // This gives us nothing good
        System.out.println(args);
 
        // Convert args to a List of String
        List<string> argList = Arrays.asList(args);
 
        // Print them out
        System.out.println(argList);
    }
}

이것의 단점은 수정할 수 없다고 합니다. 새 요소를 추가할려고 하면 UnsupportedOperationException이 발생한다고 합니다.
2. 반복은 비효율적이다.
반복에는 단점이 여러가지가 있다고 합니다.
  • 각각의 추가 또는 제거 후 콜렉션의 크기를 조정해야 하므로 비효율적이다.
  • 잠금을 획득하고, 작업을 수행한 후 잠금을 다시 해제할 때마다 심각한 동시성 문제가 발생할 수 있다.
  • 추가 또는 제거가 발생하는 동안 해당 콜렉션 작업을 수행하려는 다른 스레드에 의해 경쟁 조건이 발생한다.
하지만, Collections에서 제공하는 함수(e.g. addAll 또는 removeAll)을 사용하여 쉽게 처리할 수 있다고 하고 있습니다.

3. For 루프로 Iterable 반복하기
이것은 저도 많이 활용하고 있는 방법입니다.
예전에는 Iterator를 가져온 후 next()를 사용하여 Iterator에 지정된 오브젝트를 가져온 다음 hasNext()를 통해 사용할 수 있는 추가 오브젝트가 있는지 확인하는 과정으로 수동으로 수행해야 했습니다. 하지만 Java 5부터는 이러한 모든 과정을 자동으로 처리하는 for 루프 변형을 자유롭게 사용할 수 있습니다.
Iterable 인터페이스를 구현한 모든 Collections에서 사용 가능합니다.
저 같은 경우는 ArrayList에서 객체를 가져올 때 주로 사용합니다.

1
2
3
4
5
6
7
ArrayList<string> list = new ArrayList<string>();
list.add("item1");
list.add("item2");
list.add("item3");
for (String item : list) {
    // ...
}

위와 같이 주로 사용합니다.

IBM 기술문서에 나온 내용을 이용하여 제가 좀 적어봤는데요.
제가 언급하지 않는 내용도 Collections를 사용하면 굉장히 유용할 것입니다.
나머지는 제가 아직 사용해보지 않아서 어떻게 말씀을 못드리겠습니다.
하지만 위에서 언급한 내용은 정말 유용합니다.

더 많은 내용을 원하시면 위에 링크를 걸어놓은 IBM 기술문서 페이지로 이동하시면 됩니다.


저작자 표시 비영리 변경 금지
신고

리눅스에 JDK 설치하기




http://java.sun.com/
에서 일단 리눅스용 bin파일을 다운 받는다.
rpm버전으로 되어 있는 버전도 있지만, 그것은 rpm을 구동시킬 수 있는 환경이 되어야하므로
bin을 실행하여 압축만 푸는 버전으로 하는 것이 좋을 것으로 본다.

압축을 풀고, 원하는 위치에 파일을 이동시킨다.
하지만, 이것으로는 java -version을 하면 이상한 에러만 발생된다.

# java -version
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object


위와 같은 에러만 나오고 실행은 되지 않는다.

이것을 해결하기 위해 구글을 통해서 많이 사이트를 찾았다.
하지만, 해결책이 있는 사이트는 하나뿐이었고, 한국어로 되어 있는 사이트는 아무곳에도 없었다.

대부분의 사이트에서는 "JAVA_HOME을 해줘야한다.", "PATH를 지정해줘야한다.", "CALSSPATH를 지정해줘야 한다." 이렇게 말하고 있었다.

하지만, 아무것도 이 에러를 잡아주지를 못했다.
위 내용도 맞을 수 있다. 다만 Object class 파일이 jre/lib에 있다는 것을 확신하고, 찾을 수만 있다면....
하지만, lib에는 jar 파일이 보이지 않았고, pack이라는 파일들이 보였다.
즉, rt.pack 파일은 보였으나 rt.jar 파일이 보이지 않았다.

따라서, pack 파일을 jar로 변환하는 스크립트를 공개하려 한다.
이 내용은 sun사가 운영하는 forum에서 가져온 내용이며, 굳이 스크립트에 대한 저작권을 바란다면, 그쪽 사이트에 있다고 하겠다.
JAVA_HOME을 정확하게 지정하고 실행시켜야 한다.

#!/bin/sh
JH=${JAVA_HOME:-"/usr/local/jdk1.6.0_13/jre"}
UNPACK_EXE=$JH/bin/unpack200
if [ -f $UNPACK_EXE ]; then
chmod +x $UNPACK_EXE

PACKED_JARS="lib/rt.jar lib/jsse.jar lib/charsets.jar lib/ext/localedata.jar lib/plugin.jar lib/javaws.jar lib/deploy.jar"
for i in $PACKED_JARS; do
srcFile=${JH}`dirname $i`/`basename $i .jar`.pack
dstFile=${JH}/$i
if [ ! -f $srcFile ]; then
printf "Error: Unable to find %s. Please, check out your installation.\n" $srcFile
exit 1
fi
$UNPACK_EXE $srcFile $dstFile
if [ ! -f $dstFile ]; then
printf "Error: unpack could not create %s. Please refer to the Troubleshooting\n" $dstFile
printf "Section of the Installation Instructions on the download page.\n"
exit 1
fi

rm -f $srcFile
done

else
printf "Error: unpack command could not be found. Please refer to the \n"
printf "TroubleShooting Section of the Installation Instructions on \n"
printf "the download page.\n"
printf "Please do not attempt to install this archive file.\n"
exit 2
fi


(출처) http://forums.sun.com/thread.jspa?threadID=598858
저작자 표시 비영리 변경 금지
신고

자바에서interface와abstract에관해



1. 공통점:
우선 아래 소스1을 보시면, 전형적인 interface,와 abstract 클래스를 나타내고 있습니다.
1) abstract와 interface는 그자체가 instance화 될수가 없습니다.
즉, TestInterface t = new TestInterface(), TestAbstract a = new TestAbstract();
둘다 컴파일을 해보면, 에러를 발생시킵니다.

2) Prototye만 있고 Body가 없는 메소드를 멤버함수로 가집니다.
소스1에서 보시는 봐와 같이 TestInterface, TestAbstract 는 함수 선언부는 존재하지만, 내용이 없는 함수들을 포함하고 있습니다.

3) abstract,interface 클래스를 사용하려면, abstract,interface 위클래스를 상속받아서, 새로운 클래스를 생성시킨후, instance화 할수가 있습니다.
소스2 에서 보는봐아 같이 상속을 받은후, 사용해야 합니다.
즉, childclass c = new childclass(); 님 컴파일시 에러가 발생하지 않습니다.

[소스1]
public interface TestInterface {
     public static int num = 8;
     public void func1();
     public void func2();
}

public abstract class TestAbstract {
     public abstract void func1() ;
     public void func2() {
          System.out.println("func2");
     }
}

[소스2]
class childclass1 extends TestAbstract {
     // Abstrace Method을 오버라이딩했습니다.
     public void func1() {
          System.out.println("상속 받아서, Body를 채워줬습니다.");
     }
}

class childclass2 implements TestInterface {
     public void func1() {
          System.out.println("Class Test1");
     }
     public void func2() {
          System.out.println("Class Test2");
     }
}

차이점:
1) Prototye만 있고 Body가 없는 메소드 즉 abstract메소드라고 하는데, Abstract 클래스는 abstract메소드와 일반 메소드를 혼용해서, 가질수 있습니다. 즉, 일반메소드 + abstrace메소드 형태를 유지한다는 겁니다.
하지만, interface는 모든 메소드들이 abstract 메소드로 존재 해야 합니다. 소스 1에서 보는봐와 같이 func1(), func2()는 모두 Body(내용) 이 없이 Prototype(선언만) 이 존재합니다.

2) interface와 abstrace클래스를 상속받을때, 상속받는 키워드 가 다릅니다.
abstract클래스는 소스2처럼, extends를 사용하고, interface클래스는 implements 을 사용합니다.

3) 다중상속 가능유무 입니다.
보통 자바에서는 일반 클래스에서는 다중상속을 지원하지 않습니다. 즉 2개이상의 클래스를 상속 받지 못하게 되어 있죠. 하지만, interface의 경우에는 다중상속이 가능합니다.

4) 클래스 시작 키워드가 다르죠.
abstract클래스는 abstract class.. 형태로 시작하고, 인터페이스 클래스는 interface..로 시작합니다.

결국 큰범주에서 보면, abstract method로만 이루어진 abstract class가 interface 인셈이죠.

신고

클래스 이름을 이용하여 클래스를 생성하는 방법



기존의 우리가 클래스는 생성하는 방법은
아래와 같이, new 연산자를 이용하여 생성자를 호출하는 방식으로 했었다..

ExampleClass name = new ExampleClass();

하지만, 내가 무지한 탓인지...
클래스 이름을 String 값으로 가지고 있어도 클래스를 생성할 수 있다는 사실을 알게되었다.
아래와 같이 클래스 이름만 가지고 있다면...

String name = "ExampleClass";

Class 클래스에 있는 forName() 메소드를 사용함으로써 ExampleClass라고 하는 클래스가 초기화가 된다.

Class t = Class.forName(name);

객체 t를 이용하여 새로운 객체를 생성하게 된다.

name = (ExampleClass) t.newInstance();

(Example)
HTTPServerSocket server = new HTTPServerSocket(port);
위의 것을 클래스 이름만 알고 있다면 아래와 같이 바꿔서 생성할 수 있다.

String serverClass = "context.arch.comm.protocol.HTTPServerSocket";
int serverPort = 6000;

Class[] classes = new Class[2];
classes[0] = Class.forName("context.arch.comm.CommunicationsObject");
classes[1] = Class.forName("java.lang.Integer");

Constructor constructor = Class.forName(serverClass).getConstructor(classes);

Object[] objects = new Object[2];
objects[0] = this;
objects[1] = new Integer(serverPort);

server = (CommunicationsServer)constructor.newInstance(objects);

p.s.
클래스 이름만 알고 있는 상태에서 저렇게 한다면 클래스를 쉽게 생성할 수 있다.
프로그래밍을 하다보면 클래스 이름을 이용해서 객체를 생성해야할 때 저렇게 사용해보는 것은 어떨까?

Chan이 준 사용 예이다. ㅋㅋ
이게 command 패턴이라고 한다.

String action = getAction();
IAction = null;
if ( action != null ) {
   IAction tempAction = ( IAction ) Class.forName(action).getConstructor().newInstance();
   tempAction.doAction();
}

신고

ResourceBundle의 활용



API 위치
java.util.ResourceBundle

역할
프로그램 배포시 고정된 자원과 변화하는 자원이 있다.
게시판 배포를 예로 든다면 안에 소스는 대부분 고정된 자원이다. 하지만 사용자마다 database의 설정 등은 수정해서 사용해야 하는 부분이다.
이러한 값들은 프로그램의 알고리즘 과 상관없는 부분으로 따로 관리해야 하는 자원들이다. 이러한 자원은 파일로 저장해서 관리하는 것이 보편적은 추세로 ResourceBundle을 이용 할 수 있다.

아래는 현재 사용중인 properties 파일이다.
ADMIN_ID=id
ADMIN_PWD=pass
MAX_UPLOAD_SIZE=6291456

위에서 보면 단순히 "="를 기준으로 해서 왼쪽에 key 오른쪽에 value가 들어가는 단순한 형식임을 볼 수 있다.
#주석
[key]=[value]

주의 할점은 String 형식이라고해서 ",' 이런걸 사용하면 안된다는 것이다.

ResourceBundle 클래스는 자원을 저장하고 반환하는 기능을 제공하는 클래스이다. 이 클래스의 getBundle 메소드는 파일이나 클래스등으로 부터 ResourceBundle 객체를 생성시켜 주어 key값을 통해 해당 value를 얻을 수 있다.

주요 메소드
static ResourceBundle getBundle(String baseName)
: 주어진 값으로 해당 자원을 가지는 ResourceBundle 객체를 만든다.
Object getObject(STring key)
: 키값에 해당되는 객체를 반환한다.
String getString(String key)
: 키값에 해당되는 문자열을 반환한다.

자원 파일
ResourceBundle 클래스는 국제화를 지원하기 위한 클래스로 파일명은 Locale 파일 규칙을 사용한다. 파일의 기본 이름은 "Res"이고, 언어 코드가 "ko", 지역 코드가 "KR"이라면 "Res_ko_KR.properties" 이런식으로 만들며 확장자는 반드시 .properties인 텍스트 파일이어야 한다. 하지만 우리는 국제화에 따라 다양한 언어와 지역을 지원하기 위해 사용하는 것이 아니니 그냥 "Res_성격에 맞는 이름.properties"로 사용하면 되겠다.

자원 파일의 위치
properties 파일은 getBundle 메소드에 의해 객체로 전환이 된다. 따라서 클래스 파일과 같이 위치를 추적하면 되겠다. 만일 "Res_test.properties"라는 파일을 classes 폴더 및에 test라는 폴더 아래 두었다면 우리는 "test.Res_test" 라고 해서 찾아가면 된다.

Res_test.properties
SINCE_YEAR=2002
SINCE_MONTH=5
SINCE_DATE=8
SINCE_DAY=Wednesday

이 파일을 "web-inf/classes/test/" 아래 두고 테스트를 해보겠다.

불러오기 테스트
간단하게 jsp에서 호출을 해보겠다.
resourceBundleTest.jsp
<%@ page contentType="text/html;charset=MS949"%>
<%@ page import!="java.util.ResourceBundle" %>
<%@ page import!="java.util.Enumeration" %>
<%
  ResourceBundle bundle = null;
  try {
       bundle = ResourceBundle.getBundle("test.Res_test");
       Enumeration enum = bundle.getKeys();
       for (; enum.hasMoreElements(); ) {
           String name = (String)enum.nextElement();
           String value = bundle.getString(name);
           out.println(name + " : " + value);
           out.println("<BR>");
       }
  } catch (Exception e) {
       out.println("Err: "+e.toString());
  }
%>

결과
SINCE_YEAR : 2002
SINCE_DATE : 8
SINCE_MONTH : 5
SINCE_DAY : Wednesday

ResourceBundle 클래스는 사용이 너무도 간단하기에 web에서 자주 사용되리라 생각된다.


신고