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. $(document).ready()

- 외부 리소스. 이미지와는 상관 없이 브라우저가 DOM (document object model) 트리를 생성한 직후 실행

- window.load() 보다 더 빠르게 실행되고 중복 사용하여 실행해도 선언한 순서대로 실행됨

 

 

2. $(window).load()

- DOM의 standard 이벤트

- html의 로딩이 끝난 후에 시작

- 화면에 필요한 모든 요소(css, js, image, iframe etc..)들이 웹 브라우저 메모리에 모두 올려진 다음에 실행됨

- 화면이 모두 그려진 다음의 메세징이나 이미지가 관련 요소가 모두 올려진 다음의 애니메이션에 적합함

- 전체 페이지의 모든 외부 리소스와 이미지가 브러우저에 불려운 이후 작동하게 되어 이미지가 안뜨너가 딜레이가 생길 때에는 그만큼의 시간을 기다려야 함

- 외부 링크나 파일 인크루트시 그 안에 window.load 스크립트가 있으면 둘 중 하나만 적용됨

- body onload 이벤트와 같이 body에서 onload 이벤트를 쓰게 되면 모든 window.load() 가 실행되지 않는 현상이 발생함

 

 

* window > document

- document는 window의 자식 객체

  (window의 자식 객체 : document, self, navigator, screen, forms, history, location etc..)

- document : html의 요소들이나 속성들에 접근할 시 사용하는 객체

 

 

3. 실행 순서 비교

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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(window).load(function() {
    console.log("console> window.onloade() 첫번째");
});
 
$(window).load(function() {
    console.log("console> window.onload() 두번째");
});
 
$(document).ready(function() {
    console.log("console> document.ready() 첫번째");
});
 
$(document).ready(function() {
    console.log("console> document.ready() 두번째");
});
</script>
 
</head>
<body>
 
</body>
</html>
cs

 

 

콘솔창에서 document.ready가 먼저 실행되고 그 다음에 window.load가 실행되는 것을 확인할 수 있다.

 

 

4. document.ready() vs window.load() vs body onload 이벤트 비교

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
 $(window).load(function() {
     console.log("console> window.load()");
 });
 
 $(document).ready(function() {
     console.log("console> document.ready()");
 });
</script>
 
</head>
<body onload="console.log('console> body onload...');">
 
</body>
</html>
cs

 

document.ready() > window.load() > body onload 이벤트 순서대로 실행되는 것을 확인할 수 있다.

 

 

* window.load() vs body onload 차이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> -->
<script>
$(window).load(function() {
     console.log("console> window.load()");
 });
</script>
 
</head>
<body onload="console.log('console> body onload...');">
 
</body>
</html>
cs

 

 

window.load()는 jquery CDN을 import 해줘야 사용할 수 있는 반면, body onload 이벤트는 jquery CDN을 import 해주지 않아도 사용할 수 있다.

 

 

* $(function() 대신 $(document).ready() 를 권장하는 이유

$(function() 을 쓰나 $(document).ready() 를 쓰나 같은 함수임에는 틀림이 없으나

$(window).load() 함수와 확실하게 구분지어주기 위해 $(document).ready() 를 사용하는 것을 권장한다.

1. text()

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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $("#btn1").click(function() {
        console.log("console> btn1");
        
        $("#test1").text("Hello World!");
    });
    
    $("#btn2").click(function() {
        console.log("console> btn2");
        
        $("#test2").text("<b>Hello world!</b>");
    });
});
</script>
 
</head>
<body>
 
<p id="test1">This is a paragraph.</p>
<p id="test2">This is another paragraph.</p>
 
<button id="btn1">Set text</button>
<button id="btn2">Set html</button>
 
</body>
</html>
cs

 

text()는 안에 포함되어 있는 태그를 일반 텍스트로 인식한다(태그가 적용되지 않음)

 

 

2. html()

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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $("#btn1").click(function() {
        console.log("console> btn1");
        
        $("#test1").html("Hello World!");
    });
    
    $("#btn2").click(function() {
        console.log("console> btn2");
        
        $("#test2").html("<b>Hello world!</b>");
    });
});
</script>
 
</head>
<body>
 
<p id="test1">This is a paragraph.</p>
<p id="test2">This is another paragraph.</p>
 
<button id="btn1">Set text</button>
<button id="btn2">Set html</button>
 
</body>
</html>
cs

 

 

html() 은 안에 있는 태그를 태그로 인식하여 적용시켜 준다(태그가 적용됨)

 

 

1. 문자열 배열 정렬(알파벳)

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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<p id="demo"></p>
 
<button onclick="myFunction()">Try it</button>
 
<script>
    var fruits = ["Banana""Orange""Apple""Mango"];
    
//    console.log("console> fruits.length : " + fruits.length);
 
    document.getElementById("demo").innerHTML = fruits;
    
//     sort() : 배열 요소를 알파벳 순서대로 정렬
//     reverse() : 알파벳 역순으로 정렬    
     function myFunction() {
         fruits.sort();
         fruits.reverse();
        
         document.getElementById("demo").innerHTML = fruits;
     }        
</script>
 
</body>
</html>
cs

 

 

2. 숫자 배열 정렬

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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<p id="demo"></p>
 
<button onclick="myFunction()">Try it</button>
 
<script>
    var points = [40100152510];
    
//    console.log("console> points.length : " + points.length);
 
    document.getElementById("demo").innerHTML = points;
    
    function myFunction() {
//        sort() : 배열 요소를 알파벳 순서대로 정렬하는 메소드
//                 숫자가 올 경우 안에 callback 함수를 이용하여 정렬
//        숫자를 작은 수 > 큰 수 순으로 정렬하는 경우
        points.sort(function(a, b) {
            return a - b;
        });
 
//        숫자를 큰 수 > 작은 수 순으로 정렬하는 경우
        points.sort(function(a, b) {
            return b - a;
        });
        
        document.getElementById("demo").innerHTML = points;
    }
</script>
 
</body>
</html>
cs

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은 어느 클래스 & 메소드에서나 사용 가능한 공용일 뿐 변수이기 때문에 언제든지 바뀔 수 있는 가변성을 가지고 있다.

1. 웹서버 (Web Server)

- 웹 클라이언트에게 컨텐츠를 제공하는 서버.

- 정적인 html, jpg, gif, javascript 같은 이미지를 http 프로토콜을 통해 웹브라우저에 전송함.

- 서버에 있는 리소스를 전달하는게 주된 기능, 클라이언트로부터 컨텐츠를 받는 것.

 

 

2. 웹 어플리케이션 서버(Web Application Server)

- 서버 단에서 어플리케이션이 동작할 수 있도록 지원함.

- 기존 웹서버와 달리 동적인 요구에 대응하기 위해 적합한 형태로 진화하였다 (Web Client에서는 결과값만 전송함)

- 서버 단에서 http를 통해 사용자의 장치에 애플리케이션을 수행해주는 미들웨어.

- Servlet, Asp, Jsp, PHP 등의 웹 언어로 작성된 웹애플리케이션을 서버단에서 실행한 후, 실행 결과값을 사용자에게 넘겨주고, 우리가 가진 브라우저가 결과를 해석하여 화면에 표시하는 순으로 동작한다.

 

ㄱ. 역할

- 프로그램 실행 환경 + DB 접속 기능 제공

- 여러 개의 트랜젝션 관리

- 업무를 처리하는 비즈니스 로직을 수행

 

ㄴ. 종류

- Apache Tomcat

- JEVS

- Weblogic

- IIS

 

 

3. 차이

- 정적 데이터 전송 vs 동적 데이터 전송의 차이이나 Apache Tomcat의 경우 웹 애플리케이션 서버에 웹서버 기능이 포함된 서버 프로그램이다.

 

* Apache Tomcat : Tomcat에 자체 웹서버가 있어 Tomcat만 사용해도 jsp 웹 서버 구현은 가능하지만, 내장 웹서버는 아주 기본적인 기능만 하기 때문에 대용량의 콘텐츠를 전송하는 경우에는 웹서버인 Apache Tomcat을 꼭 설치해야 한다.

 

'개발지식 > 그 외' 카테고리의 다른 글

마이크로소프트의 개발생명주기(MS-SDL)  (0) 2017.06.25
아키텍쳐 (Architecture)  (0) 2016.11.07

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(자바 컴파일러)가 존재하는지, 자바 컴파일러 버전이 자바 버전과 일치하는지 확인한다.(일치해야 함)

1. 정의

문자열에서 문자 조합에 일치시키기 위해 사용되는 패턴

정규식 또한 객체이다

특정 규칙을 가진 문자열의 집합을 표현하는데 사용되는 형식의 언어

(단점 : 가독성이 떨어져서 표현식을 숙지하지 않으면 이해가 힘들다)

 

* 정규 표현식은 정규 표현식의 메소드를 바로 사용하는 것보다 문자열 객체의 메소드와 함께 사용하는 것이 일반적임

 

주로 js 파일에 넣어서 form이 submit 되기 전 유효성을 검사하는 데에 사용된다

 

 

2. 메소드 종류

메소드 

 의미

 test()

 일치하는 문자열이 있을 시 true, 없을 시 false

 exec()

 일치하는 문자열을 리턴

 match()

 일치하는 부분을 리턴

 search()

 일치하는 부분의 위치를 리턴

 (index : 0부터 시작, 숫자로 리턴함)

 split()

 정규 표현식을 기준으로 문자열을 잘라 배열을 리턴

 (정규 표현식과 일치하는 부분만 뺌)

 replace()

 일치하는 부분을 새로운 문자열로 바꿈

 대체 문자 사용 가능

 (default : defined)

 

ㄱ. replace() 메소드 대체 문자

- $& : 일치

- '$ : 일치하는 앞 부분

- $' : 일치하는 뒷부분

- $1, $2 : 그룹

 

* replace 메소드 대체 문자 부분에서 callback 함수 호출 가능

 

 

3. 플래그 문자

문자

 의미

 g

 전역 비교 수행

 i

 대소문자 안 가리고 비교

 m

 여러 줄 검사 수행

 

 

4. 앵커 문자

 문자

  의미

 ^ABC

 맨 앞 문자가 ABC인 경우

 ABC&

 맨 뒤 문자가 ABC인 경우

 

 

5. 메타 문자

 문자

 의미

 .

 아무거나

 [a]

 괄호 안의 글자만

 [a^]

 괄호 안의 글자를 제외한

 [a-z]

 a에서 z까지

 [A-Z]

 A에서 Z까지

 [0-9]

 0에서 9까지

 \d

 숫자만

 \w

 아무 단어

 \s

 공백 문자

 \D

 숫자를 제외한

 \W

 아무 단어가 아닌

 \S

 공백이 아닌

 

 

6. 수량문자

문자 

 의미

 a+

 1개 이상

 a*

 0개 or 여러개(1개 제외)

 a?

 0개 or 1개(여러개 제외)

 a{5}

 a가 5개

 a{2, 5}

 a가 2~5개

 a{2,  }

 a가 2개 이상

 a{  , 2}

 a가 2개 이하

 

 

7. 선택문자

 문자

의미 

 {abc | def}

 abc or def 

 

 

8. 정규식 응용

정규식

의미

var regExp = /\s/g;

모든 공백 체크

var regExp = /^[0-9]+$/;

숫자만 체크

var regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i; 

이메일 유효성 검사

var regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/;

휴대폰번호 유효성 검사

var regExp = /^\d{2,3}-\d{3,4}-\d{4}$/;

전화번호 유효성 검사

var regExp = /^[a-z0-9_]{4,20}$/; 

아이디, 비밀번호 유효성 검사

 

 

9. 예제

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
function updateMemberSave() {
//    alert('####');
    
    var form = document.update_member_form;
    
//    alert('member_update_form : ' + member_update_form);
    
    if (!form.memberEmail.value) {
        alert("이메일을 입력하세요.");
        
        form.memberEmail.focus();
        
        return false;
    }
 
//    function validateSmartEmail 함수를 불러와서 유효성 검사를     
    if (validateSmartEmail(form.memberEmail.value) == false) {
        alert("이메일 형식이 맞지 않습니다. \n ex) abcde@gmail.com");
        
        form.memberEmail.focus();
        
        return false;
    }
    
    if (!form.memberTel.value) {
        alert("전화번호를 입력하세요.");
        
        form.memberTel.focus();
        
        return false;
    }
 
//    function validateSmartPhone 함수를 불러와서 유효성 검사를 함    
    if (validateSmartPhone(form.memberTel.value) == false) {
        alert("전화번호 형식이 맞지 않습니다. \n ex) 010-1234-5678");
        
        form.memberTel.focus();
        
        return false;
    }
}
 
//휴대폰번호 체크 정규식
function validateSmartPhone(phone) {
    
    var regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/;
    
//    test() : 비교해서 문자열 있으면 true, 없으면 false
//             유효하면 true, 아니면 false
    return regExp.test(phone);
}
 
//이메일 체크 정규식
function validateSmartEmail(email) {
    
    var regExp =  /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
 
//    test() : 비교해서 문자열 있으면 true, 없으면 false
//             유효하면 true, 아니면 false
    return regExp.test(email);
}
cs

 

회원을 추가할 때, form에서 휴대폰 번호와 이메일의 유효성을 검사하는 함수로 응용해봤다.

자바 클래스에서 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 객체 메소드들을 설정해줘야 인코딩이 깨지지 않는다.

+ Recent posts