5.JDBC/2)JDBC_개념

JDBC_개념_Day_10

구이제이 2024. 3. 4. 16:57

mvc(모델뷰컨트롤러) 패턴 -> 스프링



프로젝터 / 스프린터 / 쪼개서 하는것

틀을 만들고 덧붙여서 하는것

 

작게 완성하게 하는 것

 

 

 

ㅡㅡㅡ



1.디렉토리 표시

windows : \(역슬래시 사용)

  c:\test\aa.txt

  c:\\test\\aa.txt

  “”안에 파일 경로를 넣을 때 주의 필요

  “”안에서는 \(역슬래쉬)가 제어문자로 인식

  “”안에 파일 경로를 설정 : \\ 




windows10 버전 이상(둘다 가능 역슬래쉬, 슬래쉬)

c:\\test\\aa.txt 

c:/test/aa.txt

 

mac:/(슬래쉬만 사용가능)

c:/test/aa.txt



\n -> 한칸내리기

\”  -> “(쌍따옴)



2. 절대경로와 상대경로

절대 경로 : 위치가 고정

c:/test/aa.txt

c:\tst\aa.txt

상대 경로 : 현재 작업하는 파일을 기준으로 경로를 설정

./ : 자신이 속해 있는 곳(폴더=디렉토리)

.\, .\\

../ : 현재 자신이 속한 폴더의 상위 폴더

..\\, ..\

 

3. 문자셋

EUR_KR : 국가 표준 문자셋(한국산업규격으로 지정된 한국어 문자 집합)

표준

한글/한자 2byte로 처리, 영문/

영문 특수문자 숫자 : 1byte로 처리

@@몇바이트인지가 중요합니다.

MS949 : 마이크로소프트사, 한글 + EUC-KR에 빠진 한글 완성형 코드 8,822자 추가

  비표준

  한글/한자-2byte, 영문 특수문자 - 1byte

UTF-8 : 한글/한자 - 3byte, 영문/숫자 특수문자 - 1byte

  가변 길이 문자 인코딩 방식(1 ~ 4byte)

  웹서버, 데이터베이스, 리눅스, mac시스템의 기본 인코딩 방식

UTF-16 : 한글, 영어, 숫자, 특수문자 모두 2byte

    고정 길이 문자 인코딩 방식

ASCII(아스키코드) : 영문자, 특수문자, 숫자, 제어코드에 코드를 부여한 것

    미국정보교환표준부호(American Standard Code for Information Interchange)

UNICODE : 세계 만국 공통어

하나의 문자셋에 국가별 모든 문자셋 통합

자바의 문자셋(Charset) : java.nio.charset.Charset 클래스로 정의되어 있음




#웹서버

전부 UTF-8방식으로 처리해줍니다.

그래서 설정을 해주어야 합니다.

 

 

======================================================================



▣ 데이터 입출력

   자바는 입력 스트림과 출력 스트림을 통해 데이터를 입출력함

   자바에서 데이터 입출력과 관련된 라이브러리 : java.io 패키지

 

▣ 입출력 스트림

   1. 스트림(Stream) : ‘단방향’으로 데이터가 ‘흐르는 것’ 

2가지로 나눕니다. (1.바이트스트림(일반적으로 사용하는 모든것) /2. 문자스트림)

 

         입력 스트림      출력 스트림

      출발지   ------------->  프로그램  -------------> 도착지

 

   2. 바이트 스트림 : 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 입출력할 때 사용

바이트 단위로 데이터 전송

이진 데이터를 처리하기 때문에 바이너리 스트림이라고도 함

int 4byte long 8byte 

double 4byte float 8byte

- (바이트가 같지만,데이터저장방식이 달라서, double float이 더크다)

 

      InputStream : 추상클래스

         XXXInputStream

      OutputStream : 추상클래스

         XXXOutputStream

 

      1) 바이트 출력 스트림 : OutputStream

         메소드

         void write(int b)    1byte룰 출력,  매개값 int(4byte)에서 끝 1byte만 출력

 

         void write(byte[] b)    매개값으로 주어진 배열b의 모든 바이트를 출력

 

         void write(byte[] b, int off, int len) 

                  매개값으로 주어진 배열 b[off] 부터 len 개의 바이트 출력

 

         void  flush()      출력 버퍼에 잔류하는 모든 바이트를 출력

                  OutputStream은 내부에 작은 버퍼 가지고 있음

                  write() 메소드 호출되면 버퍼에 바이트를 우선 저장하고

                  버퍼가 차면 순서대로 바이트를 출력

                  flush() 메소드는 내부 버퍼에 잔류하는 모든 바이트를 출력하고

                  버퍼를 비우는 역할

 

         void  close()      출력 스트림을 닫고 사용 메모리 해제



#버퍼 (물이 많이들어오든 적게 들어오든, 임시의 통에 담는다. 그래서 담아두면서, 일정량의 물을 흐르게 해주는 임시통을 ‘버퍼’라고 보면됩니다.)

 

출력스트림(내보내는 것)

flush 받는 것 남아있는 것 내보내준다.

output할떄, 잔류하는 모든 것을 내보낸다.

내보낼려고 모았던것을

 






      2) 바이트 입력 스트림 : InutStream

         메소드

         int  read()       1byte를 읽은 후 읽은 바이트를 리턴

                  1byte를 읽고 int(4byte) 타입을 리턴, 4byte 중 끝 1byte에만 데이터 있음

                  더 이상 입력 스트림으로부터 바이트 읽을 수 없으면 -1을 리턴

 

         int  read(byte[] b)   읽은 바이트를 매개값으로 주어진 배열에 저장 후 읽은 바이트 수를 리턴

 

         void close()       입력 스트림을 닫고 사용 메모리 해제

 

   3. 문자 스트림 : 문자만 입출력할 때 사용

      2byte 단위로 전송

      채팅, 문자만 입출력할 때 사용

      Reader

         XXXReader

      Writer

         XXXWriter

 

      1) 문자 출력 

         메소드

         void write(int c)             매개값으로 주어진 한 문자를 출력

         void write(char[] cbuf)             매개값으로 주어진 배열의 모든 문자를 출력

         void write(char[] cbuf, int off, int len)    매개값으로 주어진 배열에서 cbuf[off]부터 len개까지의 문자를 출력

         void write(String str)             매개값으로 주어진 문자열을 출력

         void write(String str, int off, int len)      매개값으로 주어진 문자열에서 off 순번부터 len까지의 문자를 출력

         void flush()               버퍼에 잔류하는 모든 문자를 출력

         void  close()               출력 스트림을 닫고 사용 메모리를 해제

 

      2) 문자 읽기

         메소드

         void read()      1개 문자를 읽고 리턴

         int   read(char[] cbuf)   읽은 문자들을 매개값으로 주어진 문자 배열에 저장하고 읽은 문자 수를 리턴

         void  close()      입력 스트림을 닫고, 사용 메모리 해제



   4. 보조 스트림

      다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림

      보조스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스로부터 직접

      생성된 입출력 스트림에 연결해서 사용해야 함

   

      입출력 스트림에 보조 스트림을 연결하려면 보조 스트림을 생성할 때 생성자 매개값으로 입출력 스트림을 제공

         보조스트림 변수 = new 보조스트림(입출력스트림);

 

         InputStream is = new FileInputStream("....");

         InputStreamReader reader = new InputStreamReader( is );



         InputStream is = new FileInputStream("....");

         InputStreamReader reader = new InputStreamReader( is );

         BufferedReader br = new BufferedReader( reader );

      



      1) 보조 스트림

         InputStreamReader         바이트 스트림을 문자 스트림으로 변환

 

         BufferedInputStream,         입출력 성능 향상

         BufferedOutputStream,

         BufferedReader,

         BufferedWriter

 

         DataInputStream, DataOutputStream   기본타입 데이터 입출력

 

         PrintStream, PrintWriter         줄바꿈 처리 및 형식화된 문자열 출력

         ObjectInputStream, ObjectOutputStream   객체 입출력

 

      2) 문자 변환 스트림

         바이트 스트림에서 입출력할 데이터가 문자라면 문자 스트림(Reader와 Writer)로 변환해서

         사용하면 좋음.  문자로 바로 입출력하는 편리함이 있고, 문자셋의 종류를 지정할 수 있기 때문











package fileinputoutput; 생성

fileinputoutput패키지에 WriteExample,WriteExample2,InputStreamExam,InputStreamExam2생성

abc.txt 생성

폴더만들기 c드라이브에 temp




 

WriteExample,  - 일반으로 적기

WriteExample2,- 배열으로 적기

InputStreamExam - try/catch로 처리

InputStreamExam2 - throws 으로 try/catch 안쓰고 처리하기

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ




InputOutputExam - 파일입출력 (a.txt 의 내용이 b.txt로 입력되고 저장됩니다.)

InputOutputExam2 - char형으로 출력하기

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

package fileinputoutput;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

public class InputOutputExam {

public static void main(String[] args) {

 

String input = "c:\\temp\\a.txt";

String output = "c:\\temp\\b.txt";

 

//파일입력 스트림 : 파일읽어오기 -> 처리 -> 종료(close)

//파일 출력 스트림 : 파일을 열기 -> 처리 -> 종료(close)

//try - with - resource : close()를 자동 처리, 자동으로 리소스 닫기

try(FileInputStream fis = new FileInputStream(input); //이파일을 읽어와서

FileOutputStream fos = new FileOutputStream(output);) { //여기에 넣어주려합니다.  이게 파일 입출력입니다.

 

//try() 안에 입력한다면,

//close라는 말안써도 알아서 닫아준다. 저기다가 입력하면

 

//file을 읽어서 바로  file로 내보내기

int c; //fis.read(); 1byte씩 읽어오기

  //더이상 읽을 내용이 없으면 -1을 리턴

while((c=fis.read()) != -1) {

fos.write(c); //1byte씩 쓰기

}

 

 

}catch(IOException e) {

System.out.println("예외 발생");

e.printStackTrace();

}

 

 

 

}

}



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

package fileinputoutput;

 

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

 

public class InputOutputExam2 {

 

public static void main(String[] args) {

 

String input = "c:\\temp\\a.txt";

String output = "c:\\temp\\b.txt";

 

//파일입력 스트림 : 파일읽어오기 -> 처리 -> 종료(close)

//파일 출력 스트림 : 파일을 열기 -> 처리 -> 종료(close)

//try - with - resource : close()를 자동 처리, 자동으로 리소스 닫기

try(FileInputStream fis = new FileInputStream(input); //이파일을 읽어와서

FileOutputStream fos = new FileOutputStream(output);) { //여기에 넣어주려합니다.  이게 파일 입출력입니다.

 

//try() 안에 입력한다면, 

//close라는 말안써도 알아서 닫아준다. 저기다가 입력하면

 

//file을 읽어서 바로  file로 내보내기

int c; //fis.read(); 1byte씩 읽어오기

  //더이상 읽을 내용이 없으면 -1을 리턴

while((c=fis.read()) != -1) {

fos.write(c); //1byte씩 쓰기

System.out.printf("%c(%d) ", (char)c,c); //char형으로 읽기.

}

 

 

}catch(IOException e) {

System.out.println("예외 발생");

e.printStackTrace();

}

 

 

 

 

}

 

}





WriterExample

 

package fileinputoutput;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class WriteExample {

public static void main(String[] args) {

try {

OutputStream os = new FileOutputStream("c:\\temp\\test1.txt");

 

//자식은 부모타입에 대입할수있습니다.

//FileOutputStream자식

//OutputStream qnah

 

 

byte a = 10;

byte b = 20;

byte c = 30;

 

try {

os.write(a); //1byte 씩 쓰기

os.write(b);

os.write(c);

 

os.flush(); // 버퍼 내용 모두 쓰기(버퍼 비우기)

os.close(); // 출력스트림을 닫기

 

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

 

 

 

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}





ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



● 

ReadExample - 한문자씩 읽어오기



package fileinputoutput;

import java.io.FileReader;

import java.io.Reader;

public class ReadExample {

public static void main(String[] args) throws Exception {

 

String r = "c:/temp/test10.txt";

Reader reader = new FileReader(r);

 

while(true) {

int data =reader.read(); //한문자씩 읽기

if(data == -1 ) {break;}

System.out.println((char)data); //문자로 강제 형변환

}

 

reader.close();

 

}

}




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ




● 

CharacterConvertStreamExam

보조연결스트림



package fileinputoutput;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.Reader;

import java.io.Writer;

public class CharacterConvertStreamExam {

public static void main(String[] args) throws Exception { //write()에서 throws한 것을 다시 throws를 합니다.

 

write("문자 변환 스트림을 사용합니다.");

String data =read();

System.out.println(data);

 

 

}

 

public static void write(String str) throws Exception { // Exception보다 정확하게 IOExceoption,

String o = "c:/temp/test2.txt"; //나를 호출한 곳에서 처리해줘(던지는 것의 의미)

FileOutputStream fos = new FileOutputStream(o);

Writer writer = new OutputStreamWriter(fos); //보조 스트림을 연결

//FileOutputStream을 OutputStreamWriter에 연결

 

//OutputStreamWriter 보조 스트림을 이용해서 문자 출력

writer.write(str);

writer.flush();

 

//리소스 닫기

writer.close();

}

 

 

public static String read() throws Exception {

String f = "c:/temp/test2.txt";

 

FileInputStream fis = new FileInputStream(f);

Reader reader = new InputStreamReader(fis);

 

char[] buffer = new char[100];

int readCharNum = reader.read(buffer);

 

reader.close();

 

String data = new String(buffer, 0, readCharNum); //char 배열에서 읽은 수만큼 문자열로 변환

return data;

 

 

 

 

 

}

}




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ





# 톰캣 오류시 (클린과 클린톰캣 디렉토리 눌러주기)









ㅡㅡㅡ

 

EL

JST

사용자 정의태그











#사용하려면 이렇게 다운받아서 넣어줘야합니다.











●구구단 

jstltest 폴더에 

core1.jsp 생성

gugudan.jsp 생성






<%@ 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>

<form action="gugudan.jsp" method="post">

<h2>숫자 : <input type="text" name="number"></h2>

<h2><input type="submit" name="전송"></h2>

</form>

</body>

</html>






ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

  

  

   <%--

  

    core 라이브러리

    <c:if test="조건" [var="결과 변수"] [scope="{page | request | session | application}"] >

    조건이 참인 경우 출력되는 부분

   

    </c:if>

   

    scope는

    page : 현재 page범위

    request : request 객체 범위

    session : sever와 내페이지 섹션아이디를 공유합니다.(다시로그인 안하고 쓸수있게 합니다.)

    session동안에 살아남아있게 하겠습니다.

    application : 응용프로그램, 이 프로그램이 살아있는 동안에. 닫으면 없어지겠습니다.

  

    ex) <c:if test="${msg == 'user1'}" var="result">

    ${result}

    </c:if>

   

   

   <c:forEach [var="참조객체"] [varStatus="상태정보변수"] begin="시작" end="종료" [step="반복 단계 증가 값, 1이 기본"]

    반복 출력문

   </c:forEach>

   ex) 회원이름과 이메일을 반복하여 출력

    - members 는 이전 페이지에서 전달된 리스트 객체로 가정, m리스트 아이템이 하나씩 전달됨

    - status 객체를 통해 index, 횟수 참조

   

    <c:forEach var="m" items="${members}" begin=0 end="5" varStaus ="status">

    index : ${status.index} <br>

    count : ${status.count} <br>

    name : ${m.name} <br>

   

   

  

  

  

  

    --%>

   

   

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  

  

  

  

  

  

  

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<style>

td{

width: 120px;

height: 50px;

line-height: 50px;

text-align: center;

}

</style>

</head>

<body>

<%

String number = request.getParameter("number");

int num = Integer.parseInt(number); //문자열이기 때문에, 숫자로 바꾸어준다.

%>

<!-- when으로 뽑기  -->

<c:set var="number" value="<%=num%>" />

<c:if test="${number % 2 == 0}">

${"짝수"}

</c:if>

 

<c:if test="${number % 2 == 1}">

${"홀수"}

</c:if>

<br>

<hr>

<br>

<!-- if으로 뽑기  -->

<c:choose>

<c:when test="${number % 2 == 0 }">

<c:out value="${number }" />은 짝수입니다.

</c:when>

<c:when test="${number % 2 == 1 }">

<c:out value="${number }" />은 홀수입니다.

</c:when>

<c:otherwise>

숫자가 아닙니다.

</c:otherwise>

 

</c:choose>

<br>

<hr>

<br>

 

<!-- forEach 2중포문 -->

<h2>구구단</h2>

<table border="1">

<c:forEach var="i" begin="2" end="9">

<tr>

<c:forEach var="j" begin="1" end="9">

<td> ${i } * ${j } = ${ i*j } </td>

</c:forEach>

</tr>

</c:forEach>

 

</table>

</body>

</html>




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



#

html에 

 

서블릿은 자바코드안에다가, html태그를 집어넣는 것

서블릿은 자바코드로 작성한다. 자바클래스파일




DAO에서 전부처리한다.

sql문을 메소드로 처리한다.




java resources - serverexam패키지 생성 - MyfirstServlet생성










미리만들어줄려고 체크하라고 하는 것입니다.



init

destroy

getServletConfig

getServletInfo

service

 

doGet : doGet, doPost 서로호출하기에 같다고보면됩니다.(service이용해서

doPost : 서블릿관 상관없이 클라이언트 요청을 실행(service이용해서 처리

doPut : 

doDelete

doHead

doOptions

doTrace

 

이렇게 나옵니다.

 

그래서 보통 doGet이나 do Post 둘중하나만 작성합니다.

 






● 계산기만들기

calculatorViewForm.jsp

CalculatorServlet




calculatorViewForm.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>

<form action="/shopdb/calc" method="get" name="calcForm">

<input type="text" name="number1">

<select name="selectOption">

<option> + </option>

<option> - </option>

<option> * </option>

<option> / </option>

</select>

<input type="text" name="number2"> <br>

<input type="submit" name="계산하기">

<input type="reset" name="다시입력">

 

 

 

</form>

</body>

</html>




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

CalculatorServlet

 

package servletexam;

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("/calc")

public class CalculatorServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

     

   public CalculatorServlet() {

       super();

   }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//1. 요청 처리

int number1 = Integer.parseInt(request.getParameter("number1")); //들어올떄 문자열

int number2 = Integer.parseInt(request.getParameter("number2")); //들어올떄 문자열

String selectOption = request.getParameter("selectOption");

 

int result = 0; // 계산 결과 double result = 0.0, long result=0L;

 

switch(selectOption) {

case "+" : result = number1 + number2; break;

case "-" : result = number1 - number2; break;

case "*" : result = number1 * number2; break;

case "/" : result = number1 / number2; break;

}

 

 

 

 

//2. 응답 처리

//2.1 한글 처리

response.setContentType("text/html; charset=UTF-8");

 

//2.2 출력 스트림과 html 태그를 이용해 출력

PrintWriter out = response.getWriter();

 

out.append("<h1>계산 결과 </h1>")

.append("<hr>")

.append("<h2> 결과 : " + result + "</h2>");

 

 

out.close();

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}





서블릿 : 자바로 만들어진 프로그램을 웹서버에서 실행하기 위해 만들어진 기술

   데이터베이스 연동, 외부 서비스 연동을 통해 정적인 웹에 동적인 정보 제공하는 기능

   순수 자바코드로 작성

   단독으로 실행할 수 없고 서블릿 컨테이너를 통해서 실행

 

서블릿의 생명 주기

   서블릿은 컨테이너 의해 동작하므로 객체의 생성 과정과 종료 과정도 컨테이너 안에서 이루어짐

 

   사용자 url 요청에 따라 서블릿 실행(서블릿이 메모리에 있는지 확인)

      메모리에 없으면 init() 메소드 호출 메모리에 있으면 service()메소드 호출

    -> init() : 서블릿 초기화, 초기에 한번만 실행됨, 생략 가능

 

    -> service()          : 스레드를 통해 동시에 실행, 요청/응답

      doGet()

      doPost()

 

   -> destroy() : 서블릿 종료, 종료할 때 한번만 실행