'Java'에 해당되는 글 26건

  1. 2017.09.13 JSON 문자열을 Map 으로 변환하기(Jackson 사용)
  2. 2014.05.29 Apache Commons HttpClient 3.x 로 Http 서버에 파일 전송하기
  3. 2014.03.05 Apache HttpComponents 파일전송 예제 5
  4. 2012.06.12 Java : JSOUP 를 이용, html에서 소스, 링크경로 추출후 절대 경로로 바꾸기 2
  5. 2012.05.31 Java 정규표현식으로 문자열 중에서 ip 문자열을 배열로 추출하기

JSON 문자열을 Map 으로 변환하기(Jackson 사용)


https://gturnquist-quoters.cfapps.io/api/random 여기에 있는 JSON을 읽어서 Map 으로 변환하고 이것저것 더 해보기


브라우저에서 위 URL 로 접속해 보면 JSON 문자열을 다음과 같다.

{
   type: "success",
   value: {
      id: 10,
      quote: "Really loving Spring Boot, makes stand alone Spring apps easy."
   }
}



요것을 처리하는 예제 코드

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTest {
	public static void main(String[] args)
            throws JsonParseException, JsonMappingException, MalformedURLException, IOException {

        ObjectMapper mapper = new ObjectMapper();

        // URL 에 있는 JSON String 을 Map으로 변환하기
        Map<String, Object> data = mapper.readValue(
                     new URL("https://gturnquist-quoters.cfapps.io/api/random"), 
                     new TypeReference<Map<String,Object>>(){});




        // {type=success, value={id=9, quote=So easy it is to switch container in #springboot.}}
        System.out.println(data);

        // {id=9, quote=So easy it is to switch container in #springboot.}
        System.out.println(data.get("value"));






        // Map을 JSON String 으로 변환
        // {"type":"success","value":{"id":9,"quote":"So easy it is to switch container in #springboot."}}
        System.out.println(mapper.writeValueAsString(data));


        // Map을 보기쉬운 JSON String 으로 변환
        /*
           {
              "type" : "success",
              "value" : {
                "id" : 9,
                "quote" : "So easy it is to switch container in #springboot."
              }
           }
        */
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(data));
    }
}


Apache Commons HttpClient 3.x 로 Http 서버에 파일 전송하기


저번에 썼던 포스트에서는 Apache HttpComponents 를 이용해서 파일전송 예제를 맹글어 봤었는데.


요번에는 Apache Commons HttpClient 를 이용해서 파일전송 예제를 맹글어 보았다.



정확하게는 모르지만 왠지 내가 알기론 Apache Commons HttpClient 후로젝트가 Apache HttpComponents 로 바뀐것 같다.


그러니까 최신 API 는 아마 Apache HttpComponents 이겠지...



그런데 왜 굳이 옛날 API 로 예제를 맹글게 되었을까..?


피치못할 사정으로 JDK 1.4 기반에서 동작하도록 해야했기 때문이다 -.-




나 같은 저주 받은 개발환경이 아닌 사람들은 이전에 썼던 포스트를 참고해서 고거 쓰면 된다.


뭐 아무튼 예제 소스는 요럿다.

package com.tistory.stove99;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.lang.StringEscapeUtils;


public class Http {
	private static final String DEFAULT_ENCODING = "UTF-8";
	
	private String url;
	private String encoding;
	private Map param;
	
	
	public Http(String url){
		this(url, null);
	}
	
	public Http(String url, String encoding){
		this.encoding = encoding==null ? DEFAULT_ENCODING : encoding;
		this.url = url;
		
		param = new HashMap();
	}
	
	/**
	 * Http 전송
	 * @return
	 */
	public String submit(){
		String result = null;
		
		HttpClient client = new HttpClient();
		PostMethod method = new PostMethod (url);

		try{
			Part[] parts = new Part[param.size()];
			Iterator it = param.keySet().iterator();
			int index = 0;
			while( it.hasNext() ){
				String key = (String)it.next();
				Object value = param.get(key);
				
				if( value instanceof File ){
					// 한글 파일명이 쪽바로 처리가 안되서 StringEscapeUtils 썻음.
					// 받는 쪽에서는 StringEscapeUtils.unescapeHtml() 로 다시 변환바람.
					parts[index++] = new FilePart(
											key, 
											StringEscapeUtils.escapeHtml(((File)value).getName()), 
											(File)value, 
											null, 
											encoding);
				}else{
					parts[index++] = new StringPart(key, (String)value, encoding);
				}
			}
			method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
			
			client.executeMethod(method);
			
			// read result
			BufferedReader br = new BufferedReader(
										new InputStreamReader(method.getResponseBodyAsStream(), encoding));
			String buffer = null;
			StringBuffer tmp = new StringBuffer();
			
			while( (buffer=br.readLine())!=null ){
				tmp.append(buffer).append("\r\n");
			}
			
			result = tmp.toString();
		}catch (HttpException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			method.releaseConnection();
		}
		
		return result;
	}
	
	/**
	 * 일반 파라메터 추가
	 * @param name  파라메터 이름
	 * @param value 값
	 * @return
	 */
	public Http addParam(String name, String value){
		param.put(name, value);
		
		return this;
	}
	
	/**
	 * 업로드할 파일을 파라메터로 추가
	 * @param name  <input type="file" name="요기들어가는 값"/>
	 * @param file
	 * @return
	 */
	public Http addParam(String name, File file){
		param.put(name, file);
		
		return this;
	}
	
	
	/**
	 * 테스트
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Http http = new Http("http://127.0.0.1:8888/rpm/alarm/receive.kins");
		String result = http.addParam("test", "테스트다1")
							.addParam("test1", "테스트다2")
							.addParam("upload_file1", new File("d:\\야훗훗 유지보수.xlsx"))
							.addParam("upload_file2", new File("d:\\휴가신청서.hwp"))
							.submit();
		
		System.out.println("result : " + result);
	}
}



Maven Dependency

	<dependency>
		<groupId>commons-lang</groupId>
		<artifactId>commons-lang</artifactId>
		<version>2.6</version>
	</dependency>
	<dependency>
		<groupId>commons-httpclient</groupId>
		<artifactId>commons-httpclient</artifactId>
		<version>3.1</version>
	</dependency>



Maven 안쓸때 필요한 라이브러리 따운

library.zip


Apache HttpComponents 파일전송 예제


최근에 Http 를 이용해서 간단히 파일전송이랑 이것저것 구현해야 되는 프로젝트를 했다. 


요런것들을 구현할때 딱 좋은 것들 중 하나는 Apache HttpComponents 이다.




라이브러리 같은거는 최신버전을 쓰고 싶다는 이상 야릇한 고집같은게 있어서 최신버전이 뭔가~ 하고 간만에 Apache HttpComponents 프로젝트 사이트에 가 보았다.


가보니 최신버전이 4.3.2 였다.



4.3.2 버전을 maven dependency 에 추가하고 예전에 썼던 글(Apache HttpComponents를 이용한 GET, POST 요청하기)을 참고해서 클래스를 하나 맹글었다.


그런데 라이브러리가 이것저것 변경이 많이 됐는지 deprecate 된 메소드가 무지 많은것 같이 느껴졌다.



그래서 사이트에서 제공하는 예제를 바탕으로 아예 4.3.2 에 맞게 클래스를 새로 하나 맹글었다.



먼저 maven 사용하는 사람들은 요런 디펜던시를 추가해 주고

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.3.2</version>
</dependency>

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpmime</artifactId>
	<version>4.3.2</version>
</dependency>



기냥 쌩으로 하는 사람들은 httpclient-4.3.2.jar, httpcore-4.3.1.jar, httpmime-4.3.2.jar 를 클래스패스에 추가해 주면 된다.




Apache HttpComponents 4.3.2 를 이용한 HTTP 파일전송하기 샘플

package com.tistory.stove99;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class Http {
	private static final String DEFAULT_ENCODING = "UTF-8";
	
	private String url;
	private MultipartEntityBuilder params;
	
	/**
	 * @param url 접속할 url
	 */
	public Http(String url){
		this.url = url;
		
		params = MultipartEntityBuilder.create();
	}
	
	/**
	 * Map 으로 한꺼번에 파라메터 훅 추가하는 메소드
	 * @param param 파라메터들이 담긴 맵, 파라메터들은 UTF-8로 인코딩 됨
	 * @return
	 */
	public Http addParam(Map<String, Object> param){
		return addParam(param, DEFAULT_ENCODING);
	}
	
	/**
	 * Map 으로 한꺼번에 파라메터 훅 추가하는 메소드
	 * @param param 파라메터들이 담긴 맵
	 * @param encoding 파라메터 encoding charset
	 * @return
	 */
	public Http addParam(Map<String, Object> param, String encoding){
		for( Map.Entry<String, Object> e : param.entrySet() ){
			if (e.getValue() instanceof File) {
				addParam(e.getKey(), (File)e.getValue(), encoding);
			}else{
				addParam(e.getKey(), (String)e.getValue(), encoding);
			}
		}
		return this;
	}
	
	/**
	 * 문자열 파라메터를 추가한다.
	 * @param name 추가할 파라메터 이름
	 * @param value 파라메터 값
	 * @return
	 */
	public Http addParam(String name, String value){
		return addParam(name, value, DEFAULT_ENCODING);
	}
	
	public Http addParam(String name, String value, String encoding){
		params.addPart(name, new StringBody(value, ContentType.create("text/plain", encoding)));
		
		return this;
	}
	
	/**
	 * 업로드할 파일 파라메터를 추가한다.
	 * @param name
	 * @param file
	 * @return
	 */
	public Http addParam(String name, File file){
		return addParam(name, file, DEFAULT_ENCODING);
	}
	
	public Http addParam(String name, File file, String encoding){
		if( file.exists() ){
			try{
				params.addPart(
						name, 
						new FileBody(file, ContentType.create("application/octet-stream"),
						URLEncoder.encode(file.getName(), encoding)));
			}catch( Exception ex ){ ex.printStackTrace(); }
			
		}
		
		return this;
	}

	/**
	 * 타겟 URL 로 POST 요청을 보낸다.
	 * @return 요청결과
	 * @throws Exception
	 */
	public String submit() throws Exception{
		CloseableHttpClient http = HttpClients.createDefault();
		StringBuffer result = new StringBuffer();
		
		try{
			HttpPost post = new HttpPost(url);
			post.setEntity(params.build());
			
			CloseableHttpResponse response = http.execute(post);
			
			try{
				HttpEntity res = response.getEntity();
				BufferedReader br = new BufferedReader(
									new InputStreamReader(res.getContent(), Charset.forName("UTF-8")));
				
				String buffer = null;
				while( (buffer=br.readLine())!=null ){
					result.append(buffer).append("\r\n");
				}
			}finally{
				response.close();
			}
		}finally{
			http.close();
		}

		return result.toString();
	}
	
	
	/**
	 * 테스트
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Http http = new Http("http://127.0.0.1:8888/receiver.jsp");
		
		http.addParam("test", "문자열 파라메터 테스트다!")
			.addParam("upload_file1", new File("d:\\첨부파일1.hwp"))
			.addParam("upload_file2", new File("d:\\첨부파일2.jpg"))
			.submit();
	}
}


Spring @MVC 로 receiver 쪽을 대충 요렇게 구현하면 될것 같다.

	@RequestMapping
	public void receiver(
			@RequestParam("upload_file1") MultipartFile file1, 
			@RequestParam("upload_file2") MultipartFile file2){
		System.out.println("upload_file1 : " + file1.getOriginalFilename());
		System.out.println("upload_file2 : " + file1.getOriginalFilename());
		
		File upDir = new File("c:\\upfile\\");
		try {
			file1.transferTo(new File(upDir, file1.getOriginalFilename()));
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


Java : JSOUP 를 이용, html에서 소스, 링크경로 추출후 절대 경로로 바꾸기



Java 라이브러리 중에 JSOUP 라고 심플하면서도 왠지 간지나는 HTML 문서를 다루는 라이브러리가 있다.


요 라이브러리를 이용해 HTML 문서에서 각종 경로를 추출해서 요 경로를 절대 경로로 바꿔보자.


먼저 테스트할 html 문서

<html>
<head>
	<title>테스트다!!</title>

	<script type="text/javascript" src="/resource/js/jquery-1.7.1.min.js"></script>

	<link type="text/css" href="/resource/css/admin/general.css" rel="stylesheet" />
</head>

<body>
<span id="navi">
	<img src="http://www.naver.com/resource/image/stitle_standarda.gif" alt="" />
</span>

테스트다!!
</body>
</html>



테스트 소스

import java.io.IOException;
import java.net.URL;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class Test  {
	public static void main(final String[] args) throws IOException{
		Document doc = Jsoup.parse(
				new URL("http://127.0.0.1:8080/index.html").openConnection().getInputStream(), 
				"UTF-8", 
				"http://127.0.0.1:8080/");
		
		// src attribute 가 있는 엘리먼트들을 선택
		Elements elems = doc.select("[src]");
		for( Element elem : elems ){
			if( !elem.attr("src").equals(elem.attr("abs:src")) ){
				elem.attr("src", elem.attr("abs:src"));
			}
		}
		
		// href attribute 가 있는 엘리먼트들을 선택 
		elems = doc.select("[href]");
		for( Element elem : elems ){
			if( !elem.attr("href").equals(elem.attr("abs:href")) ){
				elem.attr("href", elem.attr("abs:href"));
			}
		}
		
		System.out.println(doc.toString());
	}
}



변환된 html 문서

<html>
<head>
	<title>테스트다!!</title>
	<script type="text/javascript" src="http://127.0.0.1:8080/resource/js/jquery-1.7.1.min.js"></script>
	<link type="text/css" href="http://127.0.0.1:8080/resource/css/admin/general.css" rel="stylesheet" />
</head>
<body>
	<span id="navi"> <img src="http://www.naver.com/resource/image/stitle_standarda.gif" alt="" /></span> 
	테스트다!!
</body>
</html>




JSOUP 사이트 : http://jsoup.org/


Maven Dependency

<dependency>
	<groupId>org.jsoup</groupId>
	<artifactId>jsoup</artifactId>
	<version>1.6.3</version>
</dependency>



뭐 이것 외에도 JSOUP 를 이용하면 HTML뿐만 아니라 XML 도 쉽게 다룰수 있다.


JQuery 에서 css 셀렉터를 써서 엘리먼트를 가져와서 쪼물닥 거리는 것과 비슷하게 xml 문서를 쉽게 파싱해서 땡겨다 쓸수 있다.


저번에 얼핏 말했던 xpath 를 이용해서 쪼물딱 거리는것 보다 개인적으로 훨씬 좋은것 같다.


JQuery 써본 사람들은 금방 쉽게 대충 파악해서 쓸 수 있다. 고건 시간되면 다음 기회에~

Java 정규표현식으로 문자열 중에서 ip 문자열을 배열로 추출하기



저번에는 Javascript 정규표현식으로 IP 문자열을 추출하는걸 해 봤는데 이번에는 Java 로 바꿔서 해 보았다.


소스

public static String[] getIp(String str){
	Pattern p = 
       Pattern.compile("((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})");
	Matcher m = p.matcher(str);

	StringBuffer sb = new StringBuffer();
	while(m.find()){
		sb.append(m.group()+ " ");
	}
    
	return m.reset().find() ? sb.toString().split(" ") : new String[0];
}



prev 1 2 3 4 ··· 6 next