1. 소켓 (Socket)

- TCP 프로토콜을 사용하여 통신을 하는데 쓰임(TCP의 기본 : IP / Port 번호가 필요)

- 네트워크 상에서 서버, 클라이언트 두 개의 프로그램이 특정 포트를 통해 양방향 통신이 간으하도록 만들어주는 소프트웨어 장치.

- java.net에서 ServerSocket 클래스(서버측)와 Socket 클래스(서버측 + 클라이언트측)를 이용하여 서버와 클라이언트 간의 통신을 가능하게 만듦.

- 자바 채팅 프로그램의 기초는 서버 - 클라이언트 간의 연결이 가능해야 하는데, 소켓 프로그래밍으로 가능함(하나의 서버에 여러 개의 클라이언트가 접속하는 멀티 클라이언트 채팅 프로그램도 가능).

 

* IP : 컴퓨터마다 가지고 있는 고유의 주소

  port : 통신을 위한 연결 라인

 

 

2. 자바 소켓 프로그래밍 (TCP)

- 소켓 프로그래밍 중의 하나. 스트림 통신 프로토콜.

- 연결 지향 프로토콜 : 양 쪽의 소켓이 연결된 상태여야 함.

- 송신 > 수신시 차례대로, 연결된 순서대로 데이터를 교환해야 함(신뢰성이 높음).

- java.net.ServerSocket : 서버측에서 클라이언트의 접속에 대기하기 위해 필요한 클래스.

- java.net.Socket : 서버 - 클라이언트 간 통신하기 위해 필요한 클래스.

 

 

3. 자바 소켓 프로그래밍 실행 순서

 

 

4. 자바 소켓 프로그래밍 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package lesson01.exam02.server;
 
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
 
//간단한 소켓 서버 프로그램. 소켓 연결이 되면 현재 시간을 출력하고 연결된 소켓을 닫음
public class SimpleSockterServer {
    static final int PORT = 8888;
    
    public static void main(String[] args) {
        
        try{
//          ServerSockter 생성 (포트 번호를 사용하는 서버 소켓)
//          서버용 소켓. 통신은 불가능하고 클라이언트의 연결만을 기다림
//          ServerSocket 소켓변수명 = new ServerSocket(포트번호);
            ServerSocket serverSocket = new ServerSocket(PORT);
            
            System.out.println("console> 서버 : 클라이언트의 접속을 기다립니다.");
            
//          소켓 서버가 종료될 때까지 무한루프
            while(true) {
//              클라이언트와 연결이 되면 실제로 통신을 하기 위해 만들어야 하는 소켓
//              서버소켓.accept();
//              클라이언트 소켓에서 요청을 할 때까지 소켓 서버가 대기 상태가 됨
//              클라이언트 소켓 수가 많아질 시 요청 횟수가 증가하면서 스레드가 늘어나면 
//              서버 자원을 많이 소모함
//              => 스레드풀(Thread Pool)이 등장하게 됨 : 다중 접속 처리가 원활해짐
                Socket socket = serverSocket.accept();
                
                System.out.println("console> 서버 " + socket.getInetAddress() + " 클라이언트와 " +
                                    socket.getLocalPort() + " 포트로 연결되었습니다.");
                
                try {
//                  응답을 통해 스트림을 얻어옴(서버에서 클라이언트의 입력을 받아들임)
                    OutputStream stream = socket.getOutputStream();
//                  현재 날짜를 받아와 출력함
                    stream.write(new Date().toString().getBytes());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
//                  소켓은 반드시 닫아야 함
                    socket.close();
                }
            }

//        예외처리

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package lesson01.exam02.server;
 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
 
//소켓 클라이언트 프로그램. 소켓 서버에 접속하여 결과 출력하고 프로그램을 종료함
//서버 소켓은 필요 없고, InputStream을 OutputStream으로, InputStreamReader를 OutputStreamWriter로 바꾸면 됨
//서버 소켓에서 생성한 서버의 IP, port번호를 알고 있어야 함
public class SimpleSocketClient {
    static final int PORT = 8888;
    
    public static void main(String[] args) {
        try {
//          소켓 생성
            Socket socket = new Socket("localhost", PORT);
            
            System.out.println("console> PORT(" + PORT + ") 로 접속을 시도합니다.");
            
//          스트림을 얻어옴
            InputStream stream = socket.getInputStream();
//          스트림을 래핑함(클라이언트에서 서버로부터 수신 받은 메세지 받아들임)
            BufferedReader br = new BufferedReader(new InputStreamReader(stream));
            
//          결과를 읽음(서버로부터 온 메세지 수신)
            String response = br.readLine();
            
            System.out.println("console> 수신 response : " + response);
            
//          소켓 닫음
            socket.close();
            
//          프로그램 종료
            System.exit(0);

//        예외처리 

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs

 

 클래스명

 설명

 특징

 InputStream

 byte 단위로 입력 받는 최상위 클래스

 객체화가 불가능한 추상 클래스.

 (상속 받아 사용해야 함)

 OutputStream

 byte 단위로 출력 받는 최상위 클래스

 Reader

 문자 단위 입력 스트림

 Writer

 문자 단위 출력 스트림

 BufferReader

 Buffer에 있는 IO 클래스. 읽는 클래스

 

 BufferedWriter

 Buffer에 있는 IO 클래스. 쓰는 클래스

 

 

1. 업캐스팅 (Upcasting)

서브클래스가 슈퍼클래스의 타입으로 형 변환되는 것

객체 내의 모든 멤버(변수, 메소드)에 접근할 수 없고, 슈퍼클래스의 멤버(변수, 메소드)에만 접근이 가능함

자식 클래스의 타입으로 업캐스팅을 했을 시, 상속에 의해 자식 클래스 + 부모 클래스 둘 다 호출이 가능함

자동적 형변환

 

 

a. 변수를 업캐스팅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package kr.or.example.A;
 
public class Casting_Main {
    public static void main(String[] args) {
//      변수 선언, 초기화
        int a = 10;
        double b;
        
        System.out.println("console> before a : " + a);
        
//      상위 형인 double 형으로 변수 업캐스팅
        b = (double) a;
        
        System.out.println("console> after a : " + a);
        System.out.println("console> b : " + b);
    }
}
cs

 

 

 

b. 클래스를 업캐스팅

1
2
3
4
5
6
7
8
9
10
11
package kr.or.example.A;
 
public class Person {
    String name;
    String id;
    
//  생성자에서 name 변수 초기화
    public Person(String name) {
        this.name = name;
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package kr.or.example.A;
 
//Person 클래스를 상속받는 Student 클래스
public class Student extends Person {
    String grade;
    String department;
 
//  생성자 호출시 super 키워드를 이용하여 부모 클래스의 동명 메소드 호출
    public Student(String name) {
        super(name);
        
        System.out.println("console> name : " + name);
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package kr.or.example.A;
 
public class Person_Main {
    public static void main(String[] args) {
//      부모 클래스 객체 생성
        Person person;
//      자식 클래스 객체를 생성하고 인자를 넣어줌
        Student student = new Student("미니");
        
//      자식 클래스 객체 인스턴스를 부모 클래스 객체 인스턴스로 형을 변환함(업캐스팅)
        person = student;
        
//      Person 클래스 생성자에서 부모 클래스의 메소드를 호출했지만
//      자식 > 부모가 아닌 자식 = 부모가 되었기 때문에 출력 시
//      자식 클래스의 내용 먼저 출력된다(콘솔 창에서 출력 가능).
        System.out.println(person.name);
    }
}
cs

 

 

 

 

* instanceof 연산자

업캐스팅을 한 경우 레퍼런스가 가리키는 실제 객체가 어떤 클래스 타입인지 구분이 어려워지기 때문에 사용

 

 

2. 다운캐스팅 (Downcasting)

업캐스팅 되었던 슈퍼클래스가 다시 본래의 서브클래스 형으로 돌아오는 것)

명시적으로 타입을 지정해야 캐스팅이 됨

1. final

ㄱ. 변수에 붙이는 경우 : 변수 선언시 마지막 값이 되도록(상수) 만들어준다. 처음 선언시의 초기화만 가능하고, 보통 상수로 사용할 때에는 static을 붙여 같이 사용한다. => 상수명은 전부 대문자로만 이루어져야 함

 

ㄴ. 메소드에 붙이는 경우 : 메소드에 final을 선언하면 그 메소드가 포함된 클래스를 상속받은 클래스에서 오버라이딩을 통해 재정의할 수없는 메소드가 된다.(final 메소드에 오버라이딩 시도시 에러 발생)

1
2
3
4
5
6
7
8
9
10
package kr.or.ksmart.A;
 
public class FinalTest {
    String str = "홍길동";
        
//    String형 str 변수를 리턴하는 name 메소드 선언
    public final String name() {
        return str;
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
package kr.or.ksmart.A;
 
public class FinalTest_Extend extends FinalTest {
//    FinaltTest 클래스를 상속받는 FinalTest_Extend 클래스
//    name 메소드를 오버라이딩 하지 못한다(컴파일 에러가 남)
//    => final로 정의해줬기 때문에
    public String name() {
        return "강감찬";
    }
}
cs

 

 

(실제로 이클립스 상에서 final을 수정하거나 삭제하라는 오류가 뜬다)

 

ㄷ. 클래스에 붙이는 경우 : final + 접근제한자 + 클래스명

abstract와 함께 사용 불가 - final은 상속 불가인데 abstract는 추상 클래스 생성시 사용하는 내용이므로 공존할 수 없음(컴파일 에러)

 

 

 

2. static

클래스나 인스턴스 생성시 각 인스턴스들은 독립적이기 때문에 서로 다른 값을 유지하는 경우에 따라 각각의 인스턴스들이 공통적으로 같은 값을 유지해야 하는 경우에 사용.

static이 붙은 변수는 클래스가 메모리에 올라갈 때 인스턴스가 자동적으로 생성되기 때문에 인스턴스를 생성할 필요가 없음.

static 메소드는 인스턴스 생성 없이 호출이 가능하나, 보통은 인스턴스 변수를 생성해야만 호출이 가능하므로 static 메소드 내에서는 인스턴스 변수를 허용함(인스턴스 변수가 존재한다 > static 변수가 이미 메모리에 있기 때문에)

먼저 클래스 멤버 변수중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 살펴보고 static을 붙임(작성한 메소드 중 인스턴스 변수를 사용하지 않는 메소드에 대해 static을 붙임)

보통 클래스 변수와 관련된 작업을 하는 메소드나 변수에 static을 붙임.

 

 

3. final과 static의 차이

final은 절대 변하지 않는 상수이나 static은 어느 클래스 & 메소드에서나 사용 가능한 공용일 뿐 변수이기 때문에 언제든지 바뀔 수 있는 가변성을 가지고 있다.

APMSETUP은 톰캣과 MySql을 동시에 편리하게 제어할 수 있어 쉽게 쓰인다.

그러나 APMSETUP의 PhpMyadmin은 내장되어 있는 MySql의 버전이 최신이 아니기 때문에 사용할 경우 최대 5.xx까지만 가능하다.(개발하는데 문제는 없음)

 

MySql의 버전을 5.xx 이상으로 사용하고 싶을 때에는 MySql Workbench를 따로 설치하여 연결해서 사용하면 된다.

 

 

1. 홈페이지 접속

- http://www.apmsetup.com/download.php 접속 > 다운로드 > APMSETUP7 DOWNLOAD 클릭

1. 홈페이지 접속

 

- https://www.oracle.com/ 접속 > Downloads > Java SE 클릭

 

 

2. 다운로드

 

- JDK를 다운받는다.

 

* JDK > JRE : JRE는 기본으로 컴퓨터에 깔려있기 때문에 JDK를 설치해야 한다.

   실수로 컴퓨터 내의 JRE를 삭제했을 시에는 오라클 홈페이지에서 JRE만 따로 다운로드 가능.

 

 

3. 다운 받은 exe 파일 실행

- 분할한 파티션을 용이하게 사용하기 위해 C 드라이브가 아닌 D 드라이브에 Java8 이라는 폴더를 새로 만들고 JDK를 다운받았다.

- 다운 받은 Java8 폴더를 살펴보면 JDK만을 설치했을 때에도 자동으로 JDK 폴더 안에 JRE가 생성되어 있는 것을 확인할 수 있다. (JDK > JRE)

 

- JRE는 JDK 폴더 내의 JRE 폴더에 덮어쓰기 해줬다.

 

- 이러한 창이 뜨면 Close를 눌러준다.

 

 

4. 자바가 설치되었는지 cmd로 확인

- cmd를 열고 가장 상위 폴더인 C드라이브로 올라가 컴퓨터의 자바 버전을 확인한다. (1.8.0_102)

 

- 명령어를 확인하여 자바를 컴파일하는 javac(자바 컴파일러)가 존재하는지, 자바 컴파일러 버전이 자바 버전과 일치하는지 확인한다.(일치해야 함)

자바 클래스에서 PrintWriter 객체를 선언한 후,

해당 객체의 인스턴스를 통해 println 메소드를 이용하여 response 범위로 alert을 선언했는데

인코딩이 되지 않았다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
protected void doPost(HttpServletRequest request, HttpServletResponse response)
                                        throws ServletException, IOException {
    String url = "";
    
    //PrintWrtier에서 한글 인코딩이 깨지는 경우 셋팅
    //반드시 PrintWriter 객체 선언하기 전에 셋팅해줘야 함
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html; charset=UTF-8");
                
    //alert 띄우고 리스트로 돌아가서 리스트 새로고침
    PrintWriter out = response.getWriter();
                
    url = "GetAllBookInfo";
                
    out.println("<script>");
    out.println("alert('도서를 삭제했습니다.')");
    out.println("location.href='" + url + "';");
    out.println("</script>");
    out.flush();
}
cs

 

PrintWriter 객체를 선언한 후 CharacterEncoding, ContentType을 setter로 초기화 했었는데도 전혀 되지 않았다.

반드시 PrintWriter 객체를 선언하기 에 response 객체 메소드들을 설정해줘야 인코딩이 깨지지 않는다.

페이징을 사용할 때 쿼리 select 문에 LIMIT를 사용하여 select로 뜨는 결과를 제한, 페이징을 구현할 수 있다.

 

1. 의미

LIMIT a, b

a번 인덱스 쿼리부터 b개 만큼 출력하겠다는 의미.

(ex. LIMIT 3, 3 : 3번 인덱스 컬럼부터 3개만 select 한다.)

 

 

2. 예제

 

 

book 테이블을 출력하는 쿼리 SELECT * FROM book; 을 입력했을 때에는

 

 

컬럼 book_code가 b00001부터 b00010까지인 book 테이블의 모든 정보를 보여준다.

 

여기서 응용하여 book_code가 b00003 ~ b00007까지 select 한다고 하면 쿼리를 어떻게 입력해야 할까?

 

 

답은 간단하다. 뒤에 LIMIT만 붙여주면 된다.

단, 컬럼의 인덱스는 0부터 시작하기 때문에 LIMIT 2, 5로 적어줘야 b00003인 도서부터 select 해줄 수 있다.

 

아래는 그 결과이다.

 

phpMyAdmin이나 developer 프로그램 이외에 command 창에서 mysql을 다루기 위한 기본적인 명령어들을 정리해봤다.

 

 

 

- cd.. : 상위 경로로 빠져나가는 명령어

- mysql -u user -p : user 부분에는 생성했던 user명을 입력하면 된다. Enter password 부분에는 해당 user의 패스워드를 입력한다.

 

mysql 폴더가 위치한 C드라이브로 경로를 옮긴다.

 

 

 

- show databases : 해당 user와 연동되어 있는 DB 목록을 보여준다.

- use DB명 : 입력한 DB를 사용한다는 뜻이다. 입력한 데이터베이스로 이동한다.

- show tables : 해당 데이터베이스 내에 만든 테이블들을 조회한다.

 

 

- select * from table : 테이블 내 데이터들을 조회한다.

데이터베이스 내에 있는 여러 테이블들 중 book이라는 테이블을 조회했는데, 한글이 꺠져서 나오는 문제가 발생했다.

 

 

 

- set character set euckr : command mysql 상에서 한글 깨짐을 방지하는 명령어이다.

다시 테이블 내용을 조회하니 잘 나온다.

 

 

 

- desc table : 테이블 구조를 보여준다. 필드명, 타입 등을 확인할 수 있다.

 

 

 

- show create table table_name : desc table과 비슷한 명령어이다.

   비슷하지만 ENGINE과 CHARSET 속성도 확인할 수 있는 장점이 있다.

(ENGINE을 InnoDB로 설정하여 테이블을 생성해야 외래키를 설정할 수 있다.)

오라클은 mysql보다 한 단계 더 업그레이드 된 데이터베이스이다.

 

1. http://www.oracle.com 홈페이지로 들어간다.

 

downloads > oracle datebase express edition 11g release 2 > accept 버튼을 클릭한 뒤 각 컴퓨터 사양에 맞는 exe 파일을 다운받는다.

 

 

2. 다운 받은 exe 파일을 실행

- next > I accept > next > (defalt 사용) C:\oraclexe\ > id : system / pw : oracle > next > install > finish.

 

 

3. 자동 시작 방지 설정

- 제어판 > 관리 > 서비스 > OracleServietXE / OracleXETNSListener 속성 > 시작 유형 : 수동으로 설정

 

 

4. sql developer을 다운받는다.

 

 

5. Oracle Start database /  stop database 시작 메뉴에 고정

 

 

6. Oracle Start database

a. OracleServiceXE 실행중

b. OracleXETNSListenr 실행중

2개가 실행되면 정상

 

 

7. Oracle Stop > Oracle 다시 시작

 

 

8. 오라클 포트 변경

톰캣이 8080 포트를 쓰는데, 오라클도 8080 포트를 기본으로 쓰기 때문에 충돌 방지를 위해 오라클 포트를 8090으로 변경해야 함. 바꾸지 않으면 톰캣 실행이 되지 않아서 이클립스 에러가 난다.

근본적인 해결책 : 오라클 포트를 8090으로 변경한다.

 

a. sql developer 실행

 

b. 테이블 스페이스 생성

- dba > 저장 영역 > 테이블 스페이스 > 새로만들기

- 이름 : 파일명 뒤에 반드시 .DBA를 붙일 것

- 디렉토리 : DBA 파일들이 위치한 경로

- 파일 크기 : byte 단위. K(B), M(B), G(B), T(B)

 

(테이블 스페이스를 따로 두고 싶지 않을 때에는, 데이터베이스를 생성할 때 default로 system이나 다른 공간으로 테이블 스페이스를 지정한다.)

 

c. 사용자 추가

- dba > 보안 > 사용자 > 새로만들기

 

- 아이디, 비밀번호는 임의로 만들어 작성.

- 기본 테이블 스페이스 : 테이블 스페이스에서 생성했던 DBA명 클릭, 임시 테이블 스페이스 : TEMP 클릭

 

d. db 추가

- 접속 > 새접속

 

- 접속 이름 : 임의로 생성.

- 사용자 이름, 비밀번호 : 사용자를 생성했을 때 기입했던 아이디와 비밀번호 그대로 기입.

- 비밀번호 저장 체크할 것.

- 테스트 버튼을 눌러 접속이 원활하게 되는지 테스트한 뒤, 접속 버튼을 누른다.

 

e. 오라클 포트 변경

- 생성한 db에 접속한 뒤 SELECT DBMS_XDB.GETHTTPPORT() FROM DUAL 이라고 입력한 후 현재 오라클 포트를 확인한다.

- EXEC DBMS_XDB.SETHTTPPORT(8090) 을 입력하여 오라클 포트를 8090으로 변경한다.

 

f. 톰캣 테스트

- 오라클 포트를 8090으로 변경한 상태에서 이클립스에 접속, 실행시켜 톰캣이 제대로 작동하는지(포트 충돌 없는지) 다시 한 번 확인한다.

1. 서블릿으로 파라미터를 보내는 form.html 페이지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Form.html</title>
</head>
<body>
 
<!-- 필터는 post 방식으로 받을 때에만 적용됨. -->
<!-- form.do라는 서블릿으로 파라미터들을 보냄. -->
<form action="form.do" method="post" name="textform"> 
    Name : <input type="text" name="name"><br⁄> 
    <input type="submit" value="전송" name="submitbtn"> 
</form> 
 
</body>
</html>
cs

 

2. WEB-INF/web.xml 파일에 필터 매핑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name>Archetype Created Web Application</display-name>
  
  <!-- 서블릿을 매핑하듯 필터도 같은 방식으로 WEB-INF/web.xml 파일에 매핑함. -->
  <!-- filter-name : 필터 클래스 파일 이름. -->
  <!-- filter-class : 필터 클래스 경로(애플리케이션 내에서의 절대 경로). -->
  <!-- init-param : 필터 클래스에서 사용하려는 파라미터의 이름, 값을 web.xml에서 미리 지정할 수 있음. -->
  <filter>
      <filter-name>HangulEncodingFilter</filter-name>
      <filter-class>com.filter.HangulEncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>      
  </filter>
  
  <!-- url-pattern : 해당 애플리케이션 내에서 필터를 적용시키고자 하는 범위. -->
  <!--                 /* - 애플리케이션 내 모든 post 방식에서 적용(servlet, jsp 구분 없이). -->
  <!--                 /*.do - 애플리케이션 내 *.do로 이름을 지은 서블릿 post 메소드만 적용. -->
  <!-- servlet-name : 애플리케이션 내 특정 서블릿에만 적용할 때 씀.-->
  <filter-mapping>
      <filter-name>HangulEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
cs

 

3. form.do 서블릿이 실행되기 전에 실행되는 filter 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.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;
 
/**
 * Servlet Filter implementation class ExampleBFilter
 */
public class HangulEncodingFilter implements Filter {
 
    //인코딩을 수행할 인코딩 캐릭터 셋 지정
    String encoding;
    
    //필터 설정 관리자
    FilterConfig filterConfig;
    
    /**
     * Default constructor. 
     */
    public HangulEncodingFilter() {
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        //초기화
        //getInitParameter() : web.xml에 초기화해서 지정한 파라미터 값을 불러오는 메소드. 
        this.filterConfig = fConfig;
        this.encoding = fConfig.getInitParameter("encoding");
        
//        System.out.println("debug > init %%%%%%%%%");
    }    
    
    /**
     * @see Filter#destroy()
     */
    //destroy : 웹 애플리케이션이 끝날 때 같이 끝남
    public void destroy() {
        
        this.encoding = null;
        this.filterConfig = null;
        
//        System.out.println("debug > destroy %%%%%%%%%%%");
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                throws IOException, ServletException {
 
        //request.setCharacterEncoding("utf-8");
        
//        System.out.println("characterEncoding : " + request.getCharacterEncoding());
        
        if (request.getCharacterEncoding() == null) {
            if (encoding != null
                request.setCharacterEncoding(encoding);
        }
        
        chain.doFilter(request, response);
    }
}
cs

 

4. form.do 서블릿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/form.do")
public class MyServlet extends HttpServlet {
    
    public MyServlet() {
        super();
    }
       
//    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
//                throws ServletException, IOException {
//        // TODO Auto-generated method stub
//    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException {
        
        // 한글깨짐방지
        // 한글 필터를 쓰면 아래것은 쓸모없다
        // request.setCharacterEncoding("utf-8");
 
        // 아래 2줄 넣으면 한글 무조건 깨진다.
        // PrintWriter out = response.getWriter();
        // out.println("name : " + name);        
        String name = request.getParameter("name");
        
//        System.out.println("Debug> name : " + name);
        
        request.setAttribute("name", name);
        
        RequestDispatcher rd = request.getRequestDispatcher("result.jsp");    
        rd.forward(request, response);
    }
}
cs

 

5. 서블릿에서 파라미터를 받아 출력하는 jsp 페이지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%@ page isELIgnored="false" %>
    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>화면 결과 출력 예제</title>
</head>
<body>
    name : ${name}
</body>
</html>
cs

+ Recent posts