메인함수가없다.

톰캣이 가지고있다.-> 약속된함수 : service

서비스함수만 오버라이드하면된다

 

데이터베이스란 ? 데이터를 베이스화해서 사용하는것 

데이터를 묶어놓은 집합

실시간으로 데이터사용x

데이터중복사용 -> 데이터결함발생

 

결함을없애는 데이터구조 - 무결성

데이터베이스의 가장큰 장점 : 무결성

데이터중복없앰 ->결함없앰

 

데이터베이스관리시스템이란 ?

데이터베이스를관리해주는것

 

데이터베이스와 데이터베이스관리시스템는 같은가

아니.

 

데이터베이스관리시스템이 필요한 이유는 ?

동시성,보안,성능해결

(헬스장기구를 여러사람이 동시에쓰려고할때 문제발생/시간이겹치고 관련파트만 접근가능하도록)

 

데이터베이스를직접이용하지않는다.

관리해주는애한테부탁

일정명령어사용

명령어집합을 SQL이라고한다.

 

명령어집합 3가지

1. 데이터정의 DDL : create / alter/drop

2. 데이터조작 DML : select / insert/update/ delete

3. 데이터제어 DCL : grant/ revoke(허가)

 

    create table 테이블명(
        필드명 타입,
        필드명 타입
    PRIMARY KEY(필드명)

    );

 

오라클 DBMS 설치

1.데이터베이스관리해주는사람

2.SQL사용

3.튜닝하는사람..?

데이터결함하는과정에서 비효율적인->조인에대한내용...옵티마이저

오라클 DBMS설치

이미 설치가되어있을것.

개발도구를 클라이언트프로그램으로 쓰게된다

 

SQL : Structures Query langage

구조화된 데이터를 질의한다.

학생,부서,결제 등 개념단위 그룹핑 

그룹화된 개념단위 데이터를 질의하려면 데이터를 정의해야한다.

회원이라는 데이터정의

 

자바컴파일러에게 약속 class member{ }

정의명령어 CREATE

테이블정의

캐릭터는 홑따옴표로 감싼다.

 

데이터형식 : 캐릭터형

문자자료형 : char, varchar, nchar, nvarchar,long,clob,nclob

VARCHAR :안쓰는공간 반환, (가변적인 길이일 경우 적합)

CHAR : 데이터공간 고정형

  • CHAR(2 CHAR) : UTF8 문자하나당 3바이트씀 총6바이트 (크기에 상관없이 글자2개를 넣겠다)
  • NCHAR(2) : UTF16  숫자 2는 바이트의미, 1바이트 2개를 준비. 문자하나당 2바이트 (NATIONAL CHARACTER),공간절약 
  • CHAR(2) : 아스키코드 2개
  • 아스키코드외의 문자들은 NCHAR가 적합 
VARCHAR2(길이) NVARCHAR2(길이) CHAR NCHAR
길이가변형 길이가변형 길이고정 길이고정
알파벳과 숫자만 한글이 포함되는 경우    
NAME1 VARCHAR2(20): 20바이트이하 저장
"일이삼사오육칠팔"은
한글 8자리*3BYTE=24BYTE로 초과
NAME2 NVARCHAR2(20)
20자이하
"일이삼사오육칠팔"은
한글 8자리저장하고 추가12자리 더 저장가능
   

Q. VARCHAR(100) 하고 한글10자를 적으면 ? 

100은 실제공간이 아니라 MAX를 의미

한 문자당 3바이트*10개 = 30바이트크기

 

Q. NVARCHAR(100) 하고 한글10자를 적으면 ? 

2바이트*10개 = 20바이트적용 
괄호안에 100은 최대크기 100BYTE

CREATE TABLE MEMBER21
(
    ID          NUMBER,
    PWS         VARCHAR2(50),--CHAR(10) [HI       ][OK      },VHARCHAR2(10) HI,OK
    NAME        NVARCHAR2(50),
    GENDER      NCHAR(2),--'남성','여성'; CHAR(2)<->CHAR(2 CHAR):UTF-8:X3 <->NCHAR(2):UTF-16:X2
    BIRTHDAY    CHAR(6),--'900112','891225',
    PHONE       VARCHAR2(13)--아스키범주라 N필요없음  
)
CREATE TABLE NOTICE
(
    ID          NUMBER,
    TITLE       NVARCHAR2(100),--100바이트, 한글:33문자정도,한글10글자를 적었을경우 N을안붙이면30바이트->공간낭비
    "CONTENT"   NCLOB--최대4000바이트 CHARACTER LARGE OF BYTE
    
)

 

 

 

LONG은 초창기,제한이많음 

 

blog.naver.com/wideeyed/221742972778

적당한크기가 내가할수있는것도많다..

50명정도이상

 

  • GET요청을 주로만든다. 사용자에게 돌려주는내용 : HTML
  • HTML을 주로돌려주는데, 반복적이고 시간을 많이든다.
  • 제스퍼라는역할자가 HTML(out.write() )을 대신해준다.
  • 확장자를 jsp로하면 ->을 출력해주는 서블릿코드완성된다.
  • <%%>를 이용해 코드를 작성하면된다.
  • JSP는 첫요청할때만 느리고 서블렛과 생명주기와동일하다.
  • 톰캣설정에서 카피한 이클립스설정
  • 톰캣손대지않고 이클립스설정을(서버)를 지웠다가 새로생성

코드블럭

-기본블럭 <% 자바문법 %>

-정의블럭 <%! %>

-출력블럭 <%= %>

-사전지시자블럭 <%@ %>

 

주석블럭

<%-- --%>

out.print와 같다

자바는 함수안에 함수정의불가능

 

 JSP태그 종류

  • 지시자  : <%@ %> --> 페이지 속성(.jsp 파일의 제일 상단에서 볼 수 있음)
  • 주석     : <%-- --%> --> JSP의 주석은 HTML 주석과 다르게 브라우저에서 소스보기를 했을 때 보이지 않음
  • 선언     : <%! %> --> 변수, 메소드 선언
  • 표현식  : <%= %> --> 결과값 출력
  • 스크립트릿 : <% %> --> JAVA 코드

<%! %> 서비스함수와 동급으로 넣어준다.

service() { }함수메소드안에 들어가는게아니라 클래스의 멤버로서 추가된다.

사전지시사항(import) 설정

프론트작업한 프론트웹폴터의 파일,폴더들을 복사해서 이클립스-webcontent에 붙여넣기해서 오버라이드한다.

list.jsp를 추가하고 list.html파일의 내용을 list.jsp안에 넣는다.

jsp를 실행하면 웹화면이 뜬다.

5번반복

1. list.jsp 파일에

반복할 HMTL태그위에 <% for(int i=0;i<10;i++){ %> 자바코드를 넣어준다 

2. list_jsp.java파일에 작용으로 적용된다 (세번째그림)

   HTML태그는 자동으로 out.write( )태그가적용어서 나타난다. 

3. 윈도우창을 새로고침하면 10번 반복되어있다.(두번째그림) jsp는서버를 다시실행시킬필요없다.

 

10번 반복적용 

doGet 노가다성..html모두 작성해야하는..

서블릿->JSP(페이지기반의 서버페이지를 만드는 플랫폼)Java Server Page

아직까지는 서버페이지기반이지만 점점 사용률이 줄어든다.

 

jsp내장객체 알아야함, 외워야한다.

4대저장소

pageContext:현재 페이지(현재 서블릿) 생명력짧은 

request :두 서블릿간의 데이터공유

session : 사용자별 저장소

application:전역저장소 

 

Jesper :  엔진, 소프트웨어 (톰캣안에 있음) 클래스를 만들어주는 역할

(test. java -> test.class ->java test - > java(자바실행환경)

  javac test.java ->  ->dir -> test.java test.class

 java test : 중간코드를 번역해야하는데 (JIT just in time compiler ) Jitter야 이것좀 번역해줘 

 

이클립스가 톰캣에있는 원본을 망치지않도록, 톰캣의 실행파일은 이용하되 자기의 워크디렉토리에 배포디렉토리를 만들고 그 폴더에서 서비스를 사용 할 수 있게금 준비한다.

서버를지운다고 톰캣이 지워지지않고 이클립스가 따로 준비한 배포폴더가있고 그게 지워진다.

 

서비스할떄는 톰캣에 옮겨야한다.

 

//제조/생산 -> 기계 -> 전자기계 -> 자동화된 전자기계 ->이게인간이 할짓인가 ? AI->공부->방향숙달->창의적으로 생각

Jasper 

톰캣안에는 클래스만들어주 애가있다 : 제스퍼 

이클립스가 피해를주지않고 톰캣을 이용, 자신의 워크디렉토리에 별도폴더만들고 서비스사용하게끔 준비

 

정적인내용 / 동적인내용

첫요청할때만 느리다.

한번클래스만들고 컴파일된결과물을 이용한다

 

이제 서버코드작성할때는 - 컴파일과 배포다시, ㅅ ㅓ버다시 껏다켜야함

jsp:그럴필요없음, 코드달라짐이 톰캣이안다.서블릿코드가만들어진다.

Server Path (배포되는 디렉토리)

이클립스는 톰캣에 두지않아요.톰캣 어디에도 우리가만든 코드를 두지않습니다.

톰캣의 웹 루트에다가 배포해야만 그 루트에서 서비스하게되는데,어디에 배포하고잇는걸까

server path에 하고있음

이클립스에서 만든코드가 브라우저에서 보여지는것이 아니다(java,html이든..)

아래 폴더에 배포된다. 톰캣이 시작되서 conf에 파일을 서비스하게되는 것

콘트롤 f11해서 배포한것이 여기에 생성된다.

브라우저에서는 반영이안되요 1 : 고쳐진내용이 배포가되어야하는데, 가끔 덮어쓰기가안된다.

JSPPrj폴더에 배포가 되어야한다.  ->서버를 지우고 다시시작한다 (서버를지우면 tmp폴더가 지워지는것) 

브라우저에서는 반영이안되요 2 :브라우저는 일정시간동안 갖고있는 문서가있다(캐시)

브라우저 - 개발자도구 - 네트워크 - 톱니모양  설정 - Disable cache 표시

브라우저가 전에 다운로드했던 내용들을 캐시하고있다가 캐시에 저장되어있는것을 계속 불러온다 

jsp를 실행할때 컴파일되면서 , ~

실행코드인데 출력으로넣어진다.

그냥넣으면 출력

코드는코드블럭

 

<% int result = 13; % >와 <% out.print(result) %> : <% 코드삽입 %>

<% int result = 13; % >와 <% out.print(result) %> : <% 코드삽입 %> jsp에 넣는다

pageContext.getOut(); //printWriter와같음

 

calc_jsp.java를 손대지않는다

jsp내장객체 알아야함, 외워야한다

4대저장소

pageContext:현재 페이지(현재 서블릿) 생명력짧은 

request :두 서블릿간의 데이터공유

session : 사용자별 저장소

application:전역저장소  

 

out :출력도구 /page : 현재 서블릿객체 

GET 방식과 POST방식

GET 방식

• 서버에 있는 정보를 가져오기 위해 설계됨.

• 240바이트까지 전달할 수 있음.

• QUERY_STRING 환경변수를 통해 전달.

• 형식 : http://xxx.xxx.co.kr/servlet/login?id=hj&name=hong

• URL노출로 보안성이 요구되는경우엔 사용할 수 없음.

• 검색엔진에서 검색단어 전송에 많이 이용함.

 

POST 방식

• 서버로 정보를 올리기 위해 설계됨.

• 데이터크기의 제한은 없다.

• URL에 파러미터가 표시되지 않는다.

 

서블릿구조

서블릿 로딩

• init() 메서드

• 최초 클라이언트 요청 시 init() 메서드가 호출되며 메모리에 적재됨.

 

요청 처리

• service() 메서드

• service() 메서드가 컨테이너에 의해 호출

 

처리 수행

• doGet(), doPost() 메서드 서블릿 종료

• destroy() 메서드

 

스레드는 프로세스를 스위칭하는 작업의 또다른 모델
옛날에는 프로세스와 스레드가 1:1이었다.프로세스에는 흐름이 1개였으니까
스레드에도 흐름이 1개였었다.하나의 프로그램이 자신로직을 동시실행해야하는 일이 발생
그걸 도와주기위해 프로세스안에서 스위칭이 일어나게끔 플랫폼이 새로 등장했다
프로세스안에서 여러 스위칭이, 여러함수가 개별적인 스위칭으로 왔다갔다할 수있게해주는 하나의 단위

get요청하면서 get을 처리하는 로직에게 내가 만든 값 또는 상태를 전달할 수 있는 방법이 필요하다.
1. 파일을 이용하는 방법
2. 서블릿의 저장소를 이용하는 방법(Application/session/cookie/..)
3. QueryString을 이용하는 방법 (r값전달):
   질의용(옵션 ex,커피+샷추가)
   다른서블릿에서 값전달시에도 사용

sendRedirect : post로 왔다가 다시 get요청을 할 수있게해준다. 추가적값을 전달해서 상태유지하게해준다.

 


if(req.getMethod().equals("POST"))

첫get요청에서는 이부분이 실행되지않아도됨

서버쪽에서 get요청인지, 값을 넣고 전달한 post요청인지 알아야한다.

Request 가 모든정보를 보여준다. Request Method가 POST일때 실행하도록한다.

 

변수를 POST조건문보다 먼저 선언했어야했다.

int x = 0;
int y = 0;
int result = 0;
String x_=null;
String y_=null; 를 먼저 선언할것

POST일때만 동작하는지 확인방법 :

System.out.println("calc");를 조건문 안에 넣어서 POST일경우 calc를 서버안에서 출력하도록한다.

사용자가 덧셈을 누르면 POST가되어 calc가 서버에 출력된다.

 

 

웹브라우저 : 사용자

이닛멤버메소드를 실행한다.

초기화할수있도록 비어있는 메소드이다. 오버라이드할수있다.

스레드란..?

 

프로그램만들면 메인함수부터 절차가 진행한다.(수행절차)

흐름을 그어보면 하나의 선으로 그어진다.(수행절차)

그 흐름을 스레드라고 한다.

실행흐름 = 스레드

동시에 다른흐름이생기는 경우가있다.

별도의 프로세스로 빼서 작업했었다

ex, 이북을 동시 다운로드(파일 카피) while문,반복문이 끝날때까지 다른것들 응답없음이 뜨게된다.

하나의 프로세스가 진행되는 과정에서 다운로드는 따로실행되게하고싶다.

흐름안에 흐름만드는방법이 없어서 

fork()사용(프로세스가 자식을 만드는것,프로그램이 프로그램을 실행) 

(프로그램은 살아있지않다. 프로세스가 다운됐어가 옳바른용어)

프로그램이올라가서 프로세스가된다.

자식프로세스가 필요

자기 로직의 일부를 별도프로세스올림.

일부로직인데, 서로 데이터를 공유해야하는 상황

원래 프로세스는 각자 개별적으로 자기만의 데이터로 혼자 실행되는것

프로세스간의 데이터공유, 컨텍스트 스위칭에 대한 부담 (프로세스 수가많아지면 전환되는과정에 부담)

여러개프로세스를 동시에실행하는게아니라 그렇게보이는것

(만화가 움직이는것처럼)

포인터가 프로세스정보를 가지고있다.

스위칭과정 : 콘텍스트스위칭

하나의 프로세스안에서 갖게되는 흐름 : 프로세스는 x , 스레드라한다

맨위에있는 스택에있는함수만 실행된다.

하나의 흐름만 갖고있는 방식으로는 검색,다운로드를 병렬수행할수없게된다.

스택을 2개만든다.

동시에 실행되면서 힙에있는것

함수를 스위칭하는방식 

자바는 new Thread()클래스가있음. 스레드클래스를통해 메인과 다른함수가 동시에실행할 수있다.

스레드로 수행하고있다.

 

서비스는 개별적으로 스레드로 동작

객체는 하나, 함수는 여러개

서비스흐름이끝나도 객체는 살아있다.

요청이안오면 사라진다.

3개의함수를 오버라이드할 수있다. 

super.service(req, resp);를 지웠을때 doGET(),doPost() 오버라이드된 게 안뜬다. 

doGet과 doPost를 호출하는 장본인이 service이다.

Service를 오버라이드하는 순간 doGet과 doPost를 호출하는걸 담고있는 로직이 지워진것(부모가갖고있는)이다.

부모안에 doGet과 doPost이 있었는데 오버라이드하면서 없어진것.

Service를 오버라이드하면서  doGet과 doPost이사라짐.

 

의도적으로 doGet과 doPost로직을 처리하면서 추가적으로 겟에 대한내용과 포스트에대한 내용을 할수있겠지만
일반적으로 service()를 작성하지않는다.
calc class에서 service()를 작성안하면 톰캣이 부모service()를 호출하고 거기에 적절하게 오버라이드된 doGet과 doPost가 호출된다.

servie()함수를 오버라이드하고 super.service()를 호출안헀을때 doGet과 doPost가 호출되지않는다.
calc에 오버라이드된 service함수안에 super.service()를 호출하면 calc안에 오버라이드된 doGet, doPost가 호출된다. 

 

 

POST와 GET요청의 이해와 코드 분리하기

1. doGet()과 doPost()로 분리

 

 

2. 사용자가 값을 입력하고 덧셈을 누르면 백지가나온다.

사용자가 숫자입력하면 흰화면

3 . 사용자에게 결과값을 돌려주는 출력을 하지 않았다.

숫자를 넣고 덧셈을누르면 다음화면으로넘어가지만 결과값이 나오지않는다.

사용자에게 출력한코드가없다.

다시 출력해줄때 write(HTML)코드를 다시넣어야하나 ? (똑같은코드를 두번쓰는건 비효율적)

아니다, 다시 get요청을 할 수있는 함수가 있다.

 

문서를 출력하는것은 post가 할게아니라 get한다.

처리한 결과를 get을 이용해서해야한다. 

doGet(res,resp);를 넣어보자. -> result를 전역변수로 해보자.

결과값을 공유하지 못한다.. 

 

calc라는 일반클래스가 아니다. web의 흐름

 

post요청이왔다면 다시 get요청을받을수있게 흐름을 잡아야함

사용자가 글을적고 등록을 누르면 목록페이지로 전환된다.

클릭-문의글등록-포스트-목록페이지로 전환(새로운 GET요청)

스레드가 연결이안되어있다.

포스트서블렛이 올라갔다 바로내려감 ,메모리에아무것도없음 다시 겟서블릿생성

doget은 어떠한 지역변수도 볼수없음.

상태값을 유지할 방법이 필요하다.

 

 

get요청하면서 get을 처리하는 로직에게 내가 만든 값 또는 상태를 전달할 수 있는 방법이 필요하다.

1. 파일을 이용하는 방법
2. 서블릿의 저장소를 이용하는 방법(Application/session/cookie/..)
3. QueryString을 이용하는 방법 (r값전달)

   질의용(옵션 ex,커피+샷추가)

   다른서블릿에서 값전달시에도 사용

 

resp.sendRedirect("/add?r="+result);

내가 어떤 서블릿코드에서 get요청을하고싶을때 사용한다. 

get을 재활용하는데 쿼리스트링을 이용해서 값을 공유하도록했다. 

 

doget에서 result는 출력할목적

dopost에서 result는 계산목적

sendRedirect : post로 왔다가 다시 get요청을 할 수있게해준다. 추가적값을 전달해서 상태유지하게해준다.

 

package com.newlecture.web;

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

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


@WebServlet("/add")
public class Calc extends HttpServlet{
	
	int result;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//GET만 따로처리
		resp.setCharacterEncoding("UTF-8");//UTF로 인코딩보낸것,보내는방식지정
		resp.setContentType("text/html;charset=UTF-8");//1.브라우저가읽는방식,브라우저가 정상적으로 읽을수있도록		
		
		//1.입출력도구가 추가되었다.
		int x = 0;
		int y = 0;
		int result = 0;
		String x_=null;
		String y_=null;
		String r_= req.getParameter("r");
		
		if(r_ != null)
			result = Integer.parseInt(r_);

    	//문서를 동적으로 만드는 코드: 이 코드로 만들어진 결과물 , 동적인 문서, 서버문서 
    	PrintWriter out = resp.getWriter();
   	
    	out.write("<!DOCTYPE html>");
    	out.write("<html>");
    	out.write("<head>");
    	out.write("<meta charset=\"UTF-8\">");//2.브라우저가읽는방식,브라우저에게 이코드방식으로 읽어라 최근방식
    	out.write("<title>Insert title here</title>");
    	out.write("</head>");
    	out.write("<body>");
    	out.write("  <section>");
    	out.write("    <h1>계산기</h1>");
    	out.write("    <div>");
    	
    	if(x_ != null)//처음페이시 요청했을떄 안나오도록
    		out.write("    <div>"+x +"+"+ y+"=</div>"); //계산했던 연산식
    	
    	out.write("         <form action=\"/add\"method=\"post\">");
    	out.write("            <input type=\"text\" name=\"x\">+<input type=\"text\" name=\"y\"><br>");
    	out.write("            <input type=\"submit\" value=\"덧셈\"><span>"+result+"</span>");//출력용
    	out.write("         </form>");
    	out.write("      </div>");
    	out.write("   </section>");
    	out.write("</body>");
    	out.write("</html>");    	    	
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//POST에서 사용되는것만 분리
		int x = 0;
		int y = 0;
		int result = 0;
		String x_=null;
		String y_=null;
		
//		if(req.getMethod().equals("POST")){//대문자와비교
			System.out.println("calc");//서버에 출력
			
			x_ = req.getParameter("x");
    	if(x_ != null && !x_.equals("")) //null이면 0
    		x = Integer.parseInt(x_);
    	
    		y_ = req.getParameter("y");
    	if(y_ != null && !y_.equals("")) 
    		y = Integer.parseInt(y_);
    	
    		result = x + y; //계산용
    		// get요청을 하는것이 더 효율적이다.POST에서 계산후 get요청을 다시받아야한다
    		//doGet(req,resp);
    		resp.sendRedirect("/add?r="+result);//resp.sendRedirect("/add");값은안가고 문서만간다.
    		//get요청하면서 get을 처리하는 로직에게 내가 만든 값 또는 상태를 전달할 수 있는 방법이 필요하다.
    		//1.파일을 이용하는 방법
    		//2.서블릿의 저장소를 이용하는 방법(Application/session/cookie/..)
    		//3.QueryString을 이용하는 방법   		
    		
//		}
	}
	
	/*
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		resp.setCharacterEncoding("UTF-8");//UTF로 인코딩보낸것,보내는방식지정
		resp.setContentType("text/html;charset=UTF-8");//1.브라우저가읽는방식,브라우저가 정상적으로 읽을수있도록
		
		
		//1.입출력도구가 추가되었다.
		int x = 0;
		int y = 0;
		int result = 0;
		String x_=null;
		String y_=null;
		
		if(req.getMethod().equals("POST")){//대문자와비교
			System.out.println("calc");//서버에 출력
			
			x_ = req.getParameter("x");
    	if(x_ != null && !x_.equals("")) //null이면 0
    		x = Integer.parseInt(x_);
    	
    		y_ = req.getParameter("y");
    	if(y_ != null && !y_.equals("")) 
    		y = Integer.parseInt(y_);
    	
    		result = x + y;
		}
    	//문서를 동적으로 만드는 코드: 이 코드로 만들어진 결과물 , 동적인 문서, 서버문서 
    	PrintWriter out = resp.getWriter();
   	
    	out.write("<!DOCTYPE html>");
    	out.write("<html>");
    	out.write("<head>");
    	out.write("<meta charset=\"UTF-8\">");//2.브라우저가읽는방식,브라우저에게 이코드방식으로 읽어라 최근방식
    	out.write("<title>Insert title here</title>");
    	out.write("</head>");
    	out.write("<body>");
    	out.write("  <section>");
    	out.write("    <h1>계산기</h1>");
    	out.write("    <div>");
    	
    	if(x_ != null)//처음페이시 요청했을떄 안나오도록
    		out.write("    <div>"+x +"+"+ y+"=</div>"); //계산했던 연산식
    	
    	out.write("         <form action=\"/add\"method=\"post\">");
    	out.write("            <input type=\"text\" name=\"x\">+<input type=\"text\" name=\"y\"><br>");
    	out.write("            <input type=\"submit\" value=\"덧셈\"><span>"+result+"</span>");
    	out.write("         </form>");
    	out.write("      </div>");
    	out.write("   </section>");
    	out.write("</body>");
    	out.write("</html>");    	    	
    	
//    	resp.getWriter().print(x+y);
    	super.service(req, resp);
	}*/	
}

 어제 배운 부분에서는 저희가 doGet(), doPost() 메소드를 따로 분리하지 않고 service() 함수에서 사용자의 get 요청과 post 요청이 모두 처리되게 코드를 작성했었잖아요 근데 오늘은 get 요청과 post 요청을 따로 분리해서 doGet()에서는 사용자의 get 요청을 받게 하고, doPost()에서는 사용자의 post 요청을 받게 작성을 했어요

그래서 사용자가 get 요청을 했을 때는 doGet() 메소드 안의 내용이 사용자에게 보여지는 것인데, 이 때 저희가 계산기 입력 폼이 사용자에게 보여지게 doGet() 코드를 분리했었잖아요 이렇게 계산기 입력폼이 사용자에게 보여지는 것은 get요청으로 갈 수 있게 doGet() 안에 작성을 했는데 그렇게 해서 사용자에게 보여진 입력폼을 사용자가 제출할 때는 get이 아닌 post 요청으로 가서 doPost() 메소드가 호출될 수 있도록 <form action="/add" method="post"> 이렇게 폼 태그의 method 부분을 post로 작성해줘야해요..! 그래야 사용자가 입력폼을 제출했을 때 doPost() 메소드가 제대로 호출될 수 있습니다

 

맨 처음에는 사용자가 계산 입력폼 페이지를 요청을 해서 사용자에게 계산 입력폼 페이지를 보여줘야하니까 처음에는 doGet() 메소드가 호출돼요! 근데 그 다음에 사용자가 입력폼을 제출하면 form 태그의 method가 post이니까 POST 요청으로 받아들여져서 doPost() 메소드가 호출되구요. 근데 또 오늘 배운 것처럼 doPost()에서 resp.sendRedirect("/add?r="+result);를 통해 다시 doPost()에서 계산된 result의 값을 들고 doGet()이 호출이 되어서 result 값이 제대로 담긴 계산된 페이지가 사용자에게 get 요청으로 보여지게 됩니다~!

 

 

 

프론트엔드 : 다양한 클라이언트환경에 영향을 많이 받는다. 스크립트환경이 제각각이다.

              (쿠키 설정 허용문제 ,브라우저종류 등)

백엔드 : 약간의 안정성, 백엔드에서 문서만드는것을 최소화되고있다. 

요즘은 브라우저의 환경이 정제화되서 스크립트를 활용하기에 안정적인 환경을 갖고있다.

 

1.계산을 계속 할 수 있도록 계산기 UI를 출력하기

2. 한글 깨짐문제 해결하기

3. 계산기에서 계산한 결과 값 외에 계산했던 연산식도 함께 보여주기

4. POST와 GET요청의 이해와 코드 분리하기

5. POST요청의 기본 값

 

사용자입장에서는 불편한 계산기 

(다시 계산하려면 뒤로가야한다)

계산한 값을 출력하면서 UI를보여주자

계산한 값과 ui를 돌려주자.

Calc.java에 html을 넣어준다.

태그뒤에 "); 를 먼저 붙여넣기하고 out.write("를 붙여넣기한다. "앞에는 \넣어준다. 

 

java파일에서 실행 할 경우 500 오류 발생

req.getParameter("x"); x값이 없으니까 null이라서 오류난다. hmtl에서 실행해야한다.

계산한 값이 버튼옆에 뜬다.

동적인 문서, 서버문서

버튼옆에 숫자가 뜬다

한글깨지는 문제

서로해석을 잘못한것

ISO-8859-1 : 1바이트씩 잘라서 물음표로 나옴 

UTF-8 or EUC_KR : 2바이트씩이지만 뾰빽뽁식으로나옴

resp.setCharacterEncoding("UTF-8"); 출력도구에서 인코딩설정 //UTF-8로 보냄

브라우저에게 알려주는방법 (브라우저가 어떻게 읽을것인가에 대한 설정)

내가 UTF-8로 보냈어도 수신자가 UTF-8로 안받으면 오류발생
브라우저에게 알려주는 방법이 두가지있다
1.문서내에 메타데이터 "<meta charset=\"UTF-8\">" //UTF로 인코딩보낸것,보내는방식지정

  브라우저가 이 콘텐트가 무엇인지 알수 있다.

2. 웹의 헤더에 알려주는것 setContentType("text/html;charset=UTF-8") 

  브라우저가 제대로 읽을 수 있도록 서버단에 심어주는것 (최소책)

3."<meta charset=\"UTF-8\">");//2.브라우저에게 이코드방식으로 읽어라 최근방식

content type 에 UTP-8표시가없다. 대신 html의 meta 데이터 UTF-8설정을 찾아 한글을 출력한것
우 : contenty-type에 UTF-8이 나와있다.

 

얼마를 계산한건지 알기위해 x,y값을 알려주기

입력값없이 덧셈버튼을 누르면 500오류 발생 

String x_의 값이 null이고 null값을 파싱하려다 오류가난다. 

null을 파싱할수 없다는 오류

사용자의 값이 전달이 되지않았다. java파일에서 실행했을떄 오류

     if(x_ != null&&x_ != "") //null이면 0 ->객체비교

 

 

java파일에서도 실행되게 하려면 ? 

현재상태는 html를 통해서 실행된다. (html에서 실행했다)

html에서 데이터를 전달해야 실행되도록했지만 , 전달하지않으면 기본값을 설정할 수있지않을까

 

사용자가 입력한값이 null 이 아니거나 빈문자열이 아닐때 파싱을 하게한다. 

처음요청했을땐 노란색부분 이안나오고 나중에 포함되게하려면 ?

조건에따라서 나오게

세번째 : 널값이 아닌경우에만 출력하도록 조건을줘서 계산기 처음화면에서는 연산식이 보이지않는다.

 

POST와 GET요청의 이해

method = "post" 로 요청방식 변경

add -> 입력폼요청 GET

add*submit ->제출요청 POST

 

검색키워드가 서버로 둘다 전달된다.

GET - 폼을달라는요청 : 요청한 값이 url에 노출된다. 상태값을 유지해야하는때, 제출했던값 공유

  • 요청할때 쿼리스트링을 통해 전송
  • URL의 끝에 ? 와 함께 이름과 값으로  쌍을 이루는 요청 파라미터 : 쿼리스트링
  • 요청파라미터가 여러개이면 & 로 연결
  • URL에 조회 조건을 표시 하기 때문에 특정 페이지를 링크하거나 북마크가능
  • URL맴시멈이있다. 영어권기반, 멀티바이트코드사용불가

add?x=3&y=4 // 순수 GET요청만으로 값을 전달하고 결과를 얻는 요청

입력폼이있었지만 3,4를 누른 후 덧셈버튼을 눌럿을때 겟요청 후 포스트요청(덧셈)이지만 데이터전달형식은 get요청처럼보인다. post요청이 get요청처럼 되어있다.

 

POST - 제출요청(입력한것을 제출한다) : 요청값이 요청헤더에 따로전달됨. 데이터를 포스트바디에전달. 

  • 전송할 데이터를 HTTP메세지의 body에 담아서 전송
  • HTTP메세지의 body는 길이 제한이없다.
  • 그래서 대용량 데이터전송가능

 

웹은 모두 get요청이다 . (ex : <a >태그)

검색내용이 get일 경우 친구들과 검색결과를 공유할 수있다. (요청된 목록을 다른사람과 확인가능)

post일경우, 다시 해당사이트에서 검색을 해야한다. 

 

검색의 경우 : 검색결과가 문서를 달라고하는 요청이기때문에 get이 유용하다.

회원가입 : post요청하는게 적합

 

get (url에 입력한데이터가 노출)            /                  post (노출안됨)
POST일경우 브라우저-검사-네트워크-헤더요청에서 전달된값이 확인된다.

null일때와 빈문자열일때 

전달된 키워드가 없으면 null

전달된 키워드는있는데 값이없으면 빈문자열

숫자넣지않고 덧셈눌렀을때 빈문자열                 / html파일에서 name = x를 지우고 새로고침 후 덧셈을 누르면 전달된 x가없다. null임 

 

  1. url맵핑을 하는순간 톰캣이 @webServlet을 찾는다. 
  2. public class Calc extends HttpServlet{ }을 메모리에 올린다.
  3. "/calc" url요청에 맞게 Calc클래스를 수행한다.

 

어노테이션을 이용한 URL 매핑

Nana를 실행하려면 사용자에게 요청할 url를 주면서 그 url과 Nana를 맵핑해야한다.

맵핑을 위해 web.xml파일을 사용했었다.

사용자가 주소창에 ?c=10를 쳐서 보이도록했었다.

<input type="text" name="x">+<input type="text" name="y">

구분자 &

구분자 : &

사용자가 입력한값을 전달받아서 계산할 서버프로그램 : Calc 클래스 생성하기

직접입력하지말고 불러올것

ctrl + space하면 ->se치면 ->선택 ->오버라이딩된다.

web.xml을 url맵핑을 해줘야한다

metadata-complete="false">

맵핑정보 설정시 xml과 어노테이션으로 할 수있다.

metadata를 true로 하게되면 모든 메타데이터가 web.xml에 있는것으로 된다.( 정보를 xml에서 찾게된다)

false로 하면 어노테이션한부분을 찾게해준다

 

url은 항상 소문자로 

자바코드가 달라지면 재시작할것

@webServlet("/calc")

 

webSevlet 추가 , 이름도 add로바꿈

 

좌 : 자기페이지를 요청한다. / 우 : html이 빠진 calc에게 x,y값을 보낸다

   <form action="/add">

<form> 태그의 action 속성은  데이터(form data)를 서버로 보낼 때 해당 데이터가 도착할 URL을 명시합니다.

 

html페이지는 값을 받거나 계산하는 능력이없다. -> 정적인 페이지

<form action="서버코드 url">

 

서버를 재실행하고 3,4를 입력후 덧셈버튼을 누르면 404 오류가 발생한다.

좌: JSPPrj이 들어가있다. 우 : 로컬호스트에서 바로 add를 찾고있다

1.프로젝트명을 같이 붙여주거나 2. 내 프로젝이 콘텐트명이 없도록해야한다.(바람직)

가운데에서 -> 오른쪽으로 사용될수있게 해야한다

 

프로젝트명떼고 루트를 쓸 수 있게바꾸자

프로젝트가 서버에 있는 자원을 요청할때 항상 이 프로젝트명이 들어가는 문제가 발생한다.(계산기페이지에서 프로젝트명이 url에있음)

프로젝트명이 매번들어가는것은 바람직하지않다.

 

1 . 해당프로젝트 선택 -> 속성 Properities -> web project settings -> JSPPrj지우고 - > /넣어서 루트로 바꿔준다.-> apply and close

 

2. 오른쪽 서버탭에서 기존 서버를 지워야한다. delete -> ok

3. 서버를 재실행한다 

프로젝트명없이 나온다.

x와 y값을 받아서 사용자화면에 더한 값을 출력해보자 

콘솔창반응

입출력은 다문자열만가능하다

세번째 : 사용자가 덧셈을 누를때마다 calc이라고 서버에 출력된다

사용자가 3,4를 입력하면 3,4라는 문자열이 저장된것

String x_ = req.getParameter("x"); 사용자가 입력한값을 받아서 x에 넣는다.

문자열출력은 resp.getWriter().println(x+y);


Q. resp.getWriter().println(x+y);

PrintWriter out=response.getWriter();

URL창에 출력결과가 나와 클라이언트가 볼 수 있다.

 

먼저 위의 response는 서버가 클라이언트에게 '응답'한다는 의미를 가진 객체입니다.

서버가 클라이언트에게 '응답'하려면 무조건 response라는 객체를 통해 작업을 해야합니다.

여기서 getWriter()는 '쓰기'를 통해 응답하겠다는 메서드입니다. 데이터타입은 PrintWriter입니다.

html페이지에 원하는 결과를 출력

 

out.print("Hello Servlet");  브라우저에 Hello Servelt이 뜬다.

Q. 웹프로그램과 콘솔프로그램의 차이 ?

  1. 입/출력 도구가 추가되었다.
  2. 실행을 직접할 수 없다. 톰캣에 의해서 실행되도록 한다.
  3. 톰캣이 실행될 수있도록 서블릿코드를 만들고 url을 맵핑시켜서 톰캣이 내것을 실행
  4. 자바와 비슷하다.

Q. 스트림버퍼를 통해 읽어오는것은 모두 문자열이다.

콘솔입력이든 , 파일입력이든, 네트웍 입력이든 모두 버퍼를 쓴다.

문자열 코드를 읽어오는것.

 

Q.톰캣에 메모리가 언제 올라가는지 ?

요청을 받을때 먼저 메모리에 올라가있는 지 확인, 없으면 메모리에올린다.

자주사용하는 url같은경우 (ex. index) timeout이있다.

처음요청할땐 서블릿이 로드해야하므로 살짝느리다.

 

Q.request:입력도구 , response:출력도구 는 WAS에만 있나?

입력은 요청하면서 같이온다. 사용자가 요청하면서 가져온데이터를 알려준다.(쿠키 등) WAS는 자바에서 주로 쓰임

어플리케이션실행을 도와줌, 웹서버는 입력 도구가 필요없다.

서버쪽에서 프로그램을 동작시킬 수있는 환경을 갖고있으면 입출력도구를 제공한다

 


 

11

요청했던 사용자의 브라우저에 문자열을 돌려주자 

HttpServletRequest request : 사용자가 요청할때 우리에게 입력값을 줄 수있다.

HttpServletResponse response : 우리가 사용자에게 입력할때 사용 할 수 있는 도구들을 담아두고있다.

자바 +웹출력도구 ->웹입출력가능

 

 

요청한 사용자에게 웹을통해 출력이된다.

 

콘솔출력했던것들이 사용자에게출력가능 , 웹을 이용해 출력

10번 반복 출력

 

 


사용자가 요구하는 만큼 반복해보자 

주소에 물음표뒤에 &구분자가있다. 키와 값을 쌍으로하는 값이 나열되어있다.

사용자가 부가적인 정보를 질의하는것과 같다. 

햄버거가게 : 치즈버거+양파제외+ ~~

커피숍 : 아메리카노 + 샷추가  등등

가게와 손님이 약속이된 한도내에서 질의요청 - > 제공

 

 

사용자가 c라는 키워드로 값을 전달

?c=5 5번요청

 

 

request.getParameter("c") //약속된키워드 c

약속된 키워드를 읽어봤더니 null아니다 -> 사용자 값을 이용한다 count = Integer.parseInt(c);   

약속된 키워드를 읽어봤더니 null이다 -> 기본값 int count = 10;

 

 

사용자가 ? c=20을 입력하면 20번반복되어 출력된다.

hello를 달라고하면서 추가옵션 c=20을 요청한것

 

 

검색폼이 물음표뒤의 값을 만들어줄것

 

Get Request -> QueryString(폼태그를이용하게될것)

(톰캣이 WAS서버를 탑재)

어플리케이션을 실행해주는것을 통해 실행하면 실행되는 시작은 원격에 있는 브라우저가 요청하므로써 실행된다.

문자열출력은 PrintWriter를 이용할것 

PrintWriter out = response.getWriter();


전달하고자하는 데이터형태

브라우저가 받는건 데이터를 직접받지않고 웹문서를받는다.

 

문서를 출력 : 브라우저(웹문서 뷰어)

데이터 출력 : 데이터요청하는게 자바스크립트

1.브라우저에서 스크립트가 동작하지않는 환경이라면 문서출력

2. 스크립트가 동작하는 환경이라면 문서대신 데이터를 제공하므로써 데이터를 가지고 스크립트가 문서를만들게한다. 

 

 

 


만든 calc.html파일의 인코딩이 EUC-KR이다.

 

알트 엔터->속성 조회  

 

calc.html파일을 지우고 UTF-8을 적용해보자

window -> preference -> web -> HTML , CSS, JSP UTF-8선택후 Apply적용

 

UTF-8적용된모습

 


서버실행시 다른프로세스에서 이미 실행중이라는 오류 

1. 작업관리자 열기 -> 세부정보 -> java검색

2. 콘솔창 -> netstat -ao -> 8080찾기 -> 작업관리자에서 26872쓰는 프로그램찾기 

3. zoom이 8080을 쓰고있다..일단 포트번호만바꿔서사용해보기 

 

 

 

ctrl + c + ipconfig 

 

 

패키지명이달라져서 라이브러리명이달라짐

자카르타, 인코딩명이달라짐 (유티에프?)

톰캣이 제공하는 API가 달라졌을 경우, 그것을 활용하는 상위 라이브러리들이 달라지는데 시간이걸린다.

최신버전의 Spring이 과거버전의 서블릿을 쓰고있다. 최신버전의 서블릿을 쓰면 나중에 호환성 문제가 발생할 수있다.

 

어제 작업


서블릿이란 서버어플리케이션을 만든느것
기능벼로 코드가나뉘어짐
선택적실행

 

이클립스를 사용안하면 .. 
소스코드고치고
컴파일
클래스파일복사해서 클레스즈에 다시 붙여넣기
톰캣다시끄고시작하기
스타트업다시시작
서벗다시
주소입력다시


이클립스를 이용해서 톰캣을 실행->서블릿 실행

메모장보다 편리! 

web.xml이 서블릿을 실행하는 중요한 설정(설정내용이해)

브라우저를 띄우고 + 주소입력 해야했지만 web.xml를 선택하고 ctrl +f11누르면 쉽게 브라우저를  띄워서 그 주소까지 입력할 수있다.

 

 

Java EE

이클립스한테 톰캣실행해주도록 해야한다

서블릿코드는 톰캣에 의해 실행된다. 런타임환경을 구축해야한다. 

이클립스 다이나믹 웹 프로젝트 -> 타겟런타임 -> 뉴 런타임-> 내가 사용할 톰캣버전선택 -> 디렉토리선택 -> 9.0 홈디렉토리선택 bin이 보이는 폴더

 

WebContent 톰캣이 사용하는 기본폴더 -> index.html생성 -> "안녕하세요 " 입력

이클립스를 사용하지 않았을 경우, 톰캣을 직접 실행하고 브라우저를 열고, 로컬호스트번호로 요청해야한다.

WEB-INF에 기존 web.xml파일을 붙여넣기한다

 

웹출력

컨트롤 에프11(실행)

좌 : 이클립스내에있는 브라우저에 안녕하세요가 뜬다 / 로컬호스트주소를 브라우저창에뜨면 동일한 결과가 뜬다 
디폴트 브라우저 지정하기

패키지 추가 후 Nana.java파일 넣기 

실행시 런초록버튼 누르지말것 : Nana.java을 실행하는게 아니라 서버만 실행하는것 ->브라우저가 뜨지않는다

다시 런버튼을 누르면 서버만 계속 실행하는것 

문서가 고정되어있지않고 달라져야한다면 ?

요구되는 시점에 문서를 만들어야하는 경우가 생긴다.

동적인문서가 서버쪽에있다가 클라이언트쪽으로 갈것이다.

웹서버 톰캣이 사용자요청을 받는다.

 

톰캣이 정적인 static문서(홈디렉토리에있는 문서)와 동적인 dynamic문서(프로그램)를 받는다.

톰캣이 로드할 수 있는 컨테이너가있고, 프로그램을 실행하게한다. 실행환경 WAS(web application server)

톰캣은 웹서버보다 WAS의 기능이 중요하다.

아파치웹서버는 확장성을 가지고있어서 PHP,닷넷등 다양한 애플리케이션을 묶어서 구현할때 유용

자바만으로 개발할때는 톰캣으로 충분

홈디렉토리는 정적인문서를 서비스하기위해 웹서버가 갖게되는 디렉토리

WAS가 사용하게될 동적인 문서를 만들 서브프로그램 만들기

이클립스로 만들 수 있지만, 메모장으로도 가능하다.

메모장작성->WAS가 함수호출, 객체를 참조

(WAS : 어플리케이션이 동작할 수 있도록 도와줌)

 

사용자에게 돌려주는 내용은 없지만 사용자가 요청을하면 톰캣이 로드를해서 실행해줄 수 있다는것을 검증해보자

사용자요청이오면 서버쪽 콘솔에 "hello Servlet"이 뜨게된다.

톰캣이 내것은 실행 해 줄 수있느냐가 중요->사용자에게 출력하는 방법 배울예정

클래스명은 자유롭게 만들 수있다. Nana

톰캣이 Nana클래스를 실행 해 줄 수있다.

실행할 수있는 요건

1. 내가 만든 클래스를 참조할 수 있어야한다

2. 톰캣과 내가만든 클래스를 이어주는 참조형이 있어야한다(HttpServlet)

->톰캣은 약속되어있는 함수를 호출한다.

함수(서비스)를 우리는 구현하지않아도 된다. 서비스함수를 재정의해서 함수실행을 확인할것이다.

 

서블렛안에있는 클래스들을 임포트 서블렛안의 자손(http)는 따로 써줘야한다.

메모장으로 java파일을 만들고 저장 후 cmd창에서 컴파일을 한다. javac Nana.java

메모장 작성 Nana.java

다음과 같은 에러가 나타난다. 심볼이없다.

자바가 가진 라이브러리 안에서 HttpServlet을 찾을 수 없기 때문이다.

 servlet-api.jar라이브러리가 필요하다

1. 이 라이브러리를 자바파일이 있는곳에 두던지

2. 자바파일의 디렉토리를 지정해야한다.

자바컴파일러는 외부라이브러리를 추가할 수 있는 설정이있다.

라이브러리 디렉토리를 넣고 컴파일했으나 동일 오류 발생

같은 오류가 발생했다. 톰캣의 10버전의 문제였다. 톰캣9을 다시 받는다.

9버전의 경로를 복사하고 9버전에있는 servlet-api.jar로 경로를 바꾸고 컴파일한다. 

dir로 class파일 생성여부를 확인한다.

Nana.class 컴파일된 코드를 실행할때는 일반적인 콘솔어플리케이션처럼 실행하지않고 웹어플리케이션이니까 톰캣에 의해서 실행되게해야한다. 

클라이언트가 브라우저창에 url로 이름을 명령 ->서버쪽에서는 요구를 인식하고 실행하게해준다.

패키지명을 추가하고 다시번역해준다.

일반적인 정적인 문서의 경우 ROOT에 넣으면된다. 프로그램파일은 web-inf에 넣어야한다.

web-int \ classes \ com \ newlecture\ web 프로그램배포하는작업

내가직접실행하는게아니라 원격의 사용자가 실행을 요청(url주소를통해)

만들고 배포라는작업

톰캣한테 내가만든클래스 객체화되도록요청해야한다

xml 파일을 비주얼스투디오로 연다.

 

경로이름은 아무거나 저장가능 /aa/bb/cc/min으로 하면 하나의 이름이지, 경로가 아니다. 

사용자가 url로 요청하면 na라는 변수를 가진 servlet을 실행시킨다. 

사용자는 /min이라는 이름으로 요청하고 서버는 na라는 이름의 서블렛클래스를 실행한다 

실제로 /min이라는 파일이있지않다. 요청을 받는 웹서버는 /min파일을 찾아보고 없으면 WAS에게 넘기면

맵핑정보를 찾아서 /min에 해당하는 서블릿코드를 실행한다.

  • <servlet-class>패키지명+클래스이름
  • 첫번째 <servlet> 메모리에 올림
  • 두번째 <servlet-mapping> url매핑 :na라는 이름을 갖는 서블릿을 /min이라는 요청이오면 실행

 

브라우저에 설정한 /min을 넣으면 cmd창에 hello Servlet이 뜬다.

사용자가 url로 요청시 서버 cmd에 hello Servlet이 뜬다.

web.xml 이란 ?

  • Web Application의 Deployment Descriptor(환경파일 : 배포서술자, DD파일)로서 XML 형식의 파일
  • 모든 Web application은 반드시 하나의 web.xm l파일을 가져야 함
  • 위치 : WEB-INF 폴더 아래

서블릿설정

<servlet> : 서블릿 객체 설정

<servlet-name> : 객체의 이름 </servlet-name>

<servlet-class> : 객체를 생성할 클래스 </servlet-class>

</servlet>

클라이언트 프로그램을 CS로 만들때의 문제점 :

1. 설치작업의 부담

2. 고객불만

3. 안정성문제

 

웹기반의 클라이언트 / 서버프로그램

1. 클라이언트 : 프로그램을 설치할 필요가 없어진다.

2. 데이터전달이 아니라 문서를 주면된다.

   코드를 실행해서  실행결과를 돌려주는것

동적인 문서(코드) 

브라우저 + 웹서버 + 실행환경이 필요하다.

 

Servlet 이란 ? 

서블릿(servlet)은 서버에서 웹페이지 등을 동적으로 생성하거나 데이터 처리를 수행하기 위해 자바로 작성된 프로그램이다. 

 

웹서버 실행

static문서 서비스

톰캣을 실행해서 사용자에게 서비스해봤다.

Nana.txt파일은 정적인문서이다. 항상 같은 문서를 서비스해보자.

 

Tomcat : 웹서버

apache.org 접속 - tomcat - 10.0.4버전 - 압축버전

압축풀기 - \apache-tomcat-10.0.4 - bin - startup.bat 실행

웹브라우저에 localhost:8080치면 서버에서 제공한 내용이 뜬다.

IP

공인IP :전세계에서 유일한 식별 ip

사설IP : 지역적으로 사용

+ Recent posts