* CounterServlet File로 저장 하고 불러오기[실습]

[문제] 방문자수(카운터수)를 파일에 저장해서 방문자수 유지하기

 

 

 


package servlet.lifecycle;

 
import java.io.DataInputStream;
import java.io.DataOutputStream;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
 
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 CounterServlet extends HttpServlet{
 //변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.)
 private int visitCount;
 //카운트 한 값을 저장 시킬 공간
 private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.dat";
 //생성자( 객체 생성)
 public CounterServlet(){
  
 }
 //객체 생성 직후 실행(count값 read 한 다음에 visitCount로 넣기)
 public void init(){
  DataInputStream dataInputStream = null;
  try {
   dataInputStream = new DataInputStream(new FileInputStream(counterFile));
   visitCount = dataInputStream.readInt();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally{
   if(dataInputStream!=null){
    try {
     dataInputStream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  
 }
 //객체 소멸 직전 실행(visitCount 값을 파일로 write)
 public void destroy(){
  DataOutputStream dataOutputStream = null;
  try {
   dataOutputStream = new DataOutputStream(new FileOutputStream(counterFile));
   dataOutputStream.writeInt(visitCount);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally{
   if( dataOutputStream!=null){
    try {
     dataOutputStream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
 //service() -> doGet() : 클라이언트 요청이 들어올때 마다 호출
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
  response.setContentType("text/html;charset=UTF-8");
  PrintWriter out = response.getWriter();
  out.println("<html><head><title>카운터</title></head>");
  out.println("<body>");
  visitCount++;//카운터의 값을 1증가
  out.println("당신은 "+visitCount+" 번째 방문자 입니다.");
  out.println("</body></html>");
 }
}

 * 결과

 

 

 

Posted by 조은성
,

* CounterServlet 실습

[문제]서버가 살아 있는 동안 카운트 수 유지 시키기(톰캣을 내리면 초기화)

dynamic web project : myweb

class
package : servlet.lifecycle
class : CounterServlet

 

 

* 실행 : http://127.0.0.1:8088/myweb/CounterServlet

* F5로 새로고침을 하면 카운트가 1씩 증가하는 것을 볼 수 있다.

 

Posted by 조은성
,

* 서블릿 실행과정

1. class요청

2. 객체 생성
- container가 no-argument 생성자를 호출해서 객체를 생성한다. (따라서 일반적인 상황에는 default생성자가 만들어 지므로 안만들어도 된다.

3.init()호출

4. Service()호출
- service()를 doGet()으로 만들어 놨기때문에 doGet()을 호출한다.

5. destroy()호출
- 객체 소멸

* LifecycleServlet실습

dynamic web project : myweb

class
package : servlet.lifecycle
class : LifecycleServlet

실행 웹프라우저 주소 : http://127.0.0.1:8088/myweb/lifecycleServlet

 

 

 

 

Posted by 조은성
,

 * 서블릿의 life cycle

 

* life cycle(call back) 메소드 - container가 특정 시점이 되면 호출하는 메소드

 

* 서블릿 메소드 실행 시점  - Web Container가 호출 한다.
init() - 서블릿 객체 생성 직후 실행          
service() - client의 요청이 들어오면 실행
destroy() - 서블릿 객체가 소면되기 직전에 실행 

- 객체가 만들어 져야 할때 init()
- client의 요청이 들어 오면 service()
- 자원을 반납, 데이터 저장 destroy()

 * HelloServlet.java

 * web.xml

 

* servlet 실행도

 

 

 

 

* doGet/doPost 호출

 

Posted by 조은성
,

* 서블릿 매핑 - <servlet-mapping>


- client의 요청 url과 그 요청에 일할 서블릿 객체를 연결하는 설정
- 구문
<servlet-mappting>
    <servlet-name>이름</servlet-name>일할 서블릿 객체의 이름
    <url-pattern>패턴</url-pattern> 클라이언트가 요청할 url 패턴
</servlet-mapping>

- url-pattern의 세가지 방법

1. 이름까지 정확하게 일치하도록 설정
<url-pattern>/[경로]/이름</url-pattern>
2. 디렉토리까지 일치하도록 설정
<url-pattern>/[경로]/*</url-pattern>
3. 확장자만 일차하도록 설정
<url-pattern>*.확장자</url-pattern>

1. ex : /hello/helloservlet
이렇게 요청을 하면 브라우저에 url-pattern이 구문 그대로 요청을 해야한다.

2. ex : /hello/*

이렇게 요청을 하면 브라우저에
          /hello/helloservlet
          /hello/a
          /hello/b
이렇게 /hello/~다음에 머가 오던지 요청이 된다.

만약 /* url패턴을 요청하게 되면 어떤 요청이 들어가던지 간에 다 실행이 된다.

3. ex : *.do

 /hello/helloservlet.do
 /hello/helloservlet/aaaaa.do
마지막 확장자에 .do만 들어가면 다 호출이 되어 진다.

주의 : 1.2.번은 맨 앞에 / 가 무조건 들어가야 하고 3.번은 /가 들어가면 안된다.

* <url-pattern>의 /는 application의 Root경로를 말한다.

 

* 만약 1.번과3.번을 동시에 지정해 주면 1.번 디렉토리 경로가 우선적으로 실행된다.

Posted by 조은성
,

* jsp 개발환경

- 개발환경 eclipse   --------------->실행환경
                              배포(deplay)      (Tomcat : Webapps(톰캣이 어플리케이션을 관리하는 디렉토리))

java Resources
   - src
       - .java(서블릿)

WebContent
    - html, jsp (정적인 것).
    - WEB INF
         - web.xml (-> 설정파일)
         - lib 

* Path 반드시 외워라.(아래 있는 경로와 web.xml에 대한 것이 제일 중요)

Webapplication(myweb)-Root
   |___정적 서비스 file - html, image, jsp
   |___WEB-INF
             |-----web.xml(배치 서술자)  -->Web Container가 읽어서 어떻게 일해라를 알려준다. (프로그램이 시작시읽어들임)
             |_____classes
             |             |____ .class파일(ex : 서블릿파일)
             |_____ lib
                         |__ .jar(압축된 class 파일들->api)

 

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

* web.xml

* 배포(배치) 서술자(설명자) - Deployment Descriptor(DD 파일)
* Web Application에 대한 여러 가지 설정을 해주는 xml기반의 파일
   - 서블릿 등록
   - 서블릿 요청을 위한 url 설정
   - 초기 파라미터 설정
   - 보안 설정
* 모든 Web application은 하나의 web.xml 파일을 가져야 함
* 위치 :  WEB_INF 폴더 아래
* web.xml 파일의 설정들은 Web Application 시작시 메모리에 로딩된다.
   - 수정을 할 경우 web application을 재 시작 해야 한다.

* xml
- 데이터의 정보를 알려준다.
ex :

<age>30</age>
<size>30</size>

- Root tag : <webapp></webapp> ( 모든 설정들은 webapp태그 안으로 들어간다.)

* xml 작성시 주의점

1. 대소문자 구분
2. attribute 값은 반드시 ""또는 ''으로 감싸야 한다.
3.. 태그는 반드시 닫아야 한다. - content가 없는 태그의 경우

<html> <b> <a href="">
<HTML> <B> <A HREF = "">
html은 위에 있는 두 구문이 같지만, xml을 다르게 인식한다.

<font size ="5">
<font size = 5 >
html은 위에 두 구문을 같게 인식하지만 xml은 <font size = 5 >하면 인식하지 못한다.

<font size ="5">aaaaaaaa</font>->이 구문은 html이든 xml이든 다 닫아 줘야하고
<br>이 구문은 html은 인식되지만 xml을 인식하려면 <br/>로 해줘야 한다. - content가 없는 태그의 경우

 

 

Posted by 조은성
,
* Web application(프로그램) - 동적서비스와 정적서비스로 나뉜다.

- 정적인 서비스(Web서버) - 가지고 있는 값들만 요청을 서비스 할 수 있다.

- 동적인 서비스 - 그때 그때 요청에 따라 값을 만들어 서비스 한다. 
   동적인 서비스를 실행할 수 있는 환경을 Web컨테이너라고 부른다.

* 클라이언트가 서블릿을 요청을 하면 웹서버가 요청을 받는다. 웹서버는 정적인 서비스 밖에 할 수 없어서 웹컨테이너로 넘겨 서 웹컨테이너에서 처리하고 처리한 것을 다시 웹서버로 넘겨주고 웹서버가 다시 클라이언트로 보내준다.
* 톰캣 : 웹서버와 웹컨테이너를 둘다 사용하기 위한 환경을 제공한다.

* CGI 중 자바에서는 - Servlet - java(메인이 java) -> html 출력
                             |
                             - jsp - html(메인이 html) -> java code 삽입

 

 * 기존의 servlet 프로그램

 * Servlet 프로그램


* Container - Component( java beans )->p/g모듈 : 독립적인 업무를 처리하고 재사용 가능한 p/g 모듈
   ->Component 실행환경-> infra 기술들을 제공 -> component들이 실행 하는게 공통적으로 필요한 Logic
      (->component들을 자신의 비지니스 로직만 생각하면 된다.)

* 각각의 비지니스 로직을 컴포넌트 들이 가지고 있고, 공통적으로 필요한 것을 container로 처리하여 받아 온다.
  실행할때 필요한 infra 적인 것과 공통적인 것, 실행환경은 container(Web container)에서 다 만들어 주므로 component(servlet & jsp)는 자신의 로직만 생각해서 만들면 된다.  

Posted by 조은성
,

* Web Content ->jsp File->hello.jsp

* 소스 :

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>hello.jsp</title>
</head>
<body>
안녕하세요.. 반갑습니다.<br>
<%
 //자바 코딩
 out.println("현재시간 : "+new Date());

%>
<br>
<%
 for(int i=1;i<=10;i++){
 
%>
<%=i %><br>
<%}%>
</body>
</html>

* 실행결과 :

 

 

Posted by 조은성
,

* Servlet 클래스 작성 패턴

1. public class로 작성
2. javax.servlet.http.HttpServlet을 extends
3. no-argument 생성자 필수(생성자 안만든다)
4. service 메소드 구현 - 클라이언트의 요청에 응답하는 메소드
    - public void doPost() 또는 public void doGet()
5. web.xml(배치 설명자)에 등록
   - 서블릿 객체 등록 : <servlet> 태그
   - Client가 호출하는 방법 등록 :  <servlet-mapping> 태그

*실습
dynamic web project : myweb
class
package : servlet.hello
name : HelloServlet

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

코드 :

package servlet.hello;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

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

public class HelloServlet extends HttpServlet{
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
  response.setContentType("text/html;charset=utf-8");
  PrintWriter printWriter = response.getWriter();
  String time = getNow();
  printWriter.println("<html><head><title>HelloServlet</title></head>");
  printWriter.println("<body>안녕하세요...<br>");
  printWriter.println("현재 시간 : "+time+"입니다.");
  printWriter.println("</body></html>");
 }

 public String getNow() {
  //현재 시간을 뽑아온다
  //yyyy.MM.dd HH:mm:ss
  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
  String str = simpleDateFormat.format(new Date());
  return str;
 }

}
-----------------------

 

 

java Resources - java src : servlet

webContent - 정적인 파일 : html, jsp
WEB-INF
web.xml

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

코드 :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 <servlet>
  <servlet-name>hello</servlet-name> <!-- 서블릿 클래스명을 지정함 -->
  <servlet-class>servlet.hello.HelloServlet</servlet-class> <!-- 서블릿의 전체 경로를 설정 -->
 </servlet>
 <servlet-mapping>
  <servlet-name>hello</servlet-name> <!--  hello 라는 이름의 파일을 mapping함-->
  <url-pattern>/helloServlet</url-pattern>  <!--  url에 helloServlet으로 실행함. -->
 </servlet-mapping>
</web-app>

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

* 실행 :

web브라우저에 http://127.0.0.1:8088/myweb/helloServlet 을 쳐 준다.

* 결과 :

 

 

 

Posted by 조은성
,

인터넷 ?
- Network의 Network : 전세계 컴퓨터를 Network로 묶은것

Network?

Protocol
- Computer와 Computer가 통신을 하기 위한 규약
- ex) HTTP, FTP, TCP, UDP .....

 

TCP
- 연결지향 protocol. HTTP, FTP 등의 기반 protocol
- 신뢰적, 쌍방향성

 

UDP
- 비연결지향 protocol
- 비신뢰적

 

Network Address
Physical Address
- MAC Address라고 불리는 Computer(랜카드)고유의 주소값
- 6byte로 구성된 주소 (ex 0A:4E:88:90:DD:E0)

Logical Address
- IP Address라고 불리는 주소값
- Network에 연결된 컴퓨터를 쓰기 위한 4byte 형태의 주소
- IP Address의 예 : 192.168.10.1
- IP Address를 통해 연결되어 있는 컴퓨터에 접근
- IP Address를 외우기는 힘들기 때문에 DNS서버에 Domain 이름을 등록하여 사용 (ex : stellan.tistory.com)

Port Address
- 컴퓨터내에 존재하는 서버 프로그램을 구분하기 위한 번호
- 0~65535 (0~FFFF)의 번호를 가짐
- 0~1023은 예약된 번호로 사용하지 않는 것이 좋음

 

Network의 방식
Server - Client 방식
- Server : 자원을 보유하여 Client에 서비스를 제공하는 H/W 또는 S/W
- Client : Server에서 자원을 가져다 사용하는 H/W 또는 S/W

p2p 방식
- 컴퓨터와 컴퓨터가 1:1로 통신하는 방식
- Server - Client 방식과 다르게 Server와 Client가 따로 정해져 있지 않고 서로가 Server도 될 수 있고 Client도 될 수 있다.

 

HTTP ?
- Hyper Text Transfer Protocol
- 하이퍼 텍스트[각주:1]를 전송하기 위한 프로토콜

HTTP의 통신규약
- 요청 (Web Browser가 아래와 같은 규약으로 서버로 요청함)

- 응답 (Web Server가 아래와 같은 방식으로 응답함)

HTML ?
HTML의 의미
- Hyper Text Markup Language

목적 
- 글(내용)이 web browser에서 어떻게 보여질지 지정.
- web page를 작성하기 위한 markup 언어
- 문서의 구조, 문서의 Style을 지정 (최근에 문서의 Style은 CSS에서 지정함)

특징
- Tag 기반 언어

Tag 요소(element)
- <start태그명>내용</end태그명> // 내용에 들어갈 수 있는 것들 : text, element(tag)
- <start태그 attribute="값">내용</end태그>

HTML 파일의 확장자
- html, htm

HTML의 구성
-

 

하이퍼 텍스트? 텍스트에 링크를 걸어둔 것
Posted by 조은성
,