* 요청 파라미터

   - 클라이언트가 CGI(서블릿) 으로 전송하는 데이터
   - CGI가 일처리를 위해 클라이언트로 부터 입력받아야 하는 데이터
   - HTML의 form 태그나 QueryString을 이용해 전송한다.
   - name=value 형태로 전송된다. 여러개 일때는 & 로 묶어 준다.

 

ex :  
기본 url로 요청 파라미터 보내기 : <a href="url?name=a&age=20>요청</a>

* HTML 입력 관련 태그들

- form 태그
   - 입력 태그들을 묶어주는 태그
   - 속성
       - action : 요청할 url.- 요청파라미터를 전송할 CGI의 url 지정
       - method : 요청 방식(기본 : GET)

- 입력 태그 : <select>, <textarea>, <input>
- 기본 속성
   - name : 전송할 값에 붙일 name값.


- <select>태그
   - 목록 리스트중 선택 하도록 하는 태그
   - 속성 : multiple  : 다중 선택
   - 하위 태그
        - <option> : 선택할 item 등록

- <textarea>
   - 여러 줄 입력 폼
   - 속성
      - cols : 열 수
      - rows : 행 수

Posted by 조은성
,
* javax.servlet.http.HttpServletRequest

- 클라이언트의 요청과 관련된 정보와 동작을 가지고 있는 객체
- Web Container가 생성하여 service()의 인수로 넘겨준다.
- ServletRequest의 하위
- 주요 기능
    - 요청 파라미터 객체 조회
    - HttpSession 객체 조회
    - request scope 상의 component간의 데이터 공유 지원
   

* javax.servlet.http.HttpServletResponse

- 응답할 Client에 대한 정보와 동작을 가지고 있는 객체
- Web Container가 생성하여 service()의 인수로 넘겨 준다.
- ServletResponse의 하위
- 주요 기능
    - 응답 Header 정보 설정(Content Type 설정)
    - 응답 Stream 조회
    - Redirect 방식으로 수행 넘기기

 

Posted by 조은성
,

* 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 조은성
,