'java'에 해당되는 글 28건

  1. 2012.06.12 Java : JSOUP 를 이용, html에서 소스, 링크경로 추출후 절대 경로로 바꾸기 2
  2. 2011.12.01 기본적인 Java 개발환경 구축하기( JDK 설치 + 이클립스 설치 ) 19
  3. 2011.11.28 java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction
  4. 2011.11.24 Java 에서 문자열 비교할때 equals() 말고 == (비교연산자) 로 비교하기 1
  5. 2011.11.24 Java에서 파일로 부터 데이터 읽어서 정렬(bubble sort)하기

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 개발환경 구축하기( JDK 설치 + 이클립스 설치 )

자바관련 커뮤니티를 살살 돌아다니다 보니까 의외로 이클립스같은 IDE 를 쓰지 않고 에딧트플러스나 울트라에딧트 같은 에디터로 개발을 하는 사람들이 있는것 같았다. 뭐 하긴 나도 자바 개발할때 에디트플러스 쓰다가 이클립스로 바뀌기 까지 무려 일년정도의 세월을 보내긴 했었다 -_-;

아무튼!, 요렇게 좋은 이클립스를 쓰지않고 매우매우 불편하게 개발을 하고 있는 사람들을 보면 요걸 꼭 써보라고 말을 해주고 싶지만 부끄러움을 많이 타서..


그래서 완전 쌩 기초편으로, JDK 설치부터 이클립스 설치후 전형적인 Hello 라는 문자열을 찍는 후로그램 작성까지 설명하는 포스트를 작성해 본다. 





먼저 자바개발의 제일 첫번째 시작은 JDK 를 설치하는 것이다. java.sun.com 사이트에가서 JDK 를 다운로드 받는다.

다운로드 페이지 : http://www.oracle.com/technetwork/java/javase/downloads/index.html


다운로드는 당연히 JDK 를 다운로드 받아야 한다. ※ JRE 는 단지 자바 프로그램을 실행할 수 있게 해주는 것이고, JDK 는 자바실행+자바로 개발을 할 수 있게 해주는것이다.


 뭐 대부분 윈도우 사용자겠지만 자신의 윈도우에 맞는 버전을 다운로드 받는다.
※ 32비트 윈도우 사용자는 Windows x86을 받으면 되고, 64비트 윈도우 사용자는 Windows x64 를 다운로드 받으면 된다.




 JDK 다운로드를 완료했으면 이제 설치를 하자. 설치 과정상에 주의할건 하나도 없고 일단 더블클릭후 계속 Next 만 해주면 설치가 끝난다.






JDK 설치가 완료됬으면 이제 에딧트플러스 대신 사용할 이클립스를 설치하면 된다.

다운로드 주소 : http://www.eclipse.org/downloads/

이클립스는 용도에 따라 여러가지 버전이 있는데 제일 무난한 Eclipse IDE for Java EE Developers 버전을 다운로드 받으면 된다. JDK 와 마찬가지로 자신의 윈도우 비트수에 맞는 버전을 다운로드 받으면 된다.



 이클립스 설치는 JDK 설치보다 더 간단하다. 그냥 설치하고 싶은 폴더에다 압축만 풀면 끝난다. -_-





 압축이 다 풀렸으면 이클립스 아이콘을 따블클릭해서 실행해 보자.

맨처음 실행하면 작업할 소스가 생성될 작업공간(폴더)를 선택하라고 하는데, 하고 싶은 폴더로 지정후 OK 버튼을 클릭하자.
(※Use this as the default and do not ask again 을 체크 해주면 다음에 실행할때 요런걸 묻는 창이 안뜨고 바로 실행된다. 계속 물어보면 귀찮으니까 체크해 주면 다음이 편해진다.)




 ※ 경우에 따라 이상한 에러를 뿍 뱉어 내면서 이클립이 실행이 안될 경우가 있다. 만약 실행이 안될때는 아래 관련 포스트를 보고 해결하길 바란다.



이클립스가 뿍 실행됬다. 웰컴~   웰컴은 무슨~ 그냥 닫으면 된다.



최초로 실행했을때 화면구성은 요래 되있는데 지금 딱히 필요없는 View 들은 과감하게 닫아버리자. 뭐 나중에 필요하면 추가하면 되니깐.


 필요한 것들만 남기고 싹 닫아 버리자.




음 이제 기본적인건 다끝났고 Hello 를 출력해 주는 후로그램을 이클립스로 만들어볼 차례다.
먼저 이클립스로 Java 프로그램을 맨들기 위해서는 프로젝트를 하나 생성해 줘야 한다.


File > New > Project



 Java 후로그램을 작성할거니깐 Java Project 선택



프로젝트에 대한 정보를 간단하게 입력한다. 프로젝트 이름은 MyProject 로, 이 프로젝트에서 사용할 JDK 버전을 바꾸고 싶다면 바꿔주고 Finish!




 Finish 하면 요런 창이 뜨는데 요렇게 체크한다음에 No 를 클릭해 주자. (Yes 클릭하면 화면 구성이 쫌 바껴버리는데 또 필요없는 View 이 생겨버려서 다시 끄기 귀찮다)




 MyProject 가 뽓 생성됬다.

 




Project 생성까지 다 했으니 이제 요 프로젝트에 드디어!! 클래스를 추가하고 코딩을 할 수 있게 됬다.

Project Explorer 에서 src 폴더 선택 후 마우스 오른쪽 버튼을 클릭 > New > Class 를 선택하자.




 만들 클래스에 대한 정보를 간단하게 입력하자. 패키지명은 필수가 아니기 때문에 필요없으면 안 넣어도 되고, 클래스명을 적당하게 지어주고~
public static void main(String[] args) 체크박스를 선택해 주면 클래스 생성시 main() 함수도 같이 맹글어준다.

 


 클래스가 뽓 맨들어 졌다.




 Hello 를 콘솔로 출력하는걸 맹그는게 최초 목적이였으니까 살짝 코딩해 주자.
※ 팁 : 소스코딩할때 sysou 요렇게만 타이핑 하고 Ctrl+Space 를 눌러보자. System.out.println() 을 자동으로 맹글어준다 -_-;;

※ 이클립스 인디고 버전은 한글폰트가 이상하게 후지게 나온다. 헬리오스 버전까지는 괜찮았는데, 아무튼 한글 폰트를 다시 깔쌈하게 바꾸는 것은 요 포스트를 참고하면된다.




이제 코딩을 다했으니 Ctrl+S 로 소스를 저장하고 요 클래스를 실행해볼 차례다.
Project Explorer 에서 FirstApp.java 를 선택하고 마우스 오른쪽 버튼 > Run As > Java Application 을 클릭해 보자.



 기대했던 Hello 가 콘솔창에 뽓 찍힌다.




※ 한번 후로그램을 실행하면 실행했던게 자동으로 등록되기 때문에 다음에 실행할때는 툴바에서 선택하면 편리하게 실행시킬 수 있다.



java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction



아침에 출근 했는데 갑자기 온 사방에서 내가 만든 시스템에 로그인이 안된다고 쌩 앙탈들을 부렸다.


svn 자동으로 소스를 체크아웃 받아서 maven 으로 배포를 시켜주는 스크립트를 작성해서 매일 새벽 5시에 자동으로 배포 시키도록 해 놨는데.

어떤 아이가 잘못된 소스를 커밋해 놔서 그게 같이 배포가 된줄 알고 로그를 찬찬히 살펴봤더니 그런 종료의 에러가 아니였다.



익셉션 로그를 보니  첨보는 에러인 

java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction(Ljava/sql/Connection;)Lorg/apache/ibatis/transaction/Transaction; 

요런 에러가 뽓 있었다.

대충 보니 mybatis 에서 나는 에러 같았다.




에러의 원인은 요랫다.

maven 디펜던시에 mybatis 최신 스냅샷 버전을 받도록 설정이 되 있어서, 최신 스냅샷 버전의 라이브러리로 바뀌는 바람에 나는 에러였다.

기존 mybatis 디펜던시 설정은 요랬다. 
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.1.0-SNAPSHOT</version>
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>1.0.3-SNAPSHOT</version>
</dependency>



요렇게 되 있는걸 릴리즈 버전을 쓰도록 요래 바꿔 주니깐 다시 잘 된다.
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.0.6</version>
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>1.0.2</version>
</dependency>



mybatis 는 살짝살짝 버그가 쫌 있어서 최신 버전을 쓰는게 좋다고 해서 그렇게 해 놨는데, 스냅샷 버전을 쓰는것은 지양해야 되겠다.

Java 에서 문자열 비교할때 equals() 말고 == (비교연산자) 로 비교하기


왠지 도움이 될것 같다면 추천을 *(-_-)*


오늘 이클립스에서 작업하다 스트링 객체 다음에 . 을 찍고 뭐 쓸만한게 없나 문득 살펴봤다.

왠지 늘 쓰던거만 쓰면 재미없지 않은가! 뭐 재미진 메소드가 없나 하는 요런 마음?


고러던 와중 그동안 즌혀 관심 1g 조차 없었던 intern() 이라는 메소드가 보였다.

이클립에서 뽓 튀어 나오는 설명을 대충 쪽 읽어보니 == 으로 스트링이 똑같은지 비교를 해주게 하는것 같았다.



뭐! 요런게 있었던 말이가! 하면서 요즘 나온 JAVA7 에 새로 추가된 메소드 인가 하고 API 를 찾아보니 JDK 1.3 부터도 있었던 메소드였다 -_-;;

아무튼 요 메소드를 쓸 일은 거의 1% 미만이지만 왠지 재미진것 같으니깐 알아는 둬야지

대충 요딴식으로 사용한다.
String a = new String("3269");
String b = new String("3269");

System.out.println(a == b);    // false

System.out.println(a.intern() == b);    // false

System.out.println(a.intern() == b.intern());    // true



음 막상 코드를 작성하고 나서 보니 "3269".equals(a); 가 훨씬 더 좋구나 라고 생각이 든다 -_-;  분명히 무슨 용도가 있기 때문에 맹근 메소드일껀데 아직까진 그 용도가 잘 파악이 안된다.


※ 비교연산자는 == 요것만 되는것 같다 < , > 요런건 안됨. 컴파일 에러남 

Java에서 파일로 부터 데이터 읽어서 정렬(bubble sort)하기


왠지 도움이 될것 같다면 추천을 *(-_-)*


학교에서 내주는 숙제용 소스코드이다.

자바 기본 라이브러리로 있는 ArrayList 와 Collections.sort() 를 이용하면

임시 배열에 읽었다가 복사하고 꾸리한 버블정렬을 할 필요없이 간결한 코드를 맹글 수 있지만, 이건 숙제용이니깐~

그래도 약간 배울만한 점은 Scanner 클래스의 새로운 발견이랄까?

Scanner 는 주로 System.in 에서 사용자로 부터 뭔가를 입력받는 용도로 많이들 쓸 건데,

여기서는 File 에서 데이터를 읽는 용도로 썼다. InputStream 이나 Reader 계열로 뭔가를 읽는 코드보다 간결해서 좋은것 같다.

요거는 앞으로 Stream 에서 뭔가를 읽고 싶을때 어째 잘 써먹도록 해야 겠다. 




소스코드
import java.io.File;
import java.util.Scanner;

public class FileSort {
	public static void main(String[] args) throws Exception {
		Scanner scan = new Scanner(new File("c:\\numbers.dat"));

		float[] arr = new float[100];
		int cnt = 0;

		// numbers.dat 파일읽기
		while (scan.hasNext()) {
			arr[cnt++] = scan.nextFloat();
		}

		// 읽혀진 숫자 갯수만큼 배열을 생성해서 복사
		float[] numbers = new float[cnt];
		System.arraycopy(arr, 0, numbers, 0, cnt);

		// 버블정렬
		bubbleSort(numbers);

		// 배열 출력
		for (float num : numbers) {
			System.out.println(num);
		}
	}

	// 내림차순 버블 소트
	public static void bubbleSort(float[] arr) {
		int n = arr.length;
		for (int pass = 1; pass < n; pass++) {
			for (int i = 0; i < n - pass; i++) {
				if (arr[i] < arr[i + 1]) {
					float temp = arr[i];
					arr[i] = arr[i + 1];
					arr[i + 1] = temp;
				}
			}
		}
	}
}


내림차순으로 바꾸고 싶을때는 if (arr[i] < arr[i + 1]) 요기에서 요렇게 부등호 방향만 바꿔주면 된다. if (arr[i] > arr[i + 1]) {


사용된 numbers.dat 파일


prev 1 2 3 4 ··· 6 next