반응형

안녕들 하시죠 !

이번시간 부터는 Jsp/Servlet 등의 기술을 이용하여 개인 홈페이지를 구축해보겠습니다.

이번 게시물에서는 전체적인 앞단을, 다음 게시물부터는 뒷단위주로 작성하며 기능들을 추가해 보겠습니다.

오로지 기능구현에만 초점을 맞춘 게시물입니다.

사용언어와 문법

Oracle database, HTML5, Javascript, JSP/Servlet, JQuery, EL, JSTL 등

 

MVC 패턴사용

Servlet -> Service -> DAO 순으로 비지니스 로직을 분리하는 디자인 패턴을 사용.

 

앞단 구성에 사용될 .jsp와 .jar 파일들

 

Jsp/Servlet을 이용한 개인 홈페이지 만들기 --1의 결과물

메인 화면

로그인 화면

회원가입 화면

 

Database 구성

향후 게시판이나 관리자 페이지 등을 진행할 예정이지만 여기에선 회원(Customers), 우편번호(Post)만 만들겠습니다.

http://www.epost.go.kr/search/zipcode/cmzcd002k01.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
CREATE TABLE Customers(    
    customer_id VARCHAR2(50), -- 사용자 id
    customer_pwd VARCHAR2(50NOT NULL-- 사용자 pwd 
    customer_status NUMBER, -- 사용자 상태검사
    customer_addr VARCHAR2(100), -- 사용자 주소 + 상세주소
    customer_name VARCHAR2(30), -- 사용자 이름
    customer_buildingno VARCHAR2(100), -- 상세건물번호 
    constraint customers_pk PRIMARY KEY(customer_id) -- 사용자 id p키로 설정
);
 
CREATE TABLE post(
    zipcode varchar2(5),
    sido varchar2(21),
    sidoe varchar2(40),
    sigungu varchar2(20),
    sigungue varchar2(40),
    eupmyun varchar2(20),
    eupmyune varchar2(40),
    dorocode varchar2(12),  --도로명코드
    doro varchar2(80),  --도로명
    doroe varchar2(80),
    jiha varchar2(1),
    building1 varchar2(5), --건물번호 본번
    building2 varchar2(5), --건물번호 부번
    buildingno varchar2(25),  --건물관리번호
    daryang varchar2(40),
    building varchar2(200), --시군구용건물명
    dongcode varchar2(10),
    dong varchar2(20), --법정동명
    ri varchar2(20),
    dongadmin varchar2(40),
    san varchar2(1),
    zibun1 varchar2(4),
    zibunserial varchar2(2),
    zibun2 varchar2(4),
    zipoldcode varchar2(6),
    zipcodeserial varchar2(3));
cs

 

 

main.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
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<style>
a{
text-decoration: none;
}
</style>
<body>
<header>
                                    <!-- 페이지 타이틀을 클릭하면 메인화면으로 이동 -->
    <p  style="text-align: center; "><a href='${contextPath}/main/main.jsp'> 
    <font color="black" id="HOME"> HONGPOSSIBLE HOMEPAGE </font></a></p>
    <div style="text-align: right;">
 
    <jsp:include page="menu.jsp"/> <!-- 상세메뉴인 menu.jsp를 include해 사용 -->
    </div>
    <hr>
    <br>
    <br>
</header>
<section><p style="text-align: center;">안녕하세요</p></section>
</body>
cs

 

menu.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 language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<script>
var loadMenu = function(u, callback){
    $.ajax({
        url: u,
        method: 'GET',
        success: function(data){
            callback(data);
        }
    });
};
 
var loadLogin = function(data){ // section 영역을 비우고 그 자리에 Login 페이지를 넣는다.
    $("section").empty();
    $("section").html(data);
};
var loadJoin = function(data){ 
    $("section").empty();
    $("section").html(data);
};
 
 
$(function(){
    var $menuArr = $("#coreTopMenu>span>a"); // 메뉴(Login, Join) 페이지를 찾아 배열형태로 변수에 저장.
    $menuArr.click(function(event){        
        var url = $(this).attr('href');
        switch(url){
        case '${contextPath}/main/login.jsp':
            loadMenu(url, loadLogin);
            break;
        case '${contextPath}/main/join.jsp':
            loadMenu(url, loadJoin);
            break;
        };
    return false;  //이벤트전달 중지
    });
});
</script>    
 
<div>
<ul  id="coreTopMenu">
<span><a href='${contextPath}/main/login.jsp'><font color="black"> 로그인 </font></a></span>&nbsp;&nbsp;
<span><a href='${contextPath}/main/join.jsp'><font color="black"> 회원가입 </font></a></span>
</ul>
</div>
cs

 

login.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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<script>
$(function(){
    $("#loginbtn").click(function(){
        if($("#idid").val().trim() == 0){ // id 입력란이 공백인 상태로 로그인 버튼이 
                                          // 눌리게 되면 .focus()를 이용해 입력유도.
            $("#idid").focus();
        } else if($("input[name=pwd]").val().trim() == 0){
            $("input[name=pwd]").focus();
        } 
        else{
            $.ajax({ // 입력이슈가 발생하지 않는다면 ajax 요청
                url: '${contextPath}/login'//EL문법을 이용하여 경로지정, 
                                             // login Servlet으로 데이터 전송.
                method:'post'// post 방식으로 요청.
                data:$('form').serialize(), // form 태그안에 있는 입력된 값을 싹 긁어 전송. 
                                // 데이터 전달을 위해 name 속성을 꼭 작성해야한다.(다음게시물에서 설명)
                success: function(data){
                    var jsonObj = JSON.parse(data);
                    var msg = jsonObj.id + "님 로그인 ";
                    if(jsonObj.status == 1){ // 로그인 여부를 판단해주는 Service에서 설정한 status 
                                             //값이 1이면 로그인 성공. (다음게시물에서 설명)
                        msg += "성공";
                            location.href='${contextPath}/main/main.jsp';
                        alert(msg);
                    }else {
                        msg += "실패";
                        alert(msg);
                    }
                }
            });
         } 
        return false;
    });
});    
</script>
 
<div style="text-align: center;">
<form>
    <div>
        아이디 &nbsp;&nbsp; 
        <input type="text" placeholder="아이디를 입력하세요."  name="id" id="idid" 
        style="height: 30px; margin-left: 30px;"/>
    </div>
    <br>
    <div>
        비밀번호 &nbsp;&nbsp;
        <input type="password" placeholder="비밀번호를 입력하세요." name="pwd" 
        style="height: 30px; margin-left: 15px;"/>
    
    </div>
    <br>
    <div>
        <button type="submit" id="loginbtn">로그인</button>&nbsp;&nbsp;
        <button>회원가입</button>
    </div>
    </form>
</div>
cs

 

join.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
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<script>
$(function() {
       var $idObj = $("input[name=id]");
       var $submitObj = $("input[type=submit]");
       $submitObj.hide();
       
       $submitObj.click(function() {
        // 비밀번호 + 비밀번호 확인 검사
          if ( $("input[name=pwd]").val() != $("input[name=pwd1]").val()){ 
             alert("비밀번호가 일치하지 않습니다");
             return false;
          }
          $.ajax({
             url : '${contextPath}/join',
             method : 'POST',
             data : $("#joinform").serialize(),
             success : function(data) {
                var jsonObj = JSON.parse(data);
                if (jsonObj.status == 1) {
                      alert("회원가입 완료");
                   // 트리거이벤트 메인화면으로
                   var $main = $("#HOME");
                   $main.trigger('click');
                } else {
                   alert("필수 항목을 입력해 주세요!");
                }
             }
          });
          return false;
       });
       
       var $dupchkObj =  $("#dupchk");
       $dupchkObj.click(function(){ // 아이디 중복검사
          $.ajax({
             url:'${contextPath}/dupchk',
             method:'post',
             data:'id='+$("input[name=id]").val(),
             success:function(data){
                var jsonObj = JSON.parse(data);
                if(jsonObj.status == 1){
                   alert("사용할 수 있는 아이디 입니다");
                   $submitObj.show();                   
                }
                else if(jsonObj.status == -1){
                   alert("중복된 아이디 입니다 !!");
                   return false;
                }
             }
          });
       });
 
       var $searchZipObj = $("#searchZip");
       $searchZipObj.click(function() { // 우편번호 검색버튼 클릭
          $("#divSearchZip").show();
       });
       
       $("#divSearchZip form").submit(function(){ // 우편번호 검색 세부창
          $.ajax({
          url : '${contextPath}/searchzip',
          method : 'POST',
          data : 'doro='+ $("#divSearchZip .search_pop input[type=text]").val(),
          success : function(data) {
             var jsonObj = JSON.parse(data);
             var trs = "<tr><th>우편번호</th><th>주소</th></tr>";
             for (var i = 0; i < jsonObj.length; i++) {
                trs += "<tr id="+jsonObj[i].buildingno+"><td>"
                      + jsonObj[i].zipcode
                      + "</td>"
                      + "<td><div>"
                      + jsonObj[i].doroaddr
                      + "</div>"
                      + "<div>"
                      + jsonObj[i].buildingaddr
                      + "</div></td></tr>";
             }
             $("#divSearchZip>div>table").html(trs);
          }
          });
          return false;
       });
        // 검색 후 원하는 주소 클릭했을떄 값을 가져오는 기능.
       $("#divSearchZip>div>table").on("click","tr:not(:first-child)"function() {
             var children = $(this).children();
             var zipcode = children.eq(0).html();
             var doroaddr = children.find("div:first-child");
 
             $("input[name=zipcode]").val(zipcode);
             $("input[name=addr1]").val(doroaddr.html());
 
             $("#divSearchZip").hide();
             $("input[name=buildingno]").val($(this).attr("id"));
             console.log("빌딩번호 : " + $("input[name=buildingno]").val());
       });
       
       $("input[name=cancel]").click(function(){ // 취소버튼 클릭
          var $main = $("#HOME");
          $main.trigger('click');
       });
    });
</script>    
<style>
#divSearchZip {
   display: none;
}
 
#divSearchZip {
   padding: 8px;
   width: 300px;
   height: 300px;
   position: absolute;
   top: 150px;
   left: 750px;
   border: 1px solid transparent;
   background-color: #F5EDED;
}
 
#divSearchZip .search_pop input[type=text] {
   width: 80%;
   height: 36px;
   font-size: 14px;
   line-height: 16px;
   padding: 8px;
   margin: 0px;
   border: 2px solid #ee2e24;
   box-sizing: border-box;
   float: left;
}
 
#divSearchZip .search_pop button {
   width: 20%;
   height: 36px;
   background-color: #ee2e24;
   font-size: 14px;
   color: #fff;
   font-weight: bold;
   text-align: center;
   line-height: 32px;
   display: block;
   padding: 0px;
   margin: 0px;
   border: 0px;
   border: 2px solid #ee2e24;
   box-sizing: border-box;
   float: left;
}
 
#divSearchZip table {
   width: 100%;
   padding: 0px;
   margin: 10px 0px 20px 0px;
   border-bottom: 2px solid #888;
   color: #707070;
}
 
#divSearchZip tr:not (:first-child ):hover {
   cursor: pointer;
   font-weight: bold;
}
 
th, td {
   vertical-align: middle;
}
 
#divSearchZip>div {
   clear: both;
   overflow: auto;
   height: 80%;
}
</style>
<form id="joinform">
   <div>
      <div></div>
      <div class="joinTitle">
         <!-- 회원가입 텍스트 -->
         <div>
            <h2 style="margin-left: 230px;">회원 가입</h2>
         </div>
      </div>
      <!-- 회원가입 텍스트 -->
 
      <!-- <h4 style="margin : 20px 0 10px 5px; margin-left: 230px;" >필수 입력 정보</h4> -->
      <p class="required" style="text-align: right;  margin-right: 160px;">
         <font size="1px;">필수입력사항</font><img src="../images/ico_required.gif" alt="required Field">
      </p>
 
      <div class="joinInputArea">
         <!-- 가입 영역 -->
         <!-- 비밀번호 힌트 추가 ? -->
         <table width="940" style="padding: 5px 0 5px 0;" align="center">
 
            <tbody>
               <tr height="2" bgcolor="#FFC8C3">
                  <td colspan="2"></td>
               </tr>
               <tr>
               <tr>
                  <th scope="row">아이디 <img src="../images/ico_required.gif"
                     alt="required Field">
                  </th>
                  <td><input type="text" name="id" maxlength="16" required>
                     <button type="button" id="dupchk">중복확인</button>
                     <span style="font-size: 10px; margin-left: 7px; font-weight: bold;">
                     <img src="../images/ico_required.gif" alt="required Field">
                     중복확인을 성공해야 회원가입 버튼이 생성됩니다.</span></td>
               </tr>
 
               <tr>
                  <th scope="row">비밀번호 <img src="../images/ico_required.gif"
                     alt="required Field">
                  </th>
                  <td><input type="password" name="pwd" maxlength="16" required>
                  <span style="font-size: 10px; margin-left: 7px; font-weight: bold; margin-left: 83px;">
                     <img src="../images/ico_required.gif" alt="required Field">
                     중복확인 후에는 아이디를 수정할 수 없습니다.</span>
                  </td>
               </tr>
               
               <tr>
                  <th scope="row">비밀번호 확인 <img src="../images/ico_required.gif"
                     alt="required Field">
                  </th>
                  <td><input type="password" name="pwd1" maxlength="16"
                     required></td>
               </tr>
                <tr>
                  <th scope="row">이름 <img src="../images/ico_required.gif"
                     alt="required Field">
                  </th>
                  <td><input type="text" name="name" maxlength="16" required>
                     <br></td>
               </tr>
               <tr>
                  <th scope="row">주소 <img src="../images/ico_required.gif"
                     alt="required Field">
                  </th>
                  <td><input type="text" name="zipcode" readonly name="zipcode">
                     <button type="button" id="searchZip">우편번호 검색</button></td>
               </tr>
 
               <tr>
                  <th></th>
                  <td><input type="text" name="addr1" readonly name="addr1"
                     style="width: 270px;"></td>
               </tr>
 
               <tr>
                  <th></th>
                  <td><input type="text" name="addr2" style="width: 270px;" placeholder="나머지 주소"></td>
               </tr>
 
               <tr height="2" bgcolor="#FFC8C3">
                  <td colspan="2"></td>
               </tr>
               <tr>
                  <td colspan="2" align="center"><br> <input type="submit"
                     value="가입완료"> <input type="button" name="cancel"
                     value="취소"> <input type="hidden" name="buildingno"
                     value=""></td>
               </tr>
         </table>
      </div>
   </div>
</form>
<%-- 우편번호 찾기 영역 --%>
 
<div id="divSearchZip">
   <form>
      <div class="search_pop">
         <input type="text" placeholder="도로명 + 건물번호">
         <button>검색</button>
      </div>
 
   </form>
   <div>
      <table></table>
   </div>
</div>
cs

 

아마 위의 코드만 붙여넣기한다면 Servlet, Service, dao 가 없어 에러가 날 것입니다. 

당장 회원가입, 로그인 기능이 필요하신분들은 아래의 war 파일을 사용하시면 될 것 같습니다.

HomeEx.war
4.11MB

 

2019/09/01 - [꿀팁] - eclipse 프로젝트 war파일로 import, export 하기

 

다음 게시물에서 이어서 진행하겠습니다.

오늘은 여기까지입니다 감사합니다 !

 

 

 

반응형

안녕들 하시죠 !

이번시간에는 eclipse 프로젝트를 war파일로 import, export 하는 법에 대해 알아보겠습니다.

war파일로 export

export 하고싶은 프로젝트 우클릭 -> Export

War file 선택 -> next

Browse -> export할 위치 선택 -> 프로젝트 내의 소스코드를 함께 export 하고싶다면

Export source files 선택 후 ( 선택하지 않으면 Package 내의 .java 파일들이 포함되지 않음 ) -> next

 

 

 

war파일로 import

 

eclipse의 Package Explorer 우클릭 -> import

War file -> next

Browse -> import할 war파일 선택

Web project에 원하는 file명 입력 -> next

함께 import할 jar파일 선택 -> finish

 

오늘은 여기까지입니다 감사합니다 !

'꿀팁' 카테고리의 다른 글

현대차 투싼 출시 ! 이걸 사 말아  (0) 2020.09.20
마이프로틴 배송 후기 + (마프 골든 메탈 쉐이커)  (2) 2019.05.14
단기간 토익 700 꿀팁  (0) 2019.05.11
티스토리 ZUM 노출  (0) 2019.04.21
티스토리 구글 노출  (0) 2019.04.21
반응형

안녕들 하시죠 !

이번시간에는 자바스크립트의 문서 객체 모델(DOM)에 대해 알아보겠습니다.

 

문서 객체 모델(Document Object Model)

HTML 문서에 접근하고 그 안에 내용물을 마음대로 바꾸거나 새로운 객체를 직접 만들어 문서의 원하는 부위에 삽입 삭제를 할 수 있다.

 

참조 https://poiemaweb.com/js-dom

 

DOM 트리의 노드

 

문서 노드(Document Node)

트리의 최상위에 존재하며 각각 요소, 어트리뷰트, 텍스트 노드에 접근하려면 문서 노드를 통해야 한다. 즉, DOM tree에 접근하기 위한 시작점(entry point)이다.

 

요소 노드(Element Node)

요소 노드는 HTML 요소를 표현한다. HTML 요소는 중첩에 의해 부자 관계를 가지며 이 부자 관계를 통해 정보를 구조화한다. 따라서 요소 노드는 문서의 구조를 서술한다고 말 할 수 있다. 어트리뷰트, 텍스트 노드에 접근하려면 먼저 요소 노드를 찾아 접근해야 한다. 모든 요소 노드는 요소별 특성을 표현하기 위해 HTML Element 객체를 상속한 객체로 구성된다. (그림: DOM tree의 객체 구성 참고)

 

어트리뷰트 노드(Attribute Node)

어트리뷰트 노드는 HTML 요소의 어트리뷰트를 표현한다. 어트리뷰트 노드는 해당 어트리뷰트가 지정된 요소의 자식이 아니라 해당 요소의 일부로 표현된다. 따라서 해당 요소 노드를 찾아 접근하면 어트리뷰트를 참조, 수정할 수 있다.

 

텍스트 노드(Text Node)

텍스트 노드는 HTML 요소의 텍스트를 표현한다. 텍스트 노드는 요소 노드의 자식이며 자신의 자식 노드를 가질 수 없다. 즉, 텍스트 노드는 DOM tree의 최종단이다.

참조 https://poiemaweb.com/js-dom

 

DOM | PoiemaWeb

브라우저는 웹 문서(HTML, XML, SVG)를 로드한 후, 파싱하여 DOM(문서 객체 모델. Document Object Model)을 생성한다. 파일로 만들어져 있는 웹 문서를 브라우저에 렌더링하기 위해서는 웹 문서를 브라우저가 이해할 수 있는 구조로 메모리에 올려야 한다. 브라우저의 렌더링 엔진은 웹 문서를 로드한 후, 파싱하여 웹 문서를 브라우저가 이해할 수 있는 구조로 구성하여 메모리에 적재하는데 이를 DOM이라 한다. 즉, 모든 요소와 요소의

poiemaweb.com

 

document 객체

document 객체는 window 객체에 포함되며 특정한 엘리먼트들을 포함하고 있다.

주로 문서유형, 색깔, 포맷과 같은 문서 정보에 접근하는 방법을 제공하고있다.

ex) document.body 속성으로 <body> 엘리먼트에 접근할 수 있다.

 

document 객체의 메서드

getElementById("엘리먼트 id") : id 속성이 일치하는 하나의 엘리먼트를 반환한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
 
function selectId(){    
    var getId = document.getElementById("a"); // 변수 getId에 a라는 Id를 가진 엘리먼트를 가져와라.
    getId.style.backgroundColor = "yellow"// getId가 가지고 있는 엘리먼트의 배경색을 yellow로 바꿔라.
}
 
</script>
</head>
<body>
<button onclick = "selectId();">id 'a'인 객체 선택하기</button> <!-- 버튼을 클릭하면 selectId 함수 실행 -->
<div>
<span id="a">1번</span>&nbsp;&nbsp;
<span id="b">2번</span>&nbsp;&nbsp;
<span id="c">3번</span>&nbsp;&nbsp;
</div>
</body>
</html>
cs

 

버튼 클릭 후 

document.createElement("엘리먼트 이름")

새로운 엘리먼트를 생성한다.

 

document.querySelector("CSS 선택자")

특정 엘리먼트 속성등의 정보를 얻기위해 사용하는 document 객체의 메서드.

 

document.ElementsByTagName("엘리먼트 이름")

태그 이름이 일치하는 모든 엘리먼트를 배열의 형태로 반환.

 

document.ElementsByName("name 속성값") 

id 대신 name을 사용하지만 name은 중복 가능하므로 위에있는 ByTagName처럼 배열 형태로 저장됨.

 

document.write()

문서에 내용을 추가한다.

 

document.createTextNode('텍스트')

새로운 텍스트 노드를 생성한다.

 

 

 

반응형

안녕들 하시죠!

얼마전부터 javascript 공부를 시작했는데요.

이번시간에는 javascript를 이용하여 간단한 계산기를 만들어보며 핵심 기능들을 알아보겠습니다.

 

elementObj.addEventListener(  "이벤트 이름", Fucntion(){}  );

특정 이벤트가 발생 했을 시 특정 함수를 실행할 수 있게 해주는 기능

 

사용할 이벤트 종류

click   :   변동이 있을 때 발생.

load   :   HTML문서나 이미지 등을 불러올 때 발생.

 

querySelector("CSS 선택자");

특정 엘리먼트 속성등의 정보를 얻기위해 사용하는 document 객체의 메서드.

 

ex) var element = document.querySelector("div");

     var elements = document.querySelector("CSS 선택자");

 

- 태그 : 엘리먼트의 태그 이름을 기준으로 검색.

- #아이디 : 엘리먼트의 속성 중 id 속성으로 검색.

- .클래스 : 엘리먼트의 속성 중 className 속성으로 검색.

- [속성=속성값] : 엘리먼트의 특정 속성을 지정하여 해당 속성의 값을 비교하여 검색.

 

<body>

1
2
3
4
5
6
7
8
9
10
11
<body>
 
    <input type="number" id="a"> <!-- a라는 id를 가진 number 타입의 엘리먼트  -->
    <br>
    <input type="number" id="b">
    <br>
    <button id="plus">+</button> <!-- plus라는 id를 가진 button 생성 -->
    <button id="minus">-</button>
    <div>결과</div> <!--  계산결과를 나타내는 div 영역 -->
 
</body>
cs

 

아래와 같은 UI 생성.

 

<script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<script type="text/javascript">
    addEventListener("load"function() {
 
        var aObj = document.querySelector("#a"); // 변수 aObj에 a라는 id를 가진 입력 엘리먼트를 대입.
        var bObj = document.querySelector("#b");
        var divObj = document.querySelector("div"); // 변수 divObj에 CSS div영역을 대입.
 
        var plusObj = document.querySelector("#plus"); // 변수 plusObj에 plus라는 id를 가진 버튼 엘리먼트를 대입.
        plusObj.addEventListener("click"function() { // plus 버튼을 click 했을때 발생하는 이벤트 작성부.
 
            divObj.innerHTML = parseInt(aObj.value) + parseInt(bObj.value);
            // aObj 와 bObj의 값을 정수형으로 바꿔준 후 div영역에 HTML 코드를 삽입하는 부분.
        });
 
        var minusObj = document.querySelector("#minus");
        minusObj.addEventListener("click"function() {
 
            divObj.innerHTML = parseInt(aObj.value) - parseInt(bObj.value);
 
        });
    });
</script>
cs

 

 

 

 

실행결과

전체코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>caltest</title>
<script type="text/javascript">
    addEventListener("load"function() {
 
        var aObj = document.querySelector("#a"); // 변수 aObj에 a라는 id를 가진 입력 엘리먼트를 대입.
        var bObj = document.querySelector("#b");
        var divObj = document.querySelector("div"); // 변수 divObj에 CSS div영역을 대입.
 
        var plusObj = document.querySelector("#plus"); // 변수 plusObj에 plus라는 id를 가진 버튼 엘리먼트를 대입.
        plusObj.addEventListener("click"function() { // plus 버튼을 click 했을때 발생하는 이벤트 작성부.
 
            divObj.innerHTML = parseInt(aObj.value) + parseInt(bObj.value);
            // aObj 와 bObj의 값을 정수형으로 바꿔준 후 div영역에 HTML 코드를 삽입하는 부분.
        });
 
        var minusObj = document.querySelector("#minus");
        minusObj.addEventListener("click"function() {
 
            divObj.innerHTML = parseInt(aObj.value) - parseInt(bObj.value);
 
        });
    });
</script>
 
</head>
<body>
 
    <input type="number" id="a">
    <!-- a라는 id를 가진 number 타입의 엘리먼트  -->
    <br>
    <input type="number" id="b">
    <br>
    <button id="plus">+</button>
    <!-- plus라는 id를 가진 button 생성 -->
    <button id="minus">-</button>
    <div>결과</div>
    <!--  계산결과를 나타내는 div 영역 -->
 
</body>
</html>
cs

 

오늘은 여기까지입니다 감사합니다!

 

참고서적 김천호 「No More Copy&Paste 자바스크립트」

반응형

안녕들 하시죠!

이번시간에는 HTML로 테이블을 만들어보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <tr>
    <th>Firstname</th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td> 
    <td>50</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td> 
    <td>94</td>
  </tr>
cs

 

 

이런식으로 출력됩니다.

테이블 사이에 선을 추가해 주려면 <head></head>에 border 스타일을 추가해줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html>
<head>
<title>Table Ex</title>
 
<style>
table, th, td {
  border: 1px solid black;
}
</style>
 
</head>
<body>
 
<table style="width:5%;">
   <tr>
    <th>Firstname</th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td> 
    <td>50</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td> 
    <td>94</td>
  </tr>
 
</body>
</html>
 
cs

 

 

 

 

 

2개의 선이 아닌 깔끔한 1개의 선으로 테이블을 만들고 싶다면 collapse를 추가해줍니다.

 

1
2
3
4
5
6
<style>
table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}
</style>
cs

 

 

HTML rowspan

테이블에서 열을 합칠 때 사용합니다.

 

1
<th rowspan ="2">Firstname</th>
cs

 

Fisrtname 만 rowspan을 사용해보겠습니다.

 

이런식으로 열이 합쳐지게됩니다.

조금 깔끔하게 만들어 보겠습니다.

 

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
<table style="width:5%;">
  <tr>
    <th>Firstname</th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr>
    <td >Jill </td>
    <td>Smith</td> 
    <td>50</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td> 
    <td>94</td>
  </tr>
 
<tr>
    <th rowspan="2">Steven</th>
    <th rowspan="2">King</th>
    <td>10</td>
  </tr>
<tr>
   <td>33</td>
</tr>
cs

 

이런식으로 열을 합하거나 colspan을 사용하여 행을 합하여 사용하면 될 것 같습니다.

오늘은 여기까지입니다 감사합니다 !

반응형

안녕들 하시죠!

이번시간에는 아파치 서버를 설치해 제가만든 HTML을 브라우저에 띄워보겠습니다.

 

http://apache.org/

 

Welcome to The Apache Software Foundation!

Apache Conferences "Tomorrow's Technology Today" since 1998. Intentionally intimate, offering unparalleled educational, networking, and collaboration opportunities. 2019 events are taking place in Washington DC, Chicago, Las Vegas, and Berlin. Join us!

apache.org

아파치 홈페이지로 들어가 제일 밑으로 이동하여 Tomcat 클릭.

 

 

 

왼쪽의 Tomcat 8 클릭 -> Core에 zip으로 받겠습니다.

 

bin -> startup.bat 클릭후 설치

 

 

 

 

설치가 다되도 Tomcat 설치화면은 켜져있습니다.

브라우저를 실행한 후, URL에 localhost:8080 입력.

 

정상적으로 설치가 되었다면 위와 같은 화면이 나옵니다.

이제 제가만든 HTML 을 브라우저에서 실행시켜보겠습니다.

아파치 설치 폴더 -> webapps -> ROOT 에 HTML파일을 넣습니다.

다시 브라우저로 돌아가 제 HTML 파일인 hello.html 을 실행시켜보겠습니다.

localhost:8080/ " 여기에 html 파일명 입력 "

 

localhost:8080/hello.html

 

 

성공했습니다.

오늘은 여기까지입니다 갑사합니다 !

반응형

 

안녕들 하시죠!

이번시간에는 HTML 기본 태그에 대해 알아보겠습니다.

https://www.w3schools.com 를 참고하며 진행했습니다.

 

HTML5 태그 사용법

<element attribute = "값"> 본문 </element>

HTML5의 기본 태그

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
 
<h1>This is a Heading</h1>
<h2>This is a Heading</h2>
<h3>This is a Heading</h3>
 
<p>This is a paragraph.</p>
<p>This is a <br> paragraph.</p>
 
<!-- HTML5 연습 -->
 
</body>
</html>
cs

 

 

<!DOCTYPE html> : HTML 타입을 명시해주며 가장 윗줄에 작성한다.

<html> </html> : 문서의 가장 큰 구성 요소로서, 코드의 시작과 끝을 알린다.

<head> </head> : 문서 윗부분에 들어가는 머릿말. 문서의 정보를 가지고 있다.

<body> </body> : HTML 문서의 본문, 모든 내용이 들어있다.

<title> </title> : 인터넷 브라우저 상단의 상태바에 나타낼 타이틀 글귀 작성부분.

<!-- --> : 주석.

 

 

 

HTML의 img 태그

 

1
<img src= https://www.w3schools.com/html/w3schools.jpg alt="W3Schools.com" width="104" height="142">
cs

 

<img> : 이미지 태그.
src : 이미지 경로.
alt : 이미지를 불러오지 못할 경우 문자열을 지정하기 위한 값, 수많은 검색엔진은 이미지 정보를 alt 속성을 통해 얻는다.

width, height : 이미지 사이즈.

 

위의 코드에 이미지 태그를 추가한 모습

 

오늘은 여기까지입니다 감사합니다 !

반응형

안녕들 하시죠!

이번시간에는 Java 언어를 이용하여 원형큐를 구현해보겠습니다.

아래에 인터페이스에 있는 메소드를 오버라이딩하여 사용해보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface QueueInterface {
 
    public void newQueue(int Qsize); // 새로운 큐를 생성하는 메소드
 
    public abstract boolean isFull(); // 큐가 포화상태인지 검사하는 메소드
 
    public abstract boolean isEmpty(); // 큐가 비어있는지 검사하는 메소드
 
    public abstract boolean enqueue(Object ob); // 큐에 데이터를 삽입하는 메소드
 
    public abstract Object dequeue(); // 큐에 들어있는 데이터를 삭제하는 메소드
 
    public abstract Object peek(); // 다음번 dequeue 될 데이터 출력하는 메소드
}
cs

 

- 변수 선언과 public void newQueue

 

1
2
3
4
5
6
7
8
9
10
11
12
13
private int front; // 출력 포인터
private int rear; // 삽입 포인터
private int Qsize; // 전체 큐의 사이즈
private char[] QArray; // Qsize를 이용하여 전체 배열 생성
 
@Override
public void newQueue(int Qsize) { // 큐를 생성하는 메소드
    front = 0//
    rear = 0// 맨처음 출력,삽입 포인터가 큐의 0번지를 가리키고 있다.
    this.Qsize = Qsize;
    QArray = new char[Qsize];
    System.out.println("사이즈는 : " + Qsize);
}
cs

 

- public boolean isFull(), public boolean isEmpty()

 

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public boolean isFull() { // 큐가 포화 상태인지 검사하는 메소드
    if (((rear + 1) % this.Qsize) == front) { // 원형큐의 핵심 코드, 아래에서 그림과 함께 설명.
        return true;
    } else {
        return false;
    }
}
@Override
public boolean isEmpty() { // 큐가 이어있는지 검사하는 메소드.
    return rear == front; // rear와 front는 데이터가 삽입되기 전에만 같은 위치를 가리키기 때문에 큐가 비어있는 상태검사에 사용.
}
cs

 

 

 

- public boolean enqueue

 

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public boolean enqueue(Object ob) {
    if (isFull()) { // 큐가 가득차 있지 않다면 삽입.
        System.out.println("큐가 꽉 차 있습니다.");
        return false;
    } else {
        rear = (++rear) % this.Qsize; // 아래 그림에서 설명
        QArray[rear] = (char) ob; // 삽입포인터 rear가 가리키는 공간에 데이터 삽입.
        System.out.println(ob + "를 " + rear + "번째에" + " 삽입");
        return true;
    }
}
cs

 

- 원형큐의 원리

맨처음 삽입포인터(rear) 와 출력포인터(front)는 [0]번지를 가리키고 있습니다. ( 1번그림 )

맨처음 데이터가 삽입되게되면 삽입포인터(rear)가 [1]번지로 이동하게되고 출력포인터(front)는 [0]번지를 그대로 가리키고있습니다. ( 2번그림 )

 

1번, 2번 그림

 

데이터가 계속 삽입되며 [3]번지까지 차게되면 포화상태가 됩니다. ( 4번그림 )

 

3번, 4번 그림

이렇게 포화가 된 상태에서 dequeue() 메소드를 이용해 데이터를 삭제하려고 한다면,

출력포인터(front) 가 [1]번지로 이동하고 데이터를 삭제하게 됩니다. ( 5번그림 )

 

5번, 6번 그림

 

이제 [1]번지의 데이터가 삭제되었으니 데이터를 추가할 공간이 생겼습니다.

enqueue() 메소드를 이용해 데이터를 삽입하려고 한다면,

삽입포인터(rear) 가 [0]번지로 이동하고 데이터를 삽입하여 다시 포화상태가 됩니다. ( 6번그림 )

 

* 핵심코드

 

6번그림에서 [3]번지를 가리키고있던 삽입포인터(rear) 가 [0]번지로 이동하려면,

 

1
rear = (++rear) % this.Qsize;
cs

 

이라는 코드가 필요하게됩니다.

[3]번지에 데이터를 삽입한 후 (++rear) 연산을 통해서 rear는 4가 되어있습니다.

4를 나머지연산(%)를 통해서 Qsize인 4로 나누게 되면 0이 나오기 때문에 다시 [0]번지로 이동하여 데이터를 삽입할 수 있습니다.

 

- public Object dequeue()

 

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public Object dequeue() {
    if (isEmpty()) {
        System.out.println("큐가 비어있습니다.");
        return -1;
    } else {
        front = (++front) % this.Qsize;
        System.out.println(QArray[(front) % Qsize] + "를 삭제");
        return QArray[front];
    }
}
 
cs

 

- public Object peek() 

 

1
2
3
4
5
@Override
public Object peek() {
    System.out.println(QArray[(front + 1) % this.Qsize]);
    return QArray[(front + 1) % this.Qsize];
}
cs

 

원형큐 전체코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
interface QueueInterface {
    
    public void newQueue(int Qsize); // 새로운 큐를 생성하는 메소드
 
    public abstract boolean isFull(); // 큐가 포화상태인지 검사하는 메소드
 
    public abstract boolean isEmpty(); // 큐가 비어있는지 검사하는 메소드
 
    public abstract boolean enqueue(Object ob); // 큐에 데이터를 삽입하는 메소드
 
    public abstract Object dequeue(); // 큐에 들어있는 데이터를 삭제하는 메소드
 
    public abstract Object peek(); // 다음번 dequeue 될 데이터 출력하는 메소드
    
}
 
public class MyQueue implements QueueInterface {
 
    private int front; // 출력 포인터
    private int rear; // 삽입 포인터
    private int Qsize; // 전체 큐의 사이즈
    private char[] QArray; // Qsize를 이용하여 전체 배열 생성
 
    @Override
    public void newQueue(int Qsize) { // 큐를 생성하는 메소드
        front = 0//
        rear = 0// 맨처음 출력,삽입 포인터가 큐의 0번지를 가리키고 있다.
        this.Qsize = Qsize;
        QArray = new char[Qsize];
        System.out.println("사이즈는 : " + Qsize);
    }
 
    @Override
    public boolean isFull() { // 큐가 포화 상태인지 검사하는 메소드
        if (((rear + 1) % this.Qsize) == front) { // 원형큐의 핵심 코드, 아래에서 그림과 함께 설명.
            return true;
        } else {
            return false;
        }
    }
 
    @Override
    public boolean isEmpty() { // 큐가 이어있는지 검사하는 메소드.
        return rear == front; // rear와 front는 데이터가 삽입되기 전에만 같은 위치를 가리키기 때문에 큐가 비어있는 상태검사에 사용.
    }
 
    @Override
    public boolean enqueue(Object ob) {
        if (isFull()) { // 큐가 가득차 있지 않다면 삽입.
            System.out.println("큐가 꽉 차 있습니다.");
            return false;
        } else {
            rear = (++rear) % this.Qsize; // 아래 그림에서 설명
            QArray[rear] = (char) ob; // 삽입포인터 rear가 가리키는 공간에 데이터 삽입.
            System.out.println(ob + "를 " + rear + "번째에" + " 삽입");
            return true;
        }
    }
 
    @Override
    public Object dequeue() {
        if (isEmpty()) {
            System.out.println("큐가 비어있습니다.");
            return -1;
        } else {
            front = (++front) % this.Qsize;
            System.out.println(QArray[(front) % Qsize] + "를 삭제");
            return QArray[front];
        }
    }
 
    @Override
    public Object peek() {
        System.out.println(QArray[(front + 1) % this.Qsize]);
        return QArray[(front + 1) % this.Qsize];
    }
}
cs

 

오늘은 여기까지입니다 갑사합니다 !

+ Recent posts