반응형

톰캣 (WAS)

tcp/ip 소켓 연결관리, http 프로토콜 해석 등 프로그래머가 웹 구현을 쉽게할 수 있도록 기능을 제공해준다.

또한 서블릿 컨테이너를 관리한다.

 

서블릿, 스레드를 관리한다.

스레드로 URL 요청에 맞는 서블릿을 실행시킨다.

URL를 보고 해당되는 서블릿의 service()를 호출 

* 스프링에서의 동작은 URL을 단순히 Dispatcher Servlet에게 전부 준다.


 

서블릿

 

톰캣은 HttpServlet 을 상속한 servlet들을 알아보고 관리한다. (HttpServletRequest, HttpServletResponse)도 생성해준다.

extends HttpServlet

service()

 

service()에서 get, post를 처리해주던지, service()이후에 doGet(), doPost()를 정의

service()를 정의하지않고, doGet(), doPost()만 해주어도 가능하다. (HttpServlet) 상위에서 실행된다.

 

 


 

필터

서블릿 이전에 동작

 

[before servlet]

chain.doFilter(req, res) // 서블릿 동작

[after servlet]

 

@WebFilter("/")

 

 

 


 

JSP(jasper)

 

서블릿에서 동적인 html 페이지를 만들기 어려워서 등장한 것이 jsp

jsp도 서블릿을 상속받은 서블릿 구현체이다.

 

서블릿에서 html을 만들어서 writer로 응답해줄 수 있다.

request.setCharacterEncoding("UTF-8"); // 톰캣 인코딩
response.setCharacterEncoding("UTF-8"); // 인코딩
response.setContentType("text/html; UTF-8"); // 브라우저 디코딩

 

PrintWriter pw = response.getWriter();

pw.println(" html문서 작성하기 <br> ");
pw.println(" html 문서 제목 : html ");

 

Servlet에서 html코드를 작성하면

pw.println을 라인마다 전부 작성해줘야 하기 때문에 불편하다.

 


 

 

<%@ %> - 지시 블럭 (가장 먼저 설정됨)

<%! %> - 전역

<% %> - service() 내부

<%= %> - 출력을 위해 사용

 

JSP 위치

web-inf (비공개로 클라이언트가 바로 요청 불가능)

 

매핑

web. xml ==>  servlet mapping으로 url 패턴에 맞게 servlet class 를 호출 [WAS가 URL에 맞는 매핑을 찾아서 호출]

어노테이션 ===>  @WebServlet()

 


 

model 1 (JSP 한페이지에서 MVC를 물리적으로 나누는 방식)

 

[Controller]  jsp 위쪽은 자바코드 입력과 제어를 처리, model에 데이터를 저장

         ▼

   [Model]  자바코드를 통해 동적으로 보일 데이터

         ▼

    [View]  jsp 아래쪽은 html + model 데이터를 출력

 

 

 

model 2 (MVC를 servlet, JSP 로 분리)

 

[Controller]  실질적인 매핑 servlet은 하나만 만들고 Contoller(데이터 제어)는 pojo로 구현 ===> dispatcherServlet

         ▼

   [Model]  request 객체를 이용하여 저장, 전달

         ▼

    [View]  jsp는 제어 코드가 없는 view에 집중

 

 


 

 

Forward Redirect

Servlet에서 Servlet으로 이동하는 방식

 

(1) forward ==> request, response 객체를 공유함

사용자가 요청한 정보가 응답페이지에서도 유효하다.

새로고침 시 같은 정보가 계속 생성될 위험. 데이터 생성 서블릿을 한번 더 수행함 

URL이 바뀌지 않는다.

* request.getRequestDispatcher("webapp 이하 경로").forward(request, response)

 

(2) redirect ==> request, response 객체가 새로 생성됨

request, response 객체가 새로 생성됐기 때문에 새로고침을 해도 최초의 생성하는 request가 소멸되어 동작하지 않음

URL를 redirect URL로 바꾼다. 서버에 여러번 요청하게 된다.

* request.sendRedirect("location") 

 

 

https://mangkyu.tistory.com/51

 

[Web] Forward와 Redirect 차이

웹은 현재 작업중인 페이지에서 다른 페이지로 이동하기 위해 2가지 페이지 전환 기능을 제공합니다. 오늘은 2가지의 페이지 전환 방법의 차이와 사용법에 대해 알아보도록 하겠습니다. 1. Forward

mangkyu.tistory.com

 


 

 

EL (EL 태그는 값과 연산자를 사용할 수 있지만, 반복문같은 작업은 불가능)

request.getAttribute("data") ===> ${data}

List, Array ===> ${data[0]}

Map ===> ${data.key}

 

EL 태그 내부에서 연산자도 사용할 수 있다.

 

데이터 저장 4가지 방법

EL 데이터 명에 맞는 데이터를  page --> request --> session --> application 순으로 찾는다.

데이터 명이 겹칠 때 데이터명이 존재하면 그 값을 사용, 더 이상 찾지 않는다.

겹치게 될 경우 ${pageScope.data} ... Scope 를 붙여서 사용

 

dto를 이용할 경우

dto 객체의 getXXX() 메서드를 이용해서 값을 가져온다.

${dto.xxx}

 


 

JSTL

반복문을 사용할 수 있게 한다.

HTML이 JSTL문법인 것을 인지하도록 태그를 써줘야 한다.

 

속성

forEach

var - items의 변수

items - servlet 통해 가져온 데이터

varStatus - 상대값을 활용할 수 있다. 

 

https://postitforhooney.tistory.com/entry/JSPJSTL-JSTL-foreach%EC%97%90%EC%84%9C%EC%9D%98-varStatus-%EC%86%8D%EC%84%B1-%EC%9D%B4%EC%9A%A9

 

[JSP/JSTL] JSTL, foreach에서의 varStatus 속성 이용

JSTL : foreach에서의 varStatus 속성 태그 상태 속성 입니다. 속성을 이용해서 제어하면 좀더 쉽게 제어할수있습니다. ${status.current}      <!– 현재 아이템 –> ${status.index}      <!– 0부터..

postitforhooney.tistory.com

 

 

forTokens

delim - 구분자를 넣어줄 수 있다.

 

 

format

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

LocalDateTime format

<fmt:parseDate value="${ time }" pattern="yyyy-MM-dd" var="parsedDateTime" type="both" />
<fmt:formatDate pattern="yyyy-MM-dd" value="${parsedDateTime}"></fmt:formatDate>

number format

<fmt:formatNumber pattern="###.0000##" value="123.33"/>

 

 

functions

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

${ fn:toUpperCase(value) }

 

 


 

비즈니스 레이어

 

Controller : URL 에 맞는 Service 매칭

Service : 업무서비스 Transaction

Repository : DB CRUD

 

 


 

POST 요청으로 여러값을 받을 때 배열로 받는다.

[] = request.getParameterValues(" name ");

 

하나의 form에 버튼이 여러개일때

request.getParameter(" btn name ");

button value로 분리해서 처리

 

 


파일업로드

 

html

인코딩 방식 변경 enctype = " multipart/form-data "  // 파트를 나눠서 받는다. 문자는 문자로, 파일은 파일로

 

Servlet도 멀티파트로 변경한다.

@MultipartConfig(

location = "/tmp",  // 임시 저장 디스크

fileSizeThreshold = 1024*1024,  // 1MB 이상이면 디스크 사용

maxFileSize = 1024*1024*5,  // 하나의 파일 사이즈 제한

maxRequestSize = 1024*1024*5*5   // 전체 파일 사이즈 제한

)

 

Part filePart = request.getPart(" file 지정 name ")  // 파일을 받는 Part를 얻는다.

InputStream is = filetPart.getInputStream() // 얻은 filePart를 InputStream에 담는다. 

 

저장할 경로 생성

상대경로로 물리경로 얻기request.getServletContext().getRealPath("/upload")

FileOutputStream fos = new FileOutputStream (경로);

 

byte[] buf = new byte(1024);

int size = 0;

while( (size = is.read(buf) ) != -1)   // 읽을게 없으면 -1 반환

   fos.write(buf , 0 , size);

 

is.close()

fos.clos()

 

 

 

 

 


JSP

${   }

4가지 영역

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=milkoon1&logNo=220860106284 

 

[IT지식] JSP 속성변수(pageContext, request, session, application)들의 참조 범위

JSP 영역이란? 한개 이상의 JSP가 모인 그룹을 뜻한다 영역의 종류는 [ PageContext / Request / ...

blog.naver.com

 

 

 

 

 

 

 

 

반응형

'프로그래밍 > Servlet \ JSP' 카테고리의 다른 글

WAS의 역할과 JSP, 서블릿 개념  (0) 2022.05.06
반응형

WAS

톰캣이다.

톰캣은 Java servlet을 관리한다.

 

톰캣외에도 WAS가 있지만 톰캣을 가장 많이 사용

 

 

역할

통신지원

멀티 스레드 관리

서블릿 생명주기 관리

세션 관리

 

동작방식

Request, Response 객체 생성 -> servlet에게 전달 /스프링/ spring dispatcher servlet 

 

 

 

용어 정리

 

✔ Socket

IP + Port

HTTP도 Socket을 사용함, Web Socket 통신이 아닐뿐임

 

✔ HTTP 통신

요청에 대한 응답을 주고 바로 통신을 해제

TCP 위에서 보편적으로 사용, UDP 위에서도 사용가능함 (Youtube QUIC)

 

✔ Web Socket 통신

HTTP와 달리 통신을 유지하며 실시간 통신 지원

처음 요청시 HTTP Get 으로 Upgrade:web socket 헤더를 추가하여 보냄

 

 

 

 Web Server

HTTP, HTTPS 통신을 위해 Server는 (IP + 80번, 443번)으로 socket 생성

정적인 데이터를 응답

 

✔ Web Container == Servlet Container

웹 컨테이너는  자바 서블릿과 상호작용한다.

동적인 처리를 위한 Servlet들이 모인 Container, JAVA에서는 동적 처리로 Servlet을 이용한다.

클라이언트의 URL에 맞는 Servlet을 매핑

(스프링에서는 Dispatcher Servlet 하나의 Servlet으로 URL에 맞는 Controller를 Handler Mapping)

 

  • 서블릿 객체의 생명주기 담당
  • 싱글톤 패턴으로 관리
  • 멀티 스레딩 지원

 

 

✔ Web Container Server == Web Application Server(WAS)

Web Container + Web Server

요청에 대한 동적인 데이터를 처리하여 응답

WAS에도 Web Server가 존재하지만 보안, 로드밸런싱, 정적데이터 처리를 위해 Web Server를 앞단에 하나 더 둠

 

 

 

 

 


JSP 라이프 사이클

 

  1.  클라이언트가 URI로 JSP 파일을 서버에 요청
  2.  톰캣이 서버에 해당 JSP 파일이 있다면 JSP파일 -> JAVA파일 -> JAVA파일 컴파일 -> 서버 메모리에 로드
  3.  init() 메서드 호출 -> service() 메서드 호출 -> HTTP response 로 응답

 

(jsp)자바파일의 변경이 없다면 -> 기존 메모리에 있는 instance service()로 바로 응답

(jsp)자바파일의 변경이 있다면 -> 기존 instance destroy() 메모리 해제 -> instance 새로 생성 -> init() -> service()

 

톰캣이 jsp 파일을 servlet instance로 만들어서 요청에대한 응답을 한다.

 


 

작성한 jsp 파일

 

 


 

톰캣이 생성한 jsp 파일.java

service() 메서드 일부

 

 

톰캣이 작성된 jsp 파일을 java class(servlet)으로 변환하고, service()메서드를 통해 요청을 처리한 후 응답한다.

 


Servlet

 

HTTP 의 request 를 처리하고 response를 돌려주는 동적인 처리를 위한 자바 기술

 

톰캣이 jsp를 class로 만들고 이 class는 요청을 처리하므로 사실 jsp는 servlet이다.

 - jsp보다 servlet이 먼저 등장했으며, servlet에서의 html 처리가 불편하여 jsp가 등장

 - jsp는 서버에서 데이터를 렌더링하여 html을 만들어서 전달하므로 Server Side Rendering(SSR)이라 한다.

 - 클라이언트에서 데이터를 받아 처리하는 것은 Client Side Rendering(CSR) - Vue, React

 

jsp를 이용하지 않고 직접 servlet에 HTML을 작성할 수도 있다.

 - 직접 작성한 servlet을 이용하게 되면 클라이언트의 요청을 jsp를 거치지 않고 servlet이 직접 받을 수 있다.

 

jsp파일은 view에 집중할 수 있게 되고,

작성한 servlet은 요청에 대한 로직을 처리하는 controller 역할만을 하게되어

jsp파일 내에서 혼합되어 처리되던 html코드와 자바 로직 코드 부분을 분리시켜 MVC 패턴을 적용시킬 수 있다.

 


 

Dispatcher Servlet

 

URL를 통해 서버에 요청이 오면 매핑된 servlet이 해당 요청을 받아준다.

이러한 요청에 맞는 servlet들을 일일이 작성해주어야 했는데 이 부분을 한곳에서 관리하고자 front controller라는 개념이 등장했다.

front controller는 한곳에서 URL과 controller를 매핑해주며, 요청에 위임할 controller에게 다시 요청한다.

spring framework은 dispatcher servlet으로 MVC패턴을 쉽게 구현할 수 있게 틀을 제공해준다.

 


 

클라이언트가 서버에게 HTTP 요청을 하면

 

요청을 받게되면 Servlet Container가 HttpServletReqeust, HttpServletResponse 객체 생성

Dispatcher Servlet으로 해당 URL에 맞는 Controller를 찾아서 비즈니스 로직 수행

이때 Controller에서 HttpServletReqeust의 값을 이용하여 로직 처리

View Resolver로 해당 view를 찾아 HttpServletReqeust, HttpServletResponse에 결과를 View에 렌더링한 후 HTTP header, body 응답

 

 

 

 

 


참고

 

https://www.theserverside.com/feature/Understanding-How-the-Application-Servers-Web-Container-Works

 

Understanding How the Application Server's Web Container Works

To understand how to do proper application server development, you need to understand how the two basic containers of an application server work, namely the Web container and the EJB container. This article will take a look at how a client application inte

www.theserverside.com

 

반응형

'프로그래밍 > Servlet \ JSP' 카테고리의 다른 글

서블릿/JSP  (0) 2022.07.19

+ Recent posts