import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;



public class TestMain {

	public static void main(String[] args) throws Exception {
		List list = new ArrayList();
		Map map = new HashMap();
		map.put("a", "1");
		map.put("b", "2");
		map.put("c", 3d);
		BigDecimal  b = new BigDecimal(1.1);
		b.toString();
		map.put("3", b);
		list.add(map);
		
		String str = resultXMLString(list, "0000");
		System.out.println(str);
	}
	/**
	 * Map 객체의 List 배열을 바탕으로 XML을 만든다.
	 * 2008.11.11 ddakker 추가
	 * @param list	  : XML 의 list 하위 item을 생성할 데이터 
	 * @param errCode : result 노드에 들어갈 값 | 0: 성공, 기타 에러코드
	 * @return
	 */
	public static String resultXMLString(List list, String errCode){ 
		CDATASection cdata 		= null;
		Text 		 text 		= null;
		String 		 xmlString 	= null;
		
		try{
			
	 	DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
	     DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
	     Document doc = docBuilder.newDocument();
			
	     Element eRoot = doc.createElement("ROOR");
	     doc.appendChild(eRoot);
	     
	     Element eResult = doc.createElement("result");
	        eRoot.appendChild(eResult);
	        
	        text = doc.createTextNode(errCode);
	        eResult.appendChild(text);
	                 
	     Element eListCnt = doc.createElement("list_cnt");
	        eRoot.appendChild(eListCnt);
	        
	        text = doc.createTextNode(list.size()+"");
	        eListCnt.appendChild(text);
	     
	        Element eList = doc.createElement("list");
	        eRoot.appendChild(eList);
	        
	        int listCnt = list.size();
	        for( int i=0; i>listCnt; i++ ){
	        	Element eItem = doc.createElement("item");
	        	eList.appendChild(eItem);
	        	
	        	Map map = (Map)list.get(i);
	        	Set set = map.keySet();
	        	Iterator it = set.iterator();
	        	while( it.hasNext() ){
	        		String key   = (String)it.next();
	        		Object value = map.get(key);

	        		Element eKey = doc.createElement(key);
	        		eItem.appendChild(eKey);
	            	
	        		cdata = doc.createCDATASection(value==null?"":value.toString());               	
	            	eKey.appendChild(cdata);
	        	}
	        }

	        xmlString = getDOMToString(doc);
	     
		}catch(Exception e){
			System.out.println(e);
			xmlString = "error";// faultXMLString("1111", "XML생성에 실패 하였습니다.");
			
		}   	    	
		
		return xmlString;
	}
	
	/**
	 * XML 문자열을 DOM(Document) 객체로 변환
	 * @param xmlStr	XML문자열
	 * @return
	 * @throws Exception
	 */
	private static Document getStringToDOM(String xmlStr) throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		return builder.parse(new InputSource(new StringReader(xmlStr)));
	}

	/**
	 * DOM(Document) 객체를 XML 문자열로 변환
	 * @param xmlStr	XML문자열
	 * @return
	 * @throws Exception
	 */
	private static String getDOMToString(Document doc) throws Exception {
		TransformerFactory transfac = TransformerFactory.newInstance();
		Transformer trans = transfac.newTransformer();
		trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
		trans.setOutputProperty(OutputKeys.INDENT, "yes");
		
		StringWriter sw = new StringWriter();
		StreamResult result = new StreamResult(sw);
		DOMSource source = new DOMSource(doc);
		trans.transform(source, result);
		
		return sw.toString();
	}


}
    

    /**
     * ResultSet를 List 로 생성
     * 2008.11.11 ddakker 추가
     * @param rs   ResultSet instance
     * @return
     */
    public static List getRsToList(ResultSet rs){
    	
    	List list = new ArrayList();
    	
    	try {
    		
    		if( rs.next() ){
    			do{
	    			Map map = new HashMap();
	    			
	    			ResultSetMetaData rsMD= rs.getMetaData();
	    			int rsMDCnt = rsMD.getColumnCount();
	    			for( int i = 1; i <= rsMDCnt; i++ ) {    				
	    				String column = rsMD.getColumnName(i).toLowerCase();
					    String value  = rs.getString(column);
					    				    
					    map.put(column, value);
				    }
	    			
	    			list.add(map);
    			}while( rs.next() );
    			
    		}else{
    			list = java.util.Collections.EMPTY_LIST;
    		}
			
			
		} catch (Exception e) {					
			list = null;
		}
    	
    	return list;
    }

    
    
        
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m  (%F:%L) \n"/>
        
    
	
	
		
		
			<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m  (%F:%L) \n" />
		
	
	
	
		
		
			<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m  (%F:%L) \n" />
		
	
	
	
        <priority value="debug" />
		<appender-ref ref="FILE_USER" />
    
    
    
         <priority value="debug" />
		 <appender-ref ref="FILE_DB" />
    
    
        <priority value ="error" />
        <appender-ref ref="STDOUT" />
    
    


// foreach
public Person(String fn, String ln, int a, Person... kids)
{
        this.firstName = fn; this.lastName = ln; this.age = a;
        for (Person child : kids)
            children.add(child);
}

// 배열 역순
Collections.reverse(list);

[출처] http://blog.naver.com/galahad76?Redirect=Log&logNo=20042609592


유닉스에서 자바 이미지 객체를 사용하려 할때 다음과 같은 에러가 발생한다.

 

Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.

 

이것은 일종의 JDK의 버그이다. 원인은 자바가 BufferedImage 를 생성하고 실제로 Graphics 객체를 얻어오기 위해 getGraphics나 createGraphics 메소드를 부를때, 실제로 display하거나 mouse, keyboard 자원을 하나도 쓰지 않을 것임에도 불구하고 내부적으로 AWT Toolkit이 그것들에 대한 자원을 얻어오게 되어있었기 때문이다. 

Sun에서는 이걸 버그로 취급하며 해결 방법은 2가지가 있다. 


1. JRE 1.3 이하 일경우 www.x.org 에서 다운로드 받을 수 있는 Xvfb 라는 것을 사용하는 방법이다. 이것은 X-server 에뮬레이터이다.



2. JRE 1.4 이상에서  Headless AWT Toolkit을 이용해서 이 문제를 해결한다. 파일을 실행할때 간단히 -Djava.awt.headless=true 옵션을 주는것만으로 가능하다.


Tomcat

catalina.sh 파일에 CATALINA_OPTS=-Djava.awt.headless=true를 추가하고 재구동하면 된다.



[출처] http://blog.naver.com/galahad76?Redirect=Log&logNo=20042609592


Console

java -Djava.awt.headless=true "class 파일명"


JEUS

Tmax에서 답변 기다리는대로 업데이트 하겠음.

시스템팀에서 알아서 해줬음 ㅡㅡ;



Struts 이용 중 Redirect 시 parameter 을 넘겨야 할 필요성이 있다.

struts 1.2 버전 밑에서는 아래와 같이 한다.

return new ActionForward("/index.do?param=value", true);

하지만 이 방법은 이동 URL을 JAVA 파일에 정의하게되어  struts의 struts-config.xml 설정파일과 별도로 관리해야 하는 단점이 있다.


그래서 struts 1.2 이상에서부터는 아래와 같은 방법을 제공한다.

ActionRedirect redirect = new ActionRedirect( mapping.findForward("success") );
redirect.addParameter("param", "123");
return redirect;

"success" 이름으로 struts-config.xml 에 정의된 URL에 param 이라는 parameter 정보를 붙여준다.

또한 1.2 이후 부터는 단순 jsp 이동 시 아래 방법은 이용 못하고, 
<action path="/index2" type="org.apache.struts.actions.ForwardAction" forward="/index.jsp" />

이 방법을 사용해야 된다.
<action path="/index" forward="/index.jsp" />

int ramdomInt = (int) (Math.random() * (899999999 - 800000000 + 1)) + 800000000;
Spring Messages 설정 시 아래와 같은 오류가 날 경우,

org.apache.jasper.JasperException: No message found under code, No message found under code ... for locale 'ko'.

[web.xml] 에 아래 설정을 넣어줘야 함.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

[JAVA 로만 이용(]
 
public static void main(String[] args) {
	
	JavaMailSender sender = getSender();
	/*
	SimpleMailMessage msg = new SimpleMailMessage();
	msg.setTo("ddakker@~");
	msg.setSubject("제목");
	msg.setFrom("ddakker@~");
	msg.setText("내용");
	sender.send(msg);
	*/
	
	MimeMessage msg = sender.createMimeMessage();
	MimeMessageHelper helper;
	try {
		helper = new MimeMessageHelper(msg, true, "UTF-8");
		helper.setSubject("제목");
		helper.setTo("ddakker@~");
		helper.setFrom("ddakker@~");
		helper.setText("내용", true);
		sender.send(msg);
	} catch (MessagingException e) {
		e.printStackTrace();
	}
    
}

private static JavaMailSenderImpl getSender(){
	JavaMailSenderImpl sender = new JavaMailSenderImpl();
	sender.setHost("도메인 및 아이피");
	sender.setUsername("계정 아이디");
	sender.setPassword("비밀번호");
	
	Properties props = new Properties();
	props.put("mail.smtp.auth", "true");
	
	sender.setJavaMailProperties(props);
	return sender;
}

[JAVA 와 Spring DI 와 함께 이용]

	
		${mailHost}
	
	
		${mailAdminId}
	
	
		${mailAdminPwd}
	
	
		
			true
		
	
 

 
JavaMailSender sender = (JavaMailSender) getBean("sender");

MimeMessage msg = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg, true, "UTF-8");
helper.setSubject(p_subject);
helper.setTo(p_to);
helper.setFrom(p_from);
helper.setText(p_message, true);
sender.send(msg);

1 : [Config] Table
     boardCode PK
N: [Board] Table
     BoardCode FK

Board를 조회 할 경우 항상 Config와 함께 JOIN이 필요 할 경우 Config Class 는 특별한 설정이 필요 없다.
Config 조회 할경우에는 단순히 Config 만 조회한다.

Board Class
     boardCode 변수를 생성할 필요 없다.


 
// fetch=FetchType.LAZY: 요청할때만 JOIN한다.,  EAGER: 무조껀 JOIN한다.
// cascade=CascadeType=ALL, MERGE, PERSIST, REFRESH, REMOVE
@ManyToOne(fetch=FetchType.LAZY, cascade = {CascadeType.REMOVE}, targetEntity=Config.class )
@JoinColumn(name = "boardCode")
@ForeignKey(name = "FK_CONFIG_BOARD_CODE")
private Config config; // getter, setter 만들어준다.


JOIN 시 FK로 Where을 걸 경우
 
Session session = getSession();
		
Criteria crit = session.createCriteria(Board.class, "B");
crit.createCriteria("Config", "C");
crit.add(Restrictions.eq("C.boardCode", boardCode));
crit.setFirstResult(firstIndex);
crit.setMaxResults(pageSize);
crit.addOrder(Order.desc("regdate"));

+ Recent posts