프로젝트 생성 후 WEB-INF 내에 web.xml 파일이 없는 경우가 있다.

직접 파일을 생성해서 내용을 써도 되나, 자동으로 생성하는 방법이 있다.

Project Explorer나 Navigator에서 해당 프로젝트에 마우스 우 클릭하여 아래와 같이 선택하면 자동으로 생성된다.

Java EE Tools -> Generate Deployment Descriptor Stub

 

 

 

 

Posted by 후니아부지
:

프리단가 계산

2014. 2. 26. 15:51 |

경력을 만으로 입력하고 기타 설정 후 계산 버튼을 누르면 단가 계산된다. 


링크: http://techknowdger.blogspot.kr/2014/02/blog-post_16.html


※ 옥희 as1님의 계산식을 사용하여 만든 계산식 페이지

※ 글 작성일이 2011년임. 현재 단가와는 다를 수 있음



Posted by 후니아부지
:

[Servlet] MVC 패턴

앎/web 2014. 2. 26. 15:47 |
  • Model

데이터를 담거나 DB로 데이터를 보내는 작업을 하는 객체를 말한다.

View 상의 사용자 입력을 담아 가지고 있는 역할을 하며, Controller에서 상태 변화를 알려주면 자기자신의 상태를 변경하여 View에게 알려주는 역할을 한다. 

DTO를 통해 상태를 주고 받으며 DB와의 데이터 통신을 위해 DAO를 사용한다.


  • View

Model을 화면상에 보여주는 부분을 말한다. 

Model의 변화된 상태를 가져와서 보여준다.

View에서의 데이터 입력을 Controller에 전달한다. 

Controller가 선택한 View를 보여준다.


  • Controller

Model과 View간의 데이터 전달 및 결과에 대한 View를 선택하여 응답하는 역할을 한다.


 

MVC 구조 활용 예시

사용자 등록하는 기능 구현해본다.

0. 사용자 정보를 관리하기 위한 DB 테이블을 생성한다.


1. 사용자 등록을 위한 html 페이지를 작성한다. (View)

MVC_Test_Register.htm


2. 사용자 페이지에서 넘어오는 데이터 저장을 위한 DTO 클래스를 작성한다. (Model)

MVC_Test_MemberDTO.java


3. DTO에 저장된 데이터를 DB로 저장하는 작업을 하는 DAO 클래스를 작성한다. (Model)

MVC_Test_MemberDAO.java


4. 사용자 페이지에서 넘어온 데이터를 DTO에 넣고 DAO 클래스의 관련 메서드에 전송하는 작업을 하고, 그 작업 결과에 따라 이동할 페이지를 결정하는 클래스를 작성한다. (Controller)

MVC_Test_MemberProcess.java


5. 서블릿 정보를 등록한다.

web.xml


6. 처리 결과에 따른 뷰 페이지를 작성한다. (View)

MVC_Test_Success.htm

 

MVC_Test_Failure.htm

서버에 올려 확인해보자.

 

MVC_Test.rar


 

Posted by 후니아부지
:

JDBC를 이용해 데이터를 가져올 때 아래와 같은 오류가 발생하는 경우가 있다. 

....: Column Index out of range, 0 < 1.

내 경우, 이유는 ResultSet을 가져올 때 아래처럼 컬럼 인덱스를 잘못 지정해서 그런 거였다.

while(rs.next()) {
    int a = rs.getInt(0);
    int b = rs.getString(1);
    ....
}

컬럼의 인덱스는 1부터 시작하는데 0으로 써서 문제가 되었던 것이었다.

참고: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getInt(int)



Posted by 후니아부지
:

MySQL Installer를 사용하여 설치 시 다음과 같이 라이센스 변경에 관한 팝업이 나타날 수 있다.


commuinity edition을 설치하는데 팝업 내용은 commercial edition을 설치해줘서 고맙단다. -_-;;;;

아무튼, GPL인 MySQL 제품이 설치된 것으로 나오니 commercial edition을 설치(community edition 이라니깐!!!!)하려면 

GPL 제품을  Commercial 라이선스로 변환해야 한다고 한다.


예(Y)를 클릭할 경우, installer에 변환에 필요한 파일이 없다고 하면서 끝~


아니요(N)를 클릭할 경우, 그냥 설치 끝~


어쩌라고.....



해결 방법은 시스템에 설치된 MySQL 제품을 모두 지우고 다시 installer를 실행하면 된다.


나의 경우, MySQL Connector를 먼저 설치했었다. 

그래서 이를 제거하고 다시 설치하니 정상적으로 설치가 진행되었다.


끝~




 


Posted by 후니아부지
:

1. 블로그 검색에 블로그 추가

http://blogsearch.google.co.kr/ping

 

블로그 주소를 입력하고 블로그 전송을 클릭한다.

 

 

2. 구글 웹마스터에 블로그 등록

https://www.google.com/webmasters/

웹마스터 도구에 로그인 클릭

블로그 주소를 입력한다. 

 

소유자의 블로그가 맞는지 확인하는 절차이다.

아래에 나온 메타 태그를 html 파일의 head 섹션에 붙여 넣는다. 

블로그 적용 후 아래 확인 버튼을 클릭한다.

 

소유자 확인이 되면 아래와 같은 문구가 출력된다.

 

웹마스터 도구의 홈 화면이 나타나면 방금 추가한 블로그가 나타나게 된다.

화면 오른쪽에 사이트 추가 버튼으로 다른 웹사이트(블로그)도 등록할 수 있다.

등록 방법은 동일하다.

 

Posted by 후니아부지
:

객체의 입출력은 스트림 기반이다.

객체의 입출력에는 직렬화가 필요하다. 이를 위해 java.io.Serializable 이라는 인터페이스를 사용한다.

사용할 객체의 클래스 선언부에 'implements Serializable'를 쓰면된다.

class 클래스명 implements Serializable {
....
}


유형별 객체 출력

FIle

File f = new File("파일이름");
FileOutputStream fos = new FileOutputStream(f, true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
\


유형별 객체 입력

FIle

File f = new File("./object_io_test.txt");
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream ois = new ObjectInputStream(bis);


예제)

테스트 객체

import java.io.*;

public class TestClass1 implements Serializable {
	private byte a;
	private int b;
	private float c;
	private String d;
	
	public byte getA() {
		return a;
	}
	public void setA(byte a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	public float getC() {
		return c;
	}
	public void setC(float c) {
		this.c = c;
	}
	public String getD() {
		return d;
	}
	public void setD(String d) {
		this.d = d;
	}
	
	public String toString() {
		return this.a + " / " + this.b + " / " + this.c + " / " + this.d;
	}
}


출력

import java.io.*;

public class ObjectOutputTest {
	public static void main(String[] ar) {
		try {
			File f = new File("./object_io_test.txt");
			FileOutputStream fos = new FileOutputStream(f, true);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			ObjectOutputStream oos = new ObjectOutputStream(bos);
			
			TestClass1 tc1 = new TestClass1();
			
			tc1.setA((byte)97);
			tc1.setB(18);
			tc1.setC(12.8f);
			tc1.setD("test1");
			
			TestClass1 tc2 = new TestClass1();
			
			tc2.setA((byte)98);
			tc2.setB(28);
			tc2.setC(22.8f);
			tc2.setD("test2");
			
			oos.writeObject(tc1);
			oos.writeObject(tc2);
			oos.close();
			
			
		} catch (Exception ex) {			
		}
	}
}


입력

import java.io.*;

public class ObjectInputTest {
	public static void main(String[] ar) {
		try {
			File f = new File("./object_io_test.txt");
			FileInputStream fis = new FileInputStream(f);
			BufferedInputStream bis = new BufferedInputStream(fis);
			ObjectInputStream ois = new ObjectInputStream(bis);
			
			TestClass1 tc1 = (TestClass1)ois.readObject();
			TestClass1 tc2 = (TestClass1)ois.readObject();
			
			ois.close();
			
			System.out.println("tc1: " + tc1.toString());
			System.out.println("tc2: " + tc2.toString());
			
		} catch (Exception ex) {
		}
	}
}


객체를 파일로 출력 후 입력 테스트를 해보면 다음과 같이 읽힐 것이다.


Posted by 후니아부지
:

텍스트 스트림은 2 Byte 문자 체계를 가진 텍스트의 입출력에 사용한다.


형식별 2 Byte 출력

Console

OutputStreamWriter osw = new OutputStreamWriter(System.out);
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw);
pw.println(....);


File

File f = new File("파일이름");
FileWriter fw = new FileWriter(f, true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
pw.println(....);

Network

Socket soc = new Socket(.....);
OutputStreamWriter osw = new OutputStreamWriter(soc.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw);
pw.println(....);


예제)

import java.io.*;

public class Text_IO_Output_test {
	public static void main(String[] ar) {
		try {
			/* 콘솔 출력 
			OutputStreamWriter osw = new OutputStreamWriter(System.out);
			BufferedWriter bw = new BufferedWriter(osw);
			PrintWriter pw = new PrintWriter(bw);
			*/
			
			File f = new File("./text_io_test.txt");
			FileWriter fw = new FileWriter(f, true);
			BufferedWriter bw = new BufferedWriter(fw);
			PrintWriter pw = new PrintWriter(bw);

			pw.println("Text I/O Output Test!");
			pw.close();			
		} catch (Exception ex) {}
	} 
}


형식별 2 Byte 입력

Console

InputStreamReader isr = new InputStreamReader (System.in);
BufferedReader br = new BufferedReader(isr);
br.readLine();


File

File f = new File("파일이름");
FileReader fr = new FileReader(f, true);
BufferedReader br = new BufferedReader(fr);
br.readLine();

Network

Socket soc = new Socket(.....);
InputStreamReader isr = new InputStreamReader(soc.getInputStream());
BufferedReader br = new BufferedReader(isr);
br.readLine();


예제)

import java.io.*;

public class Text_IO_Input_test {
	public static void main(String[] ar) {
		try {
			/* 콘솔 입력
			InputStreamReader isr = new InputStreamReader(System.in);
			BufferedReader br = new BufferedReader(isr);
			
			System.out.print("뭐든 써봐: ");
			String str = br.readLine();
			System.out.println("내용:");
			System.out.print(str);
			*/
			
                        // 파일 입력 
			File f = new File("./text_io_test.txt");
			FileReader fr = new FileReader(f);
			BufferedReader br = new BufferedReader(fr);
			
			System.out.println("읽은내용:");
			while(true) {
				String str = br.readLine();
				if (str == null) break;
				System.out.println(str);
			}
			
			br.close();
			
		} catch (Exception e) {
			
		}
	}
}

Posted by 후니아부지
:

자바 입출력은 하나의 형식으로 콘솔, 파일, 네트워크 등 모든 입출력에 사용할 수 있다.

입출력 방식이 스트림(Stream)이냐 텍스트(Text)냐의 차이이다.


자바는 입출력을 스트림에 의존한다. 모든 입출력이 1 Byte의 데이터 흐름으로 여겨진다.


형식별 1 Byte 출력

Console

FileOutputStream fos = new FileOutputStream(FileDescriptor.out);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
DataOutputStream dos = new DataOutputStream(bos);
dos.write(.....)

File

File file = new File("파일이름");
FileOutputStream fos = new FileOutputStream(file, false);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
DataOutputStream dos = new DataOutputStream(bos);
dos.write(.....)

Network

Socket soc = new Socket(.....);
BufferedOutputStream bos = new BufferedOutputStream(soc.getOutputStream(), 1024);
DataOutputStream dos = new DataOutputStream(bos);
dos.write(.....)

예제)

import java.io.*; // 입출력을 위해 I/O 패키지 추가 public class IO_Output_Test { public static void main(String[] ar) { try { /* 콘솔에 대한 출력 FileOutputStream fos = new FileOutputStream(FileDescriptor.out); BufferedOutputStream bos = new BufferedOutputStream(fos, 1024); */ // 파일에 대한 출력 File f = new File("./stream_io_test.txt"); FileOutputStream fos = new FileOutputStream(f, true); BufferedOutputStream bos = new BufferedOutputStream(fos, 1024); DataOutputStream dos = new DataOutputStream(bos); byte[] str = new byte[]{(byte)'C', (byte)'o', (byte)'n' , (byte)'s', (byte)'o', (byte)'l', (byte)'e', (byte)' '}; dos.write(str); dos.flush(); dos.close(); } catch (Exception ex) {} } }



형식별 1 Byte 입력

Console

FileInputStream fis = new FileInputStream(FileDescriptor.in);
BufferedInputStream bis = new BufferedInputStream(fis, 1024);
DataInputStream dis = new DataInputStream(bis);
dis.read();

File

File file = new File("파일이름");
FileInputStream fis = new FileInputStream(file, false);
BufferedInputStream bis = new BufferedInputStream(fis, 1024);
DataInputStream dis = new DataInputStream(bis);
dis.read();

Network

Socket soc = new Socket(.....);
BufferedInputStream bis = new BufferedInputStream(soc.getInputStream(), 1024);
DataInputStream dis = new DataInputStream(bis);
dis.read();

예제)

import java.io.*;

public class IO_Input_Test {
	public static void main(String[] arg){
		try {
			/* 콘솔 입력
			FileInputStream fis = new FileInputStream(FileDescriptor.in);
			BufferedInputStream bis = new BufferedInputStream(fis, 1024);
			DataInputStream dis = new DataInputStream(bis);
			
			System.out.print("입력: ");
			int x = dis.read();
			System.out.println("입력된 데이터는 " + (char)x + "이다.");
			dis.close();
			*/

                        // 파일 입력
			File f = new File("./stream_io_test.txt");
			FileInputStream fis = new FileInputStream(f);
			BufferedInputStream bis = new BufferedInputStream(fis, 1024);
			DataInputStream dis = new DataInputStream(bis);
			
			while(true) {
				int x = dis.read();
				if (x<0) break;
				System.out.print((char)x);
			}
			
			dis.close();
		} catch (Exception e) {}
	}

}


Posted by 후니아부지
:

가끔 영문 주소가 필요한 경우가 있는데 이를 변환하는 방법을 알아보자.


주소 확인을 위한 전용 사이트(도로명주소 안내시스템)나 네이버, 다음과 같은 포털에서 검색을 해도 된다.


※ 현재(2014-02-20) '도로명주소 안내시스템'과 '네이버'는 도로명주소에 대한 영문주소만,

    '다음'은 지번, 도로명주소 모두 영문주소 변환을 제공한다.


두 경우 모두를 지원하는 다음에서 검색을 해보겠다.

검색 창에서 '영문주소변환' 이라는 키워드로 검색을 하면 다음과 같이 주소를 입력하는 화면이 나온다.


직접 주소를 입력하고 검색 버튼을 누르면 해당 주소가 변환되어 나타날 것이다.


또는 검색창에 '주소' + '영문주소' 형태로 검색을 해도 동일한 결과가 나온다.


지번, 도로명 주소 모두 잘 변환되어 나타난다.


그러나 아파트의 동, 호수와 같은 세부 내용까지는 변환할 수 없다.

이는 직접 바꿔야하는데 아파트, 건물, 다세대주택 등과 같이 여러 형태의 건물에 따라 표기 방법이 조금씩 다르다.


1. 아파트

아파트의 이름까지 변환된다면 동, 호수만 쓰면되는데

예를 들어, 101동 201호의 경우 101-#201 처럼 쓰면 된다.


아파트 이름이 나오지 않는 경우는 발음나는대로(주소를 읽는 사람이 알아볼 수 있을정도) 써주고 Apt 를 붙이면 되겠다.


특정 주소로 전체 주소를 적어보면 

김해시 관동동 부영e그린9차아파트 101동 201호 일 경우에 주소 변환을 하면 다음과 같이 나온다.


세부 주소까지 변환하면 아래와 같다.

101-#201, Buyeong e-green 9-cha Apt., Gwandong-dong, Gimhae-si, Gyeongsangnam-do, Korea



2. 다세대 주택, 빌라 등

지번으로 조회했을 경우 우편번호를 기준으로 특정 범위의 지번이 표시된다.

위 빨간 영역에 해당 지번을 쓰면 된다. 

도로명주소의 경우 '***길 25-6' 이런 형태을 것인데, 25-6을 위 빨간 영역에 쓰면 된다.

빌라 이름이 있다면 지번 앞에 써주면 되겠다. 주소를 읽을 상대방이 읽기 쉽도록 쓸 것!!

호실의 경우는 아파트와 마찮가지로 #을 붙이면 된다.

경상남도 창원시 의창구 서상동 54-7번지 땡땡빌라 202호
#202, ddang-ddang-villa ,54-7 ,Seosang-dong, Uichang-gu, Changwon-si, Gyeongsangnam-do, Korea


3. 단독주택
2번 예에서 지번까지만 쓰면 된다.

경남 창원시 마산회원구 양덕1동 5-1번지
5-1, Yangdeok 1(il)-dong, Masanhoewon-gu, Changwon-si, Gyeongsangnam-do, Korea


4. 빌딩, 사무실
2번의 빌라 이름이 있는 경우와 유사하다.
다만 건물 이름 앞에 층수를 써주면 된다. 2층 -> 2F

경남 창원시 마산회원구 양덕1동 땡땡빌딩 3층 304호
#304, 3F ddang-ddang-building, Yangdeok 1(il)-dong, Masanhoewon-gu, Changwon-si, Gyeongsangnam-do, Korea



※ 참고로 우편번호는 우리나라에서 쓰는 체계 그대로 사용하면 된다.
123-456





Posted by 후니아부지
: