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>

 

-jquery01_시작.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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script type="text/javascript" src="./js/jquery-3.6.0.min.js"></script>
  
<script type="text/javascript">
 
//이미지 사이즈변경
    function imgSize(){
        //$('img').css('width','400px');//너비 높이중 하나만 지정할 경우, 나머지는 자동비율조정됨
        //$('img').css('height','2000px');
        //$('img').css({'width':'100px','height':'500px'});  //폭,높이를 한번에 이렇게도 사용가능
        $('img').css({'width':'100px','height':'500px'}).css('opacity','0.5');
        }
 
//필터링 메소드
    function highLight(){
        //document.getElementById('list').style.backgroundColor='tomato';  //javascript 표현식
        $('#list').css('backgroundColor','tomato');//윗 js와 같은의미의 jquery 표현
        
        //document.getElementsByTagName('li')[1].style.backgroundColor='chocolate';//javascript 표현식
        //$('li').eq(1).css('backgroundColor','chocolate'); //윗 js와 같은의미의 jquery 표현
 
        $('#list > li').slice(2,5).css('backgroundColor','chocolate');//인덱스 2부터 4까지
    }
 
    function addImg(){
        //$('div').append( '<img src="./images/img03.jpg"/>' );
        //$('div').prepend( '<img src="./images/img01.jpg"/>' );
        //$('div').before( '<img src="./images/img01.jpg"/>' );
        //$('div').after( '<img src="./images/img01.jpg"/>' );
        $('div').append( '<img src="./images/img03.jpg"/>' );
        $('div').prepend( '<img src="./images/img01.jpg"/>' );
        $('div').before( '<img src="./images/img04.jpg"/>' );
        $('div').after( '<img src="./images/img05.jpg"/>' );
        
    }
    
    function hideImg(){
        
        /*
        var imgs=document.getElementsByTagName('img');
        for (var i=0;i<imgs.length;i++){
            imgs[i].style.display= 'none';
        } */  // javascript로 구현시
 
        //$('img').first().css('display','none');
        //$('img').first().hide();
        //$('img').hide(); // 왼쪽위로 사라진다, 모든이미지 display : none
        //$('img').hide(100); // 인자로 1000은 1초 ,즉 ms단위
        //$('img').fadeOut(1000); // (투명도로)천천히 사라진다.
        //$('div').slideUp(1000); // 위로사라짐
        //$('img').hide(1000);
        $('img').slideUp(1000);
    }
    
    function showImg(){
        /* 
        var imgs=document.getElementsByTagName('img');
        for (var i=0;i<imgs.length;i++){
            imgs[i].style.display= 'block';
        }*/   //javascript로 구현시
        
        //$('img').first().show();
        //$('img').show(); //이미지 전체보이기
        //$('img').fadeIn(1000); // (투명도로) 천천히 현상된다.
        $('img').slideDown(1000);  // 핵심개념으로, hideImg 와  showImg는 태그를 맞춰줘야함.
        
    }
    
    function toggleImg(){
        //$('img').toggle(1000);  //단순토글
        //$('img').fadeToggle(1000);  //투명도 이용한 토글
        $('div').slideToggle(1000);  //슬라이드 토글
        
    }
</script>
 
</head>
<body>
 
    <h2>jQuery</h2>
    <p>
        <ul id="list">
            <li>셀렉터 표현식</li>
            <li>DOM 탐색 메소드</li>
            <li>DOM 검색 메소드</li>
            <li>이벤트 메소드</li>
            <li>이펙트 메소드</li>
            <li>AJAX 메소드</li>
            <li>기타 등등</li>
        </ul>
    </p>
    
    <p>
    <button type="button" onclick="imgSize()">이미지 크기 변경</button>
    <button type="button" onclick="highLight()">리스트 선택</button>
    <button type="button" onclick="addImg()">이미지 추가</button>
    <button type="button" onclick="hideImg()">이미지 숨기기</button>
    <button type="button" onclick="showImg()">이미지 보이기</button>
    <button type="button" onclick="toggleImg()">이미지 토글</button>
    </p>
    
    <div>
        <img alt="피카츄" src="./images/img02.jpg"/>
    </div>
</body>
</html>
cs

 

더보기

-Description

16 : 두개의 css문장을 엮을수 있음.  opacity= 투명도
22 : id 속성값이 list인 css 스타일을 변경하려는데 , 배경색을 토마토로 변경.
25 : eq(1)은 특정 태그들 중에서 인덱스가 1인 요소를 꺼내오라는 의미
27 : id 속성값이 list인 태그의 자식들중 li 태그를 모으는데 , slice(2,5) 로 인하여 [2,5) 인덱스에 속하는 태그들만
꺼내와서 배경색을 쵸콜릿으로 만듬

 

31~38 : jQuery 명령어로 태그의 추가가 이루어짐

 

57 : 슬라이드효과를 img 태그에서 1초동안 일어나게 하는 명령어

 

main GUI :

 

 

-요약-

Javascript와 JQuery 비교

id 속성에서 속성값으로 'id'를 가진 태그의 배경색을 'tomato'로 변경해보세요.

//javascript 작성법
//=> document.getElementById('id').style.backgroundColor='tomato';


//jquery 작성법 = > $('선택자').메소드()
//=> $('#id').css('backgroundColor','tomato');

 

페이지가 로드되자마자 무언갈 수행되게 해주는 onload(Javascript기준) 메소드 작성해보세요.

//javascript의 onload
//=> onload = function() {};
or
// => window.onload= function(){}; // window는 생략가능

 

//jquery의 onload
//=> $(document).ready(function() { });
or
//=>$(function() {}); //이와 같이 써도 됨

개념

JQuery

//태그의 추가 명령어
//선택된 태그의 내부에 추가
// .append() : 선택된 태그 내부의 마지막에 추가한다
// .prepend() : 선택된 태그 내부의 첫 번째에 추가한다.
//선택된 태그 외부의 윗 부분 or 아랫부분에 추가
// .before() : 선택된 태그 외부의 위쪽에 추가한다.
// .after() : 선택된 태그 외부의 아래쪽에 추가한다.

 

// 필터링 메소드
// .first() : 선택된 요소 중 첫 번째 요소를 선택한다.
// .last() : 선택된 요소 중 마지막 요소를 선택한다.
// .eq(index) : 선택된 요소 중 index 번째 요소를 선택한다.
// .slice() : 선택한 요소 중 전달받은 인덱스 범위에 해당하는 요소만 선택한다.
// .filter() : 선택된 요소 중 전달받은 선택자에 해당된거나, 함수 호출 결과가 참인 모든 요소를 선택한다.
// .not() : 선택된 요소 중 전달받은 선택자에 해당된거나, 함수 호출 결과가 거짓인 모든 요소를 선택한다.
// .has() : 선택된 요소 중 전달받은 선택자에 해당되는 요소의 모든 자손 요소를 선택한다.
// .is() : 선택된 요소 중 전달받은 선택자에 해당되는 요소가 하나라도 존재하면 true를 리턴한다.
// .map() : 선택한 요소 집합의 각 요소마다 콜백 함수를 실행하고 리턴값으로 구성된 객체를 리턴한다.

// 요소의 표시와 숨김
// .hide() : 선택한 요소의 css를 자동으로 조정해서 사라지게 한다.
// .show() : 선택한 요소의 css를 자동으로 조정해서 표시되게 한다.
// .toggle() : 선택한 요소의 css를 자동으로 조절해서 hide(), show() 메소드가 번갈아 적용된다.
// hide(), show() 메소드의 인수로 시간(밀리초)을 설정하거나 "slow", "fast"와 같은 예약어를 전달해 속도를 설정할 수 있다.

// 페이드 효과
// .fadeIn() : 선택한 요소의 css 중 opacity 속성의 값을 높여가며 나타나게 한다.
// .fadeOut() : 선택한 요소의 css 중 opacity 속성의 값을 줄여가며 사리지게 한다.
// .fadeToggle() : fadeIn(), fadeOut() 메소드가 번갈아 적용된다.
// fadeIn(), fadeOut() 메소드의 인수로 시간(밀리초)을 설정하거나 "slow", "fast"와 같은 예약어를 전달해 속도를 설정할 수 있다.
// 슬라이드 효과
// slideUp() : 선택한 요소의 css 중 height 속성의 값을 낮춰가며 사라지게 한다.
// slideDown() : 선택한 요소의 css 중 height 속성의 값을 높여가며 나타나게 한다.
// slideToggle() : slideUp(), slideDown() 메소드가 번갈아 적용된다.
// slideUp(), slideDown() 메소드의 인수로 시간(밀리초)을 설정하거나 "slow", "fast"와 같은 예약어를 전달해 속도를 설정할 수 있다.

 

-마침글-

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

인용

 

'21년이전 > 국비-JQuery+JAVA-SCRIPT' 카테고리의 다른 글

Jquery-메뉴에 특수효과 주기  (0) 2021.03.29
Jquery-form연습3  (0) 2021.03.29
Jquery-속성선택자  (0) 2021.03.25
JQuery-선택자  (0) 2021.03.25
728x90

-개발환경-

IDE : Eclipse IDE for Java Developers Version: 2020-03 (4.15.0)

공부 자료 :  www.inflearn.com/course/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%B0%94/lecture/22652

-문제-

정수모임배열이 주어질 때, 두 숫자의 합이 target이 되는 두숫자의 모임들을 리턴하시오.

 

ex)

Given nums = [2, 8, 11, 14], target = 16, Because nums[0] + nums[3] = 2 + 14 = 16

return [1, 4].

 

-접근법-

예로 , Array = {2,8,11,14}; 가 있을 때,


1) Array Index 0 부터 끝까지 for 돌리면서,  
target -(Array 각각의 값) 을 Key로 설정 그리고 value는 Array의 인덱스로 설정.


2) Map(Array 각각의 값)=value가 이미 존재하면 그것은 two sum에 적합하므로
Array에 해당하는 인덱스와 value가 쌍으로 정답이됨

-TwoSum.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
package codingTest;
 
import java.util.HashMap;
import java.util.Map;
 
public class TwoSum {
 
    public static void main(String[] args) {
        TwoSum a = new TwoSum();
 
        //TestCase1
        int[] nums= {2,8,11,14};
        int target = 16;
        
        int[] result = a.solve(nums,target);
        //Output
        for(int i: result) {
            System.out.print(i + " ");
        }
    }
    public int[] solve(int[] nums, int target) {
        //1. DataStructure
        int[] result= new int[2];
        Map<Integer,Integer> map =new HashMap<>();
        
        //2. for
        for(int i=0;i<nums.length;i++) {
            
            if(map.containsKey(nums[i])) { 
                int value = map.get(nums[i]);
                result[0]=value+1;
                result[1]=i+1;
            }else {
                map.put(target-nums[i], i);
            }
                
        }
    
        return result;
    }
}
 
cs
더보기

-Description

24 : Map객체를 생성한다.
29 : map 에 해당 인자값이 있는지 (bool) 여부 판단 
30~32 : if문이 만족하였으므로 , 목표로하는 두 값을 찾음.  각각의 값에 +1 씩해서 인덱스를 숫자로 표현.
34 : map에 key 값으로 target-nums[i] , value로 i를 삽입

27~37 : for 문의 계샨과정

-추가개념-

Map,HashMap
Map은 인터페이스이고 , 이를 구현한 것들중 하나가 HashMap클래스이다. 
(etc  HashMap이외에도  LinkedHashMap, TreeMap 이 존재)

 

-가져오기
import java.util.HashMap;
import java.util.Map;

 

-선언
Map<Integer,Integer> map =new HashMap<>();

 

-사용함수
map.put(key,value); // map에 데이터 삽입
             // 넣을 key가 map에 이미 존재한다면 value로 교체됨
map.get(key); // value값 추출
     // key가 존재하지 않을시 null을 가져옴
map.containsKey(key); //key 값이 map에 존재하는지 확인 (boolean 반환)
map.remove(key); // map에서 key 값을 삭제한후 value를 반환
          // 해당 key가 존재 하지 않으면 null 반환
map.size(); // map의 묶음수 출력
map.clear(); // map의 모든 내용제거
map.keySet(); // map의 모든 key를 Set<Integer>형식으로 반환(순서는 랜덤)
map.values(); // map의 모든 values를 Collection<Integer> 형식으로 반환(순서는 랜덤)
map.entrySet(); // map의 모든 key,value를 Map.Entry<Integer, Integer>형식으로 반환(순서는 랜덤)
// entrySet() 사용ex)
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() +"-" + entry.getValue());
        }

 

-추가
HashMap이외의  LinkedHashMap,TreeMap 은 순서라는 특징을 가진다.
LinkedHashMap은 입력된 순서대로 데이터가 출력되는 특징
TreeMap은 입력된 key의 정렬순으로 데이터가 출력되는 특징

 

-마침글-

인용

wikidocs.net/208#containskey

'21년이전 > 자바-Algorithm' 카테고리의 다른 글

DailyTemperature  (0) 2021.03.24
MoveZeros  (0) 2021.03.21
MeetingRoom  (0) 2021.03.20
728x90

-개발환경-

IDE : Eclipse IDE for Java Developers Version: 2020-03 (4.15.0)

공부 자료 :  www.inflearn.com/course/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%B0%94/lecture/22652

-문제-

- 배열 num을 감안할 때 0이 아닌 요소의 상대적인 순서를 유지하면서 모든 0을 끝으로 이동시키는 함수를 작성하십시오.

 

ex)

Input : [0,3,2,0,8,5] Output : [3,2,8,5,0,0]

 

-접근법-

풀이법1
num의  앞부터 하나씩 접근하는 반복문에서
0이아닌것을 어레이리스트에 더해줌(빅오 N)
NUM.length - 어레이리스트.length  = 0의갯수
어레이리스트에 0의갯수만큼 추가해줌
총빅오(N)

풀이법2
1. 배열 nums(자기자신)에  0이 아닌 값을 차례로 맨앞부터 넣어준다.(index 이용)
2. 기억된 index부터 0을 넣어준다.

 

풀이법2가 더 빠르고 ,공간복잡도도 작다.

-MoveZeros.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
package codingTest;
 
public class MoveZeros {
 
    public static void main(String[] args) {
        // Testcase1
        int[] nums= {0,3,2,0,8,5};
        
        //Procedure
        int index=0;
        for(int i=0; i<nums.length;i++) {
            if(nums[i]!=0) {
                nums[index]=nums[i];
                index++;
            }
        }
        while(index<nums.length) {
            nums[index]=0;
            index++;
        }
        //Output
        for(int i=0; i<nums.length;i++) {
            System.out.println(nums[i]);
        }
    }
 
}
 
cs

 

더보기

-Description

11~16 :  배열 nums(자기자신)에  0이 아닌 값을 차례로 맨앞부터 넣어준다.(index 이용)

11~16 반복문을 거친후의 index 값


17~20 : 기억된 index부터 0을 넣어준다.

 

-추가개념-

-마침글-

인용

'21년이전 > 자바-Algorithm' 카테고리의 다른 글

DailyTemperature  (0) 2021.03.24
TwoSum  (0) 2021.03.22
MeetingRoom  (0) 2021.03.20
728x90

-개발환경-

IDE : Eclipse IDE for Java Developers Version: 2020-03 (4.15.0)

공부 자료 :  www.inflearn.com/course/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%B0%94/lecture/22652

-문제-

 [[s1,e1],[s2,e2],...] (si < ei) 와 같이 , 시작과 끝의 시간으로 구성된 회의시간 배열이 주어졌을때 ,
한 사람이 모든 회의에 참여할 수 있는지 여부를 bool 로 리턴하시오.

 

ex)

Input: [[0,30],[5,10],[15,20]]
Output: false
Input: [[7,10],[2,4]]
Output: true

 

-접근법-

주어진 [startTime,endTime] 모음 배열들이 서로 겹치는지 확인하여야 한다.

1. brute force 방식으로

n-1 + n-2 n-3 ... +n-(n-1) =n*(n-1)+ ((n-1)(n-2)) /2  = (n-1)(n+(n-2)/2)  =

거의 n**2 형태만큼의 반복횟수로 확인하여도 되고,

 

2. startTime 을 기준으로 배열을  오름정렬한다.

정렬되었다면 나름 시작 시간 기준으로 오름정렬이 된 것이고,

뒤.startTime > 앞.endTime 이 만족된다면 정상적인것 ,  불만족시 false 리턴.

시간복잡도는 O(정렬+N-1)

 

-MeetingRooms.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
package codingTest;
 
import java.util.Arrays;
import java.util.Comparator;
 
 
class Interval{
    int start;
    int end;
    Interval(){
        this.start = 0;
        this.end =0;
    }
    Interval(int s, int e){
        this.start = s;
        this.end = e;
    }
}
public class MeetingRooms {
    public static void main(String[] args) {
        MeetingRooms a = new MeetingRooms();
        
        //Testcase 1 
        Interval in1=new Interval(15,20);
        Interval in2=new Interval(0,30);
        Interval in3=new Interval(5,10);
        Interval in4=new Interval(10,20);
        Interval in5=new Interval(2,24);
        Interval[] intervals = {in1,in2,in3,in4,in5};
        System.out.println(a.solve(intervals));//false
    
        //Testcase 2
        Interval in2_1=new Interval(7,10);
        Interval in2_2=new Interval(2,6);
        Interval[] intervals2 = {in2_1,in2_2};
        System.out.println(a.solve(intervals2));//true
        
    }
    
    public boolean solve(Interval[] intervals) {
        //오름차순정렬
        if(intervals==nullreturn false;
        Arrays.sort(intervals,Comp);
        
        //진위검사
        for(int i=1; i<intervals.length; i++) {
            if(intervals[i-1].end > intervals[i].start)
                return false;
        }
        return true;
    }
    
      Comparator<Interval> Comp = new Comparator<Interval>() { //Comparator을 구현하는익명객체 생성 
          public int compare(Interval o1, Interval o2) { 
              return o1.start-o2.start;  // 0 or 양수 리턴시 객체자리변경  ,    음수리턴시 자리변경x 
          };
      };
    
    
    public void print(Interval[] intervals) {
        for (int i =0; i<intervals.length; i++) {
            Interval in= intervals[i];
            System.out.println(in.start+" "+in.end);
        }
    }
}
cs
더보기

-Description

43 : Comp방식으로 정렬 , Arrays는 배열관련 유용한 클래스
46~50 : 접근법 2번 방식의  '뒤.startTime > 앞.endTime ' 적용
53~57: Interface Comparator을 구현하는 익명객체를 생성하여 compare메소드를 오버라이딩(오름차순적용)
60~65: 배열을 단순출력해주는 메소드

-추가개념-

객체의 정렬 기준을 명시하는데는 두가지 방법이 존재.
1. Interface Comparable을 구현 하는 방법
기본 정렬로 문제를 해결할 경우 이용
2. Interface Comparator을 구현 하는 방법(글에서 사용한 방법)
기본 정렬 기준과 다르게 구현하고 싶을때 이용

Compareator를 implements후 compare메소드를 오버라이딩 할시 유의사항.
public int compare(Interval o1, Interval o2) 에서 
- 기존에 o1 , o2(오름차순) 순서로 정렬할 것이라고 생각. 
- 만약 , compare 의 반환 값이 양수or 0이면 , 인자의 순서변경발생
- compare 의 반환 값이 음수이면 , 인자 순서 유지
- 위 3가지 개념을 이용해 사용자정의 정렬이 가능.


- ex) start를 기준으로 , 내림차순정렬을 만들어보자
 public int compare(Interval o1, Interval o2){
     if( o1.start < o2.start )
          return 0;
     else
          return -1;
}
같은 표현으로
 public int compare(Interval o1, Interval o2){
     if( o1.start > o2.start )
          return -1;
     else
          return 0;
}
-출력결과-
start 의 기존순서 : 15, 0, 5, 10, 2 
변경된 순서 : 15 , 10 , 5 ,2, 0 으로

 

-마침글-

인용

'21년이전 > 자바-Algorithm' 카테고리의 다른 글

DailyTemperature  (0) 2021.03.24
TwoSum  (0) 2021.03.22
MoveZeros  (0) 2021.03.21
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
728x90

-개발환경-

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

 

-poll.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
<%@ page import="com.koreait.onLinePoll.PollRead"%>
<%@ page import="java.util.*" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>투표하기</title>
</head>
<body>
 
<%  
    String filepath=application.getRealPath("/")+"poll.txt";  //  "/" 웹서비스가 실행되는 web root(최상위 경로)를 의미한다.
 
    ArrayList<String> poll = PollRead.pollread(filepath);
    int itemCount = (poll.size() -1 ) /2 ;
%>
 
 
<form action="pollWrite.jsp" method="get">
 
    
    <!-- border=테두리 , cellpadding :안여백 , cellspacing : 셀간격 . align : 표위치 정렬-->
    <table width="500" border="1" cellpadding="5" cellspacing="0" align="center">
        <tr height="50"><!-- 한 행을 의미 -->
            <th>
                <%=poll.get(0)%> <!-- 간단한표현식에 이용 -->  
            </th>
        </tr>
        
        <%
        for (int i=1;i<=itemCount;i++){
        %>
            
            <tr height="50">
                <td>
                    <input type='radio' name='poll' value='<%=i%>'/><%=poll.get(i) %>
                </td>
            </tr>
        <% 
        }
        %>
        
        <tr height="50">
            <td  align="center">
                <input type="submit" value="투표하기"/>
                <input type="button" value="결과보기" onclick="location.href='pollResult.jsp'"/> <!-- html event인 onclick -->
            </td>
        </tr>
    </table>
 
</form>
 
</body>
</html>
 
cs

 

 
더보기

-Description

17 : 투표 목록 수 

21 : method를 post방식으로 하면 데이터를 숨겨서 다른 파일에 전달. get방식으로하면 인터넷주소로 데이터 전달(보안취약)
25 : border :테두리두깨, cellpadding :안여백 , cellspacing : 셀간격 . align : 표위치 정렬방법지정

26 : <tr></tr> 한 행을 의미

28 : <%=  =>  간단한 표현법 내부에는 출력할 내용이 들어감 . 여기선 '코로나가 언제 종식될까요?''
33~42 : 투표항목의 갯수만큼 반복하며 radio 버튼과 투표 항목을 출력한다
38 : name이 poll인 라디오 버튼들을 구현. 고유 value들은 1부터 시작하는 정수

47 : 인풋타입인 submit가 실행될 시 ,  form 태그가 수행됨

48 : html event 인 onclick 으로 인하여 클릭될 시 pollResult.jsp로 페이지이동

-PollRead.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.onLinePoll;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
 
public class PollRead {
 
     public static ArrayList<String> pollread(String filePath){
        ArrayList<String> text=null;
        
         Scanner scanner;
        String memo="";
        try {
           text= new ArrayList<String>();
            scanner = new Scanner(new File(filePath));
            while (scanner.hasNextLine()) {
                String str = scanner.nextLine().trim();
                if (str.length() > 0) {
                   text.add(str);
                }
            }
        } catch (FileNotFoundException e) {
            System.out.println("파일을 찾을수 없습니다");
        }
        return text;
    }
    
}
 
cs
더보기

-Description

17 : 파일 객체를 인자로 scanner객체 생성
18 : scanner.hasNextLine() 는 scanner.nextLine() 와 주로같이 쓰이며 , 
scanner.hasNextLine() 는 다음줄이 있는지 검사.
scanner.nextLine() 은 다음 한 줄을 반환함
21 : 따온 한줄한줄을 text ArrayList에 넣어줌
27 :  text ArrayList 반환

문장의 마지막에 scanner.close() 는 써도 안써도 무관

-pollWrite.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
package com.koreait.onLinePoll;
 
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
 
public class PollWrite {
    
    public static void pollWrite(String filepath,ArrayList<String> poll) {
        PrintWriter printWriter=null;
        try {
            printWriter=new PrintWriter(filepath);
            for(int i=0;i<poll.size();i++) {
                printWriter.write(poll.get(i)+"\r\n");
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            if(printWriter!=null)
               printWriter.close();
        }
        
    }
}
 
cs

 

더보기

-Description

10 : 파일에 내용을 쓰기위해 PrintWriter 참조변수 선언
12 : 파일경로+파일이름을 토대로 PrintWriter  객체생성

14 : printWriter.write로 poll ArrayList의 내용을 한줄씩 복제 , 

Java로 줄바꿈을 파일출력시 윈도우에선 "\r\n" 을 써야 정상적 개행이 이루어짐
유닉스(리눅스)계열 에선 "\n"

20~21 : 파일출력(저장) 시 , 파일내용을 가져오는 것과 달리 꼭 닫아줘야함,
닫지 않는다면 저장또한 이뤄지지 않음

 

-pollWrite.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
<%@page import="com.koreait.onLinePoll.PollWrite"%>
<%@ page import="com.koreait.onLinePoll.PollRead"%>
<%@ page import="java.util.*" %>
<%@ 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 temp= request.getParameter("poll");//'1'~ 범위임
     
    //투표데이터가 넘어왔나 ( null 이나 공백이 아닌가) =>반드시 null먼저 검사
    if(temp!=null && temp.trim().length()>0){
         try{
            int result =Integer.valueOf(temp);
            int itemCount=0;
             String filepath=application.getRealPath("/")+"poll.txt";  //  "/"는 웹서비스가 실행되는 web root(최상위 경로)를 의미한다.
            ArrayList<String> poll = PollRead.pollread(filepath);
            if(poll!=null){
                itemCount=(poll.size()-1)/2;
            }else{
                out.println("<script>");//자바스크립트 쓰겟다는것
                out.println("alert('투표가 진행되지 않았습니다!')");
                out.println("location.href='poll.jsp'");//특정페이지로 쏴줌
                out.println("</script>");//자바스크립트 쓰겟다는것
            }
            if(result>=1 && result<=itemCount){
                int value=Integer.valueOf(poll.get(result+itemCount));
                poll.set(result+itemCount,value+1+"");
                
                 PollWrite.pollWrite(filepath, poll);
                
                response.sendRedirect("pollResult.jsp");
            }else{
                out.println("<script>");//자바스크립트 쓰겟다는것
                out.println("alert('범위값이 잘못되었습니다!')");
                out.println("location.href='poll.jsp'");//특정페이지로 쏴줌
                out.println("</script>");//자바스크립트 쓰겟다는것
            }
            
            
        }
        catch (Exception e){
            out.println("<script>");//자바스크립트 쓰겟다는것
            out.println("alert('숫자가 아닙니다!')");
            out.println("location.href='poll.jsp'");//특정페이지로 쏴줌
            out.println("</script>");//자바스크립트 쓰겟다는것
        }
    }else{
         
        out.println("<script>");//자바스크립트 쓰겟다는것
        out.println("alert('투표하세요~~~')");
        out.println("location.href='poll.jsp'");//특정페이지로 쏴줌
        out.println("</script>");//자바스크립트 쓰겟다는것
         
        
    }
%>
 
</body>
</html>
cs
더보기

-Description

15 : post 방식으로 데이터가 넘어올 때 한글 깨짐을 방지

16 : request.getParameter("poll") 을 통해 poll.jsp-form태그내부의
 name="poll"인 라디오타입에서 선택된 value를 가져옴

21 : poll.jsp에서 넘어온 값을 정수로 저장
23 :  "/"는 웹서비스가 실행되는 web root(최상위 경로)를 의미한다.

24 : 기존 poll.txt에 저장되어있는 값을 불러옴
34~35 : result에 매칭되는 값을 하나 증가시켜준 후  poll ArrayList에 다시 저장.

37 : poll ArrayList 내용을 파일에 저장
39 : response.sendRedirect("pollResult.jsp");로 바로 투표 결과를 보여준다.
41~44 : javascript태그 내부에 자바스크립트 문법작성

42 : 경고창
43 : location.href='poll.jsp'  특정 페이지로 쏴주는 자바스크립트 명령어
투표 선택창으로 돌아감

-pollResult.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
<%@page import="java.text.DecimalFormat"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.koreait.onLinePoll.PollRead"%>
<%@page import="java.util.Scanner"%>
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
 
<!--  일정 시간이 경과되면 특정 웹 사이트로 이동하기 -->
<meta http-equiv="refresh" content="1; url='?'"/> 
 
<title>Insert title here</title>
</head>
<body>
 
 <%
    String filepath= application.getRealPath("/")+"poll.txt";
    ArrayList<String> poll= PollRead.pollread(filepath);
    int itemCount= (poll.size()-1)/2;
    
     int sum=0;
    for(int i=itemCount+1;i<poll.size();i++)
        sum+= Integer.valueOf(poll.get(i));
    
    DecimalFormat df1=new DecimalFormat("#,##0표");
    DecimalFormat df2=new DecimalFormat("0.0%");
%>
 
<table width="500" border="1" cellpadding="5" cellspacing="0" align="center">
    <tr height="50">
        <th colspan="2"><!-- colspan="2" 2칸을 합치겠다. -->
            <%=poll.get(0) %>
        </th>
    </tr>
    <%
        for (int i=1;i<=itemCount;i++){
            
            int pyo = Integer.valueOf(poll.get(i+itemCount));
            double per= pyo/(double)sum;
    %>
    <tr height="50">
        <td width="150">
            <%=poll.get(i) %>(<%=df1.format(pyo) %>)
        </td>
        <td width="350"> <!-- <hr/> 태그로 막대그래프 효과를 낸다 -->
            <hr color="#FA58F4" size="20" width="<%=350*per %>"   align="left"/> 
        </td>
    </tr>
    <%
    }
    %>
    <tr height="50">
        <td align="center" colspan="2">
            <input type="button" value="투표하기로 가기" onclick="location.href='poll.jsp'">
        </td>
    </tr>
</table>
 
</body>
</html>
cs
더보기

-Description

14 :  1초후 갱신, ?는 자기 자신사이트로 갱신
http-equiv 은 기본언어 , 문자셋 , 기본 스타일 시트를 설정 ,  브라우저 호환 설정 , 그리고
페이지 리로드기능있는데 여기선 페이지 리로드 기능의 refresh 를 이용.
content 의 값은 초단위 갱신
22 : poll.txt 로 부터 poll ArrayList로 데이터 가져오기
26~27 : poll의 데이터를 전부 sum

29~30 :  making DecimalFormat's format
35 : colspan="2" 2칸을 합치겠다.
42~43 : getting  득표수  and getting 득표율 for using sum

50 : I made simple stick graph for using hr tag.

and also made the state that stick graph can be changed  for using this "<%=350*per %>" 

58 : the conception that can move to another site is  onclick="location.href='poll.jsp'" about html.

 

 

-요약-

 

-javascript-


     페이지이동
          location.href='poll.jsp'

 

-jsp-


     <%=  => :  표현식태그 ,간단한처리에 이용되며 내부에는 출력할 내용이 들어감
     
     request.setCharacterEncoding("UTF-8");  :  post 방식으로 데이터가 넘어올 때 한글 깨짐을 방지

     request.getParameter("poll"); : 이전 페이지의 form태그 내부 name속성의 값이 poll인 태그의 value 소환.

     application.getRealPath("/"); : "/"는 웹서비스가 실행되는 web root(최상위 경로)를 의미한다.

 


-java-


     file scanner객체 생성 : scanner = new Scanner(new File(filePath));

      scanner.hasNextLine() , scanner.nextLine() : 주로 이 둘이 같이 쓰이며 
          scanner.hasNextLine() 는 다음줄이 있는지 검사.
          scanner.nextLine() 은 다음 한 줄을 반환함
     
     파일에 출력을 위한 객체생성
          PrintWriter printWriter=new PrintWriter(String filepath);
     파일에 한줄 출력

          printWriter.write(String 변수+"\r\n"); //윈도우는 "\r\n" , 유닉스(리눅스)는  "\n" 
     파일출력내용 저장
          printWriter.close();


-html-


     form 태그 속성의 method
          get  : 인터넷주소로 데이터 전달(보안취약)
          post : 데이터를 숨겨서 다른 파일에 전달

    열 합치기 : colspan="2" // 2열 합치기 

    가로 막대 선 : <hr/>

     호출관계
          <input type="submit"> 은 form tag의 action값을 호출

          onclick="location.href='pollResult.jsp'" 로 페이지 이동

     <meta http-equiv="refresh" content="1; url='?'"/>  : 1초후 갱신, ?는 자기 자신사이트로 갱신
     http-equiv 은 기본언어 , 문자셋 , 기본 스타일 시트를 설정 ,  브라우저 호환 설정 , 그리고
     페이지 리로드기능있는데 여기선 페이지 리로드 기능의 refresh 를 이용.
     content 의 값은 초단위 갱신

 

     padding
          cellpadding :안여백
          cellspacing : 셀간격

 

-css-

 

     None

 

-마침글-

I made online poll for using JSP's request order & several html tags

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

국비-쿠키(Cookie)  (0) 2021.03.19
JSP-출석 게시판 구현  (0) 2021.03.18
JSP-인클루드 액션태그 이용  (0) 2021.03.14
JSP- Calendar(not DB & using web crawling)  (0) 2021.03.11
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

 

-HelloWorld.jsp-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ 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>
 
안녕 JSP
 
</body>
</html>
 
cs
더보기

5 : head 태그는 설정에 관련된 사항을 기록

 

7 : title은 사이트의 제목

 

9 : body 태그는 브라우저에서 보여주는 것들을 씀

 

-요약-

jsp인줄 알았지만 html 간단 구조 였습니다.

 

-마침글-

.

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

국비-쿠키(Cookie)  (0) 2021.03.19
JSP-출석 게시판 구현  (0) 2021.03.18
JSP-인클루드 액션태그 이용  (0) 2021.03.14
JSP- Calendar(not DB & using web crawling)  (0) 2021.03.11
JSP-코로나 실시간 온라인 투표  (0) 2021.03.04

+ Recent posts