FrontEnd/JQuery

#46. jQuery(이벤트, 안중요한거1~2), W.A.S(apache tomcat) 시작

열하나요 2023. 9. 5. 14:31

46-1. jQuery

1. 이벤트

<!DOCTYPE html>
<html lang="en">
<head>
    <title>이벤트</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>

</head>
<body>

    <h1>이벤트 핸들러(이벤트 발생 시 실행될 코드) 연결 방법 종류</h1>

    <h3>* 방법 1. 이벤트 메소드를 통한 연결</h3>

    <pre>
        $('선택자').이벤트메소드(function(){
            에빈트 발생 시 실행할 내용;
        })
    </pre>

    <h3 id="test1">클릭해보세요!</h3>

    <script>
        $(function(){

            $('#test1').click(function(){
                // console.log(window.event.target);
                console.log(this);
                $(this).text('클릭하셨네요!');
            });

            // 더블클릭
            $('#test1').dblclick(function(){
                $(this).css('color', 'pink');
            });
        });
    </script>

    <br><br>

    <h3>* 방법 2. on메소드를 호출하는 방법</h3>

    <pre>
        [ 표현법 ]
        $('선택자').on('이벤트명', function(){
            이벤트 발생 시 실행할 내용;
        });
    </pre>

    <h4 id="test2">마우스로 클릭도 해보고 올려도보고</h4>

    <script>
        $(function(){

            /*
            // 클릭 : click
            $('#test2').on('click', function(){
                $(this).css('background', 'lime').text('클릭~');
            });

            // 올려도보고 : mouseenter
            $('#test2').on('mouseenter', function(){
                $(this).css('color', 'skyblue');
            });
            */

            /*
            $('#test2').on({click : function(){
                $(this).css('background', 'lime').text('클릭~');
            }, mouseenter : function(){
                $(this).css('color', 'skyblue');
            }});
            */

            $('#test2').on({
                mouseenter : function(){
                    $(this).css('background', 'yellowgreen').text('마우스올라감~');
                },
                mouseout : function(){
                    $(this).css('background', 'greenyellow').text('마우스빠져나감~');
                },
                click : function(){
                    // 클릭이벤트가 발생한 경우 mouseenter, mouseout 이벤트 핸들러 제거
                    $(this).off('mouseenter').off('mouseout');
                    // off('삭제할 이벤트명') : 이벤트 핸들러 제거
                    $(this).css('background', 'orangered').text('이벤트제거~');
                }
            });
        })
    </script>

    <br><br><br>
    <h3>* 방법 3. on메소드를 쓰는 방법 *****</h3>

    <pre>
        [ 표현법 ]
        $('상위요소선택자').on('이벤트명', '하위요소선택자', function(){
            이벤트 발생 시 실행할 내용;
        });
    </pre>

    <div id="wrap">
        <h4>h4요소를 클릭해보세요.</h4>
        <h5>h5요소를 클릭해보세요.</h5>
    </div>

    <script>
        $(function(){
            // $('#wrap>h4').on('click', function(){});
            // $('#wrap').children('h4').on('click', function(){});
            // ==
            $('#wrap').on('click', 'h4', function(){
                alert('날 클릭했니??');
            });

            // 현재 이 문서상의 모든 요소들 중에서 h1 ~ h6에 대해서 클릭 이벤트핸들러를 부여하고 싶다.
            /*
            $('h1, h2, h3, h4, h5, h6').on('click', function(){

            })
            */

            // $(document) : 이 문서객체를 제이쿼리화 시킨 것

            /*
            $(document).on('click', 'h1, h2, h3, h4, h5, h6', function(){
                console.log(this);
                $(this).css('color', 'aqua');
            });
            */
        })
    </script>

    <hr>

    <h3>* 동적으로 만들어진 요소에 이벤트 적용</h3>

    <!-- 
        동적으로 만들어진 요소 : 
        처음 문서 로딩시에는 존재하지 않다가 나중에 새롭게 만들어지는 요소
    -->

    <div id="wrap2" style="border : 1px solid red">
        <h6>기존에 존재하는 요소</h6>
        <!-- 바로 여기에 -->
    </div>

    <script>
        jQuery(document).ready(function(){

            // 방법 1. 이벤트 메소드 호출 => 동적으로 만들어진 요소는 이벤트 적용 안됨
            /*
            $('#wrap2>h6').click(function(){
                $('#wrap2').append('<h6>새롭게 추가된 요소</h6>');
            })
            */

            // 방법 2. on메소드 => 동적으로 만들어진 요소는 이벤트 적용 안됨
            /*
            $('#wrap2>h6').on('click', function(){
                $('#wrap2').append('<h6>새롭게 추가된 요소2</h6>');
            });
            */

            // 방법 3. on메소드
            $('#wrap2').on('click', 'h6', function(){
                $('#wrap2').append('<h6>새롭게 추가된 요소3</h6>');
            });

            // 동적으로 만들어진 요소에 기존에 존재하는 이벤트를 적용하고자 한다면
            // 반드시 3번 방법으로 해야함!!!

            // => 문서 로딩이 끝난 후!($(function(){})) 이벤트가 적용된 요소가 누구냐에 따라 달라짐
        });
    </script>

    <hr>

    <h3>* 일회성 이벤트</h3>

    <p>
        이벤트는 딱 한번만 연결할 때 사용
    </p>

    <pre>
        [ 표현법 ]
        $('선택자').one('이벤트명', function(){
            이벤트 발생 시 실행할 내용;
        });
    </pre>

    <h6 id="test3">단 한번만 클릭할 것!</h6>

    <script>
        $(function(){
            $('#test3').one('click', function(){
                alert('나는 한번만 나와~');
            });
        });
    </script>

    <hr>

    <h3>* 키보드 관련 이벤트</h3>

    <p>
        키가 눌렸을 때 발생하는 이벤트 <br>
        - keydown : 키보드가 모든 키가 눌릴 때 발생 <br>
        - keypress : 키보드의 function키, 기능키, 한글을 제외한 나머지 키가 눌릴 때 발생 <br><br>

        키가 떼어질 때 발생하는 이벤트 <br>
        - keyup
    </p>

    <input type="text" id="test4">

    <script>
        $(function(){

            $('#test4').keydown(function(){
                //console.log('키보드 눌림');

                // console.log(this.value);
                // console.log($(this).val());
                // console.log(typeof($(this).val()));
                // console.log($(this).val().length); // 실시간 글자수 세기(keydown은 글자수 하나씩 밀림)


            });

            $('#test4').keyup(function(){ // keyup은 글자수 정확함
                console.log('올라옴');
            });
        });
    </script>

    <hr>

    <h3>* 글자수 세기 예제</h3>

    <div style="border : 1px solid lightgray">
        150자 이내로 입력하시오. <br>
        <textarea id="content" cols="40" rows="10" style="resize : none;" maxlength="150"></textarea>
        <br>
        <hr>
        <span id="count">0</span> / 150

    </div>

    <script>
        $(function(){
            
            $('#content').keyup(function(){

                // console.log($(this).val().length); // textarea도 div와 같이 val을 쓴다!!
                $('#count').text($(this).val().length);

            });
        });
    </script>

    <hr>

    <h3>체크박스!!</h3>

    <div id="wrapper">
        <div>
            <input type="checkbox" id="all" class="batch"> 전체
            <input type="checkbox" id="kr" class="batch"> 한식
            <input type="checkbox" id="jp" class="batch"> 일식
        </div>

        <hr>

        <div>
            <input type="checkbox" class="chk kr"><label>김치찌개</label>
            <input type="checkbox" class="chk kr"><label>국밥</label>
            <input type="checkbox" class="chk kr"><label>김치</label>

            <hr>

            <input type="checkbox" class="chk jp"><label>초밥</label>
            <input type="checkbox" class="chk jp"><label>타코야끼</label>
            <input type="checkbox" class="chk jp"><label>라멘</label>
        </div>
    </div>

    <script>
        $(function(){

            // 오류를 여기서 또 수정해주자(하위선택을 해제해도 전체나 한식 일식이 계속 선택되어있음)
            $('.batch').on('change', function(){
                if($(this).prop('checked') == false){
                    $('#all').prop('checked', false);
                }
            });

            // 숙제... 완벽하게 만들기!!!----------------------------------
            // 요소 전체가 선택되면 '전체'가 선택됨





            // 한식 하위가 풀리면 '한식'이 풀림
            $('.kr').on('change', function(){

            })

            // 일식 하위가 풀리면 '일식'이 풀림



            // 한식 하위가 모두 선택되면 '한식'도 선택됨



            // 일식 하위가 모두 선택되면 '일식'도 선택됨









            // 전체를 체크하면 모두 체크 되도록
            $('#all').on('change', function(){
                // console.log('모범시민');
                // console.log($('#all').prop('checked')); (attr은 input에서 잘 안먹을떄도 있음..?)

                let $all = $('#all').prop('checked');

                if($all){
                    $('.batch, .chk').prop('checked', true);
                }
                else{
                    $('.batch, .chk').prop('checked', false);
                }
            });

            $('#kr').on('change', function(){
                let $kr = $('#kr').prop('checked');

                if($kr){
                    $('.kr').prop('checked', true);
                }
                else{
                    $('.kr').prop('checked', false);
                }
            });

            $('#jp').on('change', function(){
                let $jp = $('#jp').prop('checked');

                if($jp){
                    $('.jp').prop('checked', true);
                }
                else{
                    $('.jp').prop('checked', false);
                }
            });

        })
    </script>

</body>
</html>

 

 

2. 안중요한거1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>안중요한거1</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>

</head>
<body>

    <h1>시각적인 효과 메소드(Effect메소드)</h1>

    <p>
        페이지 내에서 애니메이션 효과를 만들기 위해 사용하는 메소드 <br><br>
    </p>

    <h3>* show(), hide(), toggle()</h3>

    <button id="hide">숨기기</button>
    <button id="show">보이기</button>
    <button id="toggle">토글</button>
    
    <br><br>

    <img src="https://blog.kakaocdn.net/dn/cbGZHs/btqS1VzDCqM/PRWMbgOcKqeAQpqn4l9zfK/img.jpg" id="gukbab">

    <br><br>

    <h3>* fadeIn(), fadeOut(), fadeToggle()</h3>
    <p>
        선택된 요소가 점점 투명해지면서 사라지고, 점점 선명해지면서 보여지게 하는 메소드
    </p>

    <button id="fadeOut">숨기기</button>
    <button id="fadeIn">보이기</button>
    <button id="fadeToggle">토글</button>
    
    <script>
        $(function(){

            $('#fadeOut').click(function(){
                $('#gukbab').fadeOut(3000);
            });

            $('#fadeIn').click(function(){
                $('#gukbab').fadeInt(3000);
            });

            $('#fadeToggle').click(function(){
                $('#gukbab').fadeToggle(1000);
            });

            // 숨기기버튼
            $('#hide').click(function(){
                $('#gukbab').hide(3000); // 시간(ms)
            });

            // 보이기버튼
            $('#show').click(function(){
                $('#gukbab').show(3000);
            });

            // 토글
            $('#toggle').click(function(){
                $('#gukbab').toggle(1000);
            });


        })
    </script>

</body>
</html>

 

3. 안중요한거2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>안중요한거2- 아코디언 메뉴 만들기</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
    
    <style>
        div{
            background-color : cornflowerblue;
            width : 500px;
            height : 50px;
            line-height : 50px; /* 블럭요소이기 때문에 line-height. 보통 세로길이랑 똑같이 주면됨 */
            border : 1px solid darkblue;
            border-radius : 10px;
            color : white;
            padding : 12px;
        }

        p{
            padding : 12px;
            width : 500px;
            border : 1px solid yellowgreen;
            color : forestgreen;
            border-radius : 10px;
            display : none;
        }
    </style>

</head>
<body>

    <!--
        slideDown(), slideUp()
        선택된 요소가 점점 아래로 내려오면서 나타났다가 
        점점 위로 올라가면서 사라지게 하는 메소드

        고객센터, FAQ, QNA
    -->

    <!-- 
        질문은 div
        답변은 p
    -->

    <div>Q. [교환/반품] 상품을 교환/반품하고 싶어요.</div>
    <p>A. 반품은 3~4일 정도 걸립니다.</p>

    <div>Q. [스미싱] 알 수 없는 번호로 쿠팡 관련 문자를 받았어요.</div>
    <p>A. 조심하세요~</p>

    <div>Q. [회원탈퇴] 회원 탈퇴는 어떻게 하나요?</div>
    <p>A. 회원 탈퇴는 못해요~</p>

    <div>Q. [회원서비스] 휴대폰 알림은 어떻게 설정하나요?</div>
    <p>A. 알림앱을 여시고... </p>

    <script>
        $(function(){

            $('div').click(function(){

                // console.log($(this));
                // $(this) : 현재 클릭 이벤트가 발생한 div요소
                // $(this).next() : 현재 클릭 이벤트가 발생한 div요소 바로 뒤에 있는 p요소

                let $p = $(this).next();
                // jQuery방식으로 선택된 요소를 담을 때 변수명 앞에 $를 붙일 수 있음

                // $p.slideDown(1000);

                // css() => 속성명만 인자값으로 전달하게 되면 속성값을 반환해준다.

                // console.log($p.css('display'));

                if($p.css('display') == 'none'){ // 속성값이 검정색(string)이니까 ''로 묶어줌
                    // 기존에 열려있던 p태그는 닫아주기!
                    $p.siblings('p').slideUp(1000);

                    // 디스플레이 속성값이 none일 때 열어줌!
                    $p.slideDown(1000);
                }
                else{
                    $p.slideUp(1000);
                }

            });

        });
    </script>

</body>
</html>

 

 

46-2. W.A.S

Servlet

W.A.S(Web Application Server) : Web Server + Servlet Container(HTML, CSS, J.S)

동적데이터

apache : 정적데이터

 

Apache Tomcat 실행환경 구성

1. 다운로드(java eclipse버전과 호환 - Tomcat8 다운

2. 환경설정

problems, servers, console, project explorer, navigator

 

3. 인코딩 UTF-8 설정

1) window - preferences - general - workspace - text file encoding (UTF-8)

2) window - preferences - general - editors - text editors - spelling - encoding (UTF-8)

3) window - preferences - web - css files - encoding - 맨위( ISO 10646/Unocode(UTF-8) )

4) window - preferences - web - jsp files - encoding - 맨위( ISO 10646/Unocode(UTF-8) )

5) window - preferences - web - HTML files - encoding - 맨위( ISO 10646/Unocode(UTF-8) )

6) window - preferences - XML - XML files - encoding - 맨위( ISO 10646/Unocode(UTF-8) )

7) window - preferences - JSON - JSON files - encoding - 맨위( ISO 10646/Unocode(UTF-8) )

 

4. eclipse - Apache Tomcat과 연결

window - preferences - Server - Runtime Environment - Apache Tomcat v8.5 (+create a new local server 체크)

- next - directory : C:\development\apache-tomcat-8.5.93 (다운로드 받아 압축 푼 파일) 안으로 들어야됨

- JRE : jdk1.8.0_372

- Finish

 

------------

5. server 새로 만들기 (host name은 보통 회사는 www)

 

6. server더블클릭 후, port번호 바꿔주기(서버실행 시 오류 => 기본 8080 충돌) / 파일 업로드 숨김 풀기(체크박스 체크)

도메인 : http://localhost => 사이트 요청할 수 없음 (정상)

=> 정상(가용상태)

도메인 : http://localhost => 사이트 요청할 수 없음(정상)

도메인 : http://localhost:8888 => HTTP상태 404 _ 찾을 수 없음 (정상)

-------------------------------------------------------------------------------------

Project 실행

 

Static / Dynamic / Automatic

Physical / Logical / Vertual

 

New Dynamic Web Project 생성

- Default output folder : .class가 저장될 경로  (WebContent/WEB-INF/classes)

- Context root : 프로젝트의 고유한 별칭(고유한 식별값)

- Content directory : 실제 배포되는 폴더(배포 시 압축될 때 실행할 때 필요한 폴더만) (WebContent)

- Generate web.xml deployment descriptor : 꼭 안 만들어도 되지만 체크해서 만들어 줄 것

지구본J 생김~