반응형

톰캣 (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

+ Recent posts