ajax호출 해서 데이터를 처리 하는경우 하나의 url에서 정의된 key를 통해 데이터를 가공하는 경우 사용하는 util Object... args 사용해서 데이터형 상관 없이 임의의 데이터를 정의 호출되는 곳은 이걸 염두하고 xml 작업을 해야 해서... 폐기 처분 ㅠ.ㅠ

package egovframework.cmmn.service;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;

import org.springframework.util.ReflectionUtils;

import egovframework.cmmn.ApplicationContextProvider;

public class BindingMapperUtil {
	/**
	 * @param String callMapperName 호출할 mapper명(ex: @Service, @Mapper 에 지정한 이름)
	 * @param String callMethodName 호출할 메소드명
	 * @return List<HashMap<String,Object>> 리턴시 hashmap으로 리턴 이 부분은 상황에 맞게 변경 가능
	 * */
	public List<HashMap<String,Object>> ajaxDataCallToList(String callMapperName, String callMethodName, Object... args)
			throws Exception{
		Object objMapper						= ApplicationContextProvider.getApplicationContext().getBean(callMapperName);
		Class<?>[] parameterTypes 		= {HashMap.class};
		Method method 							= ReflectionUtils.findMethod(objMapper.getClass(), callMethodName, parameterTypes);
		Object objReturn 						= ReflectionUtils.invokeMethod(method, objMapper, args);

		return (List<HashMap<String,Object>>)objReturn;
	}
	
	/**
	 * @param String callMapperName 호출할 mapper명(ex: @Service, @Mapper 에 지정한 이름)
	 * @param String callMethodName 호출할 메소드명
	 * @return HashMap<String,Object> 리턴시 hashmap으로 리턴 이 부분은 상황에 맞게 변경 가능
	 * */
	public HashMap<String,Object> ajaxDataCallToInfo(String callMapperName, String callMethodName, Object... args)
			throws Exception{
		Object objMapper						= ApplicationContextProvider.getApplicationContext().getBean(callMapperName);
		Class<?>[] parameterTypes 		= {HashMap.class};
		Method method 							= ReflectionUtils.findMethod(objMapper.getClass(), callMethodName, parameterTypes);
		Object objReturn 						= ReflectionUtils.invokeMethod(method, objMapper, args);
		
		return (HashMap<String,Object>)objReturn;
	}
}

Object... args 에 넘겨주는 정보는 HashMap<String,Obejct> paramMap = new HashMap<String, Object>(); paramMap.put("dumy1","1"); paramMap.put("dumy2","2"); mapper에서 사용하는 xml에서 사용하는 key에 맞춰 데이터를 전송 해주면 됩니다.

반응형
Posted by 질주하는구
,
다른 서버의 상태를 체크하기 위한 프로그램 입니다. 해당 프로그램은 상태를 요청하고 해당 상태를 기준으로 추가 작업을 진행 하기 위한 기본 소스 입니다. 스케줄에 등록 후 사용 하려고 작성한 내용 입니다.
package socketCommunication;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

import org.apache.log4j.Logger;

public class ClientMain {
	private static final Logger log = Logger.getLogger(ClientMain.class);
	public static void main(String[] args) {
		boolean isConnetion			= true;
		boolean isSuccess 			= false;
		String serverIp 					= "localhost";
		InputStream input				= null;
		DataInputStream dis 			= null;
		Socket socket 					= null;
		try{
			socket 		= new Socket(serverIp, 8081);//소켓 오픈
			input 		= socket.getInputStream();//정보 
			dis			= new DataInputStream(input);
			
			String returnStr = dis.readUTF();
			if("true".equals(returnStr)){
				isSuccess = true;
			}
		}catch(IOException e){
			isConnetion = false;
			log.error(e);
		}finally{
			if(input!=null){try{input.close();}catch(Exception e){}}
			if(dis!=null){try{dis.close();}catch(Exception e){}}
			if(socket!=null){try{socket.close();}catch(Exception e){}}
		}
		System.out.println("연결성공여부 : "+isConnetion);//연결 실패시 서버 동작 여부 체크를 위한 메시지를 관리자에게 전달
		System.out.println("응답성공여부 : "+isSuccess);//응답 실패,성공 여부에 맞춰서 관련 작업 진행
	}

}
반응형
Posted by 질주하는구
,
서버의 동작 상태를 모니터링 하기 위해 주기적으로 정보를 주고 받아야 하는경우 해당 서버에 아래의 코드로 동작하는 소스를 업로드 합니다.
package socketCommunication;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.log4j.Logger;

public class ServerMain {
	private static final Logger log = Logger.getLogger(ServerMain.class);
	public static void main(String[] args) {
		ServerSocket serverSocket =  null;
		try{
			serverSocket = new ServerSocket(8081);
			while(true){
				Socket socket = serverSocket.accept(); 
				log.info(socket.getInetAddress()+"에서 연결 요청");
				
				OutputStream out = socket.getOutputStream();
				DataOutputStream dos = new DataOutputStream(out);
				//서버(체크 후 어떤 정보를 클라이언트에 보낼지 정해서 전송)
				//시작
				//처리 및 응답 데이터는 유형별로 따로 정의
				dos.writeUTF("true");
				dos.flush();
				log.info("메시지 전송 완료");
				//끝
				//서버(체크 후 어떤 정보를 클라이언트에 보낼지 정해서 전송)
				out.close();
				dos.close();
				socket.close();
			}
		}catch(IOException e){
			log.error(e);
		}finally{
			if(serverSocket!=null)try{serverSocket.close();}catch(Exception e){}
		}
	}

}
서버의 상태를 체크하고 체크가 완료되면 상태를 TRUE/FALSE로 리턴 합니다.
반응형
Posted by 질주하는구
,
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class TestData {

	public static void main(String[] args) throws Exception {
		String url 						= "";
        String urlParameters 		= "";
        URL obj = new URL(url);
        ignoreSsl();
        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

        //add reuqest header
        con.setRequestMethod("POST");
        con.setConnectTimeout(10000);       //컨텍션타임아웃 10초
        con.setReadTimeout(5000);           //컨텐츠조회 타임아웃 5초
        con.setDoOutput(true);              //항상 갱신된내용을 가져옴.
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

        int responseCode = con.getResponseCode();

        Charset charset = Charset.forName("UTF-8");
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(),charset));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        System.out.println(response.toString());

	}
	public static void ignoreSsl() throws Exception{
        HostnameVerifier hv = new HostnameVerifier() {
        public boolean verify(String urlHostName, SSLSession session) { 
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }
	public static void trustAllHttpsCertificates() throws Exception {
	    TrustManager[] trustAllCerts = new TrustManager[1];
	    TrustManager tm = new miTM();
	    trustAllCerts[0] = tm;
	    SSLContext sc = SSLContext.getInstance("SSL");
	    sc.init(null, trustAllCerts, null);
	    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
	}
	
	static class miTM implements TrustManager,X509TrustManager {
	    public X509Certificate[] getAcceptedIssuers() {
	        return null;
	    }
	
	    public boolean isServerTrusted(X509Certificate[] certs) {
	        return true;
	    }
	
	    public boolean isClientTrusted(X509Certificate[] certs) {
	        return true;
	    }
	
	    public void checkServerTrusted(X509Certificate[] certs, String authType)
	            throws CertificateException {
	        return;
	    }
	
	    public void checkClientTrusted(X509Certificate[] certs, String authType)
	            throws CertificateException {
	        return;
	    }
	}

}

반응형
Posted by 질주하는구
,

배열을 임의로 빈값으로 보낼때 

반응형
Posted by 질주하는구
,

maven 사용시 plugin 관련 문제가 생기는 경우 jar 파일이 다운된 repository 하위의 파일을 삭제하고 다시 시도 하거나 maven>update project 를 해주면 정상적으로 jar파일이 다운로드 되고 clean, install 이 실행 됩니다.

반응형
Posted by 질주하는구
,

jdk1.6 버전까지 사용 가능한 패키지 이지만 jdk1.7 이상 사용시 rt.jar에서 해당 패키지를 찾지 못하는 에러가

발생 될 수 있기 때문에

ImageIO 를 이용한 구성으로 변경이 필요 합니다.

반응형
Posted by 질주하는구
,

StringUtils.countMatches("대상String","확인할String");


해당 클래스는 commons-lang 에 포함된 내용 입니다.

반응형
Posted by 질주하는구
,

sitemash를 이용해서 레이아웃을 구성하는 경우 간혹 서버의 인코딩 문제로 한글이 깨지는 경우가 생길수 있습니다. was의 영향을 받기도 하겠죠... 이 경우 

was의 dfile.encoding을 하면 한큐에 해결 되지만 그렇지 않고 간혹 예전 라이브러리 때문에 어쩔수 없이

인코딩을 변경 하지 못하는 경우 


response의 인코딩 부분을 filter를 이용해서 변경 해줘야 합니다.


import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;


public class CharsetEncodingFilter implements Filter{

private String encoding;

    protected FilterConfig filterConfig;


    public void init(FilterConfig filterConfig) throws ServletException {

        this.filterConfig = filterConfig;

        this.encoding = filterConfig.getInitParameter("encoding");

    }


    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        servletRequest.setCharacterEncoding(this.encoding);

        servletResponse.setContentType("text/html;charset=" + this.encoding);

        filterChain.doFilter(servletRequest, servletResponse);

    }


    public void destroy() {

        this.encoding = null;

        this.filterConfig = null;

    }

}


setCharacterEncoding 만으로는 완벽하지 않습니다. setContentType 이게 꼭 같이 들어가 줘야 합니다.


혹은 com.opensymphony.module.sitemesh.filter.PageFilter 를 오버라이딩 해서 


import javax.servlet.FilterChain;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;


import com.opensymphony.module.sitemesh.filter.PageFilter;


public class EncodingPageFilter extends PageFilter {


public EncodingConfigurableSiteMeshFilter() {

super();

}


@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws java.io.IOException, ServletException {

servletRequest.setCharacterEncoding("UTF-8");

servletResponse.setContentType("text/html;charset=UTF-8");

super.doFilter(servletRequest,servletResponse, filterChain);

}


web.xml의 sitemash가 바라보는 class를 해당 class로 변경 해주는 방법도 있습니다.
여기서 중요한건 

servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html;charset=UTF-8");


이 부분을 어딘가에서는 변경 해줘야 한다는 겁니다.

interceptor 설정으로는 동작 하지 않습니다. web.xml에서 필터 혹은 참조 class를 변경해서 처리 해줘야 합니다.

반응형
Posted by 질주하는구
,

아래의 소스 처럼 pdf를 만드는 소스를 작업 하게 되면 한글 및 css때문에 처리에 어려움이 있습니다.

css도 제약이 많아서 우선 아래와 같이 xml형식으로 처리 하는 경우 태그를 닫는건 잘 찾아서 처리 해줘야 합니다. 요즘에는 소스 코딩을 html5로 하니까... 태그를 안 닫는 경우가 많아 관련 부분 작업이 필요 합니다. 한글은 font파일로 해결 합니다.  

pdf.css
다운로드

 

public static void main(String[] args) throws Exception {
	// Document 생성
	Document document = new Document(PageSize.A4, 50, 50, 50, 50); // 용지 및 여백 설정
		  
	// PdfWriter 생성
	PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/테스트/test.pdf")); // 바로 다운로드.
	//PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
	writer.setInitialLeading(12.5f);
	  
	// Document 오픈
	document.open();
	XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
		  
	// CSS
	CSSResolver cssResolver = new StyleAttrCSSResolver();
	CssFile cssFile = helper.getCSS(new FileInputStream("D:/테스트/pdf.css"));
	cssResolver.addCss(cssFile);
		  
	// HTML, 폰트 설정
	XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
	fontProvider.register("D:/테스트/NanumGothic-Regular.ttf", "NanumGothic"); // MalgunGothic은 alias,
	CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
	  
	HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
	htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
	  
	// Pipelines
	PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
	HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
	CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
	  
	XMLWorker worker = new XMLWorker(css, true);
	XMLParser xmlParser = new XMLParser(worker, Charset.forName("UTF-8"));
	  
	String htmlStr = "html태그 여기에 작성해서 처리 한글이 처리 안되면 폰트가 안맞아서 그러는거니 아래 처럼 폰트를 임의로 수정";
	 
	htmlStr = htmlStr.replaceAll("<br>", "<br>");
	htmlStr = htmlStr.replaceAll("rgb\\(0, 0, 0\\);", "");
	htmlStr = htmlStr.replaceAll("font-family: 굴림;", "font-family: NanumGothic;");
	htmlStr = htmlStr.replaceAll("font-family: 굴림체;", "font-family: NanumGothic;");
	htmlStr = htmlStr.replaceAll("img src=\"/", "img src=\"http://xxxxxxxxxx/");
	htmlStr = htmlStr.replaceAll(".*","");
	 
	//이미지 태그 안닫힌 태그들 찾아서 닫는 작업 진행
	Pattern pattern  =  Pattern.compile("</p><img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>");
	Matcher match = pattern.matcher(htmlStr);
	while(match.find()){
		String imgTag   = match.group();
		String imgTag2  = imgTag.replaceAll(">", "/>");
		htmlStr             = htmlStr.replaceAll(imgTag, imgTag2);
	}
			Pattern pattern2  =  Pattern.compile("<col[^>]*style=[\"']?([^>\"']+)[\"']?[^>]*>");
			Matcher match2 = pattern2.matcher(dataContent);
			while(match2.find()){
				String colTag       = match2.group();
				String colTag2  = colTag.replaceAll(">", "/>");
				dataContent         = dataContent.replaceAll(colTag, colTag2);
			}
	StringReader strReader = new StringReader(htmlStr);
	xmlParser.parse(strReader);
	  
	document.close();

}
반응형
Posted by 질주하는구
,