레이블이 java인 게시물을 표시합니다. 모든 게시물 표시
레이블이 java인 게시물을 표시합니다. 모든 게시물 표시

2012-10-26

Java] post 방식으로 header를 설정한 후 xml 데이터를 서버에 전달



apache http-client 3.x.jar필요.

출처 : http://danhobak.textcube.com/22



http post 방식으로 header를 설정한 후 xml 데이터를 서버에 전달 후

그 결과를 받는다.

첨부된 파일을 압축을 풀면 lib 디렉토리 안의 jar 파일들을

%CATALINA_HOME%\common\lib 에 위치시키거나

CALSSPASS를 잡아준 후 이용하면 된다.


<%@ page import="org.apache.commons.httpclient.HttpClient" %>
<%@ page import="org.apache.commons.httpclient.methods.PostMethod" %>
<%@ page import ="java.net.*" %>
<%@ page import ="java.io.*" %>

<%

    String orgMsg="abcdefg";
    String encMsg = null;
    String header1 = "header1";
    String header2 = "header2";
    String header3 = "header3";
    String ContentsType="text/xml";
  

    AES256 aes = new AES256();
    encMsg = aes.encrypt(msg);

      String xmldata = "<? xml version=\"1.0\" encoding=\"euc-kr\"?> "
                            +"<! DOCTYPE lgtpims:schema>"
                            +"<schema targetns=\"http://www.aaa.com\""
                    +"version=\"1.0\" xmlns=\"http://www.w3.org/2000/10/XMLSchema\">"
                        +"<parameter method=\"add\">"
                            +"<element-value name=\"addelement\">aaaaa</element-value>"
                            +"<element-value name=\"addelementtype\">bbbbb</element-value>"
                        +"</parameter>"
                    +"</schema>" ;

        String strURL = "http://www.aaa.com/aaa";
        PostMethod post = new PostMethod(strURL);
        post.setRequestHeader("Content-type", "text/xml; charset=ISO-8859-1");
        post.setRequestHeader("header1","header1");
        post.setRequestHeader("header2",header2);
        post.setRequestHeader("header3",header3");
        post.setRequestHeader("Content-Length",Integer.toString(xmldata.length()));
        post.setRequestBody(xmldata);

        HttpClient httpclient = new HttpClient();          

        try {
            int result = httpclient.executeMethod(post);
            // Display status code
            out.println("<br>Response status code: " + result);
            // Display response
             out.println("<br>Response header: "+post.getResponseHeader("Status-Line"));
            out.println("<br>Response body: ");
            out.println(post.getResponseBodyAsString());
        } finally {
            // Release current connection to the connection pool once you are done
            post.releaseConnection();
        }

%>

Java] file channel을 이용한 파일 복사, 파일 다운로드




// file channel 을 이용한 파일 복사

public void fileCopy(String src, String target) throws IOException {

FileInputStream inputStream = new FileInputStream(src);        

FileOutputStream outputStream = new FileOutputStream(target);



FileChannel fcin =  inputStream.getChannel();

FileChannel fcout = outputStream.getChannel();



long size = fcin.size();

fcin.transferTo(0, size, fcout);



fcout.close();

fcin.close();

outputStream.close();

inputStream.close();

}

// request, response 를 이용한 파일 다운로드 기능 구현...

// 출처 : http://hatssarjy.tistory.com/entry/Jsp-FileDownload

public void downloadExec(HttpServletRequest req,HttpServletResponse resp,

String fn) {

resp.setContentType("application/octet-stream");

String filename = fn;

String filename1;

try {

filename1 = new String(fn.getBytes("ISO-8859-1"),"euc-kr");

String filename2 = java.net.URLEncoder.encode(filename1, "UTF8");

LConfiguration conf = LConfiguration.getInstance();

String absPath = conf.getDevonHome().replaceAll("devonhome", "")+"/web/upload"; //  <=== context의 경로

resp.setHeader("Content-Disposition","attachment; filename=\""+filename2+"\";");

//File file = new File ("upload/"+filename);

File file = new File (absPath+"/"+filename);

byte[] bytestream = new byte[(int)file.length()];

FileInputStream filestream = new FileInputStream(file);

int i = 0, j = 0;

while((i = filestream.read()) != -1) {

bytestream[j] = (byte)i;

j++;

}

OutputStream outStream = resp.getOutputStream();

outStream.write(bytestream);                                        

outStream.close();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (DevonException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}



      // 위의 메소드를 개선한 메소드.

public void downloadExec2(HttpServletRequest req,HttpServletResponse resp,

String fn) {

LConfiguration conf;

try {

conf = LConfiguration.getInstance();

String absPath = conf.getDevonHome().replaceAll("devonhome", "")+"/web/upload"; //로컬경로

String change_name = StringUtils.defaultString(fn);

String real_name = StringUtils.defaultString(fn);

//실제 저장소의 파일명

String fileName = "/upload"+"/"+change_name;

// File file = new File(fileName);

File file = new File (absPath+"/"+real_name);

int fileSize = (int)file.length();

resp.setContentType("application/octet-stream");

resp.setHeader("Content-Disposition", "attachment;filename="+real_name+";");

resp.setContentLength(fileSize);

resp.setHeader("Content-Transfer-Encoding", "binary;");

resp.setHeader("Pragma", "no-cache;");

resp.setHeader("Expires", "-1;");

resp.setHeader("Cache-Control", "cache, must-revalidate");

if(fileSize >0 && file.isFile()){

BufferedInputStream fin;

//fin = new BufferedInputStream(new FileInputStream(fileName));

fin = new BufferedInputStream(new FileInputStream(file));

BufferedOutputStream outs = new BufferedOutputStream(resp.getOutputStream());

byte b[] = new byte[fileSize];

int read = 0;

try{

while((read=fin.read(b)) != -1){

outs.write(b,0,read);

}

}finally{

outs.close();

fin.close();

}

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (DevonException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}
;

Java] Date Format 사용하기



출처 : http://www.rgagnon.com/javadetails/java-0099.html


Using DateFormat

import java.text.*;



public class DateUtils {

  public static boolean isValidDateStr(String date) {

    try {

     DateFormat df =

       DateFormat.getDateInstance

         (DateFormat.SHORT); // YYYY-MM-DD

     df.setLenient(false);   // this is important!

     df.parse(date);

    }

    catch (ParseException e) {

     return false;

    }

    catch (IllegalArgumentException e) {

     return false;

    }

    return true;

  }

  

  public static void main(String[] args) {

    System.out.println(" 1900-12-13 valid ? " 

        + DateUtils.isValidDateStr("1900-12-13"));



    // "1990-12/13" throws a ParseException

    System.out.println(" 1900-12/13 valid ? " 

        + DateUtils.isValidDateStr("1900-12/13"));

    // "1990-13-12" throws a IllegalArgumentException

    System.out.println(" 1900-13-12 valid ? " 

        + DateUtils.isValidDateStr("1900-13-12"));

    /*

     * output :

     *  1900-12-13 valid ? true

     *  1900-12/13 valid ? false

     *  1900-13-12 valid ? false

     */

  }

}
Using SimpleDateFormat
package com.rgagnon.howto;



import java.text.*;



public class DateUtils {

  public static boolean isValidDateStr(String date, String format) {

    try {

      SimpleDateFormat sdf = new SimpleDateFormat(format);

      sdf.setLenient(false);

      sdf.parse(date);

    }

    catch (ParseException e) {

      return false;

    }

    catch (IllegalArgumentException e) {

      return false;

    }

    return true;

    }

  

  public static void main(String[] args) {

    System.out.println(" 1900-12-13 valid ? " 

        + DateUtils.isValidDateStr("1900-12-13","yyyy-MM-dd"));



    // "1990-12/13" throws a ParseException

    System.out.println(" 1900-12/13 valid ? " 

        + DateUtils.isValidDateStr("1900-12/13","yyyy-MM-dd"));

    // "1990-13-12" throws a IllegalArgumentException

    System.out.println(" 1900-13-12 valid ? " 

        + DateUtils.isValidDateStr("1900-13-12","yyyy-MM-dd"));

    /*

     * output :

     *  1900-12-13 valid ? true

     *  1900-12/13 valid ? false

     *  1900-13-12 valid ? false

     */

  }

}

Using GregorianCalendar

import java.util.*;



public class jtest {

    public static void main(String args[]) {

        try {

            GregorianCalendar gc = new GregorianCalendar();

            gc.setLenient(false);        // must do this

            gc.set(GregorianCalendar.YEAR, 2003);

            gc.set(GregorianCalendar.MONTH, 42);// invalid month

            gc.set(GregorianCalendar.DATE, 1);



            gc.getTime(); // exception thrown here

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}




출처 :  http://www.dreamincode.net/forums/topic/14886-date-validation-using-simpledateformat/


// date validation using SimpleDateFormat

// it will take a string and make sure it's in the proper 

// format as defined by you, and it will also make sure that

// it's a legal date



public boolean isValidDate(String date)

{

    // set date format, this can be changed to whatever format

    // you want, MM-dd-yyyy, MM.dd.yyyy, dd.MM.yyyy etc.

    // you can read more about it here:

    // http://java.sun.com/j2se/1.4.2/docs/api/index.html

    

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

    

    // declare and initialize testDate variable, this is what will hold

    // our converted string

    

    Date testDate = null;



    // we will now try to parse the string into date form

    try

    {

      testDate = sdf.parse(date);

    }



    // if the format of the string provided doesn't match the format we 

    // declared in SimpleDateFormat() we will get an exception



    catch (ParseException e)

    {

      errorMessage = "the date you provided is in an invalid date" +

                              " format.";

      return false;

    }



    // dateformat.parse will accept any date as long as it's in the format

    // you defined, it simply rolls dates over, for example, december 32 

    // becomes jan 1 and december 0 becomes november 30

    // This statement will make sure that once the string 

    // has been checked for proper formatting that the date is still the 

    // date that was entered, if it's not, we assume that the date is invalid



    if (!sdf.format(testDate).equals(date)) 

    {

      errorMessage = "The date that you provided is invalid.";

      return false;

    }

    

    // if we make it to here without getting an error it is assumed that

    // the date was a valid one and that it's in the proper format



    return true;



} // end isValidDate

2012-10-23

Java] iText 한글 깨짐 문제 해결 및 폰트 찾기



iText 한글깨짐 해결..
출처 : http://blog.pointbre.com/2818/itext-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0.html

라이브러리 설치
iText 2.x.x 선택해야 함, iText 5.x.x는 해보니 아무리 찾아보고 시도해봐도 안되더군요 ㅠ.ㅠ

코딩
BaseFont objBaseFont = BaseFont.createFont("HYGoThic-Medium", "UniKS-UCS2-H", false); 
Font objFont = new Font(objBaseFont, 12);
objDocument.add(new Paragraph("한글테스트", objFont));

폰트설치

윈도우, 리눅스에서 모두 동작하는 것을 확인했습니다 ^^*




===========================================================================
해당 한글 폰트 찾기
출처 : http://blog.pointbre.com/2816/jfreechart-%ED%95%9C%EA%B8%80%EA%B9%A8%EC%A7%90-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0.html

fontconfig.properties등을 고치는 건 너무 어렵고 고통스러운 테스트가 동반되어 삽질 중 포기함
jre설치위치/lib/font에 batang.ttc, gulim.ttc, H2GTRM.TTF를 복사해넣어주면 끝!
윈도우, 리눅스에서 모두 확인했슴

H2GTRM.TTF은 iText용으로 일단 copy해두었습니다. 보통의 경우라면 batang.ttc, gulim.ttc만 copy하면 될듯 합니다.

2012-10-22

Java] Eclipse + autoftp


ftp로 직접 연결해주는 플러그인.
각 프로젝트별로 설정해서 사용하면 된다.

epub관련 자료





epub 관련 자료

http://bany223.blog.me/10103012135
http://code.google.com/p/epubcheck/wiki/Development
http://threepress.org/tools/
ePub Reader & Editor :::   http://kogaeng.tistory.com/327
#summary 관련 프로젝트들

= ePUB 변환 =

  * [http://code.google.com/p/epub-tools/ epub-tools]
        Java로된 Adobe EPUBGen 엔진을 사용하고 있으며,
        frontend engine에는 XSLT 기술을 사용.
  * [https://code.google.com/p/python-epub-builder/ python-epub-builder]
        [http://genshi.edgewall.org/ Genshi] template library 기반으로 한 text to epub 변환기.
        Genshi 자체가 덩치가 있고, 간단한 text만을 대상으로 하여 markup을 넣기가 어려워 수정을 포기.
  * [http://epubsharp.sourceforge.net/ EPUB Sharp]
        .NET/C# 기반

= Markup 언어 =
여러 텍스트용 markup이 존재하고
주로 program document를 간단하게 작성하는 용으로 사용된다.

   * [http://docutils.sourceforge.net/rst.html reStructured Text](RST)
        Python Docutils에서 사용하는 포맷
   * [http://code.google.com/p/support/wiki/WikiSyntax Google Wiki]
        여기 문서 작성하는 포맷

= PDF 변환 =
PDF 생성엔진으로 [http://www.reportlab.com/software/opensource/rl-toolkit/ ReportLab Toolkit]을 대부분 사용하고 있고, 그위에 frontend engine을 올려 변환기들이 나와 있음.

  * [http://code.google.com/p/rst2pdf rst2pdf]
        reStructured Text를 PDF로 변환
  * [http://www.xhtml2pdf.com xhtml2pdf] (aka pisa)
        XHTML을 PDF로 변환

= RSS 언어 =
RSS 처리는 [http://feedparser.org Universal Feed Parser]가 진리.

  * [http://cafe.naver.com/ebook/82965 rss2epub]
        [http://ebookcafe.kr 이북카페] 욱님이 만든 python script.
        Matt's epub.py 라는 간단한 생성기를 사용


= 그외 =

  * [http://calibre-ebook.com Calibre]
         ePUB 툴의 대명사. Python 기반.
  * [http://code.google.com/p/lrf-epub-tools/ LRFtool]
        Sony Reader용 포맷인 LRF를 ePUB으로 변환하는 툴이지만
        그외에도 여러 포맷을 지원
  * [http://code.google.com/p/epubcheck epubcheck]
        ePUB 파일을 검사하는 툴. Java 기반.

Java] java Framework/DataBase별 JDBC 설정



http://blog.paran.com/powerkit/19887881


mssql 2000 jdbc driver download : http://www.microsoft.com/downloads/details.aspx?familyid=99B21B65-E98F-4A61-B811-19912601FDC9&displaylang=ko
mssql 2005 jdbc driver download : http://www.microsoft.com/downloads/details.aspx?FamilyID=e22bc83b-32ff-4474-a44a-22b6ae2c4e17&DisplayLang=ko

2012-10-14

Java] Java 파일 캐싱




출처 : http://www.ezslookingaround.com/blog/tech/?no=1414&category=


출처 : http://tripoverit.blogspot.com/2008/04/java-create-zip-file-in-memory.html



Java - Create Zip file in memory


 

I find myself writing and rewriting this piece of code whenever I want to zip a set of files (in memory) and return the zipped file back as an object in memory. I often use this when the user requests a download of multiple reports and the deployment environment doesn't allow for disk access.

I thought I'd post it here so that I could copy-paste it the next time I need it :) If you've stumbled upon this page, you're free to use the code below too!
  1. privatestaticbyte[] createZip(Map files) throws IOException {  
  2.     ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  3.     ZipOutputStream zipfile = new ZipOutputStream(bos);  
  4.     Iterator i = files.keySet().iterator();  
  5.     String fileName = null;  
  6.     ZipEntry zipentry = null;  
  7.     while (i.hasNext()) {  
  8.         fileName = (String) i.next();  
  9.         zipentry = new ZipEntry(fileName);  
  10.         zipfile.putNextEntry(zipentry);  
  11.         zipfile.write((byte[]) files.get(fileName));  
  12.     }  
  13.     zipfile.close();  
  14.     return bos.toByteArray();  


Java 로 간단한 파일 캐싱을. ^^

출처 : http://ncanis.tistory.com/104

File Caching.
오늘의 2번째 글입니다.~ ^^

간단한 파일캐싱에 대하여 한번 써봤습니다.
별로 팁이란것도 아니지만 심심해서. ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

보통 어떤 flag나 환경설정 정보를 파일에 저장할때가 있습니다.
예를 들어, database url 이나, 로그인 정보, 아니면 구현 클래스 이름 등등.
자주바뀌어야 하는 정보들 말이죠 :)

자주 바뀌어야 하는 정보라면 로더 클래스가 이 환경설정 파일을 읽어 시스템에 적용하는게 보통이죠.
그렇게 하면 파일내의 정보가 바뀌더라도 재 컴파일을 안해도 되는 장점이 있습니다.

근데,
만약 항상 파일내의 데이터를 가져오는 부분에 복잡한 루틴이 걸려있으면 어떨까요.
시스템의 성능은 많이 떨어지게 됩니다.

워, 파일 내용이 바뀌지도 않았는데 계속 파일을 읽어서 확인하다죠 ㅡ.ㅡ;

이럴때는 파일 캐싱을 통해 가져오면 되지요.

평소에는 파일내용을 메모리에 올려놓다가,
파일 내용이 바뀌었다면 다시 로딩해서 메모리에 올려놓으면 됩니다.

ps. 대부분의 개발자분들은 잘하시만, 가끔가다보면 요청함수에, 파일로딩 해서 정보를 분석하는 로직을 그냥 넣어놓는것도 심심찮게 보게 된답니다.~ -0-


아래는 파일 캐싱 예제 소스 입니다.
구현은 간단합니다. 그저 파일이 변경됬는지만 확인하고,
변경이 됐으면 => 다시 로딩해 메모리에 올리고,
변경이 안됐으면 => 기존에 저장해놓은 정보를 리턴하는거죠.~~
package test;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;

public class Caching {
    private long lastModified = 0L;
    private String value = null;
  
    // 키에 대한 value값을 가져온다.
    public String get(String key) throws IOException {
        URL url = this.getClass().getResource("/test/test.properties");
        File file = new File(url.getPath());
        // 파일이 수정되지 않았으면 기존에 로드된 정보를 리턴한다.
        if(file.lastModified()!=this.lastModified) {
            this.lastModified = file.lastModified();
            this.value = load(url,key);
        }
        return value;          
    }
    // test.properties 파일을 읽어 키의 value값을 읽어온다.
    public String load(URL url,String key) throws IOException {
        System.out.println("== 파일로부터 데이터 리로딩 ==");
        Properties p = new Properties();
        p.load(url.openStream());
        return p.getProperty(key);      
    }

    public static void main(String[] args) throws IOException {
        Caching c = new Caching();
        // 첫요청시에만 파일을 읽고, 나머지는 기존 정보를 가져오죠.~
        System.out.println("데이터로딩1 = "+c.get("message"));
        System.out.println("데이터로딩2 = "+c.get("message"));
        System.out.println("데이터로딩3 = "+c.get("message"));

    }

}

소스는 더럽지만 대충 개념은 나왔네용. ㅎㅎ
근데 한가지 주의 할 게 있습니다.
이런 설정정보를 File로 빼는것에 대한 주의점이.~
왜 몇년동안 바뀌지도 정보를 파일로 빼는지,
간단한 정보일 뿐인데 멋있다고(?) xml  로 설정정보를 만들어, 무거운 Parser를 돌리는 것인지. ㅡ.ㅡ;
이런거는 조심해야겠습니다.

무엇이든지 해당 프로젝트와 로직에 맞는 방법을 찾아 적용하는게 가장 중요하겠죠. :)
test.properties 내용.
message=ver_1.01

2012-09-14

Linux]CentOS 4.4에서 Java설치하기



CentOS 4.4에서 Java설치하기

1.
Sun의 Downloads페이지에서 플랫폼에 맞는 파일(self-extracting file)을 다운로드받는다.
2.
jpackage-utils과 rpm-build패키지를 설치한다.
3.
jpackage-nonfree repository에서 java-1.5.0-sun패키지를 다운로드받는다.(yumdownloader 이용)
4.
다운받은 파일들을 /usr/src/redhat/SOURCES/ 로 옮기고, 패키지를 빌드한다.
setarch i586 rpmbuild –rebuild java-1.5.0-sun*
(플랫폼은 알아서 변경해주는 센스)
5.
설치한다.
만약 libXp 라이브러리가 없다는 에러가 발생하면 xorg-x11-deprecated-libs 패키지를 설치해준다.
ODBC관련 에러가 뜨면 unixODBC-devel 패키지를 설치해준다.
끝.
SUN에서 제공하는 RPM을 이용해도 되지만, 그 경우 패키지 업그레이드시 사라질 수도 있다고 한다.
믿거나 말거나. 속는셈치고 믿어보고 이렇게 설치했다. java-1.5.0-sun-compat 라는 패키지도
있던데 JPackage Java compatibility package for Sun’s JDK 라고 주석이 붙어있는걸 보니
SUN의 패키지를 설치하고 이걸 설치해도 될 것 같기는 함.

2012-09-11

FreeBSD]FreeBSD에서 Java 설치하기


(2005년 01월 21일 오후 07:23) 읽은수: 2

-. FreeBSD에서 JAVA 설치하기

1. cvsup을 통한 ports tree Upgrade.

2.  http://www.freebsd.org/java 참 고만한다.

3. /usr/ports/java/jdk14

  <http://www.eyesbeyond.com/freebsddom/java>의 distinfo  

  <http://www.eyesbeyond.com/freebsddom/java>파일에 명시된 모든파일을 다운받는다.

  <http://www.eyesbeyond.com/freebsddom/java>

4. http://www.eyesbeyond.com/freebsddom/java 에서 Patch 다운로드.

5. 다운받은 모든파일을 /usr/ports/disfiles 넣는다.

6. mount -t linprocfs linprocfs /compat/linux/proc 실행.

7. /usr/ports/java/jdk14 에서 make install clean

8. JDK Path 환경설정.

9. 설치완료.


0000000000000000000000000000000000000000000000000000000

몇일 FreeBSD에서 자바와 스타오피스 설치에 관하여 삽질하다보니 이제서야 설치완료했습니다.

둘다 /compat/linux/proc 를 마운트해야만 설치가 되고 , linux_base 가 모듈로 올라와야 에러가 발생하지 않습니다.

위의 글대로 하면 에러없이 무난히 설치가 될겁니다.



참고문서 및 싸이트

-. http://www.freebsd.org 의 메일링리스트

-. http://debianusers.org 문서란의 오픈오피스.

-. http://jp.sun.com


환건님

2012-08-23

Java] Syntax error on token "enum", invalid Expression

참조 URL ::: http://sunkyu.tistory.com/71690


enum 이라는 변수를 자바에서 선언을 하면 아래와 같은 에러가 뜨는 경우가 있다.
   -- Syntax error on token "enum", invalid Expression

이는 JDK 1.5 이상을 쓰면 생기는 에러.

enum이라는 변수명 자체가 JDK 1.5이상부터는 예약어로 등록이 되어 있어 생기는 문제.

따라서, 이를 해결하려면 enum을 다른 변수명을 사용하면 해결이 된다.

2012-08-22

centos]CentOS 4.4에서 Java설치하기





CentOS 4.4에서 Java설치하기

1. Sun의 Downloads페이지에서 플랫폼에 맞는 파일(self-extracting file)을 다운로드받는다.
2. jpackage-utils과 rpm-build패키지를 설치한다.
3. jpackage-nonfree repository에서 java-1.5.0-sun패키지를 다운로드받는다.(yumdownloader 이용)
4. 다운받은 파일들을 /usr/src/redhat/SOURCES/ 로 옮기고, 패키지를 빌드한다.
   setarch i586 rpmbuild –rebuild java-1.5.0-sun*
   (플랫폼은 알아서 변경해주는 센스)
5. 설치한다.
   만약 libXp 라이브러리가 없다는 에러가 발생하면 xorg-x11-deprecated-libs 패키지를 설치해준다.
   ODBC관련 에러가 뜨면 unixODBC-devel 패키지를 설치해준다.

끝.

SUN에서 제공하는 RPM을 이용해도 되지만, 그 경우 패키지 업그레이드시 사라질 수도 있다고 한다.
믿거나 말거나. 속는셈치고 믿어보고 이렇게 설치했다. java-1.5.0-sun-compat 라는 패키지도
있던데 JPackage Java compatibility package for Sun’s JDK 라고 주석이 붙어있는걸 보니
SUN의 패키지를 설치하고 이걸 설치해도 될 것 같기는 함.

출처:
http://fedoranews.org/mediawiki/index.php/JPackage_Java_for_FC4
http://www.fedorafaq.org/#java

Java]스프링프레임워크 링크 모음



ibatis 에서 log4j 사용하기 :  http://v.daum.net/link/1728439

스케줄러를 이용한 메일 발송 : http://v.daum.net/link/2980934



SpringFramework + iBatis 연동시 주의점 및 참조 예제 :  http://lvsin.tistory.com/89

iBATIS에 있는 startBatch(), executeBatch() 메소드로 삽질후기 : http://mudchobo.tomeii.com/tt/category/아이바티스(iBATIS)



 
Spring+ibatis 를 이용한 미니 방명록 작성하기 : http://blog.daum.net/oraclejava/15192535

JAVA] 스프링에서 ajax 사용하기




스프링에서 Ajax 사용 하기 (Use JsonLib) by ultteky

출처 : http://beyondj2ee.blogspot.com/2009/08/ajax-use-jsonlib.html

몇년전만 해도 Ajax 사용은 몇몇 프로젝트에서만 사용했지만
최근에는 Ajax가 점점 필수 사항인 듯 합니다.
하지만 스프링에서 Ajax 지원에 대해서는 다소 미미한 편입니다.
제가 SimpleFormController에서 ajax를 적용한적이 있는데
좀 고생을 한기억이 있었습니다.그때 springsource에서
본 내용을 보면 아무리 스프링이 자유롭다지만 어느정도 J2EE에
대한 스펙을 생각하고 있고 그런 의미에서 Ajax는 아직 스펙이라
말하기가 어렵다고 합니다.
물론 그렇다고 스프링에서 Ajax를 전혀 지원하지 않는냐
그렇지는 않습니다. 서브 프로젝트 중애서 Spring WebFlow 2.0에서
"Spring JavaScript"를 번들을 제공 합니다.
개인적으로 스프링을 좋아하는 저로써는 "Spring Javascript"는
권하고 싶지 않습니다.
이유인즉 첫째 내부적으로 특정 라이브러리 (Dojo)를 사용합니다.
Dojo의 무거움은 경험하신분들은 아실겁니다.
(차라리 jQuery로 했으면..)
둘째로 DWR처럼 강한 결한 형태는 유지보수와 UI 변경을
복잡하게 합니다.
여러 이유가 있겠지만 크게 두가지네요
제 개인적인 Ajax 모델은 일단 클라이언트(Html)와
서버(Spring)가 느슨 결합이 되어야 하고 UI변경시
수정이 최소화 해야 한다고 생각합니다.
UI라이브러리는 기존에 훌륭한 (Extjs,jQuery,YahooUI..)중
플젝에 적합한 라이브러리를 사용하고 서버단은
AbstractView를 상속 받아서 Ajax 전용 뷰를 만들어서
서로간의 간섭이 없도록 구성해야 한다고
생각합니다.

여기서는 스프링에서 ajax를 처리 하기 위한 서버 설정을
설명 드리며 클라이언트 코드는 Json 패킷으로 대체
하는걸로 하겠습니다.
  • JsonLib 다운 받기
서버에서 클라이언트로 리턴할 오브젝트를 Json형태로 변환 하거나 또는 그반대로
Json 데이터를 해당 오브젝트로 변환하는 라이브러리가 필요 합니다. 그중에서
Json-lib를 사용 합니다 .
(해당 사이트에 접속하면 다양한 json 라이브러리를 다운 받을 수 있습니다. ).
여기서 최신 버전으로 다운로드를 받습니다.
다운로드 후 이클립스 프로젝트에
라이브러리를 추가 합니다.
웹 사이트 : http://json-lib.sourceforge.net/
다운로드 : http://sourceforge.net/projects/json-lib/files/
사용법은 해당 사이트를 참고 하시면 됩니다.
  • 스프링 전용 JsonView 다운 받기
아래의 사이트로 접속 후 화면 맨 하단을 보면 "json-lib-ext-spring" 가 있습니다.
거기서 최신 버전의 라이브러리를 다운로드 후 이클립스 프로젝트에
추가 합니다.
다운로드 : http://sourceforge.net/projects/json-lib/files/
  • JsonView 스프링 빈 설정
아래와 같이 JsonView를 빈으로 설정 합니다.
           <bean id="jsonView" class="net.sf.json.spring.web.servlet.view.JsonView"/>
          
ViewResolver 설정

JsonView를 인식 하기 위해서 "BeanNameViewResolver"를 설정 합니다.
WebApplication에서는 여러 Resolver가 존재 할수 있기 때문에
우선 순위를 "0"으로 설정해서 최우선으로 설정 합니다.
            <bean id="beanNameResolver"

           class="org.springframework.web.servlet.view.BeanNameViewResolver"

           p:order="0" />
          

  • Controller Code
아래의 코드를 보면 매우 평범합니다. 어떤한 라이브러리 참조도
없이 평소처럼 코딩 하면 됩니다. 모든 ajax 처리는 JsonView가
처리 함으로써 단지 JsonView가 선언된 스프링 빈 id를
ModelAndView의 "setViewName" 메서드에 선언만
하면 됩니다.
           

           public final ModelAndView handlerRequest(final HttpServletRequest request,

           final HttpServletResponse response) throws Exception {

           ModelAndView modelAndView = new ModelAndView();

           

           DummyMember dummyMember1 = new DummyMember();

           dummyMember1.setId("xxxxxxx");

           

           DummyMember dummyMember2 = new DummyMember();

           dummyMember2.setId("yyyyyy");

           

           List list = new ArrayList();

           list.add(dummyMember1);

           list.add(dummyMember2);

           

           Map resultMap = new HashMap();

           resultMap.put("result1", list);

           resultMap.put("result2", dummyMember1);

           

           modelAndView.addAllObjects(resultMap);

           modelAndView.setViewName("jsonView");

           return modelAndView;

           }
          

※ 샘플 도메인
           public class DummyMember {

           private String id;

           

           public String getId() {

           return id;

           }

           

           public void setId(String id) {

           this.id = id;

           }

           }
          
  • 결과 JSON 패킷
           {"result2":{"id":"xxxxxxx"},"result1":[{"id":"xxxxxxx"},{"id":"yyyyyy"}]}
          

customizing이 필요하면 JsonView 클래스를 상속 받은 후에 "renderMergedOutputModel"
메서드를 override 하시거 아니면 직접 다운로드 사이트에서
소스를 받은 후에 수정 후 적용 하시면 됩니다.