티스토리 뷰
※ Dynamic web project를 생성할 때 알아야 할 것들
▶ Dynamic web module version 4.0 -> servlet 버전을 의미한다.
실제 운영될 서버 WAS의 버전을 알아내서 프로젝트를 생성 시 버전을 선택해야 한다.
- servlet 버전이 결정되면 JSP 버전이 자동으로 결정된다.
(Java Servlet 4.0 && JavaServer Pages 2.3)
tomcat.apache.org/whichversion.html
▶ web.xml을 배치 기술자(deployment descriptor) 라고 한다.
위치는 WebContent밑에 있는 WEB-INF 밑에 있다.
프로그래머가 개발한 프로젝트(여러 resources)가 하나의 산출물로 만들어지는데 그것이 .war 이다.
산출물로 .war 압출파일을 생성하고 운영 서버에 올려서 서비스 되도록하는 것을 배치(deployment)라고 한다.
결론적으로, 운영 서버는 web.xml의 내용대로 웹어플리케이션을 실행시킨다.
▶ WEB-INF 안에 있는 lib 폴더가 의미하는 것은?
- 외부 라이브러리를 넣는다. , xx.jar (jar안에는 class 파일들이 있다.)
★ 개발할 때 프로젝트 구조와 .war로 산출물이 만들어졌을 때 구조는 다르다 !!
✔️ 구조가 중요한 이유는 브라우저에서 WEB-INF 폴더 안에 있는 리소스들은 접근할 수 없다.
✔️ WEB-INF는 내부에서 사용할 파일들만 있다. 이미지 파일이나 정적 파일들은 외부에서 접근 가능하게 하려면 여기에 두면 안된다.
✔️ Java Resources 폴더에 있던 .java 파일들은 사라지고, 대신에 컴파일된 .class 파일들이 WEB-INF안의 classes 폴더안에 생성된다.
즉, Web Browser는 WEB-INF 바깥에 있는 것들만 url로 접근 가능하다.
✔️ 프로젝트를 가지고 WebApplication(.war)로 변환한 다음 -> WAS(tomcat)에서 실행시켜야한다.
✔️ 프로젝트를 Export해서 .war 산출물을 생성하면, 프로그래머가 작성한 코드가 WEB-INF 밑에 classes폴더가 생기고,
그 안에 class 파일이 WAS에서 실행되는 것이다.
※ Servlet 생성
- 생성할 때 Url Mapping도 지정할 수 있다.
▶ 1. HttpServlet을 상속받아야 한다. (중요)
▶ 2. service(HttpServletRequest req, HttpServletResponse res) 메소드를 재정의한다.
@WebServlet("/Servlet01")
public class Servlet01 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
System.out.println("Servlet01 - service() 실행 ");
// 요청 내용을 확인
System.out.println("클라이언트 IP: " + req.getRemoteHost()); // 누가 나한테 요청했는지
// 요청 처리
// [방법 1] 응답 내용을 생성 및 전송
// res.setContentType("text/html; charset:UTF-8");
// PrintWriter writer = res.getWriter();
// writer.println("<html>");
// writer.println("<head></head>");
// writer.println("<body>Servlet01<hr/></body>");
// writer.println("</html>");
// writer.flush();
// writer.close();
// [방법 2] 응답 내용을 생성 및 전송 - 응답 내용을 jsp로 작성
RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/views/view01.jsp");
rd.forward(req, res);
// Servlet에서 응답을 생성하는 것이 아니라, jsp에서 응답내용을 만들어내서 전송하겠다.
}
}
✔️ Brower가 WAS(Tomcat)에 URL로 요청을 하게 되면, WAS는 항상 2개(요청,응답)의 객체를 만들고, 이 객체를 서블릿에 넘겨준다.
▶ 1. HttpServletRequest 객체
- 요청 내용을 확인
- 요청 처리
(-> Servlet은 Controller에게 요청 내용을 위임함)
▶ 2. HttpServletResponse 객체
- 응답 내용을 생성
- 응답 내용을 전송 (forward(req, res))
(-> Servlet은 .jsp파일로 응답 내용을 생성하게 함, 응답을 전송하는 건 RequestDispatcher 객체가 가진 forward()메소드)
※ JSP - Servlet에서 나온 기술, 응답 내용을 작성
▶ JSP의 구성 요소
주의) JSP는 <!-- --> 태그 주석은 응답 내용에 포함시키기 때문에, 응답내용에 포함하지 않는 <%-- --%> 을 이용해야 한다.
1. page 지시자 : 해당 page 에 대한 설명
<%--page 지시자 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
language="java" - 일반적으로 생략
charset은 웹 브라우저에게 보여지는 형식을 의미하고, pageEncoding은 자신의 컴퓨터, 즉 H/D에 저장하는 형식을 의미한다.
그래서 pageEncoding은 일반적으로 생략 가능하다.
- @WebServlet 어노테이션은 url을 의미하고, 이것을 표시하지 않으면 web.xml에 따로 작성을 해주어야 한다.
- Spring Framework에서는 이미 dispatcherServlet이라는 서블릿을 제공하고있다.
이미 존재하는 서블릿을 이용하려면 따로 개발자가 web.xml에서 지정하는 방법을 알아야한다.
[예시]
<servlet>
<servlet-name>Servlet02</servlet-name>
<servlet-class>com.mycompany.webapp.servlet.Servlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet02</servlet-name>
<url-pattern>/Servlet02</url-pattern>
</servlet-mapping>
※ Controller - Servlet에서 요청 내용을 확인하고 처리하는 코드를 분리(위임)시키기 위함
[Servlet이 요청을 받아서 응답을 전송하는 순서]
1. Servlet이 요청을 받아서 컨트롤러에게 넘긴다.
2. 컨트롤러가 요청을 처리하고 (응답을 넘겨줄) 뷰 이름을 리턴한다.
// 컨트롤러 생성 및 요청 처리 메소드 호출
Controller05 ctr = new Controller05();
String viewName = ctr.getBoardList(request, response);
3. servlet이 해당 뷰이름의 jsp에서 응답내용(html)을 생성해서 클라이언트에게 전송한다.
(3번 과정 코드 => RequestDispatcher 객체.forward(request, response))
// 응답 내용을 생성 및 전송 - 응답 내용을 jsp로 작성
// Servlet에서 응답을 생성하는 것이 아니라, jsp에서 응답내용을 만들어내서 전송하겠다.
String prefix = "/WEB-INF/views/";
String suffix = ".jsp";
// 컨트롤러에게 뷰 이름 선택 권한을 넘겨주었다.
RequestDispatcher rd = request.getRequestDispatcher(prefix + viewName + suffix);
rd.forward(request, response);
즉, 서블릿은 외부에서 요청이 들어오면 어떤 컨트롤러에게 요청을 위임할 것인지 결정하고,
어떤 뷰로 응답 내용을 만들어서 응답을 전송할지 뷰를 결정한다.
▶ 이렇게 서블릿이 요청과 응답을 위임하게 되면 서블릿은 하나만 있어도 된다. => Spring Framework 방식
'Web > Spring' 카테고리의 다른 글
[Spring] 스프링 시큐리티 구조 - 1 (0) | 2021.04.21 |
---|---|
[Spring] Cookie / Session (0) | 2021.03.29 |
[Spring] ORM vs MyBatis / SqlSessionTemplate (0) | 2021.03.28 |
[Spring] WebApplicationContext / ConnectionPool (0) | 2021.03.28 |
[Spring] Spring Legacy Project 설정 / Maven(빌드툴) / Log4j (0) | 2021.03.16 |
- Total
- Today
- Yesterday
- 백준
- jdk
- 클래스와객체
- sequelize.fn
- 자바빌드도구
- os
- ES6
- 사용자정의예외클래스
- 자바스크립트Call-back
- @functools.singledispatch
- java
- es6모듈
- 생성자필드메소드
- dynamic-project
- 익명자식객체
- 자바스크립트Promise
- nunjucks
- 메이븐 저장소
- nodejs
- 백준2206 파이썬 풀이
- 객체지향개념
- jre
- @functools.lru_cache
- yarn start
- 정적멤버
- @functools.wraps
- Git
- method와 function
- 자바스레드
- 인스턴스멤버
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |