Quartz로 데몬돌리기

2009. 8. 10. 00:00 from JSP
우선 소스까지 떠다먹여주신 개발자분에 대한 감사와 존경의 마음을 담아 링크를 걸고
http://blog.naver.com/an5asis/60019595888

부족한 구현능력을 커버해주는 오픈소스개발자들의 산출물에 다시한번 링크를,,,
http://www.opensymphony.com/quartz/

쿼츠 최신버전인 quartz-1.6.5.zip 를 다운받아 압축을 풀면
폴더 최상위에
quartz-1.6.5.jar

lib/core 에 있는

commons-collections-3.2.jar
commons-logging-1.1.jar

파일을 각각 참조 라이브러리에 등록합니다.

억지로 읽게 하려고 의미없는 사진도 첨부합니다.

위 부분이 스케줄을 실행할 메인함수인데 간단합니다. JobDetail 생성자 부분의 세번째 인자인 QuartzReport.class 의 execute 함수를 trigger.setCronExpression의 양식에 맞게 스케쥴링 하는게 끝이죠 부가적으로 getJobDataMap().put("type", "FULL")은 파라메터맵 설정하는정도로 생각하시면 됩니다. 결론적으로 위에있는 소스중에 execute만 고쳐서 쓰세요.
Posted by 윤재현 :
String sWhere = "AND F1 = '1' AND F2 = '2'";
이런저런 조건에 의해 만들어진 where 변수가 위와 같다면
"WHERE AND" 라는 이상한 구문이 되므로 첫번째 AND를 replace해버리곤 합니다.
그런데 이게 컨디션 따라 "and"로도 썼다가 "AND"로도 썼다가 하다보면 나중에 찾기도 귀찮고
"대문자로만 쓰자~" 고 해봤자 맨정신에 코딩하는사람도 얼마없죠

해서 자바 정규식 옵션을 이용해
sWhere.replaceFirst("(?i)and","");
처럼 처리해주시면 대문자건 소문자건 날려버릴수 있습니다.
다른 옵션도 많겠지만 당장 실용적인거만 적어놓고 또 일하러갑니다.
Posted by 윤재현 :

StringBuffer 사용시

2009. 6. 26. 13:41 from JSP
buffer.append("list").append(i);
이걸 편의상
buffer.append("list"+i);
요런식으로 사용하는데
이러면 컴파일할때는

sb.append("list").append(i);
sb.append((new StringBuilder("list")).append(i).toString());

위와같이 컴파일됩니다.
불편해도 나눠서 쓰는게 좋을거 같아요


Posted by 윤재현 :

LinkedHashMap

2009. 6. 25. 11:35 from JSP
이거 다 아는거겠지만 또 자세히 물어보면 모르는사람도 많고 하니 20일만에 게시물 업데이트좀 합니다.

아주 가~끔 개발할때
벡터에 꼴랑 키와 값을 담아서 꺼내야 할 경우가 있습니다.

Vector v = new Vector();
String[] arr = null;
for( int i = 0; i < 10; i++ ){
  arr = new String[2];
  arr[0] = "key";
  arr[1] = "value";
  v.add(arr);
}
String[] result = (String[])v.get(0);
System.out.println(result[0]);

이렇게 사용하겠죠
사실 그냥 맵에서 키, 값 쭉~ 찍으면 되는데 찍어보시면 알겠지만 순서가 뒤죽박죽 입니다. List형과 Map형은 그 특성이 달라서 원래 순서를 기억하기 위해서는 리스트를 쓰는게 맞긴합니다.
하지만 LinkedHashMap은 Map중에서 특이하게 순서를 기억합니다.


해서 아래와 같은코드에 생성자를 LinkedHashMap을 사용하면 입력된 순서대로 출력되고
HashMap 이나 HashTable, HashSet 이런거 쓰면 뒤죽박죽으로 나옵니다.

    LinkedHashMap m = new LinkedHashMap();
//    HashMap m = new HashMap();
    for( int i = 0; i < 10; i++ ){
      m.put( String.valueOf(i), String.valueOf(i) );
    }
    Iterator i = m.keySet().iterator();
    String temp;
    while(i.hasNext()){
      temp = String.valueOf(i.next());
      System.out.println(m.get(temp));
    }

물론 LinkedHashMap은 리스트처럼 순서를 저장하므로 성능은 다른 맵에 비해서 떨어질 수 있습니다.
얼마 차이는 안나요.
Posted by 윤재현 :

생성자 패턴

2009. 6. 1. 11:56 from JSP
텔레스코핑(telescoping) 생성자
public class Test {
  private final int servingSize;
  private final int servings;
  private final int calories;

  public Test( int servingSize, int servings ){
    this( servingSize, servings, 0 );
  }

  public Test( int servingSize, int servings, int calories ){
    this.servingSize = servingSize;
    this.servings = servings;
    this.calories = calories;
  }
}
매개변수값이 작을 경우에는 유용하지만 길어지면 파라메터의 용도파악이 어려움

자바빈즈패턴
public class Test {
  private int servingSize = -1;
  private int servings = 0;
  private int calories = 0;
  public Test( ){}
 
  public void setServingSize( int val ){
    servingSize = val;
  }
  public void setServings( int val ){
    servings = val;
  }
  public void setCalories( int val ){
    calories = val;
  }
}
객체 생성후 여러번의 setter 메소드를 호출하여 파라메터를 전달해야만 사용가능한 인스턴스를 생성할 수 있고 불변 클래스생성이 불가능;;

빌더패턴
public class Test {
  private final int servingSize;
  private final int servings;
  private final int calories;
 
  public static class Builder {
    private final int servingSize;
    private final int servings = 0;
    private final int calories = 0;
   
    public Builder( int val ){
      this.servingSize = val;
    }
    public Builder servings( int val ){
      this.servings = val;
      return this;
    }
    public Builder calories( int val ){
      this.calories = val;
      return this;
    }
    public Test build(){
      return new Test(this);
    }
  }
  private Test(Builder builder){
    servingSize = builder.servingSize;
    servings = builder.servings;
    calories = builder.calories;
  }
}
사용법::
Test a = new Test.Builder(1).servings(1).calories(1).build();

생성자에 많은 매개변수가 필요할 경우 유용함
Posted by 윤재현 :

배열요소 비교

2009. 5. 15. 01:13 from JSP
DB에 저장된 업로드허용 확장자 필드가 .gif|.jpg|.jpeg 로 구분되어 있을경우에 업로드되는 파일확장자명을 어떻게 비교하는게 편할지에 대해서 적습니다.

일반적으로
  String filename = "example.pdf";
  String[] ext = {".gif",".jpg",".jpeg"}; // String[] ext = rs.getString("EXT").split("\\|");
  boolean valid = false;
  for( int i = 0; i < ext.length; i++ ){
    if( ext[i].equals( filename.substring( filename.lastIndexOf(".") ) ) ){
      valid = true;
    }
  }
위와같이 쓰면 for문이 거슬립니다.

해서
  String filename = "example.pdf";

  String[] ext = {".gif",".jpg",".jpeg"};
  boolean valid = Arrays.asList(ext).contains(filename.substring(filename.lastIndexOf(".")));
/*
  boolean valid = Arrays.asList(rs.getString("EXT").split("\\|")).contains(filename.substring(filename.lastIndexOf(".")));
*/
처럼 변경이 가능합니다.
핵심은?

List인터페이스의 contains(object)로 내부요소비교가 가능하고

String[] 객체는 Arrays.asList(String[]객체) 함수를 통해 List 객체로 변환되고

List 객체는 내부함수인 List객체.toArray(); 함수를 사용해 object[] 형식으로 변환됩니다.

Posted by 윤재현 :


특정한 파라메터를 숫자로 넘긴후 다음페이지에서 숫자로 넘어온 파라메터를 다시
String 형으로 분기할때 if-else 를 사용하면 아래와 같이 지저분해 진다.


  int iDivNo = Integer.parseInt(request.getParameter("divNo"));

  if(iDivNo == 1){
    out.print("1번");
  } else if(iDivNo == 2){
    out.print("2번");
  } else if(iDivNo == 3){
    out.print("3번");
  } else if(iDivNo == 4){
    out.print("4번");
  } else if(iDivNo == 5){
    out.print("5번");
  } else if(iDivNo == 6){
    out.print("6번");
  } else if(iDivNo == 7){
    out.print("7번");
  }  



String 배열에 분기해야할 위치에 문자를 초기화해 놓으면
  
  String aParameter1[] = {"","1번","2번","3번","4번","5번","6번","7번"};
  out.println(aParameter1[iDivNo]);

위와같이 간단히 원하는 값을 찾을수 있다.



만약 파라메터로 넘어오는 값이 연속적이지 않다면 아래와 같이 초기화시킨후
원하는 값을 찾을수 있다.
  
  String aParameter2[] = new String[100];
  aParameter2[1] = "1번";
  aParameter2[5] = "5번";
  aParameter2[6] = "6번";
  aParameter2[20] = "20번";
  aParameter2[56] = "56번";
  aParameter2[88] = "88번";
  aParameter2[89] = "89번";
  aParameter2[99] = "99번";
  out.println(aParameter2[iDivNo]);

이건.. 소스길이도 비슷하고... if-else 를 사용하는것보다 그닥 좋은점은 찾기 힘들다.




 
Posted by 알 수 없는 사용자 :
로컬과 실서버에 jsp소스와 css소스가 똑같은데, 디자인이 다르게 나오는 경우,
UTF-8 에 Byte Order Mark 가 들어가 있는지 확인해봐야 한다.
소스보기로 보면,
??
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
이런 식으로 DOCTYPE앞에 이상한 글자가 들어가 있거나 칸 띄우기가 많이 되어있는 경우이다.
이를 해결하기 위해서는,
1. 해당 파일들 모두를 다른 곳에 복사 해놓고, EditPlus로 연다
2. EditPlus기본 설정을 Byte Order Mark 없는  UTF-8 파일 지원으로 맞춰놓는다.
(EditPlus 도구 -> 기본설정 -> 파일 -> 새 파일 형식 UTF-8 -> Byte Order Mark 없는  UTF-8 파일 지원 ->적용)
3. 해당 파일을 모두 다시 저장한다.
4. 이 파일들을 실서버에 옮긴다.
Posted by 알 수 없는 사용자 :