톰캣 (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
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 - 상대값을 활용할 수 있다.
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
'프로그래밍 > Servlet \ JSP' 카테고리의 다른 글
WAS의 역할과 JSP, 서블릿 개념 (0) | 2022.05.06 |
---|