« Previous : 1 : 2 : 3 : 4 : 5 : ... 6 : Next »



참조 페이지 : http://blog.naver.com/minis24?Redirect=Log&logNo=80099448440


protected Object formBackingObject(HttpServletRequest request) throws Exception {
  logger.debug("### login page"); 
  return super.formBackingObject(request);
  
 }  

protected ModelAndView showForm(HttpServletRequest request, 
                                                     HttpServletResponse response, 
                                                     BindException errors)throws Exception{
  ModelAndView view = null;
/**
 * # BindException 객체는 커맨드 객체의 정보와 파라미터 값 검증 결과 정보를 담고 있는 객체.
 * # errors.getModel() 은 Map 타입의 객체를 리턴, Map 타입 객체는 <객체이름, 객체> 와 같이 저장
 * # 뷰에서 commandName을 통해서 커맨드 객체에 접근할 수 있음.
 * - view.addAllObject(errors.getModel()); 와 같이 사용 가능
 */
  String ipAddr = request.getRemoteAddr();
  String[] ipArr = ipAddr.split("\\.");
 /**
  * 접속자의 아이피를 체크하여 일부 허용.   
  */
  if(ipArr[0].equals("172") || 
     ipArr[0].equals("192") || 
     ipAddr.equals("211.221.223.111")){
   view = super.showForm(request, response, errors);
  }else{
   view = new ModelAndView("redirect:/error.do");
  }
  return view;
 } 



11 30, 2011 17:40 11 30, 2011 17:40

Trackback URL : http://develop.sunshiny.co.kr/trackback/677

Leave a comment


import java.util.Enumeration;
import java.util.Properties;

/**
* FileName : ShowSystemInfo.java
* Comment  : static Properties getProperties(), static String getProperty(String key) 
*          : 현재 시스템 정보를 알아낼 때 사용
*/
public class ShowSystemInfo {
    public static void main(String arr[]){

        /*
         * java.runtime.name     : 자바 실행환경(JRE)의 이름
         * java.runtime.version  : 자바 실행환경의 버전
         * java.vm.version       : 자바 VM의 버전
         * os.name               : 운영체제의 이름
         * java.class.path       : 환경변수 CLASSPATH에 지정된 경로명
         * user.language         : 사용 언어
         * sun.cpu.isalist       : CPU 종류 
        */        
        String attr = "java.runtime.version";
        System.out.println(attr + "=" + System.getProperty(attr));
        
        // 시스템의 추출 가능한 모든 속성 정보를 출력
        Properties prop = System.getProperties();
        Enumeration enums = prop.propertyNames();
        String key;
        while(enums.hasMoreElements()){
            key = (String)enums.nextElement();
            System.out.println(key + "=" + System.getProperty(key));
        }
    }
}


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
* FileName : HashMapTest.java
* Comment  : entrySet() 메소드를 이용하여 원소를 Set 객체로 변환
*            Set 인터페이스의 iterator() 메소드를 이용하여 Iterator 객체를 생성
*            Iterator 객체의 next()메소드가 리턴하는  Map.Entry 객체를 이용하여
*            key값과 value값을 참조
*/
public class HashMapTest {
    public static void main(String[] arr){
        Map sp = new HashMap(System.getProperties());
        Set entries = sp.entrySet();
        Iterator it = entries.iterator();
        Entry entry;
        while(it.hasNext()){
            entry = (Entry) it.next();
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
        
        Map sp2 = new HashMap();
        sp2.putAll(System.getProperties());
    }
}


# 출력 결과
java.runtime.version=1.6.0_17-b04
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\bin
java.vm.version=14.3-b01
java.vm.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
path.separator=;
java.vm.name=Java HotSpot(TM) Client VM
file.encoding.pkg=sun.io
user.country=KR
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine
java.runtime.version=1.6.0_17-b04
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\endorsed
os.arch=x86
java.io.tmpdir=C:\Users\SUNSHINY\AppData\Local\Temp\
line.separator=

java.vm.specification.vendor=Sun Microsystems Inc.
user.variant=
os.name=Windows 7
sun.jnu.encoding=MS949
java.library.path=D:\01.WORKS_PROGRAM\JAVA\JDK6.17\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:/01.WORKS_PROGRAM/JAVA/JDK6.17/bin/../jre/bin/client;D:/01.WORKS_PROGRAM/JAVA/JDK6.17/bin/../jre/bin;D:\oracle\product\11.2.0\dbhome_1\bin;C:\Program Files\Common Files\NetSarang;D:\oracle\product\10.2.0\client_1\bin;D:\01.WORKS_PROGRAM\JAVA\JDK6.17\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Program Files\ESTsoft\ALZip;D:\01.WORKS_PROGRAM\APM_Setup\Server\Apache\bin;D:\01.WORKS_PROGRAM\APM_Setup\Server\MySQL5\bin;D:\01.WORKS_PROGRAM\APM_Setup\Server\PHP5;C:\Program Files\TortoiseSVN\bin;C:\Program Files\QuickTime\QTSystem\;C:\Program Files\ESTsoft\ALZip;D:\01.WORKS_PROGRAM\apache-tomcat-5.5.26/common/lib;D:\oracle\product\11.2.0\dbhome_1\BIN;D:\oracle\SqlQuery\test01;C:\Program Files\ESTsoft\ALSee
java.specification.name=Java Platform API Specification
java.class.version=50.0
sun.management.compiler=HotSpot Client Compiler
os.version=6.1
user.home=C:\Users\SUNSHINY
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=MS949
java.specification.version=1.6
user.name=SUNSHINY
java.class.path=D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine\bin;D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine\lib\classes12.jar;D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine\lib\commons-lang-2.4.jar;D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine\lib\commons-logging.jar;D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine\lib\commons-net-2.0.jar;D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine\lib\mail.jar;D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine\lib\servlet-api.jar;D:\10.WORKS\01.JAVA\01.MYSPACE\Sunshiny_Engine\lib\sinetfactory.jar;D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\rt.jar
java.vm.specification.version=1.0
sun.arch.data.model=32
java.home=D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre
java.specification.vendor=Sun Microsystems Inc.
user.language=ko
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode, sharing
java.version=1.6.0_17
java.ext.dirs=D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.boot.class.path=D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\resources.jar;D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\rt.jar;D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\sunrsasign.jar;D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\jsse.jar;D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\jce.jar;D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\lib\charsets.jar;D:\01.WORKS_PROGRAM\JAVA\JDK6.17\jre\classes
java.vendor=Sun Microsystems Inc.
file.separator=\
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86

08 7, 2011 10:46 08 7, 2011 10:46

Trackback URL : http://develop.sunshiny.co.kr/trackback/653

Leave a comment



# 차트 관련 예제및 소스 : http://www.java2s.com/Code/Java/CatalogJava.htm
참고사이트 : www.jfree.org
샘플예제 Applet 실행 : http://mimul.com/examples/jfree/jfreechart-1.0.10-demo.jnlp

# 차트 한글 깨짐 현상시 확인

# BarChartBean.java

package util.chart;

import org.jfree.chart.*;
import org.jfree.data.category.*;
import org.jfree.chart.renderer.category.*;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.*;
import java.awt.*;

/**
 * FileName : BarChartBean.java
 * Comment  : 
 * @version : 1.0
 * @author  : sunshiny
 * @date    : 2011. 1. 5.
 */
public class BarChartBean {

	public static void main(String arg[]){
		BarChartBean bcb = new BarChartBean();

		JFreeChart chart = bcb.getBarChart();
		ChartFrame frame1 = new ChartFrame("Bar Chart",chart);
		frame1.setSize(700,250);  
		frame1.setVisible(true);
		frame1.setLocation(100, 200);


	}

	public JFreeChart getBarChart() {
		String titleStr = "차트 타이틀";

		// row keys...
		final String series1 = "First";
		//        final String series2 = "Second";
		//        final String series3 = "Third";

		// column keys...
		final String category1 = "서울";
		final String category2 = "부산";
		final String category3 = "대구";
		final String category4 = "인천";
		final String category5 = "광주";
		final String category6 = "대전";
		final String category7 = "울산";
		final String category8 = "경기";
		final String category9 = "강원";
		final String category10 = "충북";
		final String category11 = "충남";
		final String category12 = "전북";
		final String category13 = "전남";
		final String category14 = "경북";
		final String category15 = "경남";
		final String category16 = "제주";

		// create the dataset...
		final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

		dataset.addValue(1.0, series1, category1);
		dataset.addValue(5.0, series1, category2);
		dataset.addValue(4.0, series1, category3);
		dataset.addValue(27.0, series1, category4);
		dataset.addValue(30.0, series1, category5);
		dataset.addValue(10.0, series1, category6);
		dataset.addValue(11.0, series1, category7);
		dataset.addValue(7.0, series1, category8);
		dataset.addValue(2.0, series1, category9);
		dataset.addValue(16.0, series1, category10);
		dataset.addValue(19.0, series1, category11);
		dataset.addValue(22.0, series1, category12);
		dataset.addValue(23.0, series1, category13);
		dataset.addValue(27.0, series1, category14);
		dataset.addValue(31.0, series1, category15);
		dataset.addValue(12.0, series1, category16);

		JFreeChart chart = ChartFactory.createBarChart(titleStr, "", ""
				, dataset, PlotOrientation.VERTICAL, true,true, false);

		/**
		 * Chart 폰트 설정, 클래스 파일 위치 : package org.jfree.chart.StandardChartTheme.java
		 * 		
		 */
		chart.getTitle().setFont(new Font("sansserif", Font.BOLD, 20));
		chart.getLegend().setItemFont(new Font("sansserif", Font.BOLD, 15));
		chart.getCategoryPlot().setNoDataMessageFont(new Font("sansserif", Font.BOLD, 15));
		chart.getPlot().setNoDataMessageFont(new Font("sansserif", Font.BOLD, 15));

		System.out.println(chart.getPlot().getNoDataMessageFont().getName());

		chart.setBackgroundPaint(Color.WHITE);
		chart.getTitle().setPaint(Color.orange);

		StandardCategoryItemLabelGenerator stdCateGen 
		= new StandardCategoryItemLabelGenerator();
		BarRenderer barRender = new BarRenderer();

		CategoryPlot plot = chart.getCategoryPlot();

		barRender.setItemLabelGenerator(stdCateGen); // 그래프별 값 출력
		plot.setRenderer(barRender);                 // 그래프별 값 출력

		/*		plot.setDomainAxis(new CategoryAxis("지역"));
		plot.setRangeAxis(new NumberAxis("수치"));
		plot.setOrientation(PlotOrientation.VERTICAL);
		 */

		//		plot.setDomainGridlinesVisible(true);
		plot.setRangeGridlinesVisible(true); // 가로 그리드 라인 보이기

		plot.setRangeGridlinePaint(Color.GRAY); 
		plot.setBackgroundPaint(Color.WHITE);

		// set the range axis to display integers only...
		final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
		rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
		rangeAxis.setUpperMargin(0.40);

		// disable bar outlines...
		final CategoryItemRenderer renderer = plot.getRenderer();
		renderer.setSeriesItemLabelsVisible(0, Boolean.TRUE);

		final CategoryAxis domainAxis = plot.getDomainAxis();
		// x축 문자열 회전(STANDARD, UP_45, UP_90,DOWN_45,DOWN_90)
		domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); 
		domainAxis.setLowerMargin(0.01d);
		domainAxis.setUpperMargin(0.01d);
		domainAxis.setCategoryMargin(0.30);

		return chart;
	}
}
# chart.jsp
<%@ page language="java" contentType="image/png; charset=UTF-8"	pageEncoding="UTF-8" %>
<%@ page import="org.jfree.chart.*" %>
<%@ page import="util.chart.*"%>
<%@ page import="java.util.*"%>
<%@ page import="org.jfree.data.category.*"%>
<%@ page import="org.jfree.ui.RefineryUtilities"%>
<%@ page import="org.jfree.chart.plot.PlotOrientation"%>


<%
	ServletOutputStream sos = response.getOutputStream();
	BarChartBean bcb = new BarChartBean();
	JFreeChart chart = bcb.getBarChart();
	ChartUtilities.writeChartAsPNG(sos, chart, 700, 250);
	

/*
	심각: Servlet.service() for servlet jsp threw exception
	java.lang.IllegalStateException: getOutputStream() has already been called for this response
	# Exception
	jsp에서 outputStream을 사용할때 servlet에서 생성된 writer 객체와 중복이 되어서 발생하는 에러.
	이때 servlet에서 생성된 writer 객체를 clear 시키고 jsp에서 다시 생성해서 사용하면 되는것.
	
*/
	out.clear();
	out = pageContext.pushBody();	

%>
# Result Chart Image 사용자 삽입 이미지
01 5, 2011 10:20 01 5, 2011 10:20

Trackback URL : http://develop.sunshiny.co.kr/trackback/579

Leave a comment


1. DefaultPieDataset ds = new DefaultPieDataset();
   ds.setValue("BarChart, PieChart 동일 한글 깨짐.", new Double(40.0));
   ds.setValue("aaaa", new Double(40.0));
 
  JFreeChart chart = ChartFactory.createPieChart("득점현황", ds, true, true, false);
 
  System.out.println(chart.getTitle().getFont().getName());

  // ==> 폰트를 확인한다.
  ServletOutputStream out = res.getOutputStream();
 
  ChartUtilities.writeChartAsPNG(out, chart, 400, 400);    
  out.flush();
  out.close();


2. 컴퓨터에 없는 폰트일 시 한글깨짐

   1) jfreechart-1.0.13.jar파일의 압축을 풀고
   2) E:\jfreechart-1.0.13\org\jfree\chart\StandardChartTheme.class 파일을 역 컴파일
   3) StandardChartTheme메소드의 font부분을 모두 sansserif 로 바꾼다.
   4) 다시 컴파일, E:\jfreechart-1.0.13 위치에서
   5)  jar cvf jfreechart-1.0.13.jar org 로 다시 jar파일 생성
   6) was의 사용 lib폴더로 jar 파일을 교체하면 완료

3. 아래 첨부한 StandardChartThem.java 파일을 프로젝트에 적용하면 우선 적용되어짐.
package org.jfree.chart; 와 같이 패키지의 경로를 동일하게 생성.
프로젝트의 lib 폴더에는 jfreechart-1.0.13.jar 파일이 존재해야함.

- 버전 -
jfreechart 라이브러리 : jfreechart-1.0.13
java 컴파일 버전 : 1.5

 
    public StandardChartTheme(String name)
    {
        gridBandPaint = SymbolAxis.DEFAULT_GRID_BAND_PAINT;
        gridBandAlternatePaint = SymbolAxis.DEFAULT_GRID_BAND_ALTERNATE_PAINT;
        if(name == null)
        {
            throw new IllegalArgumentException("Null 'name' argument.");
        } else
        {
            this.name = name;
            extraLargeFont = new Font("돋음", Font.BOLD, 20);
            largeFont = new Font("돋음", Font.BOLD, 14);
            regularFont = new Font("돋음", Font.BOLD, 12);
            smallFont = new Font("sansserif", 0, 10);



 


01 4, 2011 13:38 01 4, 2011 13:38

Trackback URL : http://develop.sunshiny.co.kr/trackback/578

Leave a comment


import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
#java에서 지원하는 ZipEntry, zipOutputStream 을 사용 하면 경로 내의 디렉토리명, 파일명에서 한글을 사용할경우 깨지는 현상이 발생.

jazzlib 라이브러리를 사용하면 한글깨짐 문제가 해결됩니다.
import net.sf.jazzlib.ZipEntry;
import net.sf.jazzlib.ZipOutputStream;

jazzlib 는 http://jazzlib.sourceforge.net 여기에서 다운로드 할수있습니다.
또는 아래에서 다운 하세요.

jar 파일 :
 
 

 

아래 내용 출처 :
http://cafe.naver.com/itmecca.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1737

###################### ZipUtils.java ######################

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import net.sf.jazzlib.ZipEntry;
import net.sf.jazzlib.ZipInputStream;
import net.sf.jazzlib.ZipOutputStream;

/**
* FileName : ZipUtils.java
* Comment  : # 인자값 내용
   # createZipFile(압축할디렉토리위치, 저장될zip파일의 경로를 포함한파일명, 디렉토리 없을시 생성여부)
*/
public class ZipUtils {
    private static final byte[] buf = new byte[1024];
    
    /**
    * Comment  : 생성될 ZIP파일의 경로에 디렉토리가 없을경우 에러  발생
    */
    public static void createZipFile(String targetPath, String zipPath)throws Exception{
        createZipFile(targetPath, zipPath, false);
    }
    
    /**
    * Comment  : zip 파일을 생성.
    */
    public static void createZipFile(String targetPath, String zipPath, boolean isDirCre)throws Exception{
        File fTargetPath = new File(targetPath);
        File[] files = null;
        
        if(fTargetPath.isDirectory()){
            files = fTargetPath.listFiles();
        }else{
            files = new File[1];
            files[0] = fTargetPath;
        }
        
        File path = new File(zipPath);
        File dir = null;
        dir = new File(path.getParent());
        if(isDirCre){
            dir.mkdirs();
        }
        
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(path));
        
        // zip 파일 압축
        makeZipFile(files, zipOut, "");
        
        // stream을 닫음으로서 zip 파일 생성
        zipOut.close();
        
    }
    
    
    /**
    * Comment  : # 일부 파일들을 배열로 설정하여 zip 파일 생성
    * ex) String[] arrZip = new String[]{"C:\\aaa.txt", "C:\\bbb.txt", "C:\\ccc.txt"}
    *     ZipUtils.createZipFile(arrZip, "C:\\test.zip");
    */
    public static void createZipFile(String[] targetFiles, String zipPath)throws Exception{
        createZipFile(targetFiles, zipPath, false);
    }
    
    /**
    * Comment  : # 일부 파일들을 배열로 설정하여 zip 파일 생성 (디렉토리 생성여부 선택)
    */
    public static void createZipFile(String[] targetFiles, String zipPath, boolean isDirCre)throws Exception{
        File[] files = new File[targetFiles.length];
        for(int i = 0; i < files.length; i++){
            files[i] = new File(targetFiles[i]);
        }
        
        File path = new File(zipPath);
        File dir = null;
        dir = new File(path.getParent());
        if(isDirCre){
            // 디렉토리가 없을경우 생성
            dir.mkdirs();
        }
        
        // zip 파일의 outputStream
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(path));
        
        // zip 파일 압축
        makeZipFile(files, zipOut, "");
        
        // stream을 닫음으로서 zip 파일 생성
        zipOut.close();
    }
    
    
    /**
    * Comment  : zip 파일의 압축을 해제
    */
    public static void unZipFile(String targetZip, String completeDir)throws Exception{
        unZipFile(targetZip, completeDir, false);
    }    
    
    /**
    * Comment  :
    */
    public static void unZipFile(String targetZip, String completeDir, boolean isDirCre)throws Exception{
        ZipInputStream in = null;
        
        try{
            File fCompleteDir = null;
            fCompleteDir = new File(completeDir);
            if(isDirCre){
                // 디렉토리가 없을경우 생성
                fCompleteDir.mkdirs();
            }
            
            // zip 파일의 input stream을 읽어들임
            in = new ZipInputStream(new FileInputStream(targetZip));
            ZipEntry entry = null;
            
            // input stream내의 압축된 파일들을 하나씩 읽어들임.
            while((entry = in.getNextEntry()) != null){
                System.out.println("entry : " + entry);
                // zip 파일의 구조와 동일하게 가기위해 로컬의 디렉토리 구조를 만듬.
                String entryName = entry.getName();
                if(entry.getName().lastIndexOf("/") > 0){
                    String mkDirNm = entryName.substring(0, entryName.lastIndexOf("/"));
                    System.out.println("mkDirNm : " + mkDirNm);
                    new File(completeDir + mkDirNm).mkdirs();
                }
                // 해제할 각각 파일의 output stream을 생성
                FileOutputStream out = new FileOutputStream(completeDir + entry.getName());
                
                int bytes_read;
                while((bytes_read = in.read(buf)) != -1){
                    System.out.println("bytes_read : " + bytes_read);
                    out.write(buf, 0, bytes_read);
                }
                // 하나의 파일이 압축해제됨
                out.close();
            }
        }catch(Exception e){
            throw new Exception(e);
        }finally{
            // 모든 파일의 압축이 해제되면 input stream을 닫는다.
            in.close();
        }
    }
    
    // byte 배열을 받아서 압축된 byte배열을 리턴
    public static byte[] compressToZip(byte[] src)throws Exception{
        byte[] retSrc = null;
        ByteArrayOutputStream baos = null;
        
        try{
            // zip 파일의 output Stream
            ByteArrayInputStream bais = new ByteArrayInputStream(src);
            baos = new ByteArrayOutputStream();
            ZipOutputStream zos = new ZipOutputStream(baos) ;
            
            zos.putNextEntry(new ZipEntry("temp.tmp"));
            
            int bytes_read = 0;
            // 전달받은 src를 압축하여 파일에 씀
            while((bytes_read = bais.read(buf)) != -1){
                zos.write(buf, 0, bytes_read);
            }
            bais.close();
            zos.close();
            
            // 스트림을 닫은후 byte배열을 얻어옴
            retSrc = baos.toByteArray();
        }catch(Exception e){
            throw new Exception(e);
        }finally{
            baos.close();
        }
        
        return retSrc;
    }
    
    // 압축된 byte 배열을 받아서 zipPath위치에 zip 파일을 생성한다.
    private static void makeZipFile(byte[] src, String zipPath)throws Exception{
        FileOutputStream fos = null;
        ByteArrayInputStream bais = null;
        
        try{
            fos = new FileOutputStream(zipPath);
            bais = new ByteArrayInputStream(src);
            
            int bytes_read = 0;
            while((bytes_read = bais.read(buf)) != -1){
                fos.write(buf, 0, bytes_read);
            }
            
        }catch(Exception e){
            throw new Exception(e);
        }finally{
            fos.close();
            bais.close();
        }
    }
    
    // 압축된 byte 배열의 압축을 해제하여 byte배열로 리턴
    public static byte[] unZip(byte[] src)throws Exception{
        
        byte[] retSrc = null;
        ByteArrayOutputStream baos = null;
        ZipInputStream zis = null;
        int bytes_read = 0;
        
        try{
            zis = new ZipInputStream(new ByteArrayInputStream(src));
            baos = new ByteArrayOutputStream();
            
            zis.getNextEntry(); // entry는 하나밖에 없음을 보장
            while((bytes_read = zis.read(buf)) != -1){
                baos.write(buf, 0, bytes_read);
            }
            
            retSrc = baos.toByteArray();
        }catch(Exception e){
            throw new Exception(e);
        }finally{
            baos.close();
            zis.close();
        }
        
        return retSrc;
    }
    
    // 문자열을 압축하여 byte배열로 리턴(UTF-8)
    public static byte[] compressToZip(String src)throws Exception{
        return compressToZip(src.getBytes("UTF-8"));
    }
    
    // byte배열을 압축하여 zip 파일로 생성
    public static void srcToZipFile(byte[] src, String zipPath)throws Exception{
        byte[] retSrc = null;
        // 압축
        retSrc = compressToZip(src);
        
        // 파일로 만듬
        makeZipFile(retSrc, zipPath);
    }
    
    // byte 배열을 압축하여 zip 파일로 생성
    public static void srcToZipFile(String src, String zipPath)throws Exception{
        byte[] retSrc = null;
        
        // 압축
        retSrc = compressToZip(src.getBytes("UTF-8"));
        
        // 파일로 만듬
        makeZipFile(retSrc, zipPath);
    }
    
    // 압축된 zip파일을 해제후  byte배열로 리턴
    public static byte[] zipFileToSrc(String zipPath)throws Exception{
        byte[] retSrc = null;
        
        return retSrc;
    }
    
    public static void makeZipFile(File[] files, ZipOutputStream zipOut, String targetDir) throws Exception{
        for(int i = 0; i < files.length; i++){
            File compPath = new File(files[i].getPath());

            if(compPath.isDirectory()){
                File[] subFiles = compPath.listFiles();
                makeZipFile(subFiles, zipOut, targetDir+compPath.getName()+"/");
                continue;
            }

            FileInputStream in = new FileInputStream(compPath);
            zipOut.putNextEntry(new ZipEntry(targetDir+"/"+files[i].getName()));

            int data;

            while((data = in.read(buf)) > 0){
                zipOut.write(buf, 0, data);    
            }
            zipOut.closeEntry();
            in.close();
        }
    }
    
    public static void main(String[] arr) throws Exception{
        // 압축하기
        try {
            ZipUtils.createZipFile("D:\\02.TEMP\\backup2", "D:\\02.TEMP\\AAAA\\backup2_한글지원2.zip", true);
            //ZipUtils.unZipFile("D:\\02.TEMP\\backup2_aa.zip", "D:\\02.TEMP\\mkDirNm\\", true);
            
        /*
            // 문자열의 압축과 해제
            String str = "테스트333 데이터입니다.";
            byte[] src = str.getBytes("UTF-8");
            src = ZipUtils.compressToZip(src);
            byte[] retSrc = ZipUtils.unZip(src);
            System.out.println(new String(retSrc, "UTF-8"));
        */
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
04 14, 2010 18:29 04 14, 2010 18:29

Trackback URL : http://develop.sunshiny.co.kr/trackback/427

  1. 파일 압축

    Tracked from Like RadioHead 11 8, 2010 19:07 Delete

    원문 출처 : http://develop.sunshiny.co.kr/trackback/427 Java - Zip 파일 형식 압축및 압축풀기(한글깨짐방지 - jazzlib 사용) Posted 2010/04/14 18:29, Filed under: Language/JAVA import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; #java에서 지원하는 ZipEntry, zipOutputS..

  1. # 쎄룽 2010年 11月 08日 19時 02分 Delete Reply

    잘보았습니다~ 퍼가두될까용?? ^^

    1. Re: # sunshiny 2010年 11月 12日 23時 46分 Delete

      에구.
      댓글 남기신걸 이제야 봤네요^^
      네~ 당연히 괜찮죠.
      저도 다른분이 정리해놓은거 가져온거 거든요.^^;
      글 남겨주셔서 고맙습니다^^

  2. # 자근앙마 2010年 12月 21日 18時 00分 Delete Reply

    감사합니다

    1. Re: # sunshiny 2010年 12月 21日 20時 37分 Delete

      네~
      글 남겨 주셔서 고맙습니다^^

  3. # 2011年 05月 31日 17時 26分 Delete Reply

    좋은 자료 감사합니다
    담아갑니다^^

    1. Re: # sunshiny 2011年 06月 02日 09時 11分 Delete

      네 고맙습니다^^

  4. # 열혈강군 2011年 07月 20日 13時 25分 Delete Reply

    좋은글이라 담아갑니다.~ ^^ 출처도 남겼습니다. 감사해요.

    1. Re: # sunshiny 2011年 07月 21日 11時 02分 Delete

      네~
      답글 고맙습니다^^

Leave a comment

Java - compile및 jar 파일 생성

Posted 04 14, 2010 17:00, Filed under: Language/JAVA

출처 : http://blog.daum.net/aswip/4508076


본 예제는 how.to 패키지내에 HelloJar 클래스를 갖는 jar파일을 생성하고
생성된 jar파일을 사용하여 HelloJar 클래스에 접근하는 방법에 대해서
설명하고 있습니다.

Step 1. HelloJar.java 소스파일 생성

package how.to;

public class HelloJar
{
public HelloJar() { }

public void PrintMsg(String msg)
{
System.out.println(msg);
}
}

Step 2. 컴파일

[root@linux ]# javac -d . *.java

위와 같이 컴파일 하면, 다음과 같이 how 디렉토리와
how 디렉토리 밑에 to 디렉토리가 자동으로 생성이되며
how/to 디렉토리 밑에는 "HelloJar.class"파일이
생성이 되어집니다.

Step 3. jar 생성

[root@linux ]# jar cvf hello.jar how
added manifest
added manifest
adding: how/(in = 0) (out= 0)(stored 0%)
adding: how/to/(in = 0) (out= 0)(stored 0%)
adding: how/to/HelloJar.class(in = 389) (out= 276)(deflated 29%)
------------------------------------------------------------------

jar 파일 생성후, 현재 디렉토리의 파일 목록을 살펴보면 다음과 같습니다.

[root@linux ]# ll
drwxr-xr-x 3 root root 4096 2008-06-04 11:29 ./
drwxr-xr-x 3 root root 4096 2008-06-04 11:28 ../
-rw-r--r-- 1 root root 926 2008-06-04 11:29 hello.jar
-rw-r--r-- 1 root root 135 2008-06-04 11:29 HelloJar.java
drwxr-xr-x 3 root root 4096 2008-06-04 11:29 how/

Step 4. Test.java 생성

import! how.to.*;
import! java.io.*;

public class Test
{
public Test() { }

public static void main(String[] args) throws IOException
{
how.to.HelloJar myJar = new how.to.HelloJar();
myJar.PrintMsg("Hello Jar");
}
}

Step 5. Test.java 컴파일

[root@linux ]# javac Test.java

Step 6. 실행

[root@linux ]# java Test
04 14, 2010 17:00 04 14, 2010 17:00

Trackback URL : http://develop.sunshiny.co.kr/trackback/428

Leave a comment

Java - BigDecimal의 필요성

Posted 10 31, 2009 12:06, Filed under: Language/JAVA

출처 : http://www.sdnkorea.com/blog/425


BigDecimal의 필요성
Java SE/중급 2007/08/20 17:23
저자 JZ Ventures사의 사장 겸 대표 컨설턴트 John Zukowski

이 아티클의 영문 원본은 http://java.sun.com/mailers/techtips/corejava/2007/tt0707.html#2
에서 볼수 있습니다.

부동 소수점 숫자 사용은 재미있는 작업이 될 수 있다. 일반적으로 양을 다룰 때 정수가 아니라면 double 형식을 사용하려고 한다. 정수인 경우 일반적으로 int 형식이면 충분하다. 값의 크기에 따라 float나 long도 효과적일 수 있다. 그러나 화폐를 다룰 경우, 이 형식들은 최악의 선택이 되는데, 정확한 값을 제공하지 않을 때도 있기 때문이다. 단지 이진수 형식에 저장 가능한 값만 제공한다. 다음은 합계를 계산하거나 할인을 반영하거나 부가가치세를 추가할 때 double을 사용하면 겪게 되는 문제를 보여주는 간단한 예제이다.

Calc 프로그램은 금액 $100.05로 시작한 다음 사용자에게 10% 할인을 적용하고 다시 5% 부가가치세를 추가한다. 부가가치세율은 다를 수 있지만, 이 예제에서는 5%를 사용한다. 그 결과를 보자면, 이 클래스는 NumberFormat 클래스를 사용하여 결과의 형식을 지정하는데, 이 결과는 통화로 표시되어야 한다.

import java.text.NumberFormat;

public class Calc {
 public static void main(String args[]) {
   double amount = 100.05;
   double discount = amount * 0.10;
   double total = amount - discount;
   double tax = total * 0.05;
   double taxedTotal = tax + total;
   NumberFormat money = NumberFormat.getCurrencyInstance();
   System.out.println("Subtotal : "+ money.format(amount));
   System.out.println("Discount : " + money.format(discount));
   System.out.println("Total : " + money.format(total));
   System.out.println("Tax : " + money.format(tax));
   System.out.println("Tax+Total: " + money.format(taxedTotal));
 }
}


모든 내부 계산에 double 형식을 사용하면 결과는 다음과 같다.

Subtotal : $100.05
Discount : $10.00
Total : $90.04
Tax : $4.50
Tax+Total: $94.55


가운데의 Total이 기대하는 값일 수 있으나, 맨 끝의 Tax+Total 값에서 끝난다. 할인은 $10.01이 되어야 $90.04의 금액을 얻는다. 해당 부가가치세를 추가하고 나면 최종 합계가 1센트 늘어나 있다. 세무 당국은 이 점을 이해하지 못할 것이다. 반올림 오류가 문제이다. 이 반올림 오류를 바탕으로 계산한 것이다. 다음은 형식이 지정되지 않은 값이다.

Subtotal : 100.05
Discount : 10.005
Total : 90.045
Tax : 4.50225
Tax+Total: 94.54725


형식이 지정되지 않은 값을 살펴보자면, 맨 처음 떠오르는 질문은 왜 90.045가 90.05 대신 90.04가 되었는가이다. (즉, 왜 10.005가 10.00으로 반올림되는가?) 이는 소위 RoundingMode에 의해 제어되는데, 이는 Java SE 1.6에 도입된 계수법으로서 이전 릴리스에서는 그러한 제어가 없었다. 통화를 위해 도입된 NumberFormat은 기본 반올림 모드가 HALF_EVEN이다. 즉, 남은 값이 등거리(equidistant)이면 짝수 쪽으로 라운딩된다. 이 계수법에 대한 Java 플랫폼 설명서에 따르면, 통계상 이 방법은 여러 차례의 계산을 거친 후 누적 오류를 최소화한다.

RoundingMode 계수법에서 사용 가능한 또 하나의 모드는 다음과 같다.

CEILING 항상 양수 무한대로 라운딩한다.

DOWN 항상 0으로 라운딩한다.

FLOOR 항상 음수로 라운딩한다.

UP 항상 0으로부터 벗어나서 라운딩한다.

HALF_DOWN 항상 가장 가까운 인접 수로 라운딩한다. 단, 두 인접 수 모두 등거리라면 버림한다.

HALF_UP 항상 가장 가까운 인접 수로 라운딩한다. 단, 두 인접 수가 모두 등거리라면 올림한다.

UNNECESSARY 라운딩할 필요 없이 정확한 결과를 선언한다.

이 문제의 해결 방법을 알아보기에 앞서, 약간 다른 결과를 살펴 보도록 한다. 70센트로 시작하고 할인이 없는 경우이다.

Total : $0.70
Tax : $0.03
Tax+Total: $0.74


70센트 거래의 경우, 단순히 라운딩 문제가 아니다. 형식 지정 없이 값을 보자면 다음과 같다.

Total : 0.7
Tax : 0.034999999999999996
Tax+Total: 0.735


부가가치세인 0.035는 double로 저장할 수 없다. 즉, 이진 형식에서 double로 표현할 수 없다.

BigDecimal 클래스는 float 및 double을 사용하는 부동 소수점 연산에서 생기는 문제 몇 가지에서 도움이 된다. BigDecimal 클래스는 사실상 무제한적인 정밀도로 부동 소수점 숫자를 저장한다. 이 데이터를 다루기 위해 add(value), subtract(value), multiply(value) 또는 divide(value, scale, roundingMode) 메소드를 호출한다.

BigDecimal 값을 출력하려면 setScale(scale, roundingMode)로 단위 및 라운딩 모드를 설정하거나 toString() 또는 toPlainString() 메소드를 사용한다. toString() 메소드는 과학적 표기를 사용할 수 있지만, toPlainString()은 그렇지 않다.

BigDecimal을 사용하도록 프로그램을 변환하기 전에 그 생성 방법을 확인하는 것이 중요하다. 이 클래스에는 16개의 구성자가 있다. BigDecimal의 값을 double과 같은 primitive 객체에 저장할 필요는 없으므로 String으로부터 BigDecimal 객체를 만드는 것이 가장 좋다. 이 오류를 보여 주기 위해 간단한 예제를 소개한다.

 double dd = .35;
 BigDecimal d = new BigDecimal(dd);
 System.out.println(".35 = " + d);


예상했던 출력이 아닐 것이다.

 .35 = 0.34999999999999997779553950749686919152736663818359375


그보다는 여기서 보여주는 것처럼 string "35"를 직접 사용하여 BigDecimal을 만들어야 한다.

 BigDecimal d = new BigDecimal(".35");


그 결과 다음과 같은 출력을 얻는다.

 .35 = 0.35   

값을 생성한 후 숫자의 단위와 라운딩 모드를 setScale()을 사용하여 명시적으로 설정할 수 있다. Java 플랫폼의 다른 Number 하위 클래스와 마찬가지로, BigDecimal은 변경할 수 없다. 따라서 setScale()을 호출할 경우 반환 값을 "저장"해야 한다.

 d = d.setScale(2, RoundingMode.HALF_UP);


BigDecimal을 사용하여 수정된 프로그램은 다음과 같다. 계산마다 또 다른 BigDecimal을 사용하고 그 단위를 설정해야 달러 및 센트에 대한 수학 연산이 수행된다. 분할 페니를 사용하려는 경우 단위에서 3개의 소수 자리로 갈 수도 있지만, 꼭 그럴 필요는 없다.

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Calc2 {
 public static void main(String args[]) {
   BigDecimal amount = new BigDecimal("100.05");
   BigDecimal discountPercent = new BigDecimal("0.10");
   BigDecimal discount = amount.multiply(discountPercent);
   discount = discount.setScale(2, RoundingMode.HALF_UP);
   BigDecimal total = amount.subtract(discount);
   total = total.setScale(2, RoundingMode.HALF_UP);
   BigDecimal taxPercent = new BigDecimal("0.05");
   BigDecimal tax = total.multiply(taxPercent);
   tax = tax.setScale(2, RoundingMode.HALF_UP);
   BigDecimal taxedTotal = total.add(tax);
   taxedTotal = taxedTotal.setScale(2, RoundingMode.HALF_UP);
   System.out.println("Subtotal : " + amount);
   System.out.println("Discount : " + discount);
   System.out.println("Total : " + total);
   System.out.println("Tax : " + tax);
   System.out.println("Tax+Total: " + taxedTotal);
 }
}


여기서는 NumberFormat이 사용되지 않았다. 하지만 통화 기호를 보여주고 싶다면 다시 추가할 수 있다.

이제 프로그램을 실행하면 훨씬 나은 계산이 수행된다.

Subtotal : 100.05
Discount : 10.01
Total : 90.04
Tax : 4.50
Tax+Total: 94.54


BigDecimal은 이 예제에서 보여준 것보다 더 다양한 기능을 제공한다. 정수를 사용하는데 무한대의 정밀도가 필요한 경우를 위한 BigInteger 클래스도 있다. 두 클래스에 대한 Java 플랫폼 설명서에서는 단위, MathContext 클래스, 정렬 및 동등(equality)에 대한 정보를 비롯하여 이 클래스와 관련된 자세한 내용을 확인할 수 있다.

10 31, 2009 12:06 10 31, 2009 12:06

Trackback URL : http://develop.sunshiny.co.kr/trackback/324

Leave a comment


package sunshiny.util;

import java.util.Date;
import java.util.GregorianCalendar;
import java.text.*;

public class Utils {

 /**
  * Comment  : 1. 입력받은 값 만큼의 날자를 더하기, 빼기 연산을 처리한다.
  *            2. plus : 입력받은 수 만큼 더한 날자를 반환.
  *            3. minus : 입력받은 수 만큼 뺀 날자를 반환.
  * @version : 1.0
  * @tags    : @param value
  * @tags    : @return
  * @date    : 2009. 8. 17.
  */
 public static String setOperationDate(String mode, int value){
  SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
  GregorianCalendar cal = new GregorianCalendar();

  if(mode.equals("plus")){
   cal.add(cal.DATE,value); //현재날짜에 value 값을 더한다.
  }else if(mode.equals("minus")){
   cal.add(cal.DATE,-value); //현재날짜에 value 값을 뺀다.
  }

  Date date = cal.getTime(); //연산된 날자를 생성.
  String setDate = fmt.format(date);

  return setDate;
 }
}


-----------------------------------------------------------------------------------------

   

public void gregorianCalendar(){
     // get the supported ids for GMT-08:00 (Pacific Standard Time)
     String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
     // if no ids were returned, something is wrong. get out.
     if (ids.length == 0)
         System.exit(0);

      // begin output
     System.out.println("Current Time");

     // create a Pacific Standard Time time zone
     SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);

     // set up rules for daylight savings time
     pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
     pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);

     // create a GregorianCalendar with the Pacific Daylight time zone
     // and the current date and time
     Calendar calendar = new GregorianCalendar(pdt);
     Date trialTime = new Date();
     calendar.setTime(trialTime);

     // print out a bunch of interesting things
     System.out.println("ERA: " + calendar.get(Calendar.ERA));
     System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
     System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
     System.out.println("현재 월의 마지막 날자: " + calendar.getMaximum(Calendar.DAY_OF_MONTH));
     System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
     System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
     System.out.println("DATE: " + calendar.get(Calendar.DATE));
     System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
     System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
     System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
     System.out.println("DAY_OF_WEEK_IN_MONTH: "
                        + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
     System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
     System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
     System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
     System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
     System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
     System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
     System.out.println("ZONE_OFFSET: "
                        + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
     System.out.println("DST_OFFSET: "
                        + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000)));

     System.out.println("Current Time, with hour reset to 3");
     calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override
     calendar.set(Calendar.HOUR, 3);
     System.out.println("ERA: " + calendar.get(Calendar.ERA));
     System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
     System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
     System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
     System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
     System.out.println("DATE: " + calendar.get(Calendar.DATE));
     System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
     System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
     System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
     System.out.println("DAY_OF_WEEK_IN_MONTH: "
                        + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
     System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
     System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
     System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
     System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
     System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
     System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
     System.out.println("ZONE_OFFSET: "
            + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000))); // in hours
     System.out.println("DST_OFFSET: "
            + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000))); // in hours

     calendar.add(Calendar.DATE, -1); // 하루전
     calendar.add(Calendar.MONTH, 5); // 5개월 뒤
     calendar.add(Calendar.WEEK_OF_YEAR, -5); // 5 주전
     System.out.println("calendar.getTime() : " + calendar.getTime()); //설정 내용 반영된 값 출력    

    }

/**
 * Comment  : 입력받은 수만큼 날자 더하기.
 * @version : 1.0
 * @tags    : @param iDay
 * @tags    : @return
 * @date    : 2010. 10. 29.
 */
 public static String getDate(int iDay){
  Calendar temp = Calendar.getInstance();
  StringBuffer sbDate = new StringBuffer();

  temp.add(Calendar.DAY_OF_MONTH, iDay);

  int nYear = temp.get(Calendar.YEAR);
  int nMonth = temp.get(Calendar.MONTH)+1;
  int nDay = temp.get(Calendar.DAY_OF_MONTH);

  sbDate.append(nYear);
  if(nMonth < 10)
   sbDate.append("0");
  sbDate.append(nMonth);
  if(nDay < 10)
   sbDate.append("0");
  sbDate.append(nDay);

  return sbDate.toString();
 }



 /**
 * Comment  : 등록된 날자와 현재날자를 비교하여 설정한 기간까지 New 이미지를 보여준다.
 * @version : 1.0
 * @tags    : @return
 * @date    : 2010. 10. 29.
 */
 public String getIsNewImage(){
  if(logger.isDebugEnabled()){
   logger.debug("######### StatusReturnTag.getIsNewImage()~! #########");
  }
  String setImg = "";
  SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
  Calendar cal = Calendar.getInstance();
  cal.add(Calendar.DATE, -this.dateValueEnd);
 
 
  int createDate = Integer.parseInt(fmt.format(this.dateValue));
  int nowDate = Integer.parseInt(fmt.format(cal.getTime()));
 
  if(nowDate < createDate){
   setImg = "<img src='${contextPath}/img/img_b_04.gif' border='0' />";
  }
  return setImg;
 }


 

08 17, 2009 16:54 08 17, 2009 16:54

Trackback URL : http://develop.sunshiny.co.kr/trackback/279

Leave a comment


Commons Net의 FTPClient 사용하기 | JSP 2005/10/14 15:22  
from http://www.jakartaproject.com/article/jakarta/1113911351166

 

I. Commons net

Jakarta Commons의 net은 network utility collection입니다.
인터넷 프로토콜을 대부분지원하는 강력한 유틸리티로 사용이 쉽고 간결합니다.

클라이언트측의 기본적인 Internet protocol을 구현함으로서 고차원적인 abstract가 아닌

기본적인 프로토콜 access가 목적이기 때문에 부분적으로 object-orient 규칙에 위배되는

사항이 있다는것을 참고적으로 알자.

Commons net이 지원하는 프로토콜은 다음과 같다.

FTP
NNTP
SMTP
POP3
Telnet
TFTP
Finger
Whois
rexec/rcmd/rlogin
Time (rdate) and Daytime
Echo
Discard
NTP/SNTP


FTP의 경우 이전에는 Sun 패키지의 FtpClient를 사용했지만 이제는
Commons net의 FTP를 사용해 봅시다.

 

II. 준비물

Commons net은 자체적으로 ORO를 사용합니다.

Jakarta ORO란 파일이름의 치환, 분할, 필터링 등을 수행하기 위한 Perl5 호환 정규식, AWK와 같은 정규식, glob 표현, 그리고 유틸리티 클래스들을 제공하는 텍스트 처리 자바 클래스들입니다.

   Commons net http://jakarta.apache.org/site/downloads/downloads_commons-net.cgi
   Jakarta ORO http://jakarta.apache.org/site/downloads/downloads_oro.cgi

참고자료
   Commons net API http://jakarta.apache.org/commons/net/apidocs/index.html
   Commons net http://jakarta.apache.org/commons/net/

 

III. org.apache.commons.net.ftp 의 흐름

Sun 패키지의 FTPClient처럼 FTP여러 동작을 Commons net의 FTPClient로 구현해 보자.

다음 ① ~ ⑦까지 목록은 필수항목으로 구현되어야 합니다.

논리적으로 보면 간단합니다.


① FTPClient 생성
   먼저 가장 중심적인 역할을 하는 FTPClient를 생성합니다.
   FTPClient ftpClient = new FTPClient();

② FTPServer에 Connect
   서버에 연결을 합니다.
   ftpClient.connect(server);

③ 응답이 정상적인지 확인 합니다.
   응답을 받아와서
   int reply = ftpClient.getReplyCode();

   정상적인지 확인해 봅니다.
   if (!FTPReply.isPositiveCompletion(reply)) {
      정상적이지 않으면 연결을 끊고 종료 합니다.
      ftpClient.disconnect();
      System.out.println("FTP server refused connection.");
   }  else {
      정상적이면 계속 진행 합니다
      System.out.println("Connect successful");
      ...
   }

④ FTP Server 로그인
   ftpClient.login(username, password);

⑤ 여러가지 작업을 합니다
   list, get, put...

⑥ FTP Server 로그아웃
   ftpClient.logout();

⑦ FTP Server disconnect
   ftpClient.disconnect();


IV. 사용예제 - 목록보기
본격적으로 FTP에 접속하여 목록을 가져오는 소스를 봅시다.
FTPClient ftpClient = null;
try {
    ftpClient = new FTPClient();
    ftpClient.setControlEncoding("euc-kr");  // 한글파일명 때문에 디폴트 인코딩을 euc-kr로 합니다
    ftpClient.connect("user.chollian.net");  // 천리안 FTP에 접속합니다

    int reply = ftpClient.getReplyCode(); // 응답코드가 비정상이면 종료합니다
    if (!FTPReply.isPositiveCompletion(reply)) {
        ftpClient.disconnect();
        System.out.println("FTP server refused connection.");   
    } else {
        System.out.print(ftpClient.getReplyString());  // 응답 메세지를 찍어봅시다


        ftpClient.setSoTimeout(10000);  // 현재 커넥션 timeout을 millisecond 값으로 입력합니다
        ftpClient.login(username, password); // 로그인 유저명과 비밀번호를 입력 합니다

        // 목록보기 구현

        FTPFile[] ftpfiles = ftpClient.listFiles("/public");  // public 폴더의 모든 파일을 list 합니다
        if (ftpfiles != null) {
            for (int i = 0; i < ftpfiles.length; i++) {
                FTPFile file = ftpfiles[i];
                System.out.println(file.toString());  // file.getName(), file.getSize() 등등..
            }
        }

        ftpClient.logout();
    }

} catch (Exception e) {
    System.out.println(e);
    e.printStackTrace();
} finally {
   if (ftpClient != null && ftpClient.isConnected()) {
       try {
           ftpClient.disconnect();
       } catch (IOException ioe) {
           ioe.printStackTrace();
       }
}


목록보기 방법에는 한가지 방법이 더 있습니다.

위의 코드는 해당 디렉토리내의 모든 파일을 가져오는 방법이며

다음 방법은 해당 디렉토리의 모든 파일을 정해진 수로 짤라 가져오는 방법이 있습니다.

위의 빨간색 코드대신 다음 코드가 들어갈 수 있습니다.


    int page = 1;
    FTPListParseEngine engine = ftpClient.initiateListParsing("/public"); // 목록을 나타낼 디렉토리
    while (engine.hasNext()) {
        FTPFile[] ftpfiles = engine.getNext(10); // 10개 단위로 끊어서 가져온다


        System.out.println("------------------------ "+page+" ------------------------");   

        if (ftpfiles != null) {
            for (int i = 0; i < ftpfiles.length; i++) {
                 FTPFile file = ftpfiles[i];
                 System.out.println(file.toString());
           }
        }
        System.out.println("------------------------ "+(page++)+" -------------------------");
    }

 

V. 사용예제 - get (파일 다운로드)

서버의 /public/테스트.txt 파일을 클라이언트의 C:\\Test\\테스트.txt 에 다운받는 예제.

    File get_file = new File("C:\\Test\\테스트.txt"); 
    OutputStream outputStream = new FileOutputStream(get_file);
    boolean result = ftpClient.retrieveFile("/public/테스트.txt", outputStream);

    outputStream.close();

 

VI. 사용예제 - put(파일 업로드)

클라이언트의 C:\\Test\\보내자.txt 파일을 서버의 /public/보내자.txt 에 업로드하는 예제.
만일 서버에 이미 /public/보내자.txt 파일이 있다면 덮어쓰게 된다.
    File put_file = new File("C:\\Test\\보내자.txt");
    inputStream = new FileInputStream(put_file);
    boolean result = ftpClient.storeFile("/public/보내자.txt", inputStream);
    inputStream.close();

 

VII. 사용예제 - append (파일업로드)
위의 예제와 같은 기능을 하지만 이미 파일에 동일한 파일이 있으면 false를 반환하면서 실행하지 않는다
    File append_file = new File("C:\\Test\\더해라.txt");
    inputStream = new FileInputStream(append_file);
    boolean result = ftpClient.appendFile("/public/더해라.txt", inputStream);
    inputStream.close();

 

VIII. 사용예제 - rename (파일 이름변경)

변경전 파일명과 변경할 파일명을 파라미터로 준다.
    boolean result = ftpClient.rename("/public/바꾸기전파일.txt", "/public/바꾼후파일.txt");

 

IX. 사용예제 - delete (파일삭제)

삭제할 파일을 선택한다     .
    boolean result = ftpClient.deleteFile("/public/test.txt");

 

X. 사용예제 - directory 생성

/public 에 oops 디렉토리를 생성한다.
    boolean result = ftpClient.makeDirectory("/public/oops");

 

XI. 사용예제 - OS 커맨드 입력하기

/public 에 oops 디렉토리를 생성한다
    ftpClient.sendCommand(FTPCommand.MAKE_DIRECTORY, "/public/oops");
    sendCommand 함수에 FTPCommand의 실행할 OS명령을 static 멤버변수를 넘겨준다

 

XII. 사용예제 - 작업디렉토리 설정하기

작업디렉토리를 /public 설정한 후 oops 디렉토리를 설정한다 (위의 예제와 비교해보라!)
    ftpClient.changeWorkingDirectory("/public");
    boolean result = ftpClient.makeDirectory("oops"); // /public/oops 절대경로를 적지 않아도 된다


XIII. 사용예제 - 파일 및 전송형태 설정

파일 형태 설정
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);


파일 타입

FTP.BINARY_FILE_TYPE, FTP.ASCII_FILE_TYPE, FTP.EBCDIC_FILE_TYPE,
FTP.IMAGE_FILE_TYPE , FTP.LOCAL_FILE_TYPE

이 값을 설정하지 않으면 디폴트는 ASCII 이다.


전송 형태 설정
ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);


전송 타입
FTP.BLOCK_TRANSFER_MODE, FTP.COMPRESSED_TRANSFER_MODE 

이값을 설정하지 않으면 디폴트는 FTP.STREAM_TRANSFER_MODE 이다.


 

출처 : http://www.javaservice.net   조성대(GoodBug)님의 글

08 5, 2009 15:51 08 5, 2009 15:51

Trackback URL : http://develop.sunshiny.co.kr/trackback/266

Leave a comment

Java - 특수문자 제어 Util

Posted 07 17, 2009 16:08, Filed under: Language/JAVA

package test.check;

public class StringTest {

 public boolean StringCheck(String str){
  int n = str.length();
  char chr;
  int cnt = 0;

  for (int i = 0; i < n; i++ ) {
   chr = str.charAt(i);
   if (!Character.isJavaIdentifierPart(chr)){
    System.out.println("파일명 \"" + str + "\" 에 허가되지 않은 특수문자 '" + chr + "' 가 있습니다.");
    break;
   }
   cnt ++;
  }
  return cnt == n ? true : false;
 }

 public static void main(String[] arr){
  StringTest test = new StringTest();

  String str = "sunshiny";
  boolean isCheck = test.StringCheck(str);
  System.out.println("StrChk : " + isCheck);
 }
}

07 17, 2009 16:08 07 17, 2009 16:08

Trackback URL : http://develop.sunshiny.co.kr/trackback/254

Leave a comment

« Previous : 1 : 2 : 3 : 4 : 5 : ... 6 : Next »

Recent Posts

  1. Linux - Telnet 서비스 비활성및 실행
  2. NT - 서버 원격데스크탑 연결
  3. NT - http와 https간에 세션 공유가...
  4. Unix - 대량 파일 이동, 삭제시 Argu...
  5. Oracle - SYS_CONTEXT 함수를 이용하...

Recent Comments

  1. 네. 고맙습니다^^ 행복한 한해 보... sunshiny 01 16,
  2. sunshiny님. 안녕하세요... 올려 주... yihans 01 16,
  3. 답글 주셔서 고맙습니다^^ 소스 복... sunshiny 01 11,
  4. 관리자만 볼 수 있는 댓글입니다. 비밀방문자 01 11,
  5. 넵 답변감사합니다^^ 좋은 하루 되... 노로링

Recent Trackbacks

  1. 윈도우 cmd 명령어 팁 월풍도원(月風道院) - Delight on th... %M
  2. 파일 압축 Like RadioHead %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   02 2012   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. Oracle All Documentation
  4. 엑셈
  5. 오라클 클럽
  6. 네이버개발자센터
  7. API - Java
  8. API - Spring
  9. Java Community
  10. Reference - Spring
  11. 스프링사용자
  12. 자바지기
  13. Ready System
  14. Solaris Freeware
  15. Linux-Site
  16. RedHat Korea
  17. 윈디하나의 솔라나라

Site Stats

TOTAL 217714 HIT
TODAY 16 HIT
YESTERDAY 115 HIT