190710_Day63 JSP

복습

  • Web_INF/src 에는 Java File, DAO, VO (.java는 여기에! )

  • 자바와 관련없는 것들은? 프로젝트 밑에 sub 디렉토리 만들어서!

    • HTML, CSS, JavaScript, JSP
  • .xml은? 어디 넣어도 괜찮아

    • 데이터에 목적 같으면 sub디렉토리에
    • web.xml은 Web_INF 에
  • 디렉토리 구조
    • TomTest
      • sub디렉토리
        • HTML, CSS, JavaScript, JSP
      • WEB_INF
        • src
          • .java 파일
        • classes
          • .class 파일
        • lib
          • .jar 파일
        • web.xml 파일

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>안녕</title>
</head>
<body>
    <font color="blue" size="12">안녕, JSP~!!</font>
    <br>
    <script>
     document.write("나는 자바스크립트~^O^*");
    </script>
    <% 
      out.print("<br>나는 JAVA~!!");
      System.out.println("나는 콘솔 출력~~!!");
    %>
</body>
</html>

1562721502806


< JSP > Java Server Page, 서버스크립트(jsp, php, asp)

  • 자바 웹 어플리케이션
  • 브라우저 서비스(뷰)를 담당하는 한 페이지를 표현
  • Servlet Container (ApacheTomcat)를 통해 실행
  • HTML(CSS, JavaScript) + Java코드
    • <물>과 <기름> 처럼 섞이지 않아!
    • 각각 브라우저실행과 JVM에서 실행이기 때문
    • 누가 먼저 실행되나?
      • Java 코드가 먼저 실행됨
  • JSP 는 내(HTML)안에 너(JAVA) 있다.

<실행절차>

  1. JSP페이지 요청

    http://ip:port/컨텍스트루트/경로/hello.jsp

    ​ 컨텍스트루트 == 프로젝트명

  2. jsp페이지 존재 유무 ----무----> 404에러

  3. 매핑된 서블릿 클래스(hello_jsp.java) 존재 유무 -----무 ----> 생성

    public class hello_jsp extends HttpServlet{
            public void init(){}
            public void service(HttpServletRequest request,
                                HttpServletResponse response){
                out.print("JSP페이지에서 작성된 HTML");                    
            }
            public void destroy(){}
        }   
  4. 컴파일(hello_jsp.class) 유무 -----무----> 컴파일

  5. 메모리 적재 유무 ----무----> 메모리 로딩!!

  6. 최초 호출인 경우 init()메소드 호출

  7. service()메소드 호출


<JSP기본태그> ===> JSP페이지(.jsp)내에서 자바코드를 식별하는 태그

  1. Declaraction(선언) <%! %>

    <%!

    ​ 멤버요소 ---> 변수선언 가능, 변수초기화X , 변수선언과 동시에 초기화는 가능, 메소드정의 가능

    %>

    <%!
    int su; ==> O
    
    su = 20; ==> X
    
    int su = 20; ==> O
    
    pulbic String getMsg()
    {
    return "가능하지만... 비권장 이왕이면 .java에 들어가는게 더 좋음";
    } ==> O
    
    System.out.println(su2); ==> X,메소드호출불가
    %>
  2. Sctiptlet(스크립트릿, 실행) <% %>
    <%

    ​ service() 메소드 안의 자바코드

    ​ - 변수선언, 변수초기화, 메소드호출, 조건문, 반복문, 자바주석문( // , /**/ )

    %>

    <%
    int su3;
    int su4 = 40;
    su = 10;//멤버 초기화
    su3 = 30; //지역변수 초기화
    
    if(조건식){}
    for(){}
    System.out.println("안녕")
    
    %>
  3. Expression(표현식, 출력식) <%= %>
    <%= 데이터 %> ==> 서블릿 코드에서 out.print(데이터); 변환!! <%= 브라우저에 출력하고자 하는 데이터 %>
    ---> 데이터, 변수명, 사칙연산자, 메소드호출(리턴이 있는 메소드만 호출 가능)

    <%= 2 + 3 %> ===> out.print(2+3);
    <%= "안냥" %> ===> out.print("안냥");
    <%= su4 %> ===> out.print(su4);
    <%= getMsg() %> ===> out.print(getMsg());
    <%= getMsg(); %> ===> out.print(getMsg();); ==> 얘는 안됨
  1. Comment(주석, 설명문)<%-- --%>

문제1) 화면에 조회수를 출력하시오. (count.jsp)

​ =>조회수 : 1회

<%@page import="java.util.ArrayList"%>
<%@ 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>
    <%! int cnt;
        ArrayList<String> list = new ArrayList<>();
    %>
    <%
        if(session.isNew()) cnt++;
    %>
    조회수 : <%= cnt %> 회
<br> 세션아이디 : <%=session.getId()%>
</body>
</html>

문제2) 로그인 폼에서 아이디 비밀번호 가져오기

login_form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h3>로그인폼</h3>
    <hr>
    <!-- 
        <form action = "폼안의 데이터를 가지고서 이동할 URL">
        만약 action속성을 정의하지 않는 경우 현재 문서가 기본적으로 정의됨.
        (현재문서가 브라우저에 재호출)
        1. <form>
        2. <form action = "login_form.html">
            => 1번과 2번은 같다.

        만약 method속성을 정의하지 않는 경우 기본값 method="get"
            => method속성은 HTTP요청방식을 의미!!
     -->

    <form action="/TomTest/0710/param_test.jsp" method="post">
        ID : <input type="text" size="10" name="id"><br> PASS : <input
            type="password" size="10" name="pwd"><br> <input
            type="submit" value="로그인">
    </form>
</body>
</html>

param_test.jsp

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터테스트</title>
</head>
<!-- HTML주석 -->
<%-- JSP주석 --%>
<%--  param_test.jsp --%>


<body>
<!-- 당신이 현재 페이지를 오픈한 시간  <%= new Date() %>--><br>
   전달받은 아이디 : <%= request.getParameter("id") %><br>
   전달받은 비밀번호 : <%= request.getParameter("pwd") %><br>
</body>
</html>

문제3) 화면에 계산기를 출력하시오

Calculator.java (어제것.)

package t0709;


public class Calculator {//(사칙연산관련)기능정의
    //모델(데이터 관련된) 클래스 : 보통 결과데이터를 리턴!!

    private int su1;
    private int su2;
    private String oper;

    private int result;//사칙연산 결과를 담을 변수

    public Calculator(int su1, int su2, String oper) {
        this.su1 = su1;
        this.su2 = su2;
        this.oper = oper;
        choice();
    }
    //public int plus(int su1, int su2) { return su1+su2;} 
    //public int minus(int su1, int su2) { return su1-su2;}

    private void choice() {
        if(oper.equals("+"))plus();
        else if(oper.equals("-"))minus();
        else if(oper.equals("*"))multi();
        else //if(oper.equals("/"))
             div();
    }//choice

    public void plus() {
        result = su1+su2;
    }
    public void minus() {
        result = su1-su2;
    }
    public void multi() {
        result = su1*su2;
    }
    public void div() {
        result = su1/su2;
    }

    //최종 결과값 리턴!!
    public String getResultStr() {
        return "결과값: "+su1 + oper + su2 + "="+ result;//결과값: 2+3=5
    }

}

result.jsp

<%@page import="t0709.Calculator"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산 결과 출력</title>
</head>
<body>
    <%
        //요청페이지로(calc.jsp)부터 데이터 얻기
        //요청페이지 == request
        String su1 = request.getParameter("su1");
        String su2 = request.getParameter("su2");
        String oper = request.getParameter("oper");

        Calculator cal = new Calculator(Integer.parseInt(su1),
                 Integer.parseInt(su2),
                           oper);
    %>

    <%= cal.getResultStr() %>
</body>
</html>

미션1

화면에 구구단을 출력하시오

화면에 구구단을 출력하시오. ===> gugudan.jsp (<table>태그 사용)
  2*1=2    3*1=3   .....................   9*1=9

  .............................................
  2*9=18   3*9=27  .....................   9*9=81

  ==> <tr>태그 9개 생성
      <td>태그가 각 행마다 8개 생성

gugudan.jsp

<%@ 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">
        /*   css주  석

            태그이름 {
                        스타일명1 : 스타일값;
                        스타일명2 : 스타일값2;
                    } 
        */
        table{ margin : auto }
        h3{
            text-align: center
        }
        td{
            padding: 5px;
        }
    </style>
</head>
<body>
    <h3>구구단</h3>
    <hr>
    <table border = "2">
        <tr bgcolor = "pink">
            <% for(int i = 1; i <10; i++ ){ %>
            <th> <% out.print(i); %> 단</th>
            <% } %>
        </tr>
            <% for(int i = 2; i <10; i++) { %>
        <tr bgcolor = "gray">
            <% for (int j = 1; j < 10; j++) { %>
            <td> <% out.print(j +"X" + i + " = " + i*j); %> </td>
            <% } %>
        </tr>
            <% } %> 
    </table>
</body>
</html>

미션2

화면에 계산기를 출력하시오

  - calc2.jsp로만 실행 (계산기폼과 계산결과가 한화면에 출력)  : CalcServlet2클래스 참조
  - request.getParameter("name")사용
  - 기존 Calculator클래스 사용
---> 계산버튼 클릭시
       - 계산폼 밑으로 수평선<hr> 긋기
       - 수평선 밑에 계산결과를 '파랑색'으로 "결과값: 2*3=6" 출력
---> 만약 su1 또는 su2에 데이터가 입력되지 않았다면
      '빨강색'으로 "데이터를 입력!!" 출력            
---> 만약 su1 또는 su2에 숫자아닌값이 입력되었다면
      '빨강색'으로 "숫자만 입력!!" 출력            
---> 만약 oper가 '/'이고 su2가 '0'이 입력되었다면
      '빨강색'으로 "0으로 나눌 수 없습니다!!" 출력

calc2.jsp

<%@page import="t0709.Calculator"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP계산기</title>
</head>
<%--calc2.jsp --%>
<body>
<h3>JSP계산기2</h3>
<hr>
<form method="post" action="calc2.jsp">
  <input type="text" size="4" name="su1">
  <select name="oper">
    <option>+</option>
    <option>-</option>
    <option>*</option>
    <option>/</option>
  </select>
  <input type="text" size="4" name="su2">
  <button type="submit">계산</button>
</form>
   <%  //service()메소드 안에 들어갈 자바코드!!

      if(request.getMethod().equals("POST")){
        String su1 = request.getParameter("su1");
        String su2 = request.getParameter("su2");
        String oper = request.getParameter("oper");
        System.out.println("su1>>"+su1);


        out.print("<hr>");
        //입력 데이터에 대한 유효성 검사!!
        String msg;
        boolean flag=false;

        if(su1.equals("")  || su2.length()==0){//빈값 체크
           msg = "데이터를 입력!!";    
        //}else if(!su1.matches("[0-9]+") ||  !su2.matches("[\\d]+")){//숫자 체크
        }else if( !(su1.matches("[0-9]+") && su2.matches("[\\d]+"))  ){//숫자 체크
           msg = "숫자만 입력!!";    

        }else if( oper.equals("/") && su2.equals("0")){// 나누기0 체크
           msg = "0으로 나눌 수 없습니다!!";    

        }else{//정상입력
            flag=true;
          Calculator calc = new Calculator(Integer.parseInt(su1),
                                        Integer.parseInt(su2),oper);
           msg = calc.getResultStr();    
        }

        if(flag) out.print("<font color=blue>");
        else out.print("<font color=red>");

        out.print(msg+"</font>");

      }//if(POST)   
   %>

</body>
</html>

190708_Day Day TomCat 설정, Servelet

Preference에서

General에서 Workspace에서

d왼쪽 Text file encoding을 UTF-8로 바꿈

web탭에있는 애들(CSS,HTML,JSP)도 다 UTF-8로!


<톰캣서버 환경설정>

  1. 시스템 JAVA_HOME 설정 확인

  2. apache-tomcat 서버 설치

    http://tomcat.apache.org

    jdk8과 톰캣8이 가장 호환이 잘 되니 이걸로 간다!

    core가 가장 핵심이니 코어로 간다!

    보통 윈도우는 zip 리눅스는 tar

    zip파일과 installer가 있는데 굳이 zip 쓰는 이유는 서버 여러개 생성 가능해서


압축풀면

bin 에는 멸령어들(서버시작, 정지 등)

conf 환경설정 파일들 (server.xml web.xml context.xml)

logs 에는 서버 실행중 기록파일 기록함 (log.txt)

temp는 임시폴더

webapps는 웹 어플리케이션들, 중요한 폴더 (HTML, JAVA, JSP)

work는 개발자가 작성한 jsp 맵핑되는 servlet파일(.java .class) 를 생성하는 곳, 시스템테이블이랑 비슷, readonly, 자바코드 생성해주는 곳


cmd에서 startup.bat 실행시키면 Tomcat뜨면서 에러 발생함.

BindException도 발생하는데 웹서버를 돌리기 위해서는 포트넘버 하나를 가져가게 되는데 그것이 8080, 근데 오라클에서 리스닝 상태라 이미 쓰고 있어서 에러가 발생하는 것.

conf폴더에 포트넘버 바꾸는것이 있어!, 환경설정 모아둔 폴더

여기서 server.xml 에서 8080을 8282로 바꾸어보자!


이클립스에 플러그인 설치~! (필히 필요한건 아니지만 편리하다!)

https://sourceforge.net/projects/tomcatplugin/files/

여기서 zip파일 다운받기!

plugins폴더에

net.sf.eclipse.tomcat_9.1.4.jar 복사

복사한 jar파일을 내가 사용하는 이클립스 폴더 내에 plugins폴더에 붙여넣기 후 재시작

톰캣 메뉴 생김

Preferences 에서도 Tomcat 항목이 생겼다!

서버 버젼 8.x로 맞추고

Tomcat Home도 apache-tomcat-8.5.42 로 맞추고

context files로 어플라이!

그리고 Advances에서도 apache-tomcat-8.5.42

JVM setting에서도 체크 don't run Tomcat is debug mode

이후 Tomcat Project생성! Open perspective 뜨면 아니오~!

bin과 src는 헷갈릴거 같아서 지웠!


TomTest 프로젝트에서 jsp file 생성

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> 하이 톰캣서비스 ~ ! </title>
</head>
<body>
<!-- hello.jsp -->
    <font color="blue" size="15"> 톰캣 Plug-In을 통한 프로젝트 생성!</font>
</body>
</html>

http://192.168.0.87:8282/TomTest/hello.jsp 로 실행!


< Java Application>

  • 한개의 main()메소드를 가지고 독립적으로 실행하는 자바클래스

< Java Web Application>

  • 브라우저에서 실행되는 자바클래스 (Servlet/JSP)
  • 서블릿과 JSP를 실행하기 위해서는 web Application Server가 필요

<서블릿> javax.servlet.Servlet

  • 자바 플랫폼에서 컴포넌트를 기반으로 한 웹 애플리케이션을 개발할 때 사용
  • 스레드를 기반으로 하므로 웹 애플리케이션 운영에 효율적
  • 자바를 기반으로 하므로 자바 API를 모두 사용할 수 있다
  • 운영체제나 하드웨어에 영향을 받지 않으므로 한번 개발된 애플리케이션은 다양한 서버환경에서도 실행이 가능
  • 웹애플리케이션에서 효율적인 자료 공유 방법을 제공
  • JSP는 서블릿을 기반으로 한 기술

<웹 애플리케이션 개발 시 서블릿을 사용하면 좋은 점>

  • 콘텐츠와 비즈니스 로직을 분리 할 수 있다.
  • 컨트롤러와 뷰의 역할 분담으로 인해 웹 디자이너와 개발자 간의 원활한 작업이 가능
  • 유지보수가 수월
  • 기능확장이 용이

<서블릿 클래스의 상속관계>

javax.servlet.Servlet(인터페이스)

​ |

javax.servlet.GenericServlet(클래스)

​ |

javax.servlet.http.HttpServlet(클래스)

<서블릿의 생명주기 메소드> ★★★ Life Cycle

  1. init() 메소드

    서블릿 로딩시 실행되는 메소드

    서블릿 초기화에 관련된 메소드

    생성자라고 보면 됨

  1. service() 메소드

    웹브라우저에서 서비스(화면출력)하는 메소드

    클라이언트 요청에 따리 doGet()이나, doPost() 메소드로 분기

    사용자 요청 처리는 request(요청객체, client, 아이객체, 때쟁이, 브라우저)로

    ​ 응답 처리는 response(응답객체, server, 엄마객체, 톰캣)로 처리함

  1. destroy() 메소드

    컨테이너로부터 서블릿 종료요청이 있을때

    서블릿 종료직전에 해야 할 작업을 명시할 때 사용

    대부분의 경우 컨테이너가 종료될 때 실행된다.

    ​ 아파치 톰캣 => 서블릿 컨테이너! (서버, 실행기)


MyServlet.java

package t0708;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet{
  //서블릿 : 한개의 웹페이지 화면을 구성!!

   @Override
   public void init() throws ServletException {
      System.out.println("init()");
   }

   @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       System.out.println("service()");
       //서블릿 서비스 메소드 == 웹브라우저 서비스!! ==> HTML 서비스
       //request:클라이언트(사용자, 브라우저), response : 서버를 각각 의미

       // (한글)문자집합 설정
       response.setContentType("text/html;charset=UTF-8");
       // text/html => MIME형식
       // 입력:text 출력:html => out.print() 메소드를 통해 전달되는 text를 브라우저에게 html해석하시오!
       //text:plane; text:xml; 이런식으로 형식을 줄 수 있다!

       PrintWriter out = response.getWriter();
       //PrintWriter out ==> 브라우저 출력 객체를 의미함.
       //out.print("HTML코드(텍스트)");

       out.print("<html><head><title></title></head>");
       out.print("<body><h3>ServletTest</h3></hr>");
       for (int i = 0; i < 10; i++) {
           if(i%2==0)
           out.println("<b><font color = red>용진</font></b><br>");
           if(i%2==1)
            out.println("<b><font color = blue>진주</font></b><br>");
    }
       out.print("</body></html>");
    }

    @Override
    public void destroy() {
       System.out.println("destroy()");
    }

}

<서블릿 실행 방법>

  1. http://192.168.0.87:8282/TomTest/servlet/t0708.MyServlet

    그런데 이렇게 쓰면 해킹같은 문제가 발생할 수 있음.(보안상 문제)

    최근 버전부터는 그래서 주소를 적나라하게 쓰는걸 막음.

  2. WEB-INF/web.xml에 작성된 서블릿 클래스를 등록

    권장이 아닌 강요 하고 있음!

    등록과 함께 서블릿에 대한 가상의 경로를 매핑시켜서 호출.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd ">
    <!--서블릿 클래스 등록 -->
    <servlet>
        <servlet-name>my</servlet-name>
        <servlet-class>t0708.MyServlet</servlet-class>
    </servlet>

    <!--가상의 경로 설정 -->
    <servlet-mapping>
        <servlet-name>my</servlet-name>
        <url-pattern>/yongjinju/my</url-pattern> 
        <!-- url-pattern 엘리먼트 내의 맨 앞의  '/'는 (컨텍스트)루트를 의미 
            예) /yongjinju
            ===> http://localhost:828/Tomtest/yongjinju
        -->

    </servlet-mapping>

    <!-- 카운트 서블릿 등록 -->
    <servlet>
        <servlet-name> cnt2 </servlet-name>
        <servlet-class>t0708.CountServlet2</servlet-class>

    </servlet>

      <!-- 카운트 서블릿에 매핑할 가상경로 정의 -->
  <servlet-mapping>
     <servlet-name>cnt2</servlet-name>
     <url-pattern>/cnt2</url-pattern>
  </servlet-mapping>

</web-app>

xml하나를 만든다, Create XML file from an XML schema file!

XML catalog entry에서 web-app_3_0.xsd

javaee 선택하고 Edit으로 Prefix로 javaee 삭제(복잡해보여서)

CountServlet.java

package t0708;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CountServlet extends HttpServlet{
    int cnt;//=0;
    ArrayList<String> list;// 접속한 ip주소를 저장하는 용도


    @Override
    public void init() throws ServletException {
        list = new ArrayList<>(); //1회 실행
    }

    @Override
    protected void service(HttpServletRequest req, 
                           HttpServletResponse resp) throws ServletException, IOException {


       resp.setContentType("text/html;charset=UTF-8");
       //한글을 한개라도 사용하면 글자 깨짐을 방지하기 위해 '문자셋'설정을 해야 함.

       //req: 요청객체(브라우저,클라이언트), resp:응답객체(서버,출력)
       PrintWriter out = resp.getWriter();//out: 브라우저 출력객체
         //out.print("HTML텍스트");
         out.print("<html><head><title>ServletCount</title></head>");
         out.print("<body><h3>ServletCounter</h3><hr>");

      //동일 사용자(동일 브라우저접속)의 경우 ==> 조회 수를 1증가!!
         //req ==브라우저
         //HttpSession session = req.getSession(); //세션은 접속이다!!
         //if(session.isNew())

       String addr = req.getRemoteAddr();//접속한 클라이언트(브라우저)의 ip주소 얻기
           //addr ="192.168.0.90"
       System.out.println("접속클라이언트 ip주소["+addr+"]");  

         if(!list.contains(addr)) {//이미 접속한 ip가 아니라면, ip주소가 list에 포함되지 않았다면
             cnt++;
             list.add(addr);
         }

         out.print("조회수: "+  cnt  +"회</body></html>");

    }//service

}

이후 web.xml 에 서블릿 등록!

오라클 DB연결, 반드시 xe여야하는거 기억하기

counter.sql

--counter.sql

--카운트 값 저장
create table cnt
(
    cnt number
);

insert into cnt values (0);

select * from cnt;

create sequence cnt_seq;

--접속 ip 저장
create table addr
(
    addr varchar2(20)
);

drop table addr;

drop sequence cnt_seq;

counter.xml (아이바티스로)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd" >
<sqlMap namespace="count">
  <!-- counter.xml -->  
  <!-- ip저장 -->
  <insert id="insert" parameterClass="String">
      insert into addr values (#value#)
  </insert>

  <!-- 카운트값 변경 -->
  <update id="update" >
      update cnt set cnt=cnt_seq.nextval
  </update>

  <!-- 저장된 ip조회 -->
  <select id="select" parameterClass="String" resultClass="int">
      select count(*) from addr
      where addr=#value#
  </select>

  <select id="selectCnt" 
          resultClass="int">
       select cnt from cnt
  </select>
</sqlMap>

CountServlet2.java

package t0708;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.ibatis.sqlmap.client.SqlMapClient;

import iba.MySqlMapClient;

public class CountServlet2 extends HttpServlet{
    //접속한 클라이언트 ip주소와 조회수를 DB에 저장

    SqlMapClient smc;//용도? XML문서내의 sql호출

    @Override
    public void init() throws ServletException {
        smc = MySqlMapClient.getSqlMapInstance();
    }

    @Override
    protected void service(HttpServletRequest req, 
                           HttpServletResponse resp) throws ServletException, IOException {


       resp.setContentType("text/html;charset=UTF-8");
       //한글을 한개라도 사용하면 글자 깨짐을 방지하기 위해 '문자셋'설정을 해야 함.

       //req: 요청객체(브라우저,클라이언트), resp:응답객체(서버,출력)
       PrintWriter out = resp.getWriter();//out: 브라우저 출력객체
         //out.print("HTML텍스트");
         out.print("<html><head><title>ServletCount</title></head>");
         out.print("<body><h3>ServletCounter</h3><hr>");

       String addr = req.getRemoteAddr();//접속한 클라이언트(브라우저)의 ip주소 얻기
           //addr ="192.168.0.90" 
       System.out.println("접속클라이언트 ip주소["+addr+"]");  

       try {
  int count = (Integer)smc.queryForObject("count.select",addr);
           //count ==> 저장된 ip 존재 유무

           if(count == 0) {//저장ip가 존재하지 않는다면
                smc.insert("count.insert",addr);
                smc.update("count.update");
           }         
             out.print("조회수: "+  
                       smc.queryForObject("count.selectCnt").toString() 
                 +"회</body></html>");

       } catch (SQLException e) {
        e.printStackTrace();
       }

    }//service

}
궁금상자
Servlet JSP
JSP로 만들어도 실제 실행은 Servlet으로 실행됨

Servlet은 Java코드 안에 HTML 태그가 삽입된 .java코드
규약에 맞는 라이브러리나 클래스들을 상속, 구현하여 만든 클래스

JSP은 HTML을 코딩하기 불편, 어려워서 HTML내부에 Java코드를 삽입하는 방식, 인터페이스 구현이 힘든 Servlet의 비효율성을 개선?
서블릿 기반의 서버스크립트 기술!

Servlet은 자바코드로구현, 컴파일하고 배포해야 함 문자열 스크림 처리해야 함, 코드 수정시 다시 컴파일

JSP는 키워드 태그화로 쉬움, 자바코드는 <% %> 태그 안에 처리, HTML처럼 태그를 사용하여 자바코드도 사용 가능

190624_Day51


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>이미지 테스트</title>
    <script type="text/javascript">
        function imageChange2(imageName) //자바 클래스와 등가, 자바스크립트 함수는 일급 객체 , 고로 메소드안에 메소드도 가능하다!
        {
            console.log('img3의 이미지 소스  = ' + document.img3.src);
            if(imageName == 'jpg'){
                document.img3.src = "ebi.jpg"                        
            }else if ( imageName == 'hak'){
                document.img3.src = "hak.png"                
            }else if ( imageName == 'gif'){    
                document.img3.src = "ebi.gif"
            }
        }
    </script>

</head>
<body>
    <h3>자바스크립트를 통한 이미지 조작</h3>
    <hr>
    <img 
        name = "img3"
        src = "ebi.gif"
        width="400" height="300"
        onmouseover="imageChange2('jpg')"
        onmouseout = "imageChange2('hak')"
        onmousedown = "imageChange2('gif')"
    >




</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>오늘의 날짜 출력</title>
   <script type="text/javascript">
      function printDate(){
          var now = new Date();//now: 현재 날짜의 모든 정보가 저장.
          var dayStr=['일','월','화','수','목','금','토'];
          //dayStr의 자료형? Array배열!!

          var dayStr='일월화수목금토';  
          //          0123456
          //dayStr의 자료형? String문자열!!


          var year = now.getFullYear();
          var month = now.getMonth()+1;//1월~12월 :0~11 
          var date = now.getDate();
          var h = now.getHours();
          var m = now.getMinutes();
          var s = now.getSeconds();
          var day = now.getDay();//일요일~토요일 (0~6)
          /*
          document.write(year+'년 '+month+'월 '+date+'일 '+
                  h+'시 '+m+'분 '+s+'초 ('+dayStr[day]+'요일)');

          document.write('<br>'+year+'년 '+month+'월 '+date+'일 '+
                  h+'시 '+m+'분 '+s+'초 ('+dayStr.substr(day,1)+'요일)');

          document.write('<br>'+year+'년 '+month+'월 '+date+'일 '+
                  h+'시 '+m+'분 '+s+'초 ('+dayStr.charAt(day)+'요일)');
          */

          var str=year+'년 '+month+'월 '+date+'일 '+
                   h+'시 '+m+'분 '+s+'초 ('+dayStr.charAt(day)+'요일)';

          var d1 = document.getElementById('d1');
          //d1의 자료형? Element ---> 속성 innerHTML
          d1.innerHTML = str;        
          setTimeout('printDate()', 1000);
          //1초후에 printDate()호출

      }//printDate
   </script>
</head>

<!-- today_print.html -->
<body onload = "printDate()">
<!--  
    body 엘리먼트의 내용이 브라우저에 전체 출력 되었을 때 실행될것 onload
 -->
    <H3>오늘 날짜</H3>
    <hr>
<!-- 
    <script type="text/javascript">
    var now = new Date();
    var dayStr = ['일','월','화','수','목','금','토'];

    var dayStr = '일월화수목금토';            

    var year = now.getFullYear();
    var month = now.getMonth();
    var date = now.getDate();
    var h = now.getHours();
    var m = now.getMinutes();
    var s = now.getSeconds();
    var day = now.getDay();

    document.write(year + '년' + month + '월' + date + '일' + 
                h + '시' +  m + '분' +  s + '초 (' + dayStr[day] + ')');
    document.write('<br>' + year + '년' + month + '월' + date + '일' + 
            h + '시' +  m + '분' +  s + '초 (' + dayStr.substr(day,1) + ')');
    document.write('<br>' +year + '년' + month + '월' + date + '일' + 
            h + '시' +  m + '분' +  s + '초 (' + dayStr.charAt(day) + ')');
    //day가 요일 일(0) ~ 토(1)
</script>
 -->
     <div id="d1"></div>



</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원가입 폼</title>
    <script type="text/javascript">
        /* 
            등록 버튼 클릭시 validCheck() 호출 -> 유효성 검사

            1. 아이디, 비번, 비번확인, 이름, 주민, 주소에 대한 빈값 체크
                -> 빈값일 때 입력 메시지 (alert) 출력
            2. 비번과 비번확인 일치 체크
            3. 주민번호의 숫자값과 자릿수 체크'
            4. 직업을 선택했는지 체크

            => 1~4 체크가 잘 되었을 때 welcom.html 페이지로 이동!
            => <form>태그의 속성 action에 명시된 url이동! -> submit()함수 사용
            => document.form명.submit();
        */
        function validCheck()
        {
            var f = document.joinForm;
            var id = f.id.value;
            var pass = f.pass.value;
            var pass2 = f.pass2.value;
            var name = f.name.value;
            var ssn1 = f.ssn1.value;
            var ssn2 = f.ssn2.value;
            var phone1 = f.phone1.value;
            var phone2 = f.phone2.value;
            var phone3 = f.phone3.value;
            var addr = f.addr.value;
            var job = f.job.value;
            // pass, pass 2 name ssn1 ssn2 phone1 2 3 addr job
            if(id == '')
            {
                alert("입력 안된 값이 있어요!");
                f.id.focus();
            }else if(pass == '' || pass2 == ''){
                alert("비번 확인!");
                f.pass.focus();
            }else if (pass != pass2)
            {
                alert("비밀번호 불일치");                    

            }else if(name == ''){
                alert("이름 확인!");
                f.name.focus();
            }else if(ssn1 == '' || ssn2 == ''){
                alert("주민번호 확인!");
                f.ssn1.focus();
            }else if (isNaN(ssn1) || isNaN(ssn2) || ssn1.length != 6 || ssn2.length != 7){
                alert("올바르지 않은 주민번호!");
                f.ssn1.value = '';
                f.ssn2.value = '';
                f.ssn1.focus();
            }else if(phone1 == '' || phone2 == '' || phone3 == ''){
                alert("휴대폰 번호 확인!");
                f.phone1.focus();
            }else if(addr == '' ){
                alert("주소 확인!");
                f.addr.focus();
            }else if(job == '==선택==' ){
                alert("직업  확인!");
                f.job.focus();
            }else{
                return true;
                //submit 버튼 클릭시 action속성에 명시된 url이동
            }
            return false; //submit실행 x
        }

        function juminMove()
        {
            console.log('ssn1의 입력값>>>'+ 
                    document.joinForm.ssn1.value);
            if(document.    joinForm.    ssn1.        value.length == 6)
            //자료형 document form 엘리먼트 input엘리먼트 string
                {
                    document.joinForm.ssn2.focus();
                }
        }
    </script>
</head>
<body>

  <center>
  <h3>회원가입폼</h3>
 <form name = "joinForm" action = "welcome.html">
  <table  cellpadding="5" bgcolor="eeeeee">
    <tr align="right">
        <td>I D:</td>
        <td><input type="text" name="id" > 
            <input type="button" value="중복확인" tabindex="-1"> 
            <!-- tabindex로 바로 tab으로 넘어갈 수 있다.  -->
        </td>
        <!-- 
             <input>태그의 속성
         readonly    ===> 읽기전용(쓰기금지)  : 자바 setEditable(false)
         disabled    ===> 비활성화                   : 자바 setEnabled(false)
         -->
    </tr>
    <tr>
        <td>비 번:</td>
        <td><input type="password" name="pass"> </td>
    </tr>
    <tr>
        <td>비번확인:</td>
        <td><input type="password" name="pass2"></td>
    </tr>
    <tr>
        <td>이 름:</td>
        <td><input type="text" name="name"></td>
    </tr>
    <tr>
        <td>주민번호:</td>
        <td><input type="text" name="ssn1" size="6"
                   maxlength="6" onkeyup = "juminMove()">
             -
            <input type="password" 
                   name="ssn2" 
                   size="7"
                   maxlength="7">
        </td>
    </tr>
    <tr>
        <td>전화번호:</td>
        <td><input type="text" name="phone1" size="4"> -
            <input type="text" name="phone2" size="4"> -
            <input type="text" name="phone3" size="4">
        </td>
    </tr>
    <tr>
        <td>주소</td>
        <td><input type="text" name="addr"></td>
    </tr>
    <tr>
        <td>직업</td>
        <td>
             <select name="job">        
                <option >==선택==</option>      
                <option >학생</option>
                <option>공무원</option>
                <option>언론/출판</option>
                <option>군인/경찰</option>
                <option>일반사무직</option>
                <option>영업직</option>
                <option>기술/전문직</option>
                <option>보건/의료</option>
                <option>자영업</option>
                <option>주부</option>
                <option>기타</option>
             </select>
        </td>
    </tr>
    <tr>
        <td colspan="2" align="center">
           <!-- <input type="submit" value="등록"> -->
           <button type = "submit" onclick = "return validCheck()">등록</button>
           <!-- <input type="reset" value="취소"> -->
           <button type="reset">취소</button>
        </td>        
    </tr>
    </table>
   </form> 
  </center>
</body>

</html>

정규식(정규표현식) 테스트( RegularExpression )

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>정규식 테스트</title>
</head>
<body>
    <h3>RegExp 테스트</h3>
    <script type="text/javascript">
        var str = '  script ' ; // 맨 앞 공백 3개, 뒤에 공백 2칸
        //앞 뒤 공백 제거하기 
        str.trim();
        document.write(str + " " + str.trim().length);

        var str = '  script ' ;
        //trim 쓰지 말고...
        document.write("<br>" + str + " " + str.replace(' ', '').length);
        //맨 앞에 빈칸만 없애주네...
        document.write("<br>" + 'str의 문자열 길이 = ' +str.replace(/ /g,'').length);

        document.write('<br>str의 문자열길이(replace)='+
                  str.replace(/(^\s+)|(\s+$)/g,'').length);
        //패턴 검사 !! (데이터 검사 - 문자, 숫자, 길이)
        //횟수 관련 부호 : ?:(0,1)        *:( 0 ~ 무 한 대 )        +:( 1 ~ 무한대 )

        var a = ' '; var b = []; var c = {}; var d = /표현식/;
        var e = new RegExp("패턴");

        // a의 자료형 String
        // b의 자료형 배열
        // c의 자료형 JSON{키,밸류, 키,밸류 ...}
        // d,e의 자료형 RegExp객체 

        var str2 = 'abcA';
        // str2 영문자 검사!
        var regExp1 = /^[a-zA-Z]+$/
        // /하고 ^ 사이에 공백 있으면 안되네...
        // var regExp1 = /패턴/플래그;
        // 패턴내의 '^' : 문장의 시작
        // $ : 문장의 끝
        // 참고) [^abc] ==> a, b ,c 문자를 제외하고~
        //        ^[abc] ==> a 또는 b 또는 c문자로 시작하는 ~ 

        document.write('<br> 영문자 검사' + regExp1.test(str2) )
        //str2문자열을 regExp1패턴에 검사해서 일치하면 true를 리턴!

        var str3 = '12345';
        var regExp2 = new RegExp('^[\\d]+$'); // ^[\d]+$ 에서 \d 가 0~9 
        // 따옴표 때문에 \\d 쓰는것.
        document.write('<br>숫자 검사 : ' + regExp2.test(str3));

        var jumin1 = '960202';

        var juminPattern1 = /^[\d]{6}$/;
        // {m, n} : m:최소값 n:최대값
        // {3, 6} : 횟수 3이상 6이하, {6} : 6회, {3,} : 3회 이상
        document.write('<br>주민번호 앞자리 검사 : ' +
                        juminPattern1.test(jumin1) );    

        // 문제 ) 아이디를 검사 할 수 있는 패턴 idPattern을 정의하시오.
        // idPattern -> regExp객체
        // 아이디 조건 => 8~12자리, 영문자와 숫자조합, 영문자 시작

        var idcheck = 'asdfasdf';
        var idcheck = 'asdfasdf12';
        var idcheck = 'gil123df';

        var idPattern2 = new RegExp('^[a-zA-Z]{1}[a-zA-Z\\d]{7,11}$');

        document.write('<br>' + idcheck + ' 아이디 패턴을 검사! ' + idPattern2.test(idcheck));

        //문제 ) 비밀번호 검사 (5자리)

        var pass = 'aa!s5';
        var passPattern2 = new RegExp('/(?=.*\\d)(?=.*[~`!@#$%\^&*()-+=])(?=.*[a-zA-Z]){5}$/');

        document.write('<br>' + pass + ' 비밀번호 패턴을 검사! ' + passPattern2.test(pass));

    </script>
</body>
</html>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>새창열기테스트</title>
  <script>
     function win_open(){
        //window == 브라우저
        //window.open('새창에보여질URL주소','타겟명','윈도우(=브라우저)특성');
        //window.open(); 빈탭열기
        //window.open('child_window.html','_self'); 현 브라우저에 명시된 URL열기
        window.open('child_window.html','childWin',
                'toolbar=yes,location=0,status=1,menubar=1,'+
                'scrollbars=no,resizable=yes,width=300,height=200,'+
                'top=100,left=100');    
     }
  </script>
</head>
<!-- window_openTest.html -->
<body>
 <h3>새창열기테스트</h3>
 <hr>
 <form name="parentForm">
     이름: <input type="text" name="username">
 </form>
 <button onclick="win_open()">새창열기</button>


</body>
</html>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>자식창</title>
    <script type="text/javascript">
        // 부모창의 username값 얻어오기
        // 부모 윈도우창에 대한 레퍼런스 : opener( ==open window!! )
        // opener.document == 부모창의 문서, document.~ == 현재 문서
        //alert('부모폼의 이름 : ' + opener.document.parentForm.username.value);
        function initForm(){
            //alert('부모폼의 이름:'+ opener.document.parentForm.username.value);
            document.childForm.username.value
            = opener.document.parentForm.username.value;
          }

          function toParent(){
            opener.document.parentForm.username.value
              = document.childForm.username.value;
          }

    </script>
</head>
<!-- child_window.html -->
<body onload="initForm()">
   <h3>child_window(자식창)</h3>
   <hr>
   <form name="childForm">
        이름: <input type="text" name="username">
   </form>
   <br>
   <button onclick="toParent()">이름전달(to부모창)</button>
</body>

</html>

'클라우드 기반 웹 개발자 과정 공부 > JS' 카테고리의 다른 글

190621_Day50 <JavaScript4>  (0) 2019.06.21
190620_Day49 <JavaScript3>  (0) 2019.06.20
190619_Day48 <JavaScript - 1,2>  (0) 2019.06.19

190621_Day50

<자바스크립트>

  • 웹브라우저에서 실행되는 프로그램이다!!

  • HTML문서내에서 실행(html에 종속적이다,브라우저에서 실행된다!!)

  • HTML문서(정적페이지)
    ---> JavaScript적용 (동적페이지)

  • HTML문서를 통해 입력된 데이터를 얻어오고
    데이터에 대한 유효성 검사를 할 때 사용.

  • HTML문서에 대한 조작(태그,속성,스타일)!!

    ※결론) 자바스크립트를 왜(어디서) 사용하는가?

    - 문서 조작 (태그와 속성, CSS)
       ==> 조작에 필요한 데이터가 외부에 존재한다면(현재HTML없을시) Ajax를 사용!!
    - 유효성 검사 (서버에게 데이터를 보내기 전에 검사)   

===========================================================
<<JavaScript와 Java비교>>

  1. JavaScript: 클라이언트(사용자,브라우저) 스크립트 : 브라우저에서 실행!! JSP(Java) : 서버 스크립트 : JVM에서 실행!!

  2. JavaScript의 위치
    ---> HTML문서내에 포함되어서 실행.

     (HTML문서내의 어떤 위치라도 정의 가능)
    <html>
       <head>
          <script>
                        프로그램영역!!
             ----> 변수선언, 함수(function)정의                       
          </script>
       </head>
       <body>
          <script>
              프로그램영역!!
               ----> 함수 호출
          </script>
       </body>
    </html> 
  1. 자료형을 선언, 정의하지 않는다!! ★

    자바case)
       String name="홍길동";
              name="길라임";
              name=3000;   (X)
    
    자바스크립트case)
       String name="홍길동"; (X) 에러발생!!
          name="홍길동"; (O) 자료형 선언하지 않고 사용!!
    
      var su;  ---> 변수선언      
       su=2000;        ---> number타입
       su="김주원";     ---> String타입 
                            //대입되는 데이터에 따라 자료형이 변환됨
       su=true;        ---> boolean타입
       su= new Date(); ---> Date타입

  2. 자바스크립트에서의 문자열(text) 표현
    ---> 작은 따옴표와 큰 따옴표를 구분 없이 사용!!

            ---> 전혀 차이가 없음.

    name1= "홍길동"; (O)
    name2= '길라임'; (O)
    name3= "김주원'; (X)

  3. 자바스크립트는 구분자, 종결자 역할을 하는 ';'을 생략하는 것이 가능.
    ==> 이유: 라인(줄바꿈)을 통해 서로 다른 문장을 구분하기 때문.

    name='길동'
    age=13
    ==> (O)

    name="라임" age=15
    ==> (X)

    name="주원"; age=17
    ==> (O)

  4. 자바스크립트 /(몫), %(나머지)

    10/5 ---> 2
    10%5 ---> 0

    10/3 ---> 3.33333333

          parseInt(3.33333333)  ---> 3

    10%3 ---> 1

  5. JavaScript내의 주석

    • Java와 동일

    • //설명문 : 라인주석
      /*

              설명문1
              설명문2
              설명문3

      */ : 블럭주석

    • HTML주석은

'클라우드 기반 웹 개발자 과정 공부 > JS' 카테고리의 다른 글

190624_Day51 <JavaScript5>  (0) 2019.06.24
190620_Day49 <JavaScript3>  (0) 2019.06.20
190619_Day48 <JavaScript - 1,2>  (0) 2019.06.19

190620_Day49

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>함수 테스트</title>
    <script type="text/javascript">
        function gildong()
        {
        alert('딩꼬~!');
        }
    </script>

    <script src = "myfun.js"></script>
    <script type = "text/javascript">
            function vicky()
            {
                alert("비키는 용용이의 꼬집을 응원합니다.");
                alert("su1 + su2 = " + su1 + su2);
                alert("su3 = " + su3);
                alert("su4 = " + su4);
            }

    </script>

</head>

<!-- fun_test.html -->
<body>
    <h3>함수테스트</h3>
    <input type="button" onclick="gildong();" value = "딩듀호출">

    <button onclick="gildong()">딩꼬 호출</button>

    <a href="javascript:poo()">딩꼬 호출</a>

    <button onclick = "vicky();">비키 호출</button>
</body>
</html>
//myfun.js <script>태그 사이에 들어가는 
//변수선언 초기화 함수정의

su1 = 11; //전역변수
var su2 = 22; //전역변수

function poo() 
{
    su3 = 33; //전역변수
var    su4 = 44; //지역변수! (poo()함수 내에서만 사용가능)

    alert ( "진푸~!" );
    alert ( 'su2 = ' + su2 + ", su 4 = " + su4 + 'su3 = ' + su3);
    //su1, su2, su3, su4 모두 사용 가
}

<배열>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>배열테스트</title>
</head>
<!-- array_test.html -->
<body>
  <h3>배열Array 테스트</h3>
  <hr>
  <script type="text/javascript">
     //배열 객체 생성
     var str = new String("문자열");
     var myArry = new Array(5);//myArry[0]~myArry[4]할당
     document.write("myArry배열크기 = "+ myArry.length );

     //배열안에 데이터 입력
     myArry[0]=11;
     myArry[1]=22;
     myArry[2]=true;
     myArry[3]="홍길동";
     myArry[4]=new Date();

     myArry[5]='길라임';
     myArry[6]=3.14;
     //결론: 자바스크립트 배열은 여러 자료형을 입력받을 수 있고
     //     가변길이 배열이다!!

     document.write('<br>데이터입력후 myArry배열크기= '+
                      myArry.length)

     //전체 데이터 출력
     for(var i=0; i<myArry.length; i++){//배열 인덱스
        document.write('<br>myArry['+i+']='+myArry[i]); 
     }

     document.write('<hr>');
     //정해진 데이터(1,2,3,4,5)를 배열에 저장.
     //var myArry2={1,2,3,4,5};//에러: {}데이터는 JSON에서 예약!!
     //JSON ---> JavaScript Object Notation : 자바스크립트 객체를 표현하는 방법
     //JSON형식)
     //  {key:value,  key:value, ....}
     //  자바의 Map과 같다.
     // key==> 변수의 역할,  value==> 저장데이터   

     var person = {name:'홍길동', age:13, job:'학생',
                   etc:[100,200,300] };
     //사용법:  (JSON)변수명.key명
     document.write("<br>이름: "+ person.name);
     document.write("<br>나이: "+ person.age);
     document.write("<br>직업: "+ person.job);

     //etc의 두번째 데이터를 화면 출력하시오.
     //person.etc == 배열
     document.write('<br>etc의 데이터갯수: '+ person.etc.length);
     document.write('<br>etc두번째데이터: '+ person.etc[1]);


     document.write('<hr>');

     var myArry2=[1,2,3,4,5];//배열데이터는 []에 입력!!

     for(var i=0; i<myArry2.length; i++){//배열 인덱스
         document.write('<br>myArry2['+i+']='+myArry2[i]); 
     }

     document.write('<hr>');
     var myArry3= new Array(6,7,8,9,10);

     for(var i=0; i<myArry3.length; i++){//배열 인덱스
          document.write('<br>myArry3['+i+']='+myArry3[i]); 
     }

     document.write('<hr>');
     var fruits=new Array();

     //데이터 입력
     fruits.push('사과');
     fruits.push('딸기');
     fruits.push('복숭아');

     //데이터 삭제(맨 마지막 요소부터)
     fruits.pop();
     fruits.pop();

     fruits.push("리치");
     fruits.push("파인애플");
     fruits.push("수박");
     //사과,리치,파인애플,수박
     // 0   1    2     3

     //fruits.slice(startIdx,endIdx);
     document.write('<br>fruits='+fruits);
     document.write('<br>fruits.slice(1)='+fruits.slice(1));
     document.write('<br>fruits.slice(1,3)='+fruits.slice(1,3));
     document.write('<br>fruits.join("^")='+fruits.join("^"));
     //join()메소드: 특정문자를 포함한 새로운 문자열 생성
     //결과값: "사과^리치^파인애플^수박"

     document.write('<br>fruits.reverse()='+fruits.reverse());
     document.write('<br>fruits.sort()='+fruits.sort());


     for(var i=0; i<fruits.length; i++){//배열 인덱스
           document.write('<br>fruits['+i+']='+fruits[i]); 
     }



  </script>

</body>
</html>

<플러그인 설치 방법>

  1. 설치된 eclipse 폴더
    • plugins폴더
    • features폴더
      • 두 폴더에 필요한 jar파일 복사!
  2. Help메뉴
    • intall new software
    • add버튼
    • name설정과 location위치
  3. help메뉴
    • Eclipse Marketplace
    • 검색

<자바스크립트, jQuery 관련 플러그인 설치 - Tern 플러그인>

​ 2번 방법으로 설치한다!(http://marketplace.org)

http://oss.opensagres.fr/tern.repository/1.2.0

​ 설치후 재시작! 그리고 세팅~!

프로젝트 적용!

  1. 적용할 프로젝트명 오른쪽 클릭!
    1. Configure
    2. Convert to Tern Project
  2. 프로젝트 Properties
    • JavaScript
      • Modules
        ==> Browser, CKEditor, jQuery체크

이후 깃 세팅, 깃헙 사용 방법, 세미프로젝트2 학습함.

'클라우드 기반 웹 개발자 과정 공부 > JS' 카테고리의 다른 글

190624_Day51 <JavaScript5>  (0) 2019.06.24
190621_Day50 <JavaScript4>  (0) 2019.06.21
190619_Day48 <JavaScript - 1,2>  (0) 2019.06.19

190619_Day48

HTML 마지막에 있는 JavaScript에 이어서

  1. 실행

    JavaScript: 클라이언트(사용자,브라우저) 스크립트 : 브라우저에서 실행!!

    JSP(Java) : 서버 스크립트 : JVM에서 실행!!

  2. JavaScript의 위치
    ---> HTML문서내에 포함되어서 실행.

     (HTML문서내의 어떤 위치라도 정의 가능)
     <html> 
      <head>
         <script>
                        프로그램영역!!
             ----> 변수선언, 함수(function)정의                       
          </script>
       </head>
        <body>
    
          <script>
                          프로그램영역!!
               ----> 함수 호출
          </script>
    
       </body>
    </html> 
  1. 자료형을 선언, 정의하지 않는다!! ★

    자바case)
    String name="홍길동";

          name="길라임";
          name=3000;   (X)

    자바스크립트case)
    String name="홍길동"; (X) 에러발생!!

         name="홍길동"; (O) 자료형 선언하지 않고 사용!!
  var su;  ---> 변수선언      
      su=2000;        ---> number타입
      su="김주원";     ---> String타입 
                           //대입되는 데이터에 따라 자료형이 변환됨
      su=true;        ---> boolean타입
      su= new Date(); ---> Date타입
  • document.writeln("~"); 해도 new라인이 아닌 한칸만 떨어졌다.
  • new line = White Space, 브라우저에 출력됨으로 한칸으로 출력 ( 브라우저 출력 )
  • 한칸 띄고 싶다면 < br > 이라는 html 태그 이용해서!
  1. 자바스크립트에서 문자열 ( text ) 표현
  • 작은 따옴표와 큰 따옴표 구분 없이 사용!

    • ' ' 과 " " 은 전혀 차이가 없음.

      name1 = "기묜진"; (O)
      name1 = '기묜진'; (O)
      name1 = "기묜진'; (X)
  • 문제

    • 브라우저에 "여기는 남부터미널 입니다"를 출력하시오.

          document.writeln('<font color = skybule>여기는 "남부터미널" 입니다.<br>'); 
          document.writeln("<font color = orange>여기는 '남부터미널' 입니다.<br>"); 
          document.writeln("<font color = purple>여기는 \"남부터미널\" 입니다."); 
    • 데이터 10과 3에 대한 사칙연산 결과를 화면에 출력하시오.

          document.write( '<br>su1 + su2 = ' + (su1 + su2 ) );
          document.write( '<br>su1 - su2 = ' + (su1 - su2 ) );
          document.write( '<br>su1 * su2 = ' + (su1 * su2 ) );
          document.write( '<br>su1 / su2 = ' + (su1 / su2 ) ); 
          // 결과값이 소수점 이하까지 계산 되네, 정수 실수 자료형 선언이 없었기 때문, 3만 나오게 하려면 
          document.write( '<br>parseInt(su1 / su2) = ' + parseInt(su1 / su2 ) ); 
          document.write( '<br>su1 % su2 = ' + (su1 % su2 ) );
  1. 자바스크립트는 구분자, 종결자 역할을 하는 ';'을 생략하는 것이 가능

    • 이유 : 라인(줄바꿈)을 통해 서로 다른 문장을 구분하기 때문

      name = '용딩'
      age = 13
      // 이렇게 세이콜론 없이 쓰는 것 가능 하지만 쓰는 것을 권장
      
      name = '용딩' age = 13
      //이렇게 한줄로 몰아쓰는건 안된다!
      
  2. 문자열 비교

    자바Case)
    "java".equals("JAVA") => false 문자열 내용 비교
    "java" == "JAVA"      => false 메모리 주소 비교
    자바스크립트Case)
    "javascript".equals("JAVASCRIPT") => X 에러발생
    "javascript" == "JAVASCRIPT" => false 문자열 내용 비교

    koxo.com 참조

  3. '==' 연산자 '==='연산자

    • '==' 연산자
      • 등가 연산자
      • 데이터 내용만 비교 (자동 형변환 발생)
    • '==='연산자
      • 등가연산자 (엄격한 비교연산자)
      • 자료형 비교
      • 내용 비교
    • 관련연산자
      • != (비교연산자)
      • !==(엄격한 비교연산자)
  4. 조건문

       if(조건식){
              조건식의 결과가 참일 때 실행할 문장;
       }
       --->실행할 문장이 한개였을때 영역괄호{}는 생략가능!!
    
       if(조건식){
              조건식의 결과가 참일 때 실행할 문장;
       }else{
              조건식의 결과가 거짓일 때 실행할 문장;
       }
    
    
  if(조건식1){
         조건식1의 결과가 참일 때 실행할 문장;
  }else if(조건식2){
         조건식1의 결과가 거짓이고!!
         조건식2의 결과가 참일 때 실행할 문장;
  }else{
         조건식1,2의 결과가 거짓일 때 실행할 문장;
  }

   -  ※ 자바와의 차이점
          if(조건식 ==> boolean, 숫자, 객체){

          }

      숫자: 0인 수(false), 0아닌 수(true)로 구분
      객체: 브라우저에서 지원되는 객체인지 아닌지 판별.     

     ----> 변수에 값이 존재하는지 판단.

     - 존재하는 객체(문자열, 브라우저가 지원하는 객체)  ---> true

     - null, undefined                        ---> false

     ​    undefined : 선언은 되어있는데 초기화 되지 않은 변수    



문제1)브라우저에 1~5까지 출력하시오. (for문 사용)

```javascript
        for(var i = 1; i < 6; i++){
            document.write(i + '&nbsp');
        }

문제2) 5에서 1까지 브라우저에 출력하시오 (for문)

        for(var i = 5; i > 0; i--){
            document.write(i + '<br>');
        }

문제3 브라우저에 출력하시오.

        for(var i = 3; i < 13; i += 3){
            document.write(i);
            if(i < 10)document.write(", ");
        }

문제4 구구단 3단을 출력하시오. (for문 사용)

        for(var i = 1; i < 10; i++){
            document.write("<br>3 X " + i + " = " + ( 3 * i ));

        }

문제5 구구단(2단~9단)을 브라우저에 출력하시오. (조건:열을 맞추어 출력, 다중for문 사용)

        document.write("<pre>");
        for(var j = 1; j < 10; j++){
            for(var i = 2; i < 10; i++){
                    document.write( i + " x " + j + " = " + ( i * j ) + "\t");
            }
            document.write("<br>");
        }
        document.write("</pre>");
   document.write('<table cellpadding=10>')
   for(i=1; i<10; i++){//기준: 곱하는 수 1~9        9번반복!!
         document.write('<tr>');//9개의 <tr>태그 생성
       for(dan=2; dan<10; dan++){//단수: 2~9      8번반복!!
             //9*8=72 ---> 72개의 <td>태그 생성
         document.write('<td>'+dan+'*'+i+"="+(dan*i)+'</td>');
       }
       document.write('</tr>');//9개의 </tr>태그 생성
   }
   document.write('</table>')

대화상자~!

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>대화상자 테스트</title>
</head>
<!-- dialog_test.html -->
<body>
    <h3>대화상자테스트</h3>
    <hr>

    <script type="text/javascript">
        //메시지 대화상자 : alert(출력할 데이터)
        alert("딩푸 등장!");

        a = 10;
        b = 20;
        document.write( 'a + b =' + ( a + b ) ); // a와 b를 더한 값을 확인 : 브라우저 화면 출력
        alert( 'a+b =' + ( a + b ) ); // a와 b를 더한 값을 확인 : 메시지창 출력

        // 확인 대화상자 : confirm(메시지) ===> 삭제전 '확인'에서 많이 사용
        // alert( confirm() ) ; // 확인, 취소, x버튼 => true, false, false
        if( confirm ('딩듀 푸푸하셨습니까?') ){
            alert('시원하게 하셔서 다행입니다. 내일도 시원하게 하세요~!');
        }else{
            alert('조금 이따 하시겠네요 ㅋ');
        }

        //입력 대화상자( 잘 사용 안함, 모양이 이상...)
        //prompt('출력할메시지');
        var many = prompt('딩듀가 하루에 쁀하는 횟수는?', '');

        if(many != null){
            if( many == '') // 빈값 체크 : str == '' 또는 str.length == 0
            {
                alert('횟수를 입력하세요!');
            }else{
                alert('[' + many + '] 번이라구요?' + '자는 시간에만도 그것보다는 더 합니다.')
            }
        }

    </script>
</body>
</html>

내장함수

  • 내장(기본) 함수 : 자주 사용되는 함수를 레퍼런스 없이 사용하게 하는 것

  • eval()

            var a = '100';
            var b = 100;
    
            document.write('a + b = ' + ( a + b ) );
            document.write('<br>eval(a) + b = ' + ( eval ( a ) + b ) );
    
            var v2 = '{ name: " 이딩듀 ", age : 1 }';
            var v3 = eval("(" + v2 +")");
            document.write('<br> 이름 = ' + v3.name);

    #등장한김에 잠시 배워보는 JSON

    ​ JavaScript Object Notation

    ​ JSON 형식 )

    var v = { key1 : value, key2 : value };
    ---
    var v = { name : "기묜진" , age : 2};
    //v 가 JSON
    document.write('<br>이름 = ' + v.name);
    //이렇게 쓴다!
  • isNan()

    • not a number
    • 숫자인지 여부 판별할때,
  • escape() / unescape()

    • 나중에는 안쓰게 됨.
    • 인코딩 디코딩
    • 특문 몇개 제외하고는 모두 16진수 문자로 바꾸어준다.
  1. 함수(메소드) 정의 ★★★

    • 자바Case

      void hello(String name, int age){}
      int hello(String name, int age){return 100;}
    • 자바스크립트Case

      function hello(name, age){}
      function hello(name, age){return 100;}
    • 함수형식

      function 함수명(){
      
      } //---> return; 생략가능
      
      function 함수명(변수명1, 변수명2){
          return "리턴데이터";
      }
    • 주의 ) 자바스크립트의 함수는 오버로딩을 지원 할까요?

      • 기본적으로 제공하지 않는다.

        function hello(){
            안녕!
        }
        hello(); //호출 -> 안녕!
        
        function hello(){
            신짜오!
        }
            //에러 발생 안함.
        hello(); //호출 -> 신짜오! 나옴, 같은 이름 함수 두 개 쓰면 앞에것 호출 불가!
        
        function hello(name){
            니하오!
        }
            //에러 발생 안함
        hello(); //호출 -> 니하오! , 함수명만 일치하면 파라메터 상관없이 호출됨 
        
        hello(); // 니하오!
        hello('나길동'); // 니하오!
        hello('나길동',130); // 니하오!
            //함수 호출시 매개변수(인자)의 갯수와 상관없이 함수명만 일치하면 호출 가능!
            //같은 영역(파일)에 동일한 이름의 함수가 여러개 존재하면 제일 아래에 있는 함수로 overwrite됨!

        예제. myFun_test.html

        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
        <title>사용자 정의함수</title>
        
            <script type="text/javascript">
            //함수정의
            function test(){
                alert('함수 테스트');
            }
        
            function hello(){
                alert('헬로~')
            }
        
            function hello( name ){
                alert('안녕, ' + name )
            }
        
            function hello( name, age ){
                alert('하이, ' + name + "!! \n 당신의 나이는 " + age + "살" )
            }
        
            function hello( name, age ){
                //undefined : 초기화 되지 않은 변수
                //null써도 되지만 undefined
                if(name == undefined) 
                alert('헬로');
                else if(age == undefined)
                alert('안녕, ' + name );
                else
                alert('하이, ' + name + "!! \n 당신의 나이는 " + age + "살" );
            }
        
            prompt("입력", "초기값", "딩딩","비키")
            </script>
        
        </head>
        <!-- myFun_test.html -->
        <body>
            <h3>사용자 정의함수 테스트</h3>
            <hr>
            <!--
                on~ 시작하는 속성 : 이벤트 속성 
                onclick = "자바스크립트 코드"
            -->
            <input type="button" value="test()호출" onclick="test();">
            <button onclick="hello();">hello() 호출</button>
            <button onclick="hello('딩듀');">hello(딩듀) 호출</button>
            <button onclick="hello('비키', 2);">hello(비키, 2) 호출</button>
        </body>
        </html>

'클라우드 기반 웹 개발자 과정 공부 > JS' 카테고리의 다른 글

190624_Day51 <JavaScript5>  (0) 2019.06.24
190621_Day50 <JavaScript4>  (0) 2019.06.21
190620_Day49 <JavaScript3>  (0) 2019.06.20

190618_Day47 <JavaScript 시작>

form 태그 역할

  1. form내의 입력데이터를 action속성에 명시한 URL 페이지에게 전달(이동)

    보통 URL 페이지에는 서버페이지가 표시가 됨. (.jsp .php .asp .do 등)

  2. 페이지 이동 < a > 와 더불어.

    • < a > 는 단순 이동

      <a href="../0617/hello.html">
    • < form action > 은 데이터 전송과 함께 페이지 이동

      <form action = "../0617/hello.html">

input

  • 기본 type 은 text

    <input>
    • password 와 같은 type을 줄 수 있다.

      <input type = "password">
  • value 값에는 기본 값(초기값) 설정 할 수 있다.

    <input value = "기본아이디">
  • size속성 통해 길이 조정 가능

    <input size = "1">
  • 그런데 글자 size보다 더 입력되네? => maxlength 통해 조절 가능

    <input size = "1" maxlength = "1">
  • type = checkbox 로 다중선택 가능

    <input type = "checkbox"> 사과
    <input type = "checkbox" checked> 딸기
    <input type = "checkbox"> 바나나
  • radio와 name 을 통해 택1 선택 가능

    <input type = "radio" name = "room"> 1강의실
    <input type = "radio" name = "room"> 2강의실
    <input type = "radio" name = "room"> 3강의실
    <input type = "radio" name = "room"> 4강의실
  • form, name 값과 submit을 통해 입력한 값을 전송 할 수 있다.

    <input type = "submit" name ="button1" value = "버튼3(type = submit)">
  • hidden을 통해 보이지 않게 데이터를 전달 할 수 있다. (추후 사용용도 배움)

    <input type = "hidden" value = "전송"> 
  • type file로 파일 업로드 가능!

    <input type = "file">
  • method 은 get이 dafault , post옵션을 통해 전송된 값 안보이게 할 수 있다. (추후 배움)

  • enctype (추후 배움)

  • 콤보박스는 input태그를 사용하는것이 아니라 select 태그를 사용함!

        운동 : <select multiple>
                <option>야구</option>
                <option selected>축구</option>
                <option>농구</option>
                <option>배구</option>
            </select>
  • select multiple 을 사용하면 아이템이 펼처진 상태에서 보여짐

    <select multiple>
  • textarea 통해 선택한 크기의 텍스트 상자 사용 가능

    <textarea rows="5" cols="10" >기본내용은 여기에</textarea>
    • 단 value 사용 불가
  • Button 4종 비교 정리

    1. 아무반응없는 눌려지는 버튼 (JavaScript를 통해 기능정의 가능)
    <input type = "button" value = "버튼1(type = button)">
  1. button태그의 기본 type 속성의 값은 submit입니다

        <button type = 'submit'> 기본값 
        즉, form태그 안에 사용하면 <inputj type = 'submit'>과  같은 기능을 갖음
        만약, submit이 아닌 다른 기능을 구현하고 싶다면 명시적인 type속성을 정의해야 함
    <button type = "submit"> 버튼2 ( button태그 ) </button>
  2. form태그내의 submit버튼의 경우 action속성의 URL이동

    <input type = "submit" value = "버튼3(type = submit)">
  3. form태그내의 reset버튼의 경우 폼 내의 데이터를 초기화 하는 기능

    <input type = "reset" value = "버튼4(type = reset)">
  • 만약, < input > 태그를 브라우저화면 보이기만 하는것이 목적이라면 굳이 < form > 태그 안에 정의할 필요 없음.
  • < input > 태그를 < form> 태그안에 정의하는 이유는 폼 단위로 데이터를 특정 페이지에게 전달하기 위함
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>폼태그 테스트 (input 태그)</title>
</head>
<!-- form_test.html -->
<body>
    <h3>폼태그 테스트 (input 태그)</h3>
    <hr>

    <h4>단순 페이지 이동</h4>
    <a href="../0617/hello.html"> hello.html 문서로 이동!  </a>

    <hr>
    <h4>정보와 함께 페이지 이동 (form)</h4>
    <form action = "../0617/hello.html" name =""
            method = "post" enctype="application/x-www-form-urlencoded"> hello.html 문서로 이동! 

    <br>

    기본 input : <input> <br> <!-- 기본type은 text -->
     아 이 디 &nbsp;: <input type = "text" value = "기본아이디" size = "10" name = "id"> <br>
    비밀번호 : <input type = "password" name = "password"> <br>
    주민번호 : <input type="text" size = "6" maxlength="6" name = "ssn1"> 
            - 
            <input type = "password" size = "7" maxlength="7" name = "ssn2"> <br>
    좋아하는 과일 : <input type = "checkbox"> 사과
               <input type = "checkbox" checked> 딸기
               <input type = "checkbox"> 바나나
               <br>
    나의    강의실 : <input type = "radio" name = "room"> 1강의실
               <input type = "radio" name = "room"> 2강의실
               <input type = "radio" name = "room"> 3강의실
               <input type = "radio" name = "room"> 4강의실
                <br>

    파일  업로드 : <input type = "file">
    <br>
    운동 : <select multiple>
            <option>야구</option>
            <option selected>축구</option>
            <option>농구</option>
            <option>배구</option>
        </select>    

    <br>
    비고 : <textarea rows="5" cols="10" >기본내용은 여기에</textarea>
    <br>
    나보여?         <input type = "hidden" value = "전송"> 
    <br>
    <input type = "button" value = "버튼1(type = button)">
    <!-- 아무반응없는 눌려지는 버튼 (JavaScript를 통해 기능정의 가능) -->

    <button type = "submit"> 버튼2 ( button태그 ) </button>
    <!-- button태그의 기본 type 속성의 값은 submit입니다
        <button type = 'submit'> 기본값 
        즉, form태그 안에 사용하면 <inputj type = 'submit'>과  같은 기능을 갖음
        만약, submit이 아닌 다른 기능을 구현하고 싶다면 명시적인 type속성을 정의해야 함
    -->

    <input type = "submit" value = "버튼3(type = submit)">
    <!-- form태그내의 submit버튼의 경우 action속성의 URL이동 -->

    <input type = "reset" value = "버튼4(type = reset)">
    <!-- form태그내의 reset버튼의 경우 폼 내의 데이터를 초기화 하는 기능 -->

    </form>



</body>
</html>

미션 회원가입폼을 브라우저에 출력하시오.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>회원가입폼</title>
</head>
<body>
    <center>
    <h3 align="left">회원 가입</h3>
    <hr>
    <form action="" name="" method="get" >

        <table align="center" cellpadding="5">
            <tr>
                <td>아이디 :</td>
                <td><input type="text" size="10" name="id"></td>
                <td><button>아이디 중복확인</button></td>
            </tr>
            <tr>
                <td>비밀번호 :</td>
                <td><input type="password" size="10" name="pass"></td>
            </tr>
            <tr>
                <td>비번확인 :</td>
                <td><input type="password" size="10" name="pcheck"></td>
            </tr>
            <tr>
                <td>이름 :</td>
                <td><input type="text" size="5" maxlength="5" name="name">
                </td>
            </tr>
            <tr>
                <td>주민번호 :</td>
                <td><input type="text" size="6" maxlength="6" name="ssn1">
                    - <input type="password" size="7" maxlength="7" name="ssn2">
                </td>
            </tr>
            <tr>
                <td>전화번호 :</td>
                <td><input type="text" size="3" maxlength="3" name="pnum1">
                    - <input type="text" size="4" maxlength="3" name="pnum2"> -
                    <input type="text" size="4" maxlength="3" name="num3"></td>
            </tr>
            <tr>
                <td>주소 :</td>
                <td><input type="text" size="30" name="addr"></td>
            </tr>
            <tr>
                <td>직업 :</td>
                <td><select>
                        <option>학생</option>
                        <option>직장인</option>
                        <option>자영업</option>
                        <option>강아지</option>
                </select></td>
            </tr>
            <tr>
                <td colspan="3" align="center">
                    <button type="submit" value="등록">등록</button>
                    <button type="reset" value="취소">취소</button>
                </td>
            </tr>
        </table>



    </form>
    </center>
</body>
</html>
  • form 에 < form > 만 입력하고 옵션 주지 않아도 기본적으로 action에 기본값이 들어가기 때문에 submit이 되는 것.
  • post옵션은 주겠다 라는 것! 데이터를 주고 html을 다시 받아오겠다. 주는 의미가 강함.
  • < input > 태그의 속성
    • readonly 읽기 전용 ( 쓰기 금지 ) : 자바의 setEditable(false)
    • disabled 비활성화 : 자바의 setEnable(false)

base

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<!-- 
    base.html(레이아웃을 정하는 Html문서, FrameSet정의)
    주의 body태그 사용x, body태그 자리에 frameset태그를 정의
 -->
    <frameset rows = " 20%, *">
        <frame src = "header.html" name = "header">
        <frameset cols = "20%,*">
            <frame src = "menu.html" name = "menu"> 
            <frame src = "body.html" name = "body"> 
            </frameset>
            <!-- frame태그의 속성 name은 각 레이아웃의 위치 식별을 하는 용도로 사용 -->

    </frameset> 
<body>

</body>
</html>

body

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<!-- body.html -->
<body>
    기본 바디
</body>
</html>

header

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<!-- header.html -->
<body bgcolor="lightgreen">
    <center>
        <h2> FrameSet 헤더 </h2>
    </center>
</body>
</html>

menu

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<!-- menu.html -->
<body bgcolor="brown">
    <h3> 메뉴 </h3>
    <ul><!--  unordered list -->
        <li>기본</li> <!-- list item -->
        <li><a href="join_form.html"  target ="body" >회원가입</a></li>
        <li><a href= "../0617/tag_test.html" target = "body">태그테스트</a></li>
        <li><a href= "http://playdata.io" target = "body">플레이데이터</a></li>

    </ul>

</body>
</html>

1560838336081


< 자바스크립트 >

  • 웹브라우저에서 실행되는 프로그램
  • HTML문서내에서 실행(html에 종속적이다, 브라우저에서 실행된다!)
  • HTML문서( 정적페이지 ) = > JavaSctipt적용(동적페이지)
  • HTML 문서를 통해 입력된 데이터를 얻어오고 데이터에 대한 유효성 검사를 할 때 사용
  • HTML문서에 대한 조작 ( 태그, 속성, 스타일)
  • 결론) 자바스크립트 왜(어디서) 사용하는가?
    • 문서 조작 (태그와 속성)
      • 조작에 필요한 데이터가 외부에 존재한다면(현재 HTML 없을 시) Ajax를 사용!!
    • 유효성 검사 (서버에게 데이터를 보내기 전에 검사)

<<JavaScript와 java 비교>>

  1. JavaScript : 클라이언트(사용자, 브라우저) 스크립트 : 브라우저에서 실행

    JSP(Java) : 서버 스크립트 : JVM에서 실행!

  2. JavaScript의 위치

    • HTML문서내에 포함되어서 실행

    • HTML문서의 어떤 위치라도 정의하는 것이 가능!

      <html>
          <head>
              <sctipt>
                  프로그램영역!
                  (변수선언, 함수(function) 정의 (절대 실행은 안됨, 호출 전까지))
              </sctipt>
          </head>
          <body>
                 <script>
                  프로그램영역
                  (함수 호출)
              </script>
          </body>
      </html>
      
  3. 자료형을 선언, 정의하지 않는다!! ★

    자바의 경우

    String name = "홍길동";
            name = "길라임";
            name = 3000; (X) 에러발생 

    자바스크립트의 경우

    String name = "홍길동"; (X) 에러발생 
    name = "홍길동"; (O) 자료형 선언 않고 사용!
        ////////
    var su; ---> 변수선언
    su = 2000; ---> number타입!
    su = "김주원" ---> String타입 // 대입되는 데이터에 따라 자료형이 변환됨
    su = true; ---> boolean타입
    su = new Data(); ---> Date타입

'클라우드 기반 웹 개발자 과정 공부 > HTML' 카테고리의 다른 글

190617_DAY46 <HTML>  (0) 2019.06.17

190617_DAY46

<HTML.>

  • 인터넷과 함께 성장한 언어
  • 웹 문서를 만들기 위한 언어
  • HyperText Markup Language
    • HyperText
      • 뛰어넘다 + Text
      • 다른 문서 연결 텍스트
      • 비순차적 텍스트
      • 사용자 선택에 따라 관련 부분으로 이동하는, 조직화 문서
    • Markup
      • 표시하는 것, 구조적으로 하는 것
      • 어디서부터 어디까지인지 표현하는 것

<html>
    <head>
        <!--
        HTML 문서의 정보
        타이틀, 작성자, 검색키워드
        CSS, 자바스크립트 정의
        -->
    </head>
    <body>
        <!--
        브라우저에 보일 텍스트 또는 이미지
        -->
    </body>

</html>
  • 저장확장자 : .html .htm

  • 태그속성 으로 구성
  • 타 언어와의 차이점!
    • 자바는
      • System.out.println( button ) : 변수명
      • System.out.println( " button " ) : String의 의미
    • SQL은
      • select button
      • select ' button ' : charater의 의미
    • HTML은
      • button
      • < button > : Tag의 의미

  1. 태그 ( Tag )

    • < 텍스트 > : 부등호 괄호 <> 안에 텍스트가 들어 갈 때 태그!
    • 종류
      • 시작태그 < button >
      • 끝태그 < /button >
      • 빈태그 <hr / >: < hr >< /hr > >< 사이에 아무것도 , 공백도 없다. 문자 1도 없다 = < hr / >
  2. 엘리먼트 ( Element )

    <table>
        <tr>
            <td> 기묭진 </td>
            <td> 이딘듀 </td>
        </tr>
    </table>
    • table 엘리먼트
      • table 태그가 포함하는 모든 자식요소까지 합친 용어
    • table 태그
      • < table >
      • 속성과 값
  3. 속성 (Atribute)

    • 시작태그 또는 빈태그에 위치

    • 태그 또는 다른 속성과 공백(WhiteSpace)을 구분자로 구분

      • WhiteSpace : 공백, 엔터, 탭
      • 브라우저에서는 WhiteSpace가 스페이스 두번 탭 두번이어도 그냥 공백 하나로!
    • 태그에 추가적인 성질을 정의

    • 형식

      <태그명 속성값 = 속성값> 
      <태그명 속성명 = '속성값'>
          <!-- 작은따옴표, 큰 따옴표는 전혀 차이 없다. -->
      <태그명 속성명 = "속성값">
          <!-- 인용부호 사용 권장 -->
      
      <table border = 1 cellpadding = '5' bgcolor = "yellow">    
      </table>
          <!-- border, cellpadding, bgcolor를 속성이라고 하고 1, 5, yellow를 속성값 이라고 한다 -->

      만약 잘못입력하면, 에러가 발생하지 않고, 표시가 안된다!


www.w3.org

​ 웹 표준 사이트

www.trio.co.kr

​ 수업 테스트 파일

www.w3schools.com

​ 참조사이트


한번 만들어 보자

<html>
    <head>
        <title> 문서 제목 </title>
    </head>


    <!-- 주석! -->

    <body>
        HTML 안녕~!
    </body>
</html>
<html>
    <head>
        <title> 문서 제목 </title>
    </head>


    <!-- 주석! -->

    <body>
        HTML,  <!-- 한개 이상의 space, tab, enter의 조합을 WhiteSpace 브라우저 상에서는 한칸으로 출력됨 -->
         안&nbsp;&nbsp;&nbsp;녕~! <!-- 이거시 스페이스 &nbsp; -->
         <!-- 띄어쓰기 하고 싶다면 -->
         <br>
         br 한번
         <br>
         <br>
         br 두번

        <abc></abc> <!-- 사라졌다...! 브라우저에 등록되지 않은 태그는 무시하고 에러는 발생 안함, 화면 출력 안함 -->

        <h1>h1</h1>
        <h2>h2</h2>
        <h3>h3</h3>
        <h4>h4</h4>
        <h5>h5</h5>
        <h6>h6</h6>
        <h7>h7 은 없는데 어떻게 나올까..? </h7>
        <br>
        <button>                    눌러주세요 </button> <!-- 무조건 한칸 -->


        <font color = "red" size = "7" face="궁서체">기묭진</font>
        <font color = "ff00ff" size = "5" face="굴림">이딘듀</font>
        <font color = "green" size="13" face="impact">Vicky Lee</font>

        <br>
        <b> 강조할땐 b 혹은 strong </b>

        <br>
        <i>눕고 싶으면 i</i>

        <br>
        <u> 밑줄은 u </u>

        <br>
        <del> 태그안에 줄친 글자는 del s strike </del>

        <br>
        5<sup>2(sub)</sup>  log<sub>2(sub)</sub>

        <br>

    </body>
</html>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title> &nbsp; 태그 테스트 </title>
</head>
    <!-- tag_test.html -->

<!-- <body bgcolor = "orange" text="red">  -->
<!-- <body background="ebi.jpg">  -->
<!-- 현재 HTML 문서와 같은 폴더에 이미지 있을 때에는 파일명 명시, 
    현재폴더의 하위폴더에 이미지가 있다면 하위폴더 이름이 -->
<body background="sub/ebi.jpg">
<!--  상위폴더라면 "../ebi.jpg" -->
    <a href = "#bottom" name = "top">아래로 이동</a>

    <center>
        <!-- 브라우저 출력될 내용들
              문단(영역 )태그<p><div>와 영역 태그 <sapn>
         -->
         <!-- p와 div, span을 구별하자 -->
         <font color="black">안녕하세요</font> <p>html p태그(블럭모드)입니다.</p> 
         <!-- 공백줄 생기고 라인 바뀜 -->
         <hr>
         안녕하세요 <div> html div태그(블럭모드)입니다. </div> 
         <!-- 공백줄 없이 라인 바뀜 -->
         <hr>
         안녕하세요 <span> html span태그(라인모드)입니다. </span> 
         <!-- 공백줄, 줄바뀜 없음 , 이 부분만 수정할때 사용하기 위해 씀 -->

         <hr>
         <!-- pre태그 : 블럭모드, 문서상의 공백(space, tab, enter) 유지해서 표현 -->
         <pre>
         동해물과 백두산이
             마르고 닳도록
                 하느님이 보우하사 우리 나라 만세 ? &lt; A &gt;
         </pre>
                  <img src = "ebi3.gif">

         <hr>        
         <a align = "center" href="https://namu.wiki/search/%EB%94%A9%EB%93%80%EA%B0%80%20%ED%91%B8%ED%91%B8">
                  <img alt = "옆방에서 딩듀가..." src = "ebi2.jpg"
                 width = "400"
                 height="300"
                 border="10"
                 title = "딩꼬"></a>

    </center>
      <hr>
      3이 4보다 작다!
      3 &lt; 4
      HTML &amp; 자바스크립트

      <hr size="10" color="red" width="210">
      <hr color="purple" size = 10 width="70%" align = "left">
      <hr color="blue" size = 30% width="50%" align = "center">
      <hr color="red" size = 10 width="70%" align = "right">
      <!-- align 정렬! -->
      <a href="#top">맨 위로 이동!</a>
      <a name = "bottom"></a>
</body>
</html>

DL

  • 정의목록의 데이터, 용어를 설명
  • dt와 dd요소만 자식으로 가능
  • dt는 인라인 dd는 블럭 따라서 dt안에 블럭요소 불가

DD

  • 정의용어의 약자, 용어의 제목

DT

  • 정의 설명, 용어를 설명할때

OL

  • 순서 있는 목록
  • ol요소 안에는 오직 li만 가능 다른 요소를 바로 넣을 수 없고, 넣으려면 li안에 넣어야 한다. li안에 ol중첩 가능
  • 기본은 1부터 시작 start속성 주면 해당 숫자부터

UL

  • 번호없는 목록 ( unordered list )의 태그
  • desc, circle, square

LI

  • 자동 줄 바꿈

TABLE 정렬된 형태로!

  • TR 표의 줄
    • bgcolor, width, height, align, valign
  • TD 표의 칸
  • TH 표의 제목
  • bgcolor, width, border, cellspacing, cellpadding
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>테이블 태그 테스트</title>
</head>
<body>


    <h3>테이블 태그 테스트</h3>
    <table border = "1" bgcolor = "pink">

        <tr bgcolor="skyblue">
        <th>이름</th><th>나이</th><th>직업</th>
        </tr>

        <tr>
        <td bgcolor = "yellow">기묜진</td><td>28</td><td rowspan="3">꼬집기 선수</td>
        </tr>

        <tr>
        <td>이딘듀</td><td>1</td>
        </tr>

        <tr>
        <td>이비키</td><td>2</td>
        </tr>

        <tr>
        <td colspan="2" align = "center">학생수</td><td align = "right">3명</td>
        </tr>
          <h3>테이블태그 테스트</h3>
  <table border="1" bgcolor="ddffdd" width="50%"
         cellpadding="10"><!-- width="300" -->
    <!-- tr:테이블의 행표현,  th:열의 제목표현,  td:출력 데이터 -->
    <caption>Person정보</caption>
    <tr bgcolor="skyblue">
     <th width="20%">이름</th><th width="30%">나이</th><th width="50%">직업</th>
    </tr>
    <tr>
     <td bgcolor="yellow">홍길동</td><td>13</td><td rowspan="3">학생</td>
    </tr>
    <tr> 
     <td>길라임</td><td>15</td>
    </tr> 
    <tr> 
     <td>김주원</td><td>17</td>
    </tr> 
    <tr>
     <td colspan="2" align="center">학생수</td><td align="right">3명</td>
    </tr>
  </table>
  <hr/>

  <h3>테이블태그 테스트</h3>

  <table border="1" bgcolor="ddffdd" width="50%"
         cellspacing="10"><!-- width="300" -->
    <!-- tr:테이블의 행표현,  th:열의 제목표현,  td:출력 데이터 -->
    <caption>Person정보</caption>
    <tr bgcolor="skyblue">
     <th width="20%">이름</th><th width="30%">나이</th><th width="50%">직업</th>
    </tr>
    <tr>
     <td bgcolor="yellow">기묜진</td><td>13</td><td rowspan="3">학생</td>
    </tr>
    <tr> 
     <td>이딘듀</td><td>15</td>
    </tr> 
    <tr> 
     <td>이비키</td><td>17</td>
    </tr> 
    <tr>
     <td colspan="2" align="center">학생수</td><td align="right">3명</td>
    </tr>
  </table>
    </table>

</body>
</html>

궁금상자 
    - Markup언어와 Markdown언어
Markup은 문서의 구조를 정의, tag로 둘러쌓여있음, 문서 골격에 해당하는 부분 작성

Markdown은 마크업 언어의 일종, 읽기도 쓰기도 쉬움 @ 같은 것이나 해쉬태그가 마크다운
궁금상자
    - html에서 < > & 표시하고 싶으면?
&lt; &gt; &amp; 쓰거나,  2바이트 전각문자 사용하면 됨
lt : Less Than
gt : greater Than
amp : ampersand
quot : 쌍따옴표
궁금상자
    - br p nbsp는 뭐의 약자?
br : Line Break
p : paragraph
nbsp : non-breaking spaces

190614_Day45 <회원가입 마무리>, <JCF 자바컬렉션 프레임워크>

< Java Collection Framework ( JCF ) >컬렉션 프레임워크

  • 자료구조를 바탕으로 객체들을 추가 삭제 검색 할 수 있도록 인터페이스와 클래스들을 포함
  • 데이터(참조데이터)를 담는 바구니
  • JCF는 구조를 정의하기 위해 Collection, List, Set, Map 인터페이스를 참조함
  • 배열보다 더 편리하게 객체를 다룰 수 있습니다.
  • JCF내의 클래스들을 java.util.*안에 위치
  • 객체를 수집해서 저장하는 역할을 하기 위해 사용방법을 미리 정해 놓은 라이브러리
  • 대표적인 인터페이스 : List, Set, Map
  • List

    • 순차적 나열 순서지정이 가능한 요소들의 집합
    • 객체를 일렬로 늘어놓은 구조를 가지며 객체저장시 자동 인덱스가 부여
    • ArrayList, Vector, LinkedList
    • 순서를 유지하고 저장
    • 중복저장 가능
  • Set
    • HashSet, TreeSet
    • 순서를 유지하지 않고 저장
    • 중복을 허용하지 않는 요소들의 집합
  • SortedSet
    • 값들이 정렬된 Set
  • Map
    • 키와 키에 대응하는 값으로 이루어진 구조.
  • SortedMap
    • 키가 정렬된 Map.

VO새로 만들기는 부담스러울때 Map을 사용하기도 한다!

ListTest

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

import j0610.model.dto.Person;

class A{    
    void method1(Vector v) {
       for(int i=0; i<v.size(); i++) {
           System.out.println(v.get(i));
       }
    }

    void method2(ArrayList v) {
        for(int i=0; i<v.size(); i++) {
            System.out.println(v.get(i));
        }
    }

    void methodCommon(List list) {
        for(int i=0; i<list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}
//--------------------------------------------------
public class ListTest {    
  public static void main(String[] args) {
     //java.util.List(인터페이스)
     //   ----> 구현클래스: Vector, ArrayList, LinkedList
      Vector v = new Vector();
         v.add("홍길동");
         v.add("길라임");

      A a  = new A();
        a.method1(v);

      System.out.println("===============");  
      ArrayList ar = new ArrayList();
         ar.add("김주원");
         ar.add("김유신");
       a.method2(ar);


      List v2 = new Vector();
          v2.add(100);
          v2.add(200);
          a.methodCommon(v2);
      List ar2 = new ArrayList();
          ar2.add(3000);
          ar2.add(4000);

      //ArrayList와 Vector는 사용문법이 같다
        // 차이점 : ArrayList가 처리 속도가 빠르다. 
      //(이유 : Vector에는 동기화 코드가 추가되어있으므로 )

//          자료(데이터에 대한 추가, 검색, 수정, 삭제
          Vector<String> v3 = new Vector<String>();
          v3.add("길동");
          v3.add("라임");
          v3.add("즈원");

          //백터 toString()오버라이딩을 구현해서 저장된 데이터를 보여줌
          System.out.println(v3);

          ArrayList<String> alist = new ArrayList<String>();
          alist.add("이");
          alist.add("딩");
          alist.add("듀");
          System.out.println(alist);

          LinkedList<String> linkList = new LinkedList<String>();
          linkList.add("a");
          linkList.add("b");
          linkList.add("c");
          System.out.println(linkList);
          System.out.println("==================================");

          /*
           * ArrayList => 데이터 1개 저장 : 한개의 index 필요
           *     만약 데이터의 수가 많고 (1000000), 첫번째 데이터 삭제할 때(인덱스 : 0)를 삭제할때
           *  뒤의 999999데이터는 인덱스를 다시 지정해야 함.
           */
          /*
           * LinkedList => 데이터 1개 저장 : 한개의 index, 앞의 데이터 주소, 뒤의 데이터 주소 저장 필요
           * 만약 데이터의 수가 많고 (1000000), 첫번째 데이터 삭제할 때(인덱스 : 0)를 삭제할때
           * 201호 202호 203호
           * "김"  "이"  "비"에서 삭제시 하나씩 땡겨옴!
           */

          //ArrayList와 LinkedList 속도 테스트
           ArrayList<Person> list10 = new ArrayList<Person>();
           LinkedList<Person> list20 = new LinkedList<Person>();

           //첫번째 : 순자적인 입력, 데이터를 뒤로 추가

          long start = System.currentTimeMillis();
          for(int i=0; i<1000000; i++) {//반복횟수
              list10.add(new Person(1,"홍길동",13,"학생"));
          }
          long end = System.currentTimeMillis();
          System.out.println("ArrayList데이터입력시간(순차):"+ (end-start));
          //---------------------------------------------------------------
          start = System.currentTimeMillis();
          for(int i=0; i<1000000; i++) {//반복횟수
              list20.add(new Person(1,"홍길동",13,"학생"));
          }
          end = System.currentTimeMillis();
          System.out.println("LinkedList데이터입력시간(순차):"+ (end-start));
          //---------------------------------------------------------------
          System.out.println("==========================");
          //두번째:중간 입력(ArrayList는 인덱스에 대한 재배열)!!
          // List[]        0,"길동"입력
          // List["길동"]   0,"주원"입력
          // List["주원","길동"]   0,"라임"입력
          //        0     1
          // List["라임","주원","길동"]
          //               1    2
          ArrayList<Person>  list30 = new ArrayList<Person>();
          LinkedList<Person>  list40 = new LinkedList<Person>();

          start = System.currentTimeMillis();
          for(int i=0; i<1000000; i++) {//반복횟수
              //list30.add(int index, Object 데이터);
              list30.add(0, new Person(1,"홍길동",13,"학생"));
          }
          end = System.currentTimeMillis();
          System.out.println("ArrayList데이터입력시간(중간입력):"+ (end-start));

          start = System.currentTimeMillis();
          for(int i=0; i<1000000; i++) {//반복횟수          
              list40.add(0, new Person(1,"홍길동",13,"학생"));
          }
          end = System.currentTimeMillis();
          System.out.println("LinkedList데이터입력시간(중간입력):"+ (end-start));

          /*
           * 결론
           * 만약 데이터의 수가 적고, 순차적 저장을 하며 조회업무를 많이한다면 => ArrayList
           * 만약 데이터의 수가 많고, 순차적인지 않은 저장을 하며, 삭제업무를 많이 한다 => LinkedList
           */
  }
}

SetTest

import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;

public class SetTest
{
    public static void main(String[] args)
    {
        // Set: 중복데이터 제거(유일한 데이터만 저장), (저장되는)순서가 일정치 않다. null허용? O

        // Set<String> set = new HashSet<String>();

        SortedSet<String> set = new TreeSet<String>();// 정렬된 Set : null허용? X
        // 데이터 추가
        set.add("홍길동");
        set.add("길라임");
        set.add("김주원");
        set.add("홍길동");
        set.add("이순신");
        set.add("홍길동");
        // set.add(null);
        // set.add(null);

        System.out.println("Set에 저장된 요소 갯수: " + set.size());

        // 모든 요소 출력
        Iterator<String> it = set.iterator();// ---> 모든 데이터 얻어오기
        // 열거형 인터페이스

        while (it.hasNext())
        { // ---> it에 열거된 데이터가 존재한다면 true리턴
            System.out.println(it.next()); // 데이터 뽑아오기
        }

        /*
         * 출력결과) null 김주원 홍길동 길라임 이순신
         * 
         * 
         */

    }// main
}

LottoSet

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class LottoSet
{
    //로또번호 -> 1~45까지의 중복되지 않는 6개의 수
    public static void main(String[] args)
    {
        Random r = new Random();
        Set<Integer> set = new HashSet<Integer>();
        while(true)
        {
            set.add( r.nextInt( 45 ) + 1 );
            if( set.size() == 6 ) break;
        }

        Object []ob = set.toArray();

        for (int i = 0; i < ob.length; i++)
        {
            System.out.println(ob[i]);            
        }
    }
}

MapTest

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import j0611.model.dto.Person;

public class MapTest
{
    //Map - 지도 (위도, 경도)
    //            x축, y축 처럼!
    //저장데이터(키값, 데이터값) 사용!
    /*
     *  Map<K,V>
     *      - 사물함 클래스 ( 책 : 데이터, 열쇠 : 키 )
     *      - K : Key의 자료형, V : Value의 자료형
     *      - Key는 보통 문자열 사용, Value(저장데이터)는 Object
     *      - Key값은 중복X ( 유일한 값 )
     */

    //★ 기억!
    // - 저장 : map.put(키값, 저장할 데이터);
    // - 조회 : map.get(키값);
    public static void main(String[] args)
    {
        Map<String, Object> map = new HashMap<>();
        //데이터 입력 ("기묭진" , 13, "학생")
//        map.put(String key, Object value)
        map.put("name", "기묭진");
        map.put("age", 13);
        map.put("job", "학생");

        Map<String, String> map2 = new HashMap<>();
        //데이터 입력 ( "기묭진", "이딩듀", "이비키", "진주니어", "김바나" )
        map2.put("k1", "기묭진");
        map2.put("k2", "이딩듀");
        map2.put("k3", "이비키");
        map2.put("k4", "진주니어");

        //전체데이터 출력?
        System.out.println( "map2.toString() = " + map2.toString() );
        //map2.toString() = {k1=기묭진, k2=이딩듀, k3=이비키, k4=진주니어}

        //특정 데이터 출력 ( K2키에 저장된 데이터를 출력! )
        //map2.get(Object key);
        map2.get("k2");
        System.out.println(map2.get("k2"));
        //이딩듀

        //특정 데이터 삭제( 특정 키삭제 : K3 )
        //map2.remove(Object key)
        map2.remove("k3");
        System.out.println(map2.toString());
        map2.put("k3", "돌아온 이비키");
        System.out.println(map2.toString());
        map2.remove("k2");
        map2.put("k2", "돌아온 자다가 뿡뿡 두번하고 자는척하는 이딩듀");
        System.out.println(map2.toString());

        //특정 키에 저장된 데이터 수정
        map2.replace("k4", "이딩푸들과 진주니어");

        //전체 데이터 출력
        Collection<String> col = map2.values();

        Iterator<String> it = col.iterator();

        System.out.println("<<전체 map2데이터>>");
        while (it.hasNext())
        {
            System.out.println(it.next());
        }

        //map2의 ket값만 따로 얻어오기
        System.out.println("<<전체 map2의 키 출력>>");
        Set<String> set = map2.keySet();
        Iterator<String> keyset = set.iterator();
        while(keyset.hasNext())
        {
            String key = keyset.next();
            System.out.println(key + "에 저장된 데이터 : " + map2.get(key));
        }

        /*
         * 문제 ) Map m3; 에 Person클래스 (4, "길동" , 13,  "학생")
         *                     Car클래스 ("소나타", 4, 100)
         *                     거리데이터 (10KM)를 저장하시오
         */

        Map<String, Object> map3 = new HashMap<>();
        Person p = new Person(4, "길동" , 13,  "학생");
//        Car c = new Car("소나타", 4, 100);
        String d = "10km";
        map3.put("Person", p);
        map3.put("Distance", d);
        System.out.println(map3.toString());

        //문제) distance키에 저장된 거리를 출력
        System.out.println("거리 : " + map3.get("anykey")); // 일치하는 key없을 때 리턴 null
        //문제) person키에 저장된 이름과 나이를 출력
//        Object ob = map3.get("person");
//        System.out.println("이름 : " + ob.getName()); 에러발생, 부모레퍼런스 ob통해 자식메소드 호출 불가
        Person ob = (Person) map3.get("person");
        System.out.println(ob.getName());
        System.out.println(ob.getAge());

    }
}

Mission

serviceform에서 String keyword = tf_search.getText(); 부분 수정하기


  • 인터페이스 구현 클래스 특징
    List LinkedList
    Stack
    Vector
    ArrayList
    순서 있는 데이터 집합
    데이터의 중복을 허용
    Set HashSet
    TreeSet
    순서 유지하지 않는 데이터 집합
    데이터의 중복을 허용하지 않는다.
    Map HashMap
    TreeMap
    HashTable
    Properties
    Key와 Value의 쌍으로 이루어진 데이터의 집합
    순서는 유지되지 않는다.
    키의 중복을 허용하지 않는다.
    값의 중복은 허용한다.

개발 커뮤니티에서 글을 보다가

---

업무방식은 Agile

이슈는 JIRA

프로젝트는 Task로 나누고 나눠진 Task들은 Sub Task로 다시 나눠서

각 Sub Task에 대한 Story Point(일정)은 투표로 결정

소스관리는 Github, Unit-Test Code 필수적으로 작성하고

커뮤니케이션은 화상미팅, Slack, JIRA 으로 한다

---

라는 글을 보게 되었는데, 프로젝트 관리하는데 있어,

어떤 회사는 그냥 보여주기식으로 하는곳도 있다 라는 글도 보았지만

이런식으로 분류하여 체계적으로 관리한다는게 놀랍기도 하고 호기심도 들던 와중에,

교육받고 있는 엔코아에서 프로그램을 진행한다는데 뭔지는 알아보고 싶어 찾아보았다.

프로젝트 기획과 관리를

서비스 기획, 웹 기획, 프로젝트관리법 로 크게 분류하고

그 중 몇개의 세부항목을 잡아 가볍게 정리하자면,

※ 기획

  1. 서비스 기획 ( 아이데이션, Agile, Scrum, Lean StartUP)
  • 아이데이션

    • Ideation ( idea + tion )

    • 아이디어, 생각을 공유하며 피드백하는것

      1. Brain Storming

        • 의견 비판없이 수용하는 것, 무조건적인 수용이 핵심
      2. Brain Writing

        • 다른사람의 의견을 바탕으로 자유롭게 생각하는것, 말하지 않고 쓰기, 침묵의 브레인스토밍
      3. 6 HAT

        • 각기 다른 색의 모자를 쓰고 모자의 색이 의미하는데로 사고하는 것, 백색은 긍정적, 정보의존 흑색은 부정적 이런식으로?!
      4. Scamper

        • Substitute 대체
        • Combine 결합
        • Adapt 응용
        • Modify/Magnify 변형/확대
        • Put to other uses 다른방법접근
        • Eliminate 제거
        • Reverse 뒤집기
        • 아이디어 창출의 체크리스트
      5. Crevate Ideation

      6. 마인드맵

        이 밖에도 다양한 분류가 있다.

  • Agile

    • Agile의 사전적 의미는 날렵한, 민첩한, 기민한!
    • SW 개발 성공의 불확실성이 높아지고 전통적인 개발방식을 개선하고자 새로운 SW개발 방법이 등장했고, 경량 방법론이 대두되며, 2001년 에자일 SW개발 선언문을 만들고 이 때부터 애자일이라는 용어의 의미가 생겼다.
    • 소프트웨어 엔지니어링에 대한 개념적인 구조로 프로젝트 생명주기동안 반복적으로 개발을 촉진하는 것. 소프트웨어 개발 방법론이었지만 다양한 분야에 적용되고 있다.
    • 폭포수 모델을 보완하여 나온것, 문서를 통한 개발법이 아닌 실질적인 코딩을 통한 방법론!
    • 협력과 피드백이라는 핵심 단어로 정리 할 수 있다, 더 자주, 일찍 잘 협력과 피드백을 하자~!
    • 개발자와 고객 사이의 지속적 소통으로 변화하는 요구사항을 수용한다.
    • 익스트림 프로그래밍은 에자일 개발 프로세스의 대표적인 방법!
 - 에자일 자격증 이라는것도 있다.
 - 에자일 자격증 관련내용 ( <https://gmlwjd9405.github.io/2018/05/27/agile-certification.html> )
  • Scrum
    • 럭비경기에 사용되는 용어, 럭비에서 반칙으로 경기가 중단되었을 때 쓰는 대형
    • 에자일의 개발 프로세스로 불리는 개발 방법론 중 하나.
    • 스프린트는 전력질주라는 의미!
    • 스프린트라는 주기로 구성되어 각각 4주를 넘지 않고, 보통 2주로 구성되며 하나가 끝나면 다음으로 넘어간다. 이 주기는 고정되어 있어 끝났던, 아니던 정해진 날자에 끝나게 된다.
    • 장점 : 사용자와 충분한 소통, 신속한 협조와 조율, 일일 자신의 일정을 발표함으로 업무에 집중할 수 있는 환경 조성, 단순 실천 지향적, 프로젝트 진행 현황을 볼 수 있어 목표에 맞게 변화 가능
    • 단점 : 추가적 작업 시간이 필요, 일일회의를 정해진 짧은 시간(고정 15분)에 마쳐야 해서 빠듯, 투입 측정이 없어 효율성의 평가 불가, 프로세스 품질 정도 측정 불가
  • Lean StartUP
    • 이 역시 애자일 방법론.
    • 린의 사전적 의미는 기름기를 쫙 뺀.
    • 도요타 자통차의 토요타 생산 시스템에서 출발.
    • 낭비를 줄이고 생산성을 높인다는 린 사고방식을 창업 프로세스에 적용한 것.
    • 고객과 접촉하는 빈도를 높여서 낭비를 줄여 잘못된 가정을 최대한 빨리 검증하고 회피 하는것.
    • 다섯가지의 원칙
      • 새로운 제품과, 서비스를 만드는 조직은 모두 스타트업
      • 창업가 전신은 관리, 새로운 방식의 관리가 필요
      • 지속가능한 사업을 어떻게 만드는지 학습하는것이 스타트업의 존재 이유
      • 제품을 만들고 고객의 반응을 측정하여 피드백의 순환을 유도하는 것
      • 일의 우선순위를 어떻게 정할지에 대해 집중할 것
  1. 웹기획 ( IA, Sprint Backlog, Story Board )
    • IA (Information Architecture)
      • 웹 기획은 설계가 절반이라고 한다!
      • IA문서는 정보 구조를 설계하고 정리하는 것.
      • 원하는 정보를 쉽게 찾을 수 있도록 정보 컨텐츠를 구조화 하는 것.
      • 사용자가 쉬운 검색을 하기 위해 구조화 및 분류체계를 수립하고, 이를 명확하게 레이블링 하는 것.
      • IA의 4가지 요소
        • 정보분류 및 조직화 - 어떻게 정보를 범주화 할 것인지
        • 네비게이션 - 정보를 어떻게 브라우징 할 것 인지
        • 레이블링 - 정보를 어떻게 보여 줄 것인지
        • 검색 - 정보를 어떻게 검색할 것인지
    • Sprint Backlog
      • 각각의 스프린트 목표에 도달하기 위해 필요한 작업 목록
      • 제품 책임자와 스크럼팀이 모여서 회의시 결정되는 것.
      • 요수사항을 task로 구체화 한 '문서'
      • 계획이 포함되어야 하며 , 원칙 상 수정 불가!
    • Story Board
      • 화면설계
      • 실제 웹페이지 만들듯이 구체적으로 표현하는 것
      • 디자인을 위한 레이아웃 시안이 아님.
      • 주요한 구성요서가 표현되어야 함
        • 목차
        • 업데이트 기록
        • 개요 및 정의
        • 사이트맵 : 메인메뉴와 하위메뉴 시각화
        • 프로세스 : 기본흐름도를 기재 (세부흐름도 보다는)
        • 전체화면구성 : 전체화면 레이아웃 정리 및 구성
        • 영역 별 상세설명 : 영역 별 디자인, 기술적 상세설명
        • 작업 스케줄 구성 : 기획부터 개발완료까지의 스케줄
      • 위의 8가지 항목정도로 구성됨.
      • 관련 내용 링크 참조 (https://www.vingle.net/posts/997962) (https://www.yamestyle.com/138)

※ 프로젝트 관리법

(Jira, Trello, WBS, Github)

  • Jira

    • 소프트웨어 프로세스 관리 도구
    • 주된 프로젝트에서 예상되거나 이미 발생한 '이슈' 관리 (이슈 트래킹)
    • 관리 대상 이슈로는 업무, 문제점, 개선 사항
    • 이슈 관리법
      • 목록별
      • 우선순위별
      • 담당자별
      • 진행과정별
    • 위의 이슈 관리법을 통해 시스템적 관리
    • 관련내용 (https://www.eventservice.kr/atlassian/file/1207_Atlassian_busan_HandsOnLabs03.pdf)
  • Trello

    • 애자일과 칸반 스타일의 작업관리를 할 수 있는 툴

    • 화이트보드의 소프트웨어화?

    • Card/List/Board의 3가지 구조로 구성

    • Board는 List 포함 List는 Card를 포함하는 계층 구조

    • Card

      • 가장 작은 단위
      • 이미지, 긴글, 마크다운 지원
      • 제로보드의 게시판과 비슷
    • List

      • Card를 세로줄로 묶은 단위
      • 단위별로 이동, 수정이 가능
    • Board

      • 화이트보드 판
    • 넓은 확장성

  • WBS

    • Work Breakdown Structure
    • 작업분해도, 프로젝트의 범위와 산출물을 세부요소로 분할한 계층 구조
    • 전체를 큰 단위로 나누고
    • 이를 더 작은 단위로 분해한 계층!
    • 작업단위를 나누고
    • 담당인원을 배치하여 구성도를 완성
      • 수행할 업무를 식별
      • 업무 계획과 산정
      • 전체일정 파악
      • 프로젝트 정보 추적
      • 클라이언트, 개발간 의사소통
  • Github

    • 소스코드 관리를 위한 분산 버전 관리 시스템
    • 작업기록을 남겨서 수정 보관등 이력을 추적하여 협업을 용이하게
    • Git이 프로그램이라면 Github은 정보교환이 이루어지는 서버
    • 협업을 하고 소스에 대한 이력관리와 소셜코딩
    • svn은 보통 서버에 git은 작업 컴퓨터에
    • 다른 개발자들과 협업, 다른 개발자들의 코드를 볼 수 있다.

'Coding Study' 카테고리의 다른 글

언어별 주석달기  (0) 2018.09.12
(Java) 컴파일러와 인터프리터의 차이점  (0) 2018.09.12
프로그래머 역량 체크  (0) 2018.07.11

+ Recent posts