728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JQuery : jquery-3.6.0.min.js


-설정-

설정에는 두가지 방법이 있는데 , 
1. 인터넷 서비스 제공자로부터 직접 연결하여 데이터를 전송받는 CDN방식(당연히 네트워크필수)
밑 명령줄을 ecilipse의 head태그내에 삽입. 
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="  crossorigin="anonymous"></script>

2. JQuery 메인 홈페이지에서 js 파일을 다운후 script문 작성.
<script type="text/javascript" src="./js/jquery-3.6.0.min.js"></script>

 

-jquery14_요소추가.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
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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
 
 div{
     border: 1px solid blue;
     margin-top: 10px;
 }
 .prepend{
     border:1px solid red;
 }
 .append{
     border:1px solid green;
 }
 
</style>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
 
    $(document).ready(function(){
        $('button:eq(0)').click(function(){
        //    $('<tag>') : 인수로 지정된 태그를 만든다.    
        $('div').prepend($('<p>').addClass('prepend').text('prepend')); 
        });
        
        $('button:eq(1)').click(function(){
            $('div').append($('div>p:first').addClass('append'));
        });
        
        
        $('button:eq(2)').click(function(){
            $('div').html('<marquee>html 요소를 변경한다</marquee>');
        });
        
        $('button:eq(3)').click(function(){
            $('div').text('<marquee>html 요소를 변경한다</marquee>');
        });
        
    });
 
</script>
 
</head>
<body>
    <button type="button">prepend</button>
    <button type="button">append</button>
    <button type="button">html</button>
    <button type="button">text</button>
    
    <div>
        <p>1</p>
        <p>2</p>
        <p>3</p>
        <p>내부 삽입</p>
    </div>
</body>
</html>
cs
더보기

-Description

GUI :

23: onload 수행
26 : prepend() :  인수로 지정된 만들 태그를 선택된 요소의 하위 레밸의 첫번재 요소에 추가한다.
30 : append() : 인수로 지정된 만들 태그를 선택된 요소의 하위 레밸의 마지막 요소에 추가한다.
35 : html() 은 태그를 적용시켜준다. , marquee는 글자를 이동하는 효과를 준다.
39 : text()는 태그를 적용시키지 못한다.

 

-요약-

 

 

-마침글-

단순문법공부는 boring하다..

인용

 

'21년이전 > 국비-JSP' 카테고리의 다른 글

Jquery-태그추가2  (0) 2021.03.30
MergeInterval  (0) 2021.03.29
Jquery-Plugin 적용  (0) 2021.03.29
Jquery- class 추가 및 제거  (0) 2021.03.29
Jquery-EasingFlug 이용해보기  (0) 2021.03.29
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JQuery : jquery-3.6.0.min.js


-설정-

설정에는 두가지 방법이 있는데 , 
1. 인터넷 서비스 제공자로부터 직접 연결하여 데이터를 전송받는 CDN방식(당연히 네트워크필수)
밑 명령줄을 ecilipse의 head태그내에 삽입. 
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="  crossorigin="anonymous"></script>

2. JQuery 메인 홈페이지에서 js 파일을 다운후 script문 작성.
<script type="text/javascript" src="./js/jquery-3.6.0.min.js"></script>

 

-jquery13_CyclePlugin.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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"></script>
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.cycle/3.0.3/jquery.cycle.all.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $('#shuffle').cycle({ 
            fx:     'shuffle'
            easing: 'easeOutBack'
            delay:  -4000 
        });
    });
</script>
 
 
</head>
<body>
 
    <div id="shuffle">
        <img src="./images/img01.jpg"/>
        <img src="./images/img02.jpg"/>
        <img src="./images/img03.jpg"/>
        <img src="./images/img04.jpg"/>
        <img src="./images/img05.jpg"/>
    </div>
 
</body>
</html>
cs

 

 
더보기

-Description

9 : Cycle plugin 의 CDN,
이미지를 자동으로 넘겨주는 cycle 플러그인

cycle 플러그인 효과를 확인해 볼 수 있는 API 사이트=> http://malsup.com/jquery/cycle/
11 : onload

 

-요약-

 

 

-마침글-

단순문법공부는 boring하다..

인용

 

'21년이전 > 국비-JSP' 카테고리의 다른 글

MergeInterval  (0) 2021.03.29
Jquery-요소(태그)추가  (0) 2021.03.29
Jquery- class 추가 및 제거  (0) 2021.03.29
Jquery-EasingFlug 이용해보기  (0) 2021.03.29
Jquery-특수효과적용2  (0) 2021.03.29
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JQuery : jquery-3.6.0.min.js


-설정-

설정에는 두가지 방법이 있는데 , 
1. 인터넷 서비스 제공자로부터 직접 연결하여 데이터를 전송받는 CDN방식(당연히 네트워크필수)
밑 명령줄을 ecilipse의 head태그내에 삽입. 
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="  crossorigin="anonymous"></script>

2. JQuery 메인 홈페이지에서 js 파일을 다운후 script문 작성.
<script type="text/javascript" src="./js/jquery-3.6.0.min.js"></script>

 

-jquery12_class추가제거.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
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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
 
<style type="text/css">
 
    img{
        width: 200px;
        height: 200px;
    }
    .addSize{
        width: 300px;
        height: 300px;
    }
    .onOffImage{
        display: none;
    }
 
</style>
 
<script type="text/javascript">
 
    $(document).ready(function(){
        $('img').click(function(){
            if ($(this).hasClass('addSize')){ // 있는건 없에고 , 없는건 만든다
                $(this).removeClass('addSize');
            }else{
                $(this).addClass('addSize');
            } 
        });
        $('#btn').click(function(){
            $('img').toggleClass('onOffImage');
        });
    });
 
</script>
 
</head>
<body>
 
    <button id="btn">이미지 on/off</button><br/>
    <img src="./images/img01.jpg"/>
    <img src="./images/img02.jpg"/>
    <img src="./images/img03.jpg"/>
 
</body>
</html>
 
 
 
 
 
 
 
 
 
 
cs
더보기

-Description

GUI :

28 : 클릭된 img태그에 addSize 클래스 속성이 설정되었나 검사한다.
35 : 토글 클래스를 수행함

 

-요약-

클래스 속성 추가 및 제거
// addClass() : 선택된 요소에 인수로 전달받은 클래스를 추가한다.
// removeClass() : 선택된 요소에서 인수로 전달받은 클래스를 제거한다.
// toggleClass() : 선택된 요소에서 인수로 전달받은 클래스가 없으면 추가하고 인수로
// 전달받은 클래스가 있으면 제거한다.
// hasClass() : 인수로 전달받은 값이 선택된 요소에 클래스로 존재하는가 검사해서 존재하면 true,
// 존재하지 않으면 false를 리턴한다.

 

-마침글-

단순문법공부는 boring하다..

인용

 

'21년이전 > 국비-JSP' 카테고리의 다른 글

Jquery-요소(태그)추가  (0) 2021.03.29
Jquery-Plugin 적용  (0) 2021.03.29
Jquery-EasingFlug 이용해보기  (0) 2021.03.29
Jquery-특수효과적용2  (0) 2021.03.29
Jquery-특수효과주기  (0) 2021.03.29
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JQuery : jquery-3.6.0.min.js


-설정-

설정에는 두가지 방법이 있는데 , 
1. 인터넷 서비스 제공자로부터 직접 연결하여 데이터를 전송받는 CDN방식(당연히 네트워크필수)
밑 명령줄을 ecilipse의 head태그내에 삽입. 
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="  crossorigin="anonymous"></script>

2. JQuery 메인 홈페이지에서 js 파일을 다운후 script문 작성.
<script type="text/javascript" src="./js/jquery-3.6.0.min.js"></script>

 

-jquery10_EasingFlugIn.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
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"></script>
 
<style type="text/css">
    body{
        margin: 10px auto;
        width: 500px;
    }
    h2{
        margin: 5px;
        padding: 0px 0.3px; /* 위아래 0px, 좌우는 0.3px */
    }
    p{
        margin: 5px;
        padding: 0px 0.5px;
    }
    .pane{
        background : tomato;
        padding: 10px 20px;
        position: relative;
        border-top: 2px solid skyblue;
    }
    .delete{
        position: absolute;
        top: 10px;
        right: 10px;
        cursor: pointer;  /* 마우스로 가져다대면 손구락모양으로 바뀜 */
    }
</style>
 
<script type="text/javascript">
 
    $(document).ready(function(){  // onload
        $('.delete').click(function(){
            //$(this).parent().slideUp('slow'); 
            $(this).parent().slideUp(1000,'easeOutBounce'); 
        });
        
        $('#view').click(function(){
            //$('.pane').slideDown('slow');
            //$('.pane').show('slow');
            //$('.pane').css('display','block');
            //$('.pane').css('display','block');
            $('.pane').fadeIn('slow');
        });
        
        
    });
 
</script>
 
</head>
<body>
    <button id="view" type="button">보이기</button>
    
    <div class="pane">
        <h2>한국을 빛낸 100명의 위인들 1절</h2>
        <p>
            아름다운 이 땅에 금수강산에 단군 할아버지가 터 잡으시고
            홍익인간 뜻으로 나라 세우니 대대손손 훌륭한 인물도 많아
            고구려 세운 동명왕 백제 온조왕 알에서 나온 혁거세
            만주 벌판 달려라 광개토대왕 신라 장군 이사부
            백결선생 떡방아 삼천궁녀 의자왕
            황산벌의 계백 맞서 싸운 관창
            역사는 흐른다
        </p>
        <img class="delete" alt="닫기" src="./images/delete_button.png"/>
    </div>
    <div class="pane">
        <h2>한국을 빛낸 100명의 위인들 1절</h2>
        <p>
            아름다운 이 땅에 금수강산에 단군 할아버지가 터 잡으시고
            홍익인간 뜻으로 나라 세우니 대대손손 훌륭한 인물도 많아
            고구려 세운 동명왕 백제 온조왕 알에서 나온 혁거세
            만주 벌판 달려라 광개토대왕 신라 장군 이사부
            백결선생 떡방아 삼천궁녀 의자왕
            황산벌의 계백 맞서 싸운 관창
            역사는 흐른다
        </p>
        <img class="delete" alt="닫기" src="./images/delete_button.png"/>
    </div>
    <div class="pane">
        <h2>한국을 빛낸 100명의 위인들 1절</h2>
        <p>
            아름다운 이 땅에 금수강산에 단군 할아버지가 터 잡으시고
            홍익인간 뜻으로 나라 세우니 대대손손 훌륭한 인물도 많아
            고구려 세운 동명왕 백제 온조왕 알에서 나온 혁거세
            만주 벌판 달려라 광개토대왕 신라 장군 이사부
            백결선생 떡방아 삼천궁녀 의자왕
            황산벌의 계백 맞서 싸운 관창
            역사는 흐른다
        </p>
        <img class="delete" alt="닫기" src="./images/delete_button.png"/>
    </div>
    <div class="pane">
        <h2>한국을 빛낸 100명의 위인들 1절</h2>
        <p>
            아름다운 이 땅에 금수강산에 단군 할아버지가 터 잡으시고
            홍익인간 뜻으로 나라 세우니 대대손손 훌륭한 인물도 많아
            고구려 세운 동명왕 백제 온조왕 알에서 나온 혁거세
            만주 벌판 달려라 광개토대왕 신라 장군 이사부
            백결선생 떡방아 삼천궁녀 의자왕
            황산벌의 계백 맞서 싸운 관창
            역사는 흐른다
        </p>
        <img class="delete" alt="닫기" src="./images/delete_button.png"/>
    </div>
    <div class="pane">
        <h2>한국을 빛낸 100명의 위인들 1절</h2>
        <p>
            아름다운 이 땅에 금수강산에 단군 할아버지가 터 잡으시고
            홍익인간 뜻으로 나라 세우니 대대손손 훌륭한 인물도 많아
            고구려 세운 동명왕 백제 온조왕 알에서 나온 혁거세
            만주 벌판 달려라 광개토대왕 신라 장군 이사부
            백결선생 떡방아 삼천궁녀 의자왕
            황산벌의 계백 맞서 싸운 관창
            역사는 흐른다
        </p>
        <img class="delete" alt="닫기" src="./images/delete_button.png"/>
    </div>
    <div class="pane">
        <h2>한국을 빛낸 100명의 위인들 1절</h2>
        <p>
            아름다운 이 땅에 금수강산에 단군 할아버지가 터 잡으시고
            홍익인간 뜻으로 나라 세우니 대대손손 훌륭한 인물도 많아
            고구려 세운 동명왕 백제 온조왕 알에서 나온 혁거세
            만주 벌판 달려라 광개토대왕 신라 장군 이사부
            백결선생 떡방아 삼천궁녀 의자왕
            황산벌의 계백 맞서 싸운 관창
            역사는 흐른다
        </p>
        <img class="delete" alt="닫기" src="./images/delete_button.png"/>
    </div>
</body>
</html>
cs
 

 

 
더보기

-Description

GUI :

8 : jquery easing 플러그인 CDN,
easing 플러그인  효과를 볼 수 있는 API 사이트 => https://api.jqueryui.com/easings/
42 : div 태그를 easeOutBounce효과로 슬라이드 업시켜서 display none으로 만듬 .  각종 특수효과 들은

https://api.jqueryui.com/easings/ 사이트에서 미리 볼수 있음

 

46~50 : div 태그를 다시보여줌 아랫문장들 보여주는것은 전부동일

 

-요약-

 

 

-마침글-

단순문법공부는 boring하다..

인용

 

'21년이전 > 국비-JSP' 카테고리의 다른 글

Jquery-Plugin 적용  (0) 2021.03.29
Jquery- class 추가 및 제거  (0) 2021.03.29
Jquery-특수효과적용2  (0) 2021.03.29
Jquery-특수효과주기  (0) 2021.03.29
국비-쿠키(Cookie)  (0) 2021.03.19
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JQuery : jquery-3.6.0.min.js


-설정-

설정에는 두가지 방법이 있는데 , 
1. 인터넷 서비스 제공자로부터 직접 연결하여 데이터를 전송받는 CDN방식(당연히 네트워크필수)
밑 명령줄을 ecilipse의 head태그내에 삽입. 
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="  crossorigin="anonymous"></script>

2. JQuery 메인 홈페이지에서 js 파일을 다운후 script문 작성.
<script type="text/javascript" src="./js/jquery-3.6.0.min.js"></script>

 

-jquery09-

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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style type="text/css">
 
    a{
        color:#000000;
        text-decoration: none;
        font-weight: bold;
    }
    #box{
        width: 100px;
        height: 100px;
        background: hotpink;
        position: relative;
    }
 
</style>
<script type="text/javascript">
 
    $(document).ready(function(){
        $('.run').click(function(){
            $('#box').animate({'left':'400px','opacity':'0.1'}, 1000,'linear')
                .animate({'top':'400px','opacity':'1'}, 1000,'linear')
                .animate({'left':'0px','opacity':'0.1'}, 1000,'linear')
                .animate({'top':'0px','opacity':'1'}, 1000,'linear')
                .slideUp(500);  
        });
    });
 
</script>
 
</head>
<body>
 
    <p>
        <a href="#" class="run">Run</a>
    </p>
 
    <div id="box"></div>
 
</body>
</html>
cs
더보기

-Description

GUI :

12 : 글자 굵기는 두껍게.
24 : onload 수행
25 : class run이 클릭될 경우 수행
26~30 :  애니메이션 적용, 시계방향으로 한바퀴 돈 후 , 슬라이드업으로 사라짐.
이렇게 연달아 연결된걸 체이닝 이라고함

 

-요약-

 

-마침글-

단순문법공부는 boring하다..

인용

 

'21년이전 > 국비-JSP' 카테고리의 다른 글

Jquery- class 추가 및 제거  (0) 2021.03.29
Jquery-EasingFlug 이용해보기  (0) 2021.03.29
Jquery-특수효과주기  (0) 2021.03.29
국비-쿠키(Cookie)  (0) 2021.03.19
JSP-출석 게시판 구현  (0) 2021.03.18
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JQuery : jquery-3.6.0.min.js


-설정-

설정에는 두가지 방법이 있는데 , 
1. 인터넷 서비스 제공자로부터 직접 연결하여 데이터를 전송받는 CDN방식(당연히 네트워크필수)
밑 명령줄을 ecilipse의 head태그내에 삽입. 
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="  crossorigin="anonymous"></script>

2. JQuery 메인 홈페이지에서 js 파일을 다운후 script문 작성.
<script type="text/javascript" src="./js/jquery-3.6.0.min.js"></script>

 

-jquery08_effect_1.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
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
    $(function(){
 
 
        $('p').bind('click',function(){ 
            
            
 
            $(this).css('backgroundColor','orange'); // 태그가 하나만 선택되기 때문에 this 써도됨
            //선택한 요소의 형제(sibling) 요소 중에서 지정한 선택자<p>에 해당하는 요소를 모두 선택한다.
            $(this).siblings('p').css('backgroundColor','white');
        
            if ($(this).is('p:contains(hide)')){
                $('img').hide();
            }
        
            if ($(this).is('p:contains(show())')){
                $('img').show();
            }    
            
            if ($(this).is('p:contains(toggle())')){
                $('img').toggle();
            }
            
            if ($(this).is('p:contains(slideUp())')){
                $('img').slideUp(500);
            }
            
            if ($(this).is('p:contains(slideDown())')){
                $('img').slideDown(500);
            }
            
            if ($(this).is('p:contains(slideToggle())')){
                $('img').slideToggle(500);
            }
            if ($(this).is('p:contains(fadeIn())')){
                $('img').fadeIn(500);
                $('img').fadeTo(500,1);
                //fadeTo 메소드가 실행되서 투명도가 변경되면 변경된 투명도로
                //fadeIn메소드가 실행되기 때문에 fadeIn()메소드에서
                //fadeTo메소드를 실행해 opacity속성값을 1로 다시 설정해준다.
            }
            if ($(this).is('p:contains(fadeOut())')){
                $('img').fadeOut(500);
            }
            if ($(this).is('p:contains(fadeToggle())')){
                $('img').fadeToggle(500);
            }
            
            
            if ($(this).is('p:contains(fadeTo())')){
                $('img').fadeTo(500,0.5); //fadeTo(재생시간,투명도)
            }
            
            if ($(this).is('p:contains(Animation)')){
                $('img').animate( // 이미지 크기 조절 애니메효과
                        {'width':'300px','height':'300px','top':'300px','left':'300px'},//스타일
                        1000//재생시간
                        'swing'//속도함수
                    );
            
                var img2= $('#img').clone().attr('id','img2').attr('src','./images/img02.jpg');
                $('#img').before(img2); 
                        
                //복사해서 추가한 img태그에도 애니메이션을 추가
                $('#img2').animate(
                        {'width':'300px','height':'300px','top':'100px','left':'100px'},//스타일
                        1000//재생시간
                        'swing'//속도함수    
 
                );
                
            }    
        }); // p태그 click 이벤트 
        
        $('h2').click(function(){
            $('p').show();
            $('p').each(function(index){
                $(this).animate(
                    {'top':40 * (index+1+ 'px'},//스타일
                    1000//재생시간
                    'swing'//속도함수
                    function(){  //콜백함수
                        console.log('animate!');
                    }
                );
            });
            
        })
        
        
    });
</script>
 
<style type="text/css">
 
    p{
        width: 150px;
        border: 2px solid skyblue;
        position : absolute;
        left: 10px;
        display: none;
    }
    img{
        width: 200px;
        height: 200px;
        position: absolute;
        left: 200px;
        top: 100px;
    }
 
</style>
 
</head>
<body>
    <h2>이펙트 메소드</h2>
    
    <div>
        <p>hide()</p>
        <p>show()</p>
        <p>toggle()</p>
        <p>slideUp()</p>
        <p>slideDown()</p>
        <p>slideToggle()</p>
        <p>fadeIn()</p>
        <p>fadeOut()</p>
        <p>fadeToggle()</p>
        <p>fadeTo()</p>
        <p>Animation</p>
    </div>
    <div id="div">
        <img id="img" src="./images/img01.jpg"/>
    </div>
</body>
</html>
cs

 

 
더보기

-Description

GUI :

11 : .bind('이벤트',함수) : jquery 이벤트에  함수를 연결한다.
15 : 클릭한 <p>태그의 배경색을 orange 로 변경한다. 하나만 선택됨
17 : 선택한 요소의 형제(sibling) 요소 중에서
 지정한 선택자<p>에 해당하는 요소를 모두 선택한다.
19 : contains() : 인수로 지정된 문자열을 포함하면
true, 포함하지 않으면 false를 리턴.
58 : fadeTo(재생시간,투명도)
62 : animation이 클릭될시 수행.
68 : clone() 메소드로 선택된 요소를 복사해서 새로운 요소를 생성한다.
id 속성이 img인 요소(img태그)를 복사하고 복사된 요소의 id속성을 img2로 지정한다.
69 :  id로 img 태그의  윗줄에 img2를 집어 넣음
82 : h2태그를 클릭할시 수행되는 이벤트
83 : p태그에 display :'None'을 해제함, 하지만
해당 줄이 적용 되어도 , p태그에는 position:absolute가 적용되어 있어서 
정확한 확인이 안됨. 
85 : 애니메이션 효과를 준다
86 : index별로 top의 위치를 다르게 준다

 

-요약-

animate()메소드로 여러 css을 이용해서사용자 이펙트를 정의할 수 있다.
//$('선택자').animate(스타일[,재생시간][,속도함수][,콜백함수]); // []은 생략가능
//스타일 : 이펙트를 구성할 css 스타일속성을 지정한다.
//재생시간 : 이펙트가 지속될 시간
//속도함수 : 이펙트의 시간당 속도를 저장
// swing => 시작,끝 부분에서는 늦게 움직이고 , 중간에 빨라짐
// linear=> 시작,끝,중간, 구분없이 일정한 속도로 움직인다
//콜백함수 : 이펙트 동작이 완료된 후 실행할 함수를 지정한다.

 

 

-마침글-

단순문법공부는 boring하다..

인용

 

'21년이전 > 국비-JSP' 카테고리의 다른 글

Jquery-EasingFlug 이용해보기  (0) 2021.03.29
Jquery-특수효과적용2  (0) 2021.03.29
국비-쿠키(Cookie)  (0) 2021.03.19
JSP-출석 게시판 구현  (0) 2021.03.18
JSP-인클루드 액션태그 이용  (0) 2021.03.14
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JAVA : JAVA8

 

-cookieWrite.jsp-

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
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<%
    Cookie cookie = new Cookie("id","hong"); //쿠키생성
    response.addCookie(cookie);
    
    Cookie cookie2 = new Cookie("name",URLEncoder.encode("아롱이","UTF-8"));
 
    cookie2.setMaxAge(10);
    
    response.addCookie(cookie2);
%>
쿠키 저장 완료<br/>
 
</body>
</html>
cs
더보기

-Description

쿠키는 서버가 클라이언트에 남기는(보내는) 작은 정보 조각을 말한다.
쿠키를 만들때는 한 번에 한 개씩 만들고 읽어올 때는 한꺼번에 모두 읽어 처리한다.
new Cookie("쿠키이름",쿠키 내용)

 

14 : 쿠키를 클라이언트로 보낸다.
보낼때는 response 받을때는 request
16 : 쿠키 내용을 한글로 전달할 경우 터짐. , 한글을 원할시 ,
URLEncoder.encode("아롱이","UTF-8") 같이  UTF-8 인코딩작업을해야함
18 : setMaxAge(인수) : 인수로 지정된 시간(단위는 초) 만큼 쿠키를 클라이어트에 유지시킨다.
지정된 시간이 경과되면 쿠키가 자동으로 삭제된다.
20 : 클라이언트에 쿠키 전달.

-cookieRead.jsp-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
     Cookie[] cookies = request.getCookies();
    
    for (Cookie cookie : cookies){
        out.println(cookie.getName()+"&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;"+URLDecoder.decode(cookie.getValue())+"</br>");
    }
%>
</body>
</html>
cs
더보기

-Description

13 : 쿠키를 읽어올 때는 여러개를 한번에 읽어 오기 때문에 배열로 받는다.
14~ 16 : 서버로부터 얻어온 쿠키들을 하나씩 뽑아온다
15 : URLDecoder.decode(cookie.getValue()) 을 이용하여 쿠키내용이 한글인경우를 대비해 디코딩작업을 가진다.
내용이 한글인 쿠키를 저장할 때는 에러가 발생되기 때문에 반드시 인코딩 과정을 거쳐 저장해야 하지만
읽어올때는 그냥 읽어와도 에러가 발생되지 않기 때문에 이상한 형태로 인코딩된 유니코드 자체를 가져오게 된다.
따라서 제대로된 내용을 읽을수 없다. 그러므로
저장된 내용이 한글인 쿠기를 읽어올 때는 디코딩 과정을 거쳐야 한글을 읽을 수 있다.

Cookie객체의 함수.
//getName() : 쿠키이름을 얻어옴
//getValue() : 쿠키 내용을 얻어온다.
//JSESSIONID는  jsp 가 사용하는 시스템쿠키로 ,접속한 컴퓨터를 식별하는 용도로 사용됨.

클라이언트 페이지 접속화면
10초후 새로고침한 클라이언트 페이지

 

-요약-

 

 

-마침글-

.

'21년이전 > 국비-JSP' 카테고리의 다른 글

Jquery-특수효과적용2  (0) 2021.03.29
Jquery-특수효과주기  (0) 2021.03.29
JSP-출석 게시판 구현  (0) 2021.03.18
JSP-인클루드 액션태그 이용  (0) 2021.03.14
JSP- Calendar(not DB & using web crawling)  (0) 2021.03.11
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JAVA : JAVA8
DBMS : Mysql

-memoList.jsp-

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
<!-- 
10페이지 단위로 표시
 -->
 
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.io.Console"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="src.koreait.DbUtil.DBUtil"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>출첵 게시판</title>
 
<style type="text/css">
     .button{
         background: white; /*배경색*/
         border: 1px solid white; /*테두리 => 선두꼐 선종류 선색상*/
         color: black; /*글자색*/
         padding: 6px;/*안여백*/
         text-align: center; /*텍스트정렬*/
         text-decoration:none; /*줄여부*/
         /* display:block;*/
         /* display:Inline; */
         display:Inline-block;/* 같은줄에표시되게한다 */
         font-size:15px; /*텍스트크기*/
         margin: 0px 2px; /*바깥여백*/
         width: 50px; /*가로 크기*/
         height: 35px; /*높이 크기*/
         cursor: pointer; /*마우스 갖다 댈때 손까락모양으로 변경됨*/
         transition-duration: 0.4s; /*애니메이션 재생시간 , 0.4초 동안변경됨*/
     }
     
     .button1{
         background: tomato;
         color: yellow;
         font-weight: bold;    /*글꼴 두께*/
         border: 1px solid white;
     }
     
     
     .button1:hover{
         background: yellow;
         color: tomato;
     }
     
     .button2{
         background: skyblue;
         color: white;
         font-weight: bold;    /*글꼴 두께*/
         border: 1px solid white;
     }
     
     tr{
         height:40px;
     }
     
     .input{
         height: 25px;
     }
</style>
 
</head>
<body>
    <!-- ------------------------------------------------------입력 화면 설계----------------------------------------------------------- -->
    <form action="memoinsert.jsp" method="post">
        <table width="1000" align="center" border="1" cellpadding="5" cellspacing="0">
        
            <tr>
                <th colspan="3">페이지당 표시할 글의 개수 변경 기능도 구현된 출첵 게시판 ver0.99</th>
            </tr>
            <tr>
                <td width="100" align="center">이름</td>
                <td width="100" align="center">비밀번호</td>
                <td width="800" align="center">메모</td>
            </tr>
            <tr>
                <td align="center">
                    <input type="text" name="name" style="width: 90%"/>
                </td>
                <td>
                    <input type="password" name="password" style="width: 90%"/>
                </td>
                <td>
                    <input type="text" name="memo" style="width: 80%"/>
                    <input class="button button1" type="submit" value="저장"/>
                </td>
            </tr>
        </table>
    </form>    
    <!-- ------------------------------------------------------입력 화면 설계 끝----------------------------------------------------------- -->
    
    <hr size="3" color="red"/>
    
    <!--------------------------------------------------------- JSP 처리 시작 ---------------------------------------------------------------->
 
    <%
    int pageSize = 10;      //  페이지에 표시할 글(튜플)의 갯수
    int totalCount = 0;     // 테이블에 저장된 전체 글(튜플)의 갯수
    int totalPage = 0;         //전체 페이지의 개수
    int currentPage = 1;     //현재 브라우저에 표시되는 페이지 번호
    int startNo = 0;        //현재 브라우저에 표시되는 글의 시작 인덱스 번호 => 인덱스는 0부터 시작됨
    int endNo = 0;            //현재 브라우저에 표시되는 글의 마지막 인덱스 번호
    int startPage = 0;        //페이지 이동 하이퍼링크 또는 버튼에 표시될 시작 페이지 번호
    int endPage =0 ;        //페이지 이동 하이퍼링크 또는 버튼에 표시될 마지막 페이지 번호
    
    Connection conn = DBUtil.getMysqlConnection();//이것은 한번만 선언
 
 
    String     sql = "select count(*) from memoList";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    ResultSet rs=pstmt.executeQuery();
    rs.next();
    totalCount = rs.getInt(1);
    out.println("테이블에 저장된 전체 글의 갯수 : " + totalCount + "개<br/>");
    
try{
    pageSize=Integer.valueOf(request.getParameter("pageSize"));
    session.setAttribute("pageSize", pageSize+"");
}catch(NumberFormatException e){
    String temp=(String)session.getAttribute("pageSize");
    if(temp != null){
        pageSize= Integer.valueOf(temp);
    }
}
 
    totalPage= (totalCount - 1) / pageSize + 1;
 
    try{
    currentPage = Integer.valueOf(request.getParameter("currentPage"));
    //currentPage 가 범위를 넘어갈시처리
    currentPage = currentPage > totalPage ?  totalPage: currentPage;//보안기능
    }catch (NumberFormatException e){
    }
 
    
    startNo = (currentPage-1) * pageSize; // oracle은 결과에 1을 더한다.
 
 
    sql = "select * from memolist order by idx DESC limit ?,?";
    pstmt = conn.prepareStatement(sql);
    pstmt.setInt(1, startNo);
    pstmt.setInt(2, pageSize);
    rs=pstmt.executeQuery();
    %>
 
    <!--------------------------------------------------------- JSP 처리 끝 ---------------------------------------------------------------->
 
    <!--------------------------------------------------------- 게시판 시작 ---------------------------------------------------------------->
    <table width="1300" align="center" border="1" cellpadding="5" cellspacing="0">
        <tr>
            <th width="80">글번호</th>
            <th width="80">이름</th>
            <th width="780">메모</th>
            <th width="120">작성일</th>
            <th width="120">IP</th>
            <th width="120">&nbsp;</th>
        </tr>
        
        <tr>
            <td colspan="3">
                <form action="?" method="post">
                    페이지당 표시할 글의 갯수를 선택하세요
                    <select name="pageSize" style="width: 100px; height: 25px;">
                        <option>3</option>
                        <option>5</option>
                        <option selected="selected">10</option>
                        <option>15</option>
                        <option>20</option>
                    </select>
                    <input class="button button1" type="submit" value="보기"/>
                </form>
            </td>
            <td colspan="3" align="right">
                <%=totalCount%>개(<%=currentPage%> / <%=totalPage%>)
            </td>
        </tr>
        
<%
    if(rs.next()){
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd(E)");
        do{
%>
        <tr>
            <td align="center"><%=rs.getString("idx")%></td>
            <td align="center"><%=rs.getString("name").replace("<","&lt;").replace(">","&gt;")%></td>
            <td><%=rs.getString("memo").replace("<","&lt;").replace(">","&gt;")%></td>
            <td align="center"><%=sdf.format(rs.getTimestamp("writeDate"))%></td>
            <td align="center"><%=rs.getString("ip")%>P</td>
            
            
            <td align="center">
                <input class="button button1" type="button" value="수정" 
                    onclick="location.href='memoUpdate.jsp?idx=<%=rs.getString("idx")%>&currentPage=<%=currentPage%>'"/>
                <input class="button button1" type="button" value="삭제" 
                    onclick="location.href='memoDelete.jsp?idx=<%=rs.getString("idx")%>&currentPage=<%=currentPage%>'"/>
            </td>
            
        </tr>
<%    
        }while(rs.next());
    } else {
%>
        <tr>
            <td colspan="5">
                <marquee>테이블에 저장된 글이 없습니다.</marquee> <!--  marquee 태그는 글에 특수효과를 줌 상세한 옵션도 설정됨-->
            </td>
        </tr>
<%
    }
%>        
 
    <tr>
        <td colspan="6" align="center">
        
<%
    startPage = (currentPage-1)/10*10 + 1;
    endPage = startPage +9;
    endPage = endPage > totalPage ? totalPage : endPage;    
 
    
    
    
    
 if(currentPage > 1){
%>    
    <input class="button button1" type="button" value="맨앞" title="첫 번째 페이지로 이동" onclick="location.href='?currentPage=1'"/>
 
<%
 }else{
%>
    <input class="button button2" type="button" value="맨앞" disabled="disabled" title="이미 첫 번째 페이지입니다."/> 
<%         
 }
    
if(startPage>1){
%>    
    <input class="button  button1" type="button" value="이전" title="이전 10페이지로 이동" onclick="location.href='?currentPage=<%=startPage -1%>'"/>    
<% 
}else{
%>
    <input class="button button2" type="button" value="이전" disabled="disabled" title="이미 첫 번째 10페이지입니다."/> 
<% 
}
 
    for(int i = startPage ; i<= endPage;i++){
        if(i==currentPage){
            %>
            <input class="button button2" type="button" value="<%=i%>" disabled="disabled"/>
            <%
            continue;
        }else{
%>
        <input class="button button1" type="button" value="<%=i%>" onclick="location.href='?currentPage=<%=i%>'"/>
<%
        }
    }
 
 
    if(endPage < totalPage){
%>
    <input class="button  button1" type="button" value="다음" title="다음 10페이지로 이동" onclick="location.href='?currentPage=<%=endPage +1%>'"/>    
<%        
    }else{
%>
    <input class="button button2" type="button" value="다음" disabled="disabled" title="이미 마지막 10페이지입니다."/> 
<%        
    }
 
    if(currentPage < totalPage){
%>
    <input class="button  button1" type="button" value="맨뒤" title="마지막 페이지로 이동" onclick="location.href='?currentPage=<%=totalPage%>'"/>    
<%        
    }else{
%>    
        <input class="button button2" type="button" value="맨뒤" disabled="disabled" title="이미 마지막 페이지입니다."/> 
<%        
    }
 
%>    
 
        </td>
    </tr>
 
    </table>
    <!--------------------------------------------------------- 게시판 끝 ---------------------------------------------------------------->
</body>
</html>
cs
더보기

83 : 간단한 css는 인라인 방식으로 지정.  style="width: 90%"
113 : PreparedStatement 로 sql문 미리실행
114 : ResultSet 로 쿼리문 결과를 저장
115 : ResultSet의 rs 객체는 처음엔 null을 가리키고 있고, rs.next()를 수행시 첫데이터로  
가리키게 된다.  
rs.previous() 를 수행시 전 레코드를 가리키게 된다.
116 : 인자는 1부터 시작
120~121 : pageSize조절 버튼이 클릭될 시 해당내용을 세션에 저장. 
122 : catch문 - 초기화면 or  pageSize조절이아닌 버튼 클릭시 오는 화면
123 : 초기화면의 경우엔 temp엔 null 이 들어감 , 
124~125 : pageSize조절이 아닌 버튼 클릭시  session의 pageSize에 저장되있던 데이터를
pageSize에 저장함
129 : pageSize 에 해당되는 총페이지(totalPage)수를 계산.
134 : 외부로부터 currentPage 가 넘어 오고나서 , currentPage값이 범위 밖일 경우 조절
135 : currentPage 가 넘어오지 않는다면 아무것도 수행않함
139 : currentPage 와 pageSize 을 이용해 현재페이지 게시판의 시작글번호 계산
146 : 최신게시글을 pageSize만큼 가져온다
168 : 콤보박스로 select를 써서 구현 ,  name으로 "pageSize"를 지정
171 : option의 속성으로 selected를 지정해서 기본 값 설정
185 : 날짜 데이터포멧 지정 ,  E 는 요일을 의미
191 : html, xml같은 마크업기반의 언어에서는 부등호를 태그의 시작과 끝으로
 인식하기 때문에 "<" 를 "&lt;" 로 대체하고 , ">" 를 "&gt;"
192 : rs에서 날짜데이터를 가져오기위해서 getTimestamp를 이용
197~200 : 수정, 삭제 onclick을 달아줌, 인자는  두태그 전부 idx, currentPage를 전달
206 : rs에 들어가 있는 데이터가 없을 경우 테이블에 데이터가 없다는 문구를 출력
221~223 : startPage,endPage 값 계산

225 : 버튼 클릭시 , currentPage=1을 인자로 화면 새로고침
230 : disabled="disabled"로 비활성화 지정, title은 마우스 가져다댈시 나오는 텍스트
234 : pageSize=10일경우 , startPage는 11,21,31..... 이런식으로 값을 가질수 있다.
startPage가 1보다 클경우 ,  10페이지 전으로 이동할수 있게되므로 조건문을 만족.
236 : currentPage=<%=startPage -1%> 는 값으로 10,20,30 ... 이렇게 값을 가질수 있다.
240 : startPage==1 인 경우로 , 버튼을 비활성화 시킨다.
244 : startPage 부터 endPage까지 반복문을 돌림
245 ~250 : 현재 페이지번호 i 에 도달할 경우 해당 페이지번호 버튼은 비활성화시킨다.
250~255 : 페이지번호 i를 클릭시 , currentPage=<%=i%>를 인자로 화면 새로고침을 한다.
258~266 : 다음 10페이지 이동 활성화 or 비활성화
268~276 : 마지막페이지 이동 활성화 or 비활성화

 

-DBUtil.java-

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
package src.koreait.DbUtil;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class DBUtil {
    
    public static Connection getMysqlConnection() {
        Connection conn = null;
        try{//드라이버는 WEB-INF/lib 에 저장
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/jspam?useUnicode=true&characterEncoding=UTF-8";
            conn = DriverManager.getConnection(url,"root","0000");
            System.out.println("연결 성공 :"+conn+"<br/>");
        }catch(ClassNotFoundException e){
            System.out.println("드라이버 클래스가 존재 하지 않습니다 ");
        }catch(SQLException e){
            System.out.println("데이터베이스 연결 정보가 옳바르지 않습니다 ");
        }
        return conn;
    }
    
    public static void close(Connection conn) {
        if(conn!= null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
cs
더보기

-Description

9: mysql에 연결하는 Connection 을 리턴하는 메소드
12 : sql driver를 설정
13 :  ?useUnicode=true&characterEncoding=UTF-8 로 테이블에 한글이 들어올경우 대비해서 설정
14 : db 의  url , 사용자아이디, 패스워드를 이용하여서 db에 접속
24 : Connection을 닫아주는 메소드
25 : conn이 null 이외일 경우 conn.close()을 수행

-memoinsert.jsp-

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
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Statement"%>
<%@page import="src.koreait.DbUtil.DBUtil"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<%
    request.setCharacterEncoding("UTF-8");//한글깨짐방지
    String name= request.getParameter("name");
    String password= request.getParameter("password");
    String memo= request.getParameter("memo");
    String ip= request.getRemoteAddr();
    
    Connection conn = DBUtil.getMysqlConnection();
    
    String sql="insert into memolist (name,password,memo,ip) values (?,?,?,?)";
    PreparedStatement pstmt= conn.prepareStatement(sql);
    pstmt.setString(1, name);
    pstmt.setString(2, password);
    pstmt.setString(3, memo);
    pstmt.setString(4, ip);
    pstmt.executeUpdate();
    
    response.sendRedirect("memoList.jsp");
            
%>
 
</body>
</html>
cs
더보기

-Description

16 : 한글깨짐방지
17~20 : 이전 페이지에서 전달된 파라미터를 받아온다
25 : PreparedStatement를 사용해서 sql 명령을 임시로 실행한다.
26~29 :  setString 의 첫 인자는 1부터시작함
30 : 테이블을 업데이트 시켜야하므로 executeUpdate 를 실행함
32 : 뭔가를 호출할때는 response(jspService임) ,   memoList.jsp 홈페이지로 이동.

-memoUpdate.jsp-

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="src.koreait.DbUtil.DBUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>수정할 글 보기</title>
</head>
<body>
 
<%
    request.setCharacterEncoding("UTF-8");
    String tempIdx=request.getParameter("idx");
    String tempcurrentPage=request.getParameter("currentPage");
    
    if(tempIdx!=null && tempcurrentPage!=null && tempIdx.trim().length()!=0 && tempcurrentPage.trim().length()!=0){
        int intIdx;
        int intcurrentPage;
        try{
            intIdx=Integer.valueOf(tempIdx);
            intcurrentPage=Integer.valueOf(tempcurrentPage);
 
            Connection conn = DBUtil.getMysqlConnection();
            String sql="select * from memolist where idx = ?";
            PreparedStatement pstmt=conn.prepareStatement(sql);
            pstmt.setInt(1, intIdx);
            ResultSet rs=pstmt.executeQuery();
            
            if(rs.next()){
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy년 MM월 DD일 E요일 hh시 mm분 ss초");
%>
            <!--  수정할 글이 테이블에 존재하므로 수정할 글을 화면에 보여주고 비밀번호를 입력받는다. -->
            <form action="updateOK.jsp" method="post">
                <table width="700" align="center" border="1" cellpadding="5" cellspacing="0">
                    <tr>
                        <th colspan="2">수정할 글 확인</th>
                    </tr>
                    <tr>
                        <td width="100">글번호</td>
                        <td width="600"><%=rs.getInt("idx")%></td>
                    </tr>
                    <tr>
                        <td>이름</td>
                        <td>
                            <input type="text" name="name" value="<%=rs.getString("name")%>" readonly="readonly"/>
                        </td>
                    </tr>
                    <tr>
                        <td>작성일</td>
                        <td><%=sdf.format(rs.getTimestamp("writeDate"))%></td>
                    </tr>
                    <tr>
                        <td>메모</td>
                        <td>
                            <input type="text" name="memo" value="<%=rs.getString("memo")%>" style="width: 98%;"/>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" align="center">
                            <label>비밀번호 <input type="password" name="password"/></label>
                            <input type="submit" value="수정하기"/>
                            <input type="reset" value="다시쓰기"/>
                             <!-- 돌아가는 방법 이하 3가지-->
                            <input type="button" value="돌아가기1" onclick="history.back()"/>
                            <input type="button" value="돌아가기2" onclick="history.go(-1)"/>
                            <input type="button" value="돌아가기3" onclick="location.href='memoList.jsp?currentPage=<%=intcurrentPage%>'"/>
                        </td>
                    </tr>
                </table>
                
                <input type="hidden" name="idx" value="<%=rs.getInt("idx")%>"/>
                <input type="hidden" name="currentPage" value="<%=intcurrentPage%>"/>
                
            </form>    
<%                
            }else{
                out.println("<script>");
                out.println("alert('수정할 글이 테이블에 존재하지 않습니다.')");
                out.println("location.href='memoList.jsp'");
                out.println("</script>");
            }
            
        }catch(NumberFormatException e){
            out.println("<script>");
            out.println("alert('수정할 글번호와 돌아갈 페이지번호가 숫자가 아닙니다.')");
            out.println("location.href='memoList.jsp'");
            out.println("</script>");
        }
    }
    else{
        out.println("<script>alert('수정할 글번호 혹은 돌아갈 페이지 번호가 옳바르지 않습니다.')</script>");
        response.sendRedirect("memoList.jsp");
    }
%>
 
</body>
</html>
cs
더보기

-Description

17 : 들어오는데이터 한글 깨짐 방지
18~19 : 외부로부터 idx , currentPage데이터 받기
21 : 수정할 글번호와 돌아갈 페이지 번호가 모두 넘어왔나 검사한다.
24 : 수정할 글번호와 돌아갈 페이지 번호가 모두 숫자인가 검사한다.
28~32 : idx에 해당하는 데이터모음 한건을 가져온다
34 : 수정할 글이 테이블에 존재하는가 검사후 , 데이터포멧형식을 제작
55 : 날짜형식을 Result 객체에서 가져올경우 rs.getTimestamp를 이용
65 : label 로 단순텍스트와 패스워드태그를 묶어 줌
66 : submit 타입으로 form태그의 action 속성(updateOK.jsp)과 연결
67 : reset 타입으로 다시쓰기 버튼 추가
69~71 : 이전 페이지로 돌아가는 방법3 가지 ( 3가지전부 동일한 페이지로 돌아감 )
76~77 : 수정할 글번호와 수정 작업후 돌아갈 페이지 번호도 updateOK.jsp로 넘겨줘야한다 -->
type으로 hidden 을 지정시 UI에는 표시 안됨
81~86 : 수정할 글이 테이블에 존재하지 않는다면, 에러메시지를 출력하고 memoList.jsp로 돌려보낸다.
다른 홈페이지를 자바스크립트로 호출할때 location.href='memoList.jsp' 이 방식을 이용 
88~92 : 외부로부터 들어온값이 숫자가 아닐시 예외처리
95~98 : 글번호와 페이지번호가 옳바르지 않을시 경고창 띄운후 memoList.jsp로 돌아감 
 

-updateOK.jsp-

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
<%@page import="src.koreait.DbUtil.DBUtil"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% 
    request.setCharacterEncoding("UTF-8");
    
    int idx=Integer. valueOf(request.getParameter("idx"));
    int currentPage=Integer. valueOf(request.getParameter("currentPage"));
    String password=request.getParameter("password");
    String name= request.getParameter("name");
    String memo= request.getParameter("memo");
    
    Connection conn = DBUtil.getMysqlConnection();
    String sql="select * from memolist where idx = ?";
    PreparedStatement pstmt=conn.prepareStatement(sql);
    pstmt.setInt(1, idx);
    ResultSet rs=pstmt.executeQuery();
    rs.next();
 
    out.println("<script>");
    if(password.equals(rs.getString("password"))){
        sql = "update memolist set name = ?,memo = ?  where idx=?";
        pstmt=conn.prepareStatement(sql);
        pstmt.setString(1, name);
        pstmt.setString(2, memo);
        pstmt.setInt(3, idx);
        pstmt.executeUpdate();
        
        out.println("alert('수정완료!')");
    }else{
        out.println("alert('비밀번호가 다릅니다.')");
    }
        out.println("location.href='memoList.jsp?currentPage="+currentPage+"'");
        out.println("</script>");
    %>
</body>
</html>
cs
더보기

-Desciption

17~21 : memoUpdate.jsp 로부터 idx,currentPage,password 그리고 수정할 데이터(name,memo)를 받는다
24 : 특정인덱스에 해당하는 튜플하나를 받아온다.
28 : rs가 가르키는 것이 처음에는 null이므로 , null 다음에 있는 데이터를 가르키도록
rs.next() 를 수행.
30~39 : 수정하기 위해 입력한 비밀번호와 수정할 글의 비밀번호를 비교해서 일치하면 글을 수정한다
40~42 : 비밀번호가 일치하지 않는다면 경고창을 보냄
43 : 결과가 어찌됬든 memoList.jsp로 돌아간다

 

-memoDelete.jsp-

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="src.koreait.DbUtil.DBUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>삭제할 글 보기</title>
</head>
<body>
 
<%
    request.setCharacterEncoding("UTF-8");
    String tempIdx=request.getParameter("idx");
    String tempcurrentPage=request.getParameter("currentPage");
 
    if(tempIdx!=null && tempcurrentPage!=null && tempIdx.trim().length()!=0 && tempcurrentPage.trim().length()!=0){
        int intIdx;
        int intcurrentPage;
        try{
            intIdx=Integer.valueOf(tempIdx);
            intcurrentPage=Integer.valueOf(tempcurrentPage);
 
            Connection conn = DBUtil.getMysqlConnection();
            String sql="select * from memolist where idx = ?";
            PreparedStatement pstmt=conn.prepareStatement(sql);
            pstmt.setInt(1, intIdx);
            ResultSet rs=pstmt.executeQuery();
            
            if(rs.next()){
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy년 MM월 DD일 E요일 hh시 mm분 ss초");
%>
            <form action="deleteOK.jsp" method="post">
                <table width="700" align="center" border="1" cellpadding="5" cellspacing="0">
                    <tr>
                        <th colspan="2">삭제할 글 확인</th>
                    </tr>
                    <tr>
                        <td width="100">글번호</td>
                        <td width="600"><%=rs.getInt("idx")%></td>
                    </tr>
                    <tr>
                        <td>이름</td>
                        <td><%=rs.getString("name").replace("<","&lt;").replace(">","&gt;")%></td>
                    </tr>
                    <tr>
                        <td>작성일</td>
                        <td><%=sdf.format(rs.getTimestamp("writeDate"))%></td>
                    </tr>
                    <tr>
                        <td>메모</td>
                        <td><%=rs.getString("memo").replace("<","&lt;").replace(">","&gt;")%></td>
                    </tr>
                    <tr>
                        <td colspan="2" align="center">
                            <label>비밀번호 <input type="password" name="password"/></label>
                            <input type="submit" value="삭제하기"/>
                            <input type="reset" value="다시쓰기"/>
                             <!-- 돌아가는 방법 이하 3가지-->
                            <input type="button" value="돌아가기1" onclick="history.back()"/>
                            <input type="button" value="돌아가기2" onclick="history.go(-1)"/>
                            <input type="button" value="돌아가기3" onclick="location.href='memoList4.jsp?currentPage=<%=intcurrentPage%>'"/>
                        </td>
                    </tr>
                </table>
                
                <input type="hidden" name="idx" value="<%=rs.getInt("idx")%>"/>
                <input type="hidden" name="currentPage" value="<%=intcurrentPage%>"/>
                
            </form>    
<%                
            }else{
                out.println("<script>");
                out.println("alert('삭제할 글이 테이블에 존재하지 않습니다.')");
                out.println("location.href='memoList.jsp'");
                out.println("</script>");
            }
            
        }catch(NumberFormatException e){
            out.println("<script>");
            out.println("alert('삭제할 글번호와 돌아갈 페이지번호가 숫자가 아닙니다.')");
            out.println("location.href='memoList.jsp'");
            out.println("</script>");
        }
    }
    else{
        out.println("<script>alert('삭제할 글번호 혹은 돌아갈 페이지 번호가 옳바르지 않습니다.')</script>");
        response.sendRedirect("memoList.jsp");
    }
%>
 
</body>
</html>
cs
더보기

-Description

18~19 : memolist.jsp 에서 넘어오는 삭제할 글번호idx와, 삭제 작업후 돌아갈 페이지 번호currentPage를 받는다.
21 : 삭제할 글번호와 돌아갈 페이지 번호가 모두 넘어왔나 검사한다.
24 : 삭제할 글번호와 돌아갈 페이지 번호가 모두 숫자인가 검사한다.
32 : executeQuery를 사용하여 db로부터 데이터를 가져온다. 
34 : 삭제할 글이 테이블에 존재하는가 검사한다.
37 : 삭제할 글이 테이블에 존재하므로 삭제할 글을 화면에 보여주고 비밀번호를 입력받는다.
71~72 : 삭제할 글번호와 삭제 작업후 돌아갈 페이지 번호도 deleteOK.sjp로 넘겨줘야한다 
76~81 : 삭제할 글이 테이블에 존재하지 않기 대문에 에러메시지를 출력하고 memoList.jsp로 돌려보낸다.

-deleteOK.jsp-

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
<%@page import="src.koreait.DbUtil.DBUtil"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% 
    request.setCharacterEncoding("UTF-8");
    
    int idx=Integer. valueOf(request.getParameter("idx"));
    int currentPage=Integer. valueOf(request.getParameter("currentPage"));
    String password=request.getParameter("password");
    
    Connection conn = DBUtil.getMysqlConnection();
    String sql="select * from memolist where idx = ?";
    PreparedStatement pstmt=conn.prepareStatement(sql);
    pstmt.setInt(1, idx);
    ResultSet rs=pstmt.executeQuery();
    rs.next();
 
    out.println("<script>");
    if(password.equals(rs.getString("password"))){
        sql = "delete from memolist where idx=?";
        pstmt=conn.prepareStatement(sql);
        pstmt.setInt(1, idx);
        pstmt.executeUpdate();
        out.println("alert('삭제완료!')");
    }else{
        out.println("alert('비밀번호가 다릅니다.')");
    }
    out.println("location.href='memoList.jsp?currentPage="+currentPage+"'");
    out.println("</script>");
    %>
</body>
</html>
cs
더보기

-Description

17~19 : 외부로부터 idx , currentPage ,password 를 받는다.
22 : 비밀번호를 비교하기위해 sql 에서 정보를 가져온다.
26 : rs가 가르키는 곳이 처음엔 null이기에 rs.next()를 수행시킨다.
28~40 : 삭제하기 위해 입력한 비밀번호와 삭제할 글의 비밀번호를 비교해서 
일치하면 글을 삭제한다

 

-요약-

 

 

-마침글-

.

'21년이전 > 국비-JSP' 카테고리의 다른 글

Jquery-특수효과주기  (0) 2021.03.29
국비-쿠키(Cookie)  (0) 2021.03.19
JSP-인클루드 액션태그 이용  (0) 2021.03.14
JSP- Calendar(not DB & using web crawling)  (0) 2021.03.11
JSP-코로나 실시간 온라인 투표  (0) 2021.03.04
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
JAVA : JAVA 8

 

-loginTest.jsp-

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<%
    request.setCharacterEncoding("UTF-8");
    String id="";
    String password="";
    try{
    id=request.getParameter("id").trim();
    password=request.getParameter("password").trim();
    }catch (NullPointerException e){
    }
    
    //id가 hong이고 password가 123456이면 로그인 처리한다.
    if(id.equals("hong") && password.equals("123456")){
        session.setAttribute("id", id);
        session.setAttribute("name", "관리자");
        session.setAttribute("login", "yes");
        out.println("<script>alert("+"'"+session.getAttribute("id")+"님 어서오세요!"+"'"+")</script>");
    }else if(id.length()+password.length()!=0){
        out.println("<script>alert('id 또는 password가 옳바르지 않습니다!')</script>");
    }
    
    String logout= request.getParameter("logout");
    if(logout!=null && logout.equals("yes")){
        out.println("<script>");
        out.println("alert('"+session.getAttribute("name")+"님 안녕히 가세요" +"')");
        out.println("</script>");
        //로그아웃 되었으므로 session에서 로그인 정보를 제거한다.
        session.removeAttribute("id");
        session.removeAttribute("name");
        session.removeAttribute("login");
    }
    
    String login = (String) session.getAttribute("login");//"yes" or null임
    if(login!=null && login.equals("yes")){
%>
 <!-- 로그인 상태일 경우-->
    로그인 성공<br/>
    <%=session.getAttribute("name")%>님 안녕하세요<br/>
    ${name}님 안녕하세요</br>
    <input type="button" value="로그아웃" onclick="location.href='?logout=yes'"/>
<%    
    }else{
%>
 
<!-- 로그아웃 상태일 경우 브라우저에 표시될 내용 -->
<table border="1" width="300" cellpadding="5" cellspacing="0">
    <form action="?">
        <tr>
            <th width="50" >
                <label for="id">id</label>  
            </th> <!--  th는 자동으로 굵고 정렬배치 -->
            <td width="250" align="center">
                <input id="id" type="text" size="30" name="id"/>
            </td>
        </tr>
        <tr>
            <th >
            <label for="pw">pw</label>
            </th>
            <td align="center">
                <input id="pw" type="password" size="30" name="password"/>
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" value="로그인" />
            </td>
        </tr>
    </form>
 
<%
    }
%>
    
</table>
 
</body>
</html>
cs
더보기

-Description

12 : jsp로 값을 받을 때 한글을 받으려면 UTF-8 Encoding을 하여 받아야 한다.
13~19 : login 버튼이 클릭되면 넘어오는 데이터(id,password)를 받는다.

22 : 로그인 되었다면, 로그인정보를 session에 저장후 GUI로 인사출력

 

//jsp에서 사용하는 시스템 영역과 유효 범위
//pageContext => 현재 보고 있는 페이지
//request => 현재 보고있는 페이지의 다음 페이지
//session => 브라우저가 실행되면 생성되고 브라우저가 종료되면 소멸되는 영역
//application  => 서버가 실행되면 생성되고 서버가 종료되면 소멸되는 영역


27 : 비번,패스워드가 다르다면 28행의 경고 메세지 출력 , 

처음 홈페이지 접속할 경우를 대비하여 id.length()+password.length()!=0 조건 설정(즉 수행 안됨)
32 : 로그아웃이 아닌경우를 고려해서 logout!=null 조건 설정(즉 수행 안함)
32~40 : logout이 발생하면 session의 데이터를 이용해 안내메세지를 출력후 ,

session 정보 제거
42,43,51 : session에서 로그인 정보를 읽어와서 로그인 상태,로그아웃 상태의 화면을
 브라우저에 표시한다
session의 login 파라미터가 갖는 값은 null or "yes"

43 : login!=null 은 세션정보가 null 일 경우를 생각해서 조건의 가장 앞에 나와야함
48 : ${name} 는 EL 표기법으로 객체 프로퍼티 값을 꺼낼때 주로 이용된다
- name 이라는 property를 인식해서 바로 꺼내옮

49 : onclick="location.href='?logout=yes'" 은 해당 버튼을 클릭할 시 ,
현재 페이지(?) 로 파라미터(logout=yes)을 전달한다는 것이다.
55 : cellpadding은 안여백  cellspacing은 셀간격을 의미
56 : action 속성값을 "?" 로 줌으로써 자신의 홈페이지로 재로딩
59,62 : for 속성을 이용하여 다른 태그와 관계를 가지게 된다.
관계를 가진다는 것은 둘중 한태그를 클릭할시 타이핑 포인트가 자동으로 text로 가게 됨,
for 속성 없이 label태그로 묶어도 동작.

-main.jsp-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<!-- include 디렉티브 사용해서 중복되는 jsp 코드 삽입하기 -->
<%-- <%@ include file="loginTest.jsp" %> --%>
 
 
<!--  include 액션 태그를 사용해서 중복되는 jsp 코드 삽입하기 -->
<%-- <jsp:include page="loginTest.jsp"></jsp:include>  --%>
 
<jsp:include page="loginTest.jsp"/> <!-- 이 방식 권장 -->
</body>
</html>
cs
더보기

-Description

18: html은 <tag>~</tag> 사이에 아무런 내용을 쓸 필요가 없으면 </tag>를 생략해도 된다.
jsp 액션 태그는 xml문법을 따르기 때문에 </tag>를 생략하면 에러가 발생된다.
하지만 xml문법에서도 </tag>를 생략할 방법이 있는데 시작 태그의 ">"앞에 "/"를 입력해서
<tag/>와 같은 방식으로 사용하면 된다. (권장)

 

-요약-

 

 

-마침글-

.

'21년이전 > 국비-JSP' 카테고리의 다른 글

국비-쿠키(Cookie)  (0) 2021.03.19
JSP-출석 게시판 구현  (0) 2021.03.18
JSP- Calendar(not DB & using web crawling)  (0) 2021.03.11
JSP-코로나 실시간 온라인 투표  (0) 2021.03.04
JSP-html 구조  (0) 2021.02.25
728x90

-개발환경-

IDE : Eclipse IDE for Enterprise Java Developers ver-2020-06 (4.16.0)
Tomcat : Tomcat v8.0 Server
Java : java 8

 

-calendar.jsp-

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<%@page import="com.koreait.myCalendar.LunarDate"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.koreait.myCalendar.SolarToLunar"%>
<%@page import="java.util.Calendar"%>
<%@page import="com.koreait.myCalendar.MyCalendar"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>만년달력</title>
<link rel="stylesheet" href="calendar.css">
</head>
 
<body>
<%
Calendar calendar = Calendar.getInstance();
int year=calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH)+1;
int day=calendar.get(Calendar.DAY_OF_MONTH);
 
    try{
    year=Integer.valueOf(request.getParameter("year"));
    month=Integer.valueOf(request.getParameter("month"));
    }catch(Exception e){
    }
    if(month<1){
        month=12;
        year--;
    }else if(month>12){
        month=1;
        year++;
    }
    
    ArrayList<LunarDate> lunarDate=SolarToLunar.solarToLunar(year, month);
    
%>
 
<!-- 달력제작 -->
<table width="700" align="center" border="1" cellpadding="5" cellspacing="1">
    <tr>
        <th>
            <input type="button" value="이전달" onclick="location.href='?year=<%=year%>&month=<%=month-1%>'"/>
        </th>
        <th id="title" colspan="5">
            <%=String.format("%4d",year)%>년 <%=String.format("%02d",month)%>
        </th>
        <th>
            <%-- <a href="?year=<%=year%>&month=<%=month+1%>">다음달</a> --%>
            <input type="button" value="다음달" onclick="location.href='?year=<%=year%>&month=<%=month+1%>'"/>
        </th>
    </tr>
    <tr>
        <td id="sunday"></td>
        <td class="etcday"></td>
        <td class="etcday"></td>
        <td class="etcday"></td>
        <td class="etcday"></td>
        <td class="etcday"></td>
        <td id="saturday"></td> <!--단위는 px(메인),em 등..   -->
    </tr>
    
    <!-- 달력에 날짜를 출력한다. -->
    <tr>
<%    
 
    //이전달 일자 출력
        int lastYear=year;
        int lastMonth=month-1;
        if(lastMonth<1){
    lastYear--; 
    lastMonth=12;
        }
        int endDay=MyCalendar.lastDay(lastYear, lastMonth);
        int numDay=MyCalendar.weekDay(year, month, 1);
    for(int i=0; i<MyCalendar.weekDay(year, month, 1);i++){
        int newDay=endDay-numDay+i+1;
        if(i==0)
    out.println("<td class=\"beforesun\">"+lastMonth+"/"+newDay+"</td>");
        else
    out.println("<td class=\"before\" >"+lastMonth+"/"+newDay+"</td>");
    }
    
    //현재달 일자 출력
    int lastday=MyCalendar.lastDay(year, month);
    for(int i=1;i<=lastday;i++){        
        
        if(lunarDate.get(i-1).getLunar().length()==0){
    
            if (MyCalendar.weekDay(year, month, i) == 0)
                out.println("<td class=\"sun\">" + i + "</td>");
            else if (MyCalendar.weekDay(year, month, i) == 6)
                out.println("<td class=\"sat\">" + i + "</td>");
            else
                out.println("<td class=\"etc\">" + i + "</td>");
        }else{
            out.println("<td class='holiday'>"+i+lunarDate.get(i-1).getLunar()+"</td>");
        }
        
        if (MyCalendar.weekDay(year, month, i) == 6 && i + 1 <= lastday) {
            out.println("</tr><tr>");
        }
    }
 
    //다음달 일자 출력
    int nextYear = year;
    int nextMonth = month + 1;
    if (nextMonth > 12) {
        nextYear++;
        nextMonth = 1;
    }
    int DayofWeek = MyCalendar.weekDay(year, month, MyCalendar.lastDay(year, month));
    int start = 0;
    for (int i = DayofWeek + 1; i <= 6; i++) {
        if (i == 6)
    out.println("<td class='aftersat'>" + nextMonth + "/" + ++start + "</td>");
        else
    out.println("<td class='after' >" + nextMonth + "/" + ++start + "</td>");
    }
%>
    </tr>
    
    <tr>
        <td colspan="7">
            <form action="?" method="post">
                <select class="select" name="year">
<%
    for(int i=1950; i<=2050; i++){
        if(i== calendar.get(Calendar.YEAR)){
            out.println("<option selected='selected'>"+i+"</option>");
        }
        else
            out.println("<option>"+i+"</option>");
    }
%>                    
                </select>
                <select class="select" name="month">
<%
    for(int i=1; i<=12; i++){
        if(i== calendar.get(Calendar.MONTH)+1){
            out.println("<option selected='selected'>"+i+"</option>");
        }
        else
            out.println("<option>"+i+"</option>");
    }
%>                    
                </select>
                <input class="select" type="submit" value="보기" />
            </form>
        </td>
    </tr>
    
</table>
</body>
</html>
cs
더보기

-Description

13 : css 파일 지정

24~25 : 리로딩 전 페이지로부터 데이터를 받아온다.
28~34, 49~52 : 이전달,다음달 버튼 클릭시 month가 변경됨에 따라 year도 변경
36 : ArrayList형 lunarDate에 크롤링에서 받아온 양력,음력 공휴일데이터 가져오기.
44 : onclick="location.href='?year=<%=year%>&month=<%=month-1%>'"
onclick을 통해 현재페이지(?)로 리로드,  동시에 year와 month로 데이터 전달
69~83 : 이전달 일자 출력

91: i 날짜가 일요일일 경우엔 sun class의 css파일 적용
93: i 날짜가 토요일일 경우엔 sat class의 css파일 적용
91: i 날짜가 일,토요일이외인 경우엔 etc class의 css파일 적용
98 : i날짜가 공휴일인경우엔 holiday class의 css파일을 날짜와 공휴일명에 적용
101~102 : 출력한 날짜가 토요일이면 줄을 변경, </tr><tr>이런 테크닉에도 유의
86~104 : 현재달 일자 출력
107~120 : 다음달 일자 출력
124~152 : 년,월을 선택하고 보기 버튼을 클릭하면 특정 달의 달력으로 넘어가게 한다
127 : select tag로 년도 선택가능한 combobox 제작
131 : select tag의 기본선택으로 현재년도 지정,
select tag의 하위 태그인 option에서  selected='selected' 을 이용하여 기본선택지정
140~146 : 같은 원리로 select tag의 기본선택으로 현재월을 지정
149 : form tag의 action과 연결 ,  두가지 콤보박스의 선택된 데이터가 넘어감

 

-MyCalendar.java-

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
package com.koreait.myCalendar;
 
//달력작업에 필요한 메소드를 모아놓은 클래스
public class MyCalendar {
    
    public static boolean isYun(int year) {
        if (year%4==0 && year%100!=0 || year%400==0)
                return true;
        else
            return false;
    }
    
    public static int lastDay(int year,int month) {
        int[] m = {31,28,31,30,31,30,31,31,30,31,30,31};
        m[1=  isYun(year) ? 29 :28;
        return m[month-1];
    }
    
    public static int totalDay(int year,int month,int day) {
        int total= (year-1)*365  + (year-1)/4- (year-1/ 100 + (year-1)/400;
        for(int i=1; i<month;i++)
            total+=lastDay(year,i);
        return total+day;
        
    }
    
    public static int weekDay(int year,int month,int day) {
        return totalDay(year,month,day) % 7;
    }
}
 
cs
더보기

-Description

6 : year을 인수로 , 윤년, 평년을 판단해 윤년은 true, 평년은 false를 리턴하는 메소드
13 : year,month을 인수로  ,  그 달의 마지막 날짜를 리턴하는 메소드
19 : year,month,day를 인수로 ,  1년 1월 1일 부터 지나온 날짜의 합계를 리턴하는 메소드
27 : year,month,day를 인수로 , 요일을 숫자로 리턴하는 메소드,일요일(0) , 월요일(1),....., 토요일(6)

-LunarDate.java-

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.koreait.myCalendar;
 
// 양력 날짜, 양력 날짜에 해당하는 음력날짜, 공휴일을 묶음으로 기억하는 클래스
public class LunarDate {
    private int year;  //양력년
    private int month; //양력월
    private int day;  //양력일
    private int yearLunar;  //음력년
    private int monthLunar; //음력월
    private int dayLunar;  //음력일
    private boolean LunarFlag; //true면 윤달
    private String Lunar="";//공휴일
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public int getYearLunar() {
        return yearLunar;
    }
    public void setYearLunar(int yearLunar) {
        this.yearLunar = yearLunar;
    }
    public int getMonthLunar() {
        return monthLunar;
    }
    public void setMonthLunar(int monthLunar) {
        this.monthLunar = monthLunar;
    }
    public int getDayLunar() {
        return dayLunar;
    }
    public void setDayLunar(int dayLunar) {
        this.dayLunar = dayLunar;
    }
    public boolean isLunarFlag() {
        return LunarFlag;
    }
    public void setLunarFlag(boolean lunarFlag) {
        LunarFlag = lunarFlag;
    }
    public String getLunar() {
        return Lunar;
    }
    public void setLunar(String lunar) {
        Lunar = lunar;
    }
    @Override
    public String toString() {
        return String.format("앙력 %4d년 %2d월 %2d일은 음력 %s %4d년 %2d월 %2d일 입니다 . -%s",
                year,month,day,LunarFlag?"윤":"",yearLunar,monthLunar,dayLunar,Lunar);
    }
    
    
    
}
 
cs
더보기

-Description

양력, 음력, 공휴일데이터를 저장하는 데이터 클래스

-SolarToLunar.java-

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.koreait.myCalendar;
 
import java.io.IOException;
import java.util.ArrayList;
 
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
public class SolarToLunar {
 
    public static ArrayList<LunarDate> solarToLunar(int year,int month){
        
        ArrayList<LunarDate> lunarList = new ArrayList<LunarDate>();//1월~12월의 양력과 대응 되는 음력을 기억.
        ArrayList<LunarDate> list = new ArrayList<LunarDate>();//음력을 저장해 리턴할 객체
        String targetSite="";
        
        
            targetSite=String.format("https://astro.kasi.re.kr/life/pageView/5?search_year=%4d&search_month=%02d",year,month);
            
            Document document=null;
            
        try {
            document = Jsoup.connect(targetSite).get(); 
            //select()메소드를 사용해 날짜<tr>단위로 얻어온다.
            Elements elements = document.select("tbody > tr");
            for(Element element : elements) {
                Elements ele = element.select("td");
//                System.out.println(ele.get(0));//양력
//                System.out.println(ele.get(1));//음력
                String sola=ele.get(0).text();//양력
                String lunar=ele.get(1).text();//음력
                
                LunarDate lunarDate = new LunarDate();
                lunarDate.setYear(Integer.valueOf(sola.split("-")[0]));
                lunarDate.setMonth(Integer.valueOf(sola.split("-")[1]));
                lunarDate.setDay(Integer.valueOf(sola.split("-")[2].split(" ")[0]));
                
                lunarDate.setYearLunar(Integer.valueOf(lunar.split("-")[0]));
                lunarDate.setMonthLunar(Integer.valueOf(lunar.split("-")[1]));
                lunarDate.setDayLunar(Integer.valueOf(lunar.split("-")[2]));
            
                lunarDate.setLunarFlag(lunar.length()>10?true:false);
                
                lunarList.add(lunarDate);
            }
        } 
        catch (IOException e) { e.printStackTrace();     }
        
        //반복문 끝
 
        //공휴일처리
        for(int i=0;i<lunarList.size();i++) {
            
            //양력 공휴일
            if(lunarList.get(i).getMonth()==1 && lunarList.get(i).getDay()==1
                lunarList.get(i).setLunar("</br><span>신정</span>");
            else if(lunarList.get(i).getMonth()==3 && lunarList.get(i).getDay()==1
                lunarList.get(i).setLunar("</br><span>삼일절</span>");
            else if(lunarList.get(i).getMonth()==5 && lunarList.get(i).getDay()==1
                lunarList.get(i).setLunar("</br><span>근로자의날</span>");
            else if(lunarList.get(i).getMonth()==5 && lunarList.get(i).getDay()==5
                lunarList.get(i).setLunar("</br><span>어린이날</span>");
            else if(lunarList.get(i).getMonth()==6 && lunarList.get(i).getDay()==6
                lunarList.get(i).setLunar("</br><span>현충일</span>");
            else if(lunarList.get(i).getMonth()==8 && lunarList.get(i).getDay()==15
                lunarList.get(i).setLunar("</br><span>광복절</span>");
            else if(lunarList.get(i).getMonth()==10 && lunarList.get(i).getDay()==3
                lunarList.get(i).setLunar("</br><span>개천절</span>");
            else if(lunarList.get(i).getMonth()==10 && lunarList.get(i).getDay()==9
                lunarList.get(i).setLunar("</br><span>한글날</span>");
            else if(lunarList.get(i).getMonth()==12 && lunarList.get(i).getDay()==25
                lunarList.get(i).setLunar("</br><span>크리스마스</span>");
            
            //음력 공휴일 
            if(!lunarList.get(i).isLunarFlag() && lunarList.get(i).getMonthLunar()==1 && lunarList.get(i).getDayLunar()==1) {
                lunarList.get(i-1).setLunar("</br><span>설날연휴</span>");
                lunarList.get(i).setLunar("</br><span>설날</span>");
                lunarList.get(i+1).setLunar("</br><span>설날연휴</span>");
            }
            else if(!lunarList.get(i).isLunarFlag() && lunarList.get(i).getMonthLunar()==4 && lunarList.get(i).getDayLunar()==8
                lunarList.get(i).setLunar("</br><span>석가탄신일</span>");
            else if(!lunarList.get(i).isLunarFlag() && lunarList.get(i).getMonthLunar()==8 && lunarList.get(i).getDayLunar()==15) {
                lunarList.get(i-1).setLunar("</br><span>추석연휴</span>");
                lunarList.get(i).setLunar("</br><span>추석</span>");
                lunarList.get(i+1).setLunar("</br><span>추석연휴</span>");
            }
            
            //대체 공휴일 => 설, 추석, 어린이날
            if(lunarList.get(i).getMonth()==5 && (lunarList.get(i).getDay()==6 || lunarList.get(i).getDay()==7&& MyCalendar.weekDay(year,month,i)==1
                lunarList.get(i).setLunar("</br><span>대체 공휴일</span>");
            else if(!lunarList.get(i).isLunarFlag() && lunarList.get(i).getMonthLunar()==1 &&
                    (lunarList.get(i).getDayLunar()==2 || lunarList.get(i).getDayLunar()==3&& MyCalendar.weekDay(year,month,i)==1
                lunarList.get(i).setLunar("</br><span>대체공휴일</span>");
            else if(!lunarList.get(i).isLunarFlag() && lunarList.get(i).getMonthLunar()==8 &&
                    (lunarList.get(i).getDayLunar()==16 || lunarList.get(i).getDayLunar()==17&& MyCalendar.weekDay(year,month,i)==1
                lunarList.get(i).setLunar("</br><span>대체공휴일</span>"); 
            
            //어린이날 대체 공휴일 => 어린이날이 석가탄신일과 겹쳤을때
            if(lunarList.get(i).getMonth()==5 && lunarList.get(i).getDay()==5 
                    && !lunarList.get(i).isLunarFlag() && lunarList.get(i).getMonthLunar()==4 && lunarList.get(i).getDayLunar()==8) {
                lunarList.get(i).setLunar("</br><span>어린이날</span></br><span>석가탄신일</span>");
                lunarList.get(i+1).setLunar("</br><span>대체 공휴일</span>");
            }
            
            //추석 대체 공휴일 => 추석이 개천절과 겹쳤을때
            if(lunarList.get(i).getMonth()==10     && lunarList.get(i).getDay()==3 
                    && !lunarList.get(i).isLunarFlag() && lunarList.get(i).getMonthLunar()==8 && lunarList.get(i).getDayLunar()==15) {
                lunarList.get(i).setLunar("</br><span>추석</span></br><span>개천절</span>");
                lunarList.get(i+2).setLunar("</br><span>대체 공휴일</span>");
            }
        }
 
 
        
        for(int i=0; i< lunarList.size();i++
            if(lunarList.get(i).getMonth()== month) 
                list.add(lunarList.get(i));
 
        return list;
    }
    
}
 
cs
더보기

-Description

13 : 월별 양력과 음력을 크롤링하고 양력, 음력 공휴일을 계산해서 리턴하는 메소드
22 : 크롤링한 데이터를 기억할 org.jsoup.nodes 패키지의 Document 클래스 객체를 선언한다.
25 : org.jsoup.Jsoup 패키지의 connect() 메소드로 크롤링 할 타겟 사이트에 접속하고 
      get() 메소드로 타겟사이트의 정보를 얻어온다.
27 : tbody > tr > td 내부에 양력 음력 정보가 들어 있으므로 , 일단 tbody > tr 을 select함

 

32~33 : text() 메소드로 태그제외한 텍스트만 가져옴, 즉 양력 음력 데이터 
35~44:  크롤링한 결과를 반복문 마다 LunarDate 클래스 객체에 저장
44줄의 lunarDate.setLunarFlag에는 항상 false가 인수로 넘어감
46 : lunarList에는 특정년도에 해당하는 모든달 모든일에 대한 정보가 들어감.
54 : lunarList에 있는 정보들을 하나씩 뽑아와서 공휴일(Lunar)명칭을 지정
57~74 : 양력 공휴일 지정
77~88 : 음력 공휴일 지정 
91~98 : 대체 공휴일 지정 ( 토 or 일요일에 설,추석,어린이날이 있다면  , 월요일을 대체 공휴일로 지정 )
117~121 : lunarList 데이터를 list로 복사후 반환.

-calendar.css-

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
table{
    /* border-xxx: 선두께 선종류 선색상; */
    /* border-left: 0px solid; */ 
    /* border-radius: 선의 굴곡; */ 
    border: 3px solid navy;
    border-radius: 10px;
    
}
tr {
    height: 80px;
    border: 0px solid;
}
th{
    border: 0px solid;
}
td{
    border: 1px solid;
    border-radius: 5px;
}
/* .은 클래스 명명 */ 
.select{
    width: 100px;
    height: 30px;
}
/* #은 id 명명 */
th#title {
    font-size: 30pt;
    color: tomato;
    font-weight: bold;
    font-family: D2Coding;
}
td#sunday {
    font-size: 20pt;
    font-weight: bold;
    width: 100px;
    text-align: center;
    color: red;
}
 
td#saturday {
    font-size: 20pt;
    font-weight: bold;
    width: 100px;
    text-align: center;
    color: blue;
}
td.etcday {
    font-size: 20pt;
    font-weight: bold;
    width: 100px;
    text-align: center;
    color: black;
}
td.sun{
    color: red;
    font-weight: bold;
    text-align:  right;
    vertical-align: top;
}
td.sat{
    color: blue;
    font-weight: bold;
    text-align:  right;
    vertical-align: top;
}
td.etc{
    color: black;
    font-weight: bold;
    text-align:  right;
    vertical-align: top;
}
td.beforesun{
    color: red;
    font-weight: bold;
    font-size: 5px;
    text-align:  right;
    vertical-align: top;
    background: lightgray;
}
td.before{
    color: black;
    font-weight: bold;
    font-size: 5px;
    text-align:  right;
    vertical-align: top;
    background: lightgray;
}
td.aftersat{
    color: blue;
    font-weight: bold;
    font-size: 5px;
    text-align:  right;
    vertical-align: top;
    background: lightgray;
}
td.after{
    color: black;
    font-weight: bold;
    font-size: 5px;
    text-align:  right;
    vertical-align: top;
    background: lightgray;
}
td.holiday{
    color: red;
    font-weight: bold;
    font-size: 5px;
    text-align:  right;
    vertical-align: top;
    font-size: 12pt;
    background: yellow;
}
span{
    font-size: 9pt;
}
/*하이퍼 링크 스타일 지정하기*/
/* a 는 일괄 하이퍼 링크 특성 지정*/
/* a {
    color: black;
    text-decoration: none;
} */
a:link { /* link의 의미는 , 한 번도 방문하지 않은 하이퍼 링크*/
    color: black;
    text-decoration:none;
}
a:visited { /* 한 번 이상 클릭한 하이퍼 링크*/
    color: black;
    text-decoration:none;
}
a:hover{ /*마우스를 올리고 있을 때 발생함*/
    text-decoration:underline;
}
a:active{ /*마우스로 누르고 있을 때 발생함*/
    color: skyblue;
    text-decoration:none;
}
 
 
cs
더보기

-Description

정통적으로 ,
.=>class (클래스는 여러번나올때 사용) 
 # => id 를 의미 (id는 하나씩 지정할때 사용) 

 

-요약-

 

-마침글-

 

'21년이전 > 국비-JSP' 카테고리의 다른 글

국비-쿠키(Cookie)  (0) 2021.03.19
JSP-출석 게시판 구현  (0) 2021.03.18
JSP-인클루드 액션태그 이용  (0) 2021.03.14
JSP-코로나 실시간 온라인 투표  (0) 2021.03.04
JSP-html 구조  (0) 2021.02.25

+ Recent posts