<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2153121181841491382</id><updated>2012-02-16T21:41:32.043+09:00</updated><category term='Message'/><category term='excel'/><category term='saaj'/><category term='soap'/><category term='struts'/><category term='POI'/><category term='jxl'/><category term='Javascript'/><category term='통신'/><category term='dotnet'/><category term='Java'/><category term='개발'/><category term='json'/><category term='properties'/><title type='text'>아기뚱 blah blah</title><subtitle type='html'>knock! knock! who's there?</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://babyp-textcube.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://babyp-textcube.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Leonard Kim</name><uri>http://www.blogger.com/profile/02667961605815388679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_FW5Ds8QFXik/SMI2pGlqCXI/AAAAAAAAACE/G8Vsn0YuKF4/S220/untitled.bmp'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2153121181841491382.post-8074770048861380571</id><published>2009-03-05T16:05:00.000+09:00</published><updated>2011-01-30T13:04:26.978+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jxl'/><category scheme='http://www.blogger.com/atom/ns#' term='excel'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><category scheme='http://www.blogger.com/atom/ns#' term='POI'/><title type='text'>beanutils를 이용한 excel import</title><content type='html'>&lt;P&gt;excel파일을 받아서 특정 bean array로 만들어 처리해야 하는 경우...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. excel를 읽어오는 library가 필요 : 아래 2개를 찾아 냄&lt;/P&gt;&lt;P&gt;&amp;nbsp;- &lt;A href="http://poi.apache.org/" target=_blank&gt;apache의 poi&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;- &lt;A href="http://jexcelapi.sourceforge.net/" target=_blank&gt;Java Excel API&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;2. 읽어온 data를 특정 객체에 넣기&lt;/P&gt;&lt;P&gt;&amp;nbsp;- &lt;A href="http://commons.apache.org/beanutils/" target=_blank&gt;apache commons의 beanutils&lt;/A&gt;를 이용함&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[먼저]&lt;/P&gt;&lt;P&gt;I. apache POI는 MS Office에서 제공하는 가능한 모든 포멧을 java에서 읽거나 쓰기 위해 만든 프로젝트이다. 그중 HSSF+XSSF는 엑셀에 관해 처리하는 부분이며 이게 관한 api를 제공하고 있다.&lt;/P&gt;&lt;P&gt;참고로 HSSF는 97~2003까지 xls 확장자를 다루며, XSSF는 2007버젼의 xlsx 확장자를 다룬다.&lt;/P&gt;&lt;P&gt;POI는 office 전반을 controll하기 때문에 무겁고 광대하며 자세하다.&lt;/P&gt;&lt;P&gt;II. java excel api는 sourceforge에 등록된 excel controll을 목적으로 한 오픈소스 프로젝트로, 가볍고 간단하다는 장점이 있다. (과거 유명한 jxl프로젝트와 무슨 관계인지 jxl.jar로 배포하고 있다)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;[내용]&lt;/P&gt;&lt;P&gt;POI와 JXL을 선택적으로 사용해야 할 수도 있기에, interface를 제공하고 factory로 처리하고 했다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;=== Interface ===&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;public interface Importer {&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public void process() throws Exception ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;public Object getResult();&lt;br /&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;=== POIInporter === &lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;import&amp;nbsp; org.apache.poi.hssf.usermodel.*;&lt;br /&gt;import&amp;nbsp; org.apache.poi.hssf.model.Workbook;&lt;br /&gt;import&amp;nbsp; org.apache.poi.hssf.model.Sheet;&lt;br /&gt;import&amp;nbsp; org.apache.poi.hssf.*; &lt;br /&gt;import&amp;nbsp; org.apache.poi.hssf.util.*; &lt;br /&gt;import&amp;nbsp; org.apache.poi.poifs.filesystem.*; &lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileOutputStream;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.ArrayList;&lt;/P&gt;&lt;P&gt;&lt;br /&gt;public class ExcelImporter implements Importer {&lt;/P&gt;&lt;P&gt;&amp;nbsp;POIFSFileSystem fs = null;&lt;br /&gt;&amp;nbsp;FileOutputStream fileOut = null;&lt;/P&gt;&lt;P&gt;&amp;nbsp;String fileName&amp;nbsp; = "";&lt;br /&gt;&amp;nbsp;int processCount = 0; &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;HSSFWorkbook wb = null;&lt;br /&gt;&amp;nbsp;HSSFSheet sheet = null;&lt;/P&gt;&lt;P&gt;&amp;nbsp;List resultObj = null;&lt;br /&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;public ExcelImporter(String fn) {&lt;br /&gt;&amp;nbsp; this.fileName = fn;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public void process() throws Exception {&lt;br /&gt;&amp;nbsp; FileInputStream fi = new FileInputStream(fileName);&lt;br /&gt;&amp;nbsp; try{&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;fs&amp;nbsp; = new POIFSFileSystem(fi);&lt;br /&gt;&amp;nbsp; &amp;nbsp;//if(fs&amp;nbsp; != null) System.out.println("file name_______ =&amp;gt;"+fileName);&lt;br /&gt;&amp;nbsp; &amp;nbsp;//if(fs&amp;nbsp; != null) System.out.println("fs _______ =&amp;gt;"+fs);&lt;/P&gt;&lt;P&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;wb = new HSSFWorkbook(fs);&lt;br /&gt;&amp;nbsp; &amp;nbsp;System.out.println("WB =&amp;gt;"+wb);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;sheet = wb.getSheetAt(0);&lt;br /&gt;&amp;nbsp; &amp;nbsp;int totalRowNum = sheet.getPhysicalNumberOfRows();&lt;br /&gt;&amp;nbsp; &amp;nbsp;//int &amp;nbsp;totalRowNum = sheet.getLastRowNum();&lt;br /&gt;&amp;nbsp; &amp;nbsp;int rowIndex= 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;HSSFRow row = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp;short cellSize = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;HSSFCell[] cells = null ;&lt;br /&gt;&amp;nbsp; &amp;nbsp;HSSFCell cell = null ;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;resultObj = new ArrayList();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;//System.out.println("*** totalRowNum=&amp;gt;"+totalRowNum);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;Object[] obj = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp;for(int k=0; k&amp;lt;totalRowNum; k++) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; row = sheet.getRow(k); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(row == null) continue;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(k==0) cellSize = row.getLastCellNum();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; obj = new Object[cellSize];&lt;br /&gt;&amp;nbsp; &amp;nbsp; //System.out.println("*** cellSize=&amp;gt;"+cellSize);&lt;br /&gt;&amp;nbsp; &amp;nbsp; cells = new HSSFCell[cellSize]; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; for(int i=0; i&amp;lt;cellSize; i++) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;cells[i] = row.getCell(i);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;obj[i] = new Object();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;//System.out.println("cells[i].getStringCellValue()=&amp;gt;"+cells[i].getStringCellValue()); &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;obj[i] = cells[i].getStringCellValue();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; resultObj.add(obj);&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; }catch(Exception ex) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;throw ex;&lt;br /&gt;&amp;nbsp; }finally{&lt;br /&gt;&amp;nbsp; &amp;nbsp;if(fi != null) try{ fi.close(); } catch(Exception ex2) { }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;public Object getResult() {&lt;br /&gt;&amp;nbsp; return resultObj;&lt;br /&gt;&amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;=== JXLInporter === &lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;import jxl.*; &lt;br /&gt;import java.io.File;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.ArrayList;&lt;/P&gt;&lt;P&gt;public class JExcelImporter implements Importer {&lt;/P&gt;&lt;P&gt;&amp;nbsp;String fileName = "";&lt;br /&gt;&amp;nbsp;int processCount = 0; &lt;/P&gt;&lt;P&gt;&amp;nbsp;Workbook workbook = null;&lt;br /&gt;&amp;nbsp;Sheet sheet = null;&lt;br /&gt;&amp;nbsp;List resultObj = null;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public JExcelImporter(String fn) {&lt;br /&gt;&amp;nbsp; this.fileName = fn;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public void process() throws Exception {&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; try{ &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;workbook = Workbook.getWorkbook(new File(fileName)); &lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;sheet = workbook.getSheet(0); &lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;int totalRowNum = sheet.getRows();&lt;br /&gt;&amp;nbsp; &amp;nbsp;int cellSize = sheet.getColumns();&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;//System.out.println("***************************** totalRowNum=&amp;gt;"+totalRowNum); &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;//System.out.println("***************************** cellSize=&amp;gt;"+cellSize); &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;int rowIndex= 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;Cell[] cells = null ;&lt;br /&gt;&amp;nbsp; &amp;nbsp;Cell cell = null ;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;resultObj = new ArrayList();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;Object[] obj = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp;for(int k=0; k&amp;lt;totalRowNum; k++) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; cells = sheet.getRow(k);&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; if(cells&amp;nbsp; == null ) continue;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; obj = new Object[cellSize];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; for(int i=0; i&amp;lt;cellSize; i++) { &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;obj[i] = new Object(); &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;obj[i] = cells[i].getContents();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; resultObj.add(obj);&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; }catch(Exception ex) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;throw ex;&lt;br /&gt;&amp;nbsp; }finally{&lt;br /&gt;&amp;nbsp; &amp;nbsp;if(workbook != null) try{ workbook.close(); } catch(Exception ex2) { }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;public Object getResult() {&lt;br /&gt;&amp;nbsp; return resultObj;&lt;br /&gt;&amp;nbsp;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;=== Excel Util ===&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;/**&lt;br /&gt;&amp;nbsp;* 엑셀(xls)파일을 읽어서 Bean Array에 넣는 Util&lt;br /&gt;&amp;nbsp;* @FileName&amp;nbsp; : ExcelUtil.java&lt;br /&gt;&amp;nbsp;* @Project &amp;nbsp; : nurien&lt;br /&gt;&amp;nbsp;* @Date &amp;nbsp; &amp;nbsp;&amp;nbsp; : 2009. 03. 01 &lt;br /&gt;&amp;nbsp;* @Auther &amp;nbsp;&amp;nbsp; : sunjin.kim&lt;br /&gt;&amp;nbsp;* @History &amp;nbsp; :&lt;br /&gt;&amp;nbsp;* @Comment &amp;nbsp; :&lt;br /&gt;&amp;nbsp;*&amp;nbsp; Caption : xlsx(office 2007)파일 지원 안함. 저장시 97~2003통합문서로 저장.&lt;br /&gt;&amp;nbsp;*&amp;nbsp; Usage : 1. xls 최상단에 컬럼명을 넣는다&lt;br /&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; 2. new ExcelUtil(파일경로, 클래스명, data가 시작되는 row)&lt;br /&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; 3. 클래스명 : package를 포함한 class명&lt;br /&gt;&amp;nbsp;*/&lt;/P&gt;&lt;P&gt;import org.apache.commons.beanutils.*;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import java.util.HashMap;&lt;/P&gt;&lt;P&gt;import com.nurien.base.util.importer.*;&lt;/P&gt;&lt;P&gt;public class ExcelUtil {&lt;br /&gt;&amp;nbsp;private String fileName;&lt;br /&gt;&amp;nbsp;private String beanClassName;&lt;br /&gt;&amp;nbsp;private int dataRow;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public ExcelUtil(String fn, String bc, int dr){&lt;br /&gt;&amp;nbsp; this.fileName = fn;&lt;br /&gt;&amp;nbsp; this.beanClassName = bc;&lt;br /&gt;&amp;nbsp; this.dataRow = dr;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public List getImportObject(){&lt;br /&gt;&amp;nbsp; Importer importer = ImporterFactory.getInstance(fileName, ImporterFactory.JEXCEL);&lt;br /&gt;&amp;nbsp; List list = null;&lt;br /&gt;&amp;nbsp; try{&lt;br /&gt;&amp;nbsp; &amp;nbsp;importer.process();&lt;br /&gt;&amp;nbsp; &amp;nbsp;list = (List)importer.getResult();&lt;br /&gt;&amp;nbsp; }catch(Exception ex) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;ex.printStackTrace();&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; return list;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public String[] getHeaderInfo(List list) {&lt;br /&gt;&amp;nbsp; Object[] obj = (Object[])list.get(0);&lt;br /&gt;&amp;nbsp; String hs[] = null;&lt;br /&gt;&amp;nbsp; if(obj != null) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;hs = new String[obj.length];&lt;br /&gt;&amp;nbsp; &amp;nbsp;for(int i=0; i&amp;lt;obj.length; i++) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; hs[i] = (String)obj[i];&lt;br /&gt;&amp;nbsp; &amp;nbsp; hs[i] = hs[i].toLowerCase().trim();&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; return hs;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public List getImportData() {&lt;/P&gt;&lt;P&gt;&amp;nbsp; List importObj = getImportObject();&lt;br /&gt;&amp;nbsp; if(importObj == null) return null;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; String[] heads = null;&lt;/P&gt;&lt;P&gt;&amp;nbsp; heads = getHeaderInfo(importObj);&lt;br /&gt;&amp;nbsp; if(heads == null) return null;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; List list = new ArrayList();&lt;br /&gt;&amp;nbsp; Map map = new HashMap();&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; try{ &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;heads = getHeaderInfo(importObj);&lt;br /&gt;&amp;nbsp; &amp;nbsp;for(int k=dataRow; k&amp;lt;importObj.size(); k++) { //dataRow번째 행부터 data로 인식&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; Object[] objImportValues = (Object[])importObj.get(k);&lt;br /&gt;&amp;nbsp; &amp;nbsp; Object obj = Class.forName(beanClassName).newInstance();&lt;br /&gt;&amp;nbsp; &amp;nbsp; for(int i=0; i&amp;lt;heads.length; i++) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Object typeObj = PropertyUtils.getProperty(obj,heads[i]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if(typeObj.getClass().getName().equals("java.lang.String")) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; map.put(heads[i],(String)objImportValues[i]); &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; map.put(heads[i],new Integer((String)objImportValues[i]));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; PropertyUtils.copyProperties(obj,map);&lt;br /&gt;&amp;nbsp; &amp;nbsp; list.add(obj);&lt;br /&gt;&amp;nbsp; &amp;nbsp; map.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; }catch(Exception ex) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;ex.printStackTrace(System.err);&lt;br /&gt;&amp;nbsp; &amp;nbsp;return null;&lt;br /&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; return list;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;public static void main(String[] args){&lt;br /&gt;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp; if(args.length &amp;lt; 2){&lt;br /&gt;&amp;nbsp; &amp;nbsp;System.out.println("Please insert Excel File Name and Data Row Number");&lt;br /&gt;&amp;nbsp; &amp;nbsp;System.exit(0);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; String fileName = args[0];&lt;br /&gt;&amp;nbsp; int dataRow = Integer.parseInt(args[1]);&lt;br /&gt;&amp;nbsp; String className = "com.textcube.babyp.product";&lt;br /&gt;&amp;nbsp; ExcelUtil eu = new ExcelUtil(fileName,className,dataRow);&lt;br /&gt;&amp;nbsp; List list = eu.getImportData();&lt;br /&gt;&amp;nbsp; com.nurien.bbs.entity.Product[] plist = null;&lt;br /&gt;&amp;nbsp; if(list != null){&lt;br /&gt;&amp;nbsp; &amp;nbsp;System.out.println("data length : "+list.size());&lt;br /&gt;&amp;nbsp; &amp;nbsp;plist = new com.nurien.bbs.entity.Product[list.size()];&lt;br /&gt;&amp;nbsp; &amp;nbsp;for(int i=0; i&amp;lt;list.size(); i++){&lt;br /&gt;&amp;nbsp; &amp;nbsp; plist = (com.nurien.bbs.entity.Product[])list.toArray(plist);&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;for(int i=0; i&amp;lt;plist.length; i++){&lt;br /&gt;&amp;nbsp; &amp;nbsp; //System.out.println(plist[i].toString());&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2153121181841491382-8074770048861380571?l=babyp-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyp-textcube.blogspot.com/feeds/8074770048861380571/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://babyp-textcube.blogspot.com/2009/03/beanutils%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-excel-import.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default/8074770048861380571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default/8074770048861380571'/><link rel='alternate' type='text/html' href='http://babyp-textcube.blogspot.com/2009/03/beanutils%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-excel-import.html' title='beanutils를 이용한 excel import'/><author><name>Leonard Kim</name><uri>http://www.blogger.com/profile/02667961605815388679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_FW5Ds8QFXik/SMI2pGlqCXI/AAAAAAAAACE/G8Vsn0YuKF4/S220/untitled.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2153121181841491382.post-124573292865180308</id><published>2008-11-28T16:34:00.000+09:00</published><updated>2011-01-30T13:04:26.934+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Message'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>javascript message처리</title><content type='html'>&lt;P&gt;관련글 : &lt;A href="http://babyp.textcube.com/3" rel=bookmark&gt;&lt;SPAN class=entry-title&gt;Struts2의 properties를 객체에 담고 가공하기&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Json방식으로 메시지를 넣은 경우 해당 메시지를 load하여 꺼낼 Javascript가 필요 하여 구현함&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;일단 코드!!!&lt;/P&gt;&lt;BLOCKQUOTE&gt;function loadScript(src) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var s = document.getElementsByTagName('HEAD')[0].appendChild(document.createElement('script'));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s.type = 'text/javascript';&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s.charset="utf-8";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s.src = src;&lt;br /&gt;} &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;var src = '메시지 js가 있는 url';&lt;br /&gt;var NrnMessage = function(jsUrl){ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.message = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.js_src = src;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(jsUrl)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.js_src = jsUrl;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(typeof message == 'undefined'){ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loadScript(this.js_src); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTimeout('nrnmessage.init()',100);&lt;br /&gt;};&lt;br /&gt;NrnMessage.prototype = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; init: function(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.message = message;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; getMessage: function(path){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var idx = path.lastIndexOf('.');&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return this.findIdx(path.substr(0,idx), path.substr(idx,path.length));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; getDirectMessage: function(path){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return eval('this.message.'+path);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; findIdx: function(path,key){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var len = eval('this.message.'+path).length;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(var i=0; i&amp;lt;len; i++){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(eval('this.message.'+path+'['+i+']'+key))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return eval('this.message.'+path+'['+i+']'+key);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/BLOCKQUOTE&gt;&lt;P&gt;다음은 호출될 message 양식 (관련글에서 유추하듯 properties를 가져오기 때문에 해당 양식을 지키려 했다)&lt;/P&gt;&lt;BLOCKQUOTE&gt;&amp;nbsp;var message = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; LOGIN : &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; { VALIDATION : [&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {EMPTY_ID:'&amp;lt;s:text name="LOGIN.VALIDATION.EMPTY_ID"/&amp;gt;'},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {ID_SIZE:'&amp;lt;s:text name="LOGIN.VALIDATION.ID_SIZE"/&amp;gt;'},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {EMPTY_PASSWORD:'&amp;lt;s:text name="LOGIN.VALIDATION.EMPTY_PASSWORD"/&amp;gt;'},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; {PASSWORD_SIZE:'&amp;lt;s:text name="LOGIN.VALIDATION.PASSWORD_SIZE"/&amp;gt;'}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 'TITLE_BUTTON_CLOSE' : '닫기',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 'TITLE$BUTTON$OPEN' : '열기'&lt;br /&gt;&amp;nbsp;}&lt;/BLOCKQUOTE&gt;&lt;P&gt;호출하는 page에서 객체를 생성하고 사용하는 방법은 아래와 같다.&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/P&gt;&lt;P&gt;//메시지 호출&lt;/P&gt;&lt;P&gt;&amp;nbsp;nrnmessage.getMessage('LOGIN.VALIDATION.EMPTY_PASSWORD')&lt;br /&gt;&amp;nbsp;nrnmessage.getDirectMessage('TITLE_BUTTON_CLOSE')&lt;br /&gt;&amp;nbsp;nrnmessage.getDirectMessage('TITLE$BUTTON$CLOSE')&lt;/P&gt;&lt;P&gt;&amp;lt;/script&amp;gt;&lt;/P&gt;&lt;P&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/P&gt;&lt;P&gt;nrnmessage = new NrnMessage('/service/main/message_js.nrn'); //생성&lt;/P&gt;&lt;P&gt;&amp;lt;/script&amp;gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2153121181841491382-124573292865180308?l=babyp-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyp-textcube.blogspot.com/feeds/124573292865180308/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://babyp-textcube.blogspot.com/2008/11/javascript-message%EC%B2%98%EB%A6%AC.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default/124573292865180308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default/124573292865180308'/><link rel='alternate' type='text/html' href='http://babyp-textcube.blogspot.com/2008/11/javascript-message%EC%B2%98%EB%A6%AC.html' title='javascript message처리'/><author><name>Leonard Kim</name><uri>http://www.blogger.com/profile/02667961605815388679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_FW5Ds8QFXik/SMI2pGlqCXI/AAAAAAAAACE/G8Vsn0YuKF4/S220/untitled.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2153121181841491382.post-6876760724657459110</id><published>2008-11-28T16:22:00.000+09:00</published><updated>2011-01-30T13:04:26.904+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='properties'/><category scheme='http://www.blogger.com/atom/ns#' term='struts'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><title type='text'>Struts2의 properties를 객체에 담고 가공하기</title><content type='html'>&lt;P&gt;시작 : struts의 properties의 내용을 json형식으로 변환하여 메시지로 사용하고 싶다.&lt;/P&gt;&lt;P&gt;접근 : key=value 형식을 json형식으로 바꿔야 하므로....일단 properties를 객체화 시켜야 한다. &lt;/P&gt;&lt;P&gt;구조 : package단위 properties가 존재하며, 메시지는 자신과 상위것만 사용할 수 있다.&lt;/P&gt;&lt;P&gt;[내용]&lt;/P&gt;&lt;P&gt;일반적으로 properties의 값을 가져오는 방법은 java코드 단에서는 getText 메쏘드를 이용한다.&lt;/P&gt;&lt;BLOCKQUOTE&gt;message = getText("BBS.FORM.LIST.TITLE.CS");&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;물론 jsp와 같은 presentation단에서도 사용 가능하다.&lt;/P&gt;&lt;BLOCKQUOTE&gt;&amp;lt;s:property value="getText('BBS.FORM.LIST.TITLE.CS')"/&amp;gt;&lt;br /&gt;&amp;lt;s:text name="BBS.FORM.LIST.TITLE.CS"/&amp;gt; // 내부적으로 getText를 호출한다&lt;/BLOCKQUOTE&gt;&lt;P&gt;문제는 해당 key값과 value값을 분리하는데 있다.&lt;/P&gt;&lt;P&gt;보통은 ResourceBundle로 받아 loop를 돌며 처리하곤 하는데, 여기에서는 package단위 메시지처리를 해야 하므로, package를 통한 ResourceBundle접근을 하겠다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. 메시지를 가지고 있는 객체(messageManager)는 싱글톤으로 구현한다. 최초 로딩시 최상단(root) pacakge의 메시지를 저장하고 있다가 호출될때마다 해당 메시지에 add on 시키는 방식을 취한다.&lt;/P&gt;&lt;BLOCKQUOTE&gt;private static final String COMMOM_PACKAGE = "net/babyp";&lt;br /&gt;private static final String PACKAGE_NAME = "/package_ko";&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;private static List rootList = null;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;public static synchronized void init(Action action){&lt;br /&gt;&amp;nbsp; rootList = setMassage(action,COMMOM_PACKAGE);&lt;br /&gt;&amp;nbsp;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;2. 각 action에서 호출될 메쏘드는 root메시지에 자기 package 메시지를 붙인다.&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;public static List getMessage(Action action){ &amp;nbsp;&lt;br /&gt;&amp;nbsp; if(rootList == null)&lt;br /&gt;&amp;nbsp; &amp;nbsp;init(action);&lt;br /&gt;&amp;nbsp; String url = action.getClass().getPackage().getName();&lt;br /&gt;&amp;nbsp; url.replaceAll(".", "/"); &amp;nbsp;&lt;br /&gt;&amp;nbsp; List list = setMassage(action,url,rootList); &amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return list;&lt;br /&gt;&amp;nbsp;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;3. setMessage method&lt;/P&gt;&lt;BLOCKQUOTE&gt;public static List setMassage(Action action,String package_path){&lt;br /&gt;&amp;nbsp; List list = new ArrayList();&lt;br /&gt;&amp;nbsp; ResourceBundle rb = action.getTexts(package_path+PACKAGE_NAME);&lt;br /&gt;&amp;nbsp; if(rb != null){&lt;br /&gt;&amp;nbsp; &amp;nbsp;String keys = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp;Message message = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp;for (Enumeration e = rb.getKeys() ; e.hasMoreElements() ;) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; keys = (String)e.nextElement();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; message = new Message();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; message.setKey(keys);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; message.setValue(action.getText(keys));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; list.add(message);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; return list;&lt;br /&gt;&amp;nbsp;}&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;4. 위 messageManager를 호출하는 action은 ActionSupport가 포함된 package내 class를 넘겨줘야 한다. (보통 자기 자신을 보낸다)&lt;/P&gt;&lt;BLOCKQUOTE&gt;public String message() throws BaseException {&lt;br /&gt;&amp;nbsp; List list = MessageManager.getMessage(this);&lt;br /&gt;&amp;nbsp; resultMap.put("list", list);&lt;br /&gt;&amp;nbsp; return SUCCESS;&lt;br /&gt;&amp;nbsp;} &amp;nbsp;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2153121181841491382-6876760724657459110?l=babyp-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyp-textcube.blogspot.com/feeds/6876760724657459110/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://babyp-textcube.blogspot.com/2008/11/struts2%EC%9D%98-properties%EB%A5%BC-%EA%B0%9D%EC%B2%B4%EC%97%90-%EB%8B%B4%EA%B3%A0-%EA%B0%80%EA%B3%B5%ED%95%98%EA%B8%B0.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default/6876760724657459110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default/6876760724657459110'/><link rel='alternate' type='text/html' href='http://babyp-textcube.blogspot.com/2008/11/struts2%EC%9D%98-properties%EB%A5%BC-%EA%B0%9D%EC%B2%B4%EC%97%90-%EB%8B%B4%EA%B3%A0-%EA%B0%80%EA%B3%B5%ED%95%98%EA%B8%B0.html' title='Struts2의 properties를 객체에 담고 가공하기'/><author><name>Leonard Kim</name><uri>http://www.blogger.com/profile/02667961605815388679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_FW5Ds8QFXik/SMI2pGlqCXI/AAAAAAAAACE/G8Vsn0YuKF4/S220/untitled.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2153121181841491382.post-8647930749615404929</id><published>2008-11-20T20:34:00.000+09:00</published><updated>2011-01-30T13:04:26.839+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='통신'/><category scheme='http://www.blogger.com/atom/ns#' term='saaj'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='개발'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Java .Net간의 Soap 통신</title><content type='html'>&lt;P&gt;닷넷쪽 개발자에게 'Webservice로 통신 합시다!'하는 메일을 떡하니 받았다.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;응? 어떻게요? 하고 물으니&lt;/P&gt;&lt;P&gt;프로토콜은 Soap으로 맞춰 놓았으니 그렇게 호출 하시면 됩니다....하는 그쪽 개발자~&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;SAAJ로 soap 통신을 구현한 내용이 있어 차분히 인용하였다. &lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;import javax.xml.soap.*;&lt;br /&gt;import java.net.*;&lt;br /&gt;import javax.activation.DataHandler;&lt;br /&gt;&lt;br /&gt;public class SAAJTest {&lt;br /&gt;&amp;nbsp; &amp;nbsp; public static void main(String [] args) throws Exception {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // SOAPMessage 객체 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MessageFactory messageFactory =&amp;nbsp;MessageFactory.newInstance();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPMessage requestMessage =&amp;nbsp;messageFactory.createMessage();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // SOAPPart 객체 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPPart soapPart =&amp;nbsp;requestMessage.getSOAPPart();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // SOAPEnvelope 객체 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPEnvelope envelope =&amp;nbsp;soapPart.getEnvelope();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 네임스페이스 지정&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; envelope.addNamespaceDeclaration("xsd", "http://www.w3.org/2001/XMLSchema");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; envelope.addNamespaceDeclaration("xsi", "http://www.w3.org/2001/XMLSchema-instance");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; envelope.addNamespaceDeclaration("enc", "http://www.w3.org/schemas.xmlsoap.org/soap/encoding/");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; envelope.addNamespaceDeclaration("ns0", "http://localhost:8080/hello/webservice/wsdl/webservice");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 인코딩 방식 지정&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; envelope.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // SOAPFactory 객체 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPFactory soapFactory =&amp;nbsp;SOAPFactory.newInstance();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // SOAPHeader 객체 얻기&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPHeader header =&amp;nbsp;envelope.getHeader();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 헤더 엔트리 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Name name =&amp;nbsp;soapFactory.createName(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "authentication", "auth", "http://www.mincheol.com/auth");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPHeaderElement headerElement =&amp;nbsp;header.addHeaderElement(name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; headerElement.setActor("http://www.mincheol.com/auth");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; headerElement.setMustUnderstand(true);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 헤더 엔트리 자식 엘리먼트 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name =&amp;nbsp;soapFactory.createName("userid");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPElement useridElement =&amp;nbsp;headerElement.addChildElement(name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; useridElement.addTextNode("angel");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 헤더 엔트리 자식 엘리먼트 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name =&amp;nbsp;soapFactory.createName("password");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPElement passwordElement =&amp;nbsp;headerElement.addChildElement(name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; passwordElement.addTextNode("abc12345");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // SOAPBody 객체 얻기&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPBody body =&amp;nbsp;envelope.getBody();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 바디 엔트리 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 이미 envelope에서 네임스페이스를 선언했으므로 마지막인자는 null 이다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Name bodyName =&amp;nbsp;soapFactory.createName("sayHello", "ns0", null);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPBodyElement bodyElement =&amp;nbsp;body.addBodyElement(bodyName);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 바디 엔트리 자식 엘리먼트 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Name childName =&amp;nbsp;soapFactory.createName("String_1");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPElement childElement =&amp;nbsp;bodyElement.addChildElement(childName);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Name typeName =&amp;nbsp;soapFactory.createName("type", "xsi", null);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; childElement.addAttribute(typeName, "xsd:string");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; childElement.addTextNode("mincheol");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 첨부물 위치&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL url =&amp;nbsp;new URL("file:///home/kwon37xi/.vimrc");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String contentId =&amp;nbsp;"attached_image";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // AttachmentPart 객체 얻기&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DataHandler dataHandler =&amp;nbsp;new DataHandler(url);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AttachmentPart attachment =&amp;nbsp;requestMessage.createAttachmentPart(dataHandler);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; attachment.setContentId(contentId);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 요청 SOAP 메시지에 추가&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; requestMessage.addAttachmentPart(attachment);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // SOAPFault 객체 얻기&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPFault fault =&amp;nbsp;body.addFault();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fault.setFaultCode(envelope.getPrefix() +&amp;nbsp;":Client"); // faultcode에는 접두사가필요하다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fault.setFaultActor("http://www.mincheol.com/auth");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fault.setFaultString("Message does not have necessary info");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Detail detail =&amp;nbsp;fault.addDetail(); // detail 정보 생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Name entryName =&amp;nbsp;soapFactory.createName("content"); // 네임스페이스 불필요&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DetailEntry entry =&amp;nbsp;detail.addDetailEntry(entryName);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; entry.addTextNode("userid element does not have a&amp;nbsp;value");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 지금까지 생성된 XML SOAP 메시지를 화면에 출력한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println("-----------------------------------------------------");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; requestMessage.writeTo(System.out);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println("-----------------------------------------------------");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // SOAPConnection 객체생성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPConnectionFactory soapConnectionFactory =&amp;nbsp;SOAPConnectionFactory.newInstance();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPConnection connection =&amp;nbsp;soapConnectionFactory.createConnection();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 요청 SOAP 메시지를 보내고, 응답 SOAP 메시지를 받는다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOAPMessage responseMessage =&amp;nbsp;connection.call(requestMessage, &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "http://localhost:9000/hello/webservice");&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P align=center&gt;&amp;nbsp;[출처 : &lt;A href="http://kwon37xi.egloos.com/696462" target=_blank&gt;권남님&lt;/A&gt;]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2153121181841491382-8647930749615404929?l=babyp-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://babyp-textcube.blogspot.com/feeds/8647930749615404929/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://babyp-textcube.blogspot.com/2008/11/java-net%EA%B0%84%EC%9D%98-soap-%ED%86%B5%EC%8B%A0.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default/8647930749615404929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2153121181841491382/posts/default/8647930749615404929'/><link rel='alternate' type='text/html' href='http://babyp-textcube.blogspot.com/2008/11/java-net%EA%B0%84%EC%9D%98-soap-%ED%86%B5%EC%8B%A0.html' title='Java .Net간의 Soap 통신'/><author><name>Leonard Kim</name><uri>http://www.blogger.com/profile/02667961605815388679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_FW5Ds8QFXik/SMI2pGlqCXI/AAAAAAAAACE/G8Vsn0YuKF4/S220/untitled.bmp'/></author><thr:total>1</thr:total></entry></feed>
