2024. 7. 13. 00:06ㆍWebBack/Spring
JSP 작성하기
[src] -> [main] -> [webapp]에 들어가 폴더를 우클릭하여 [new] -> [other]을 클릭한다.
그리고 jsp를 검색하면 JSP File이 나온다. 이를 통해 JSP 파일을 만들어주면 된다.
코드는 다음과 같이 입력한다. 참고로 %!는 클래스 영역 안으로 들어가고 %는 서비스 영역 안으로 들어간다.
<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.util.Random" %>
<%-- <%! 클래스 영역 %> --%>
<%!
int getRandomInt(int range){
return new Random().nextInt(range)+1;
}
%>
<%-- <% 메서드 영역 - service()의 내부 %> --%>
<%
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
%>
<html>
<head>
<title>twoDice.jsp</title>
</head>
<body>
<img src='resources/img/dice<%=idx1%>.jpg'>
<img src='resources/img/dice<%=idx2%>.jpg'>
</body>
</html>
JSP는 따로 자동으로 맵핑이 되어 따로 할 필요가 없다. 그러면 URL을 어떻게 지정할까? JSP 파일 이름을 적으면 된다. TwoDice.jsp를 입력하니 제대로 작동하는 것을 확인할 수 있다.
파일이 실행되는 과정은?
1. 확장자가 jsp인 요청이 들어오면 JspServlet이 이를 받는다.
2. 그 다음에 서블릿 인스턴스가 있는지 확인한다.
3. 만약, 인스턴트가 없을 시에 jsp파일을 servlet으로 변환하여, 컴파일 한 뒤에 객체를 생성한다. 이 때 초기화 메서드가 실행된다.
4. 객체가 만들어지면 service 메서드를 실행한다. 다시 실행하면 이제 객체 생성없이 바로 service 메서드를 실행하여 응답한다.
전체적인 진행은 서블릿과 마찬가지이다.
저장소
HTTP는 상태를 저장하지 않는다. 그래서 상태를 저장하는 저장소가 4개가 map(key, value) 형태로 데이터를 저장한다.
첫번째는 pageContext로, 지역 변수(lv)를 저장한다. 기본 객체(request, response)도 여기에 저장된다. 페이지 안에서만 접근(읽기, 쓰기)가 가능하다. 요청할 때마다 새로 갱신된다.
두번째는 application으로, WebApp 전체에서 접근이 가능하다(setAttribute, getAttribute). 그래서 서블릿 콘텍스트 전체에서 단 하나만 존재한다.
세번째는 session으로, 개별저장소이다. 클라이언트마다 하나씩 존재한다. 클라이언트가 접근하는 모든 페이지에서 접근 가능하다. 흔히 로그인을 하면 그 내용이 저장되는 곳이다. 사용자 숫자만큼 객체가 생긴다. 그래서 서버 부담으로 인해 최소한의 데이터만 저장한다.
네번째는 request로, 클라이언트가 요청을 할 때마다 하나씩 생긴다. 요청이 처리되는 동안에만 존재하여 부담이 적다. 한 페이지 안에서 사용되는 경우도 있지만, forward를 통해 다른 페이지로 넘겨주는 것도 가능하다. 이 때 request 저장소에 데이터를 저장한다. 정리하면 다음과 같다.
URL 패턴
@WebServlet으로 서블릿을 URl에 매핑할 때 사용한다. 아래처럼 URL은 여러개의 배열로 등록할 수 있다.
@WebServlet(urlPatterns={"/hello", "hello/*"}, loadonStartup=1)
public class HelloServlet extends HttpServlet {
}
패턴 종류는 4가지이다. 번호는 우선순위대로 지정되어 있다. 위에서 차례대로 매칭을 한다.
1. exact mapping(/login/hello.do)
ex) http://localhost/ch2/login/hello/do
2. path mapping(/login/*)
ex) http://localhost/ch2/login/ http://localhost/ch2/login/hello http://localhost/ch2/login/hello.do
3. extension mapping(*.do)
ex) http://localhost/ch2/hi.do http://localhost/ch2/login/hello.do
4.default mapping(모든 주소)
ex) http://localhost/ch2/ http://localhost/ch2/login/hello
클라이언트에서 요청을 하면 서블릿 컨텍스트에서 servletMapping라는 Map에서 URL 패턴을 확인한다. 요청과 일치하는 내용이 있으면 해당 서블릿을 children에서 찾아 처리한다. 스프링에서는 DispatcherServlet으로 처리한다.
[src] -> [main] -> [webapp] -> [WEB-INF] -> web.xml에서 이를 확인할 수 있다.
서버에서 오는 모든 요청을 DispatcherServlet이 받는 것을 확인할 수 있다. [Servers] -> [Tomcat] -> web.xml에서 전체 설정으로 우선순위는 낮은 DefaultServlet도 확인할 수 있다.
EL
JSP에서 사용한 <% =값 %> 대신에 ${값}을 사용하여 편리하게 사용할 수 있다.
//기존
person.getCar().getColor() = <%=person.getCar().getColor()%><br>
//EL
person.getCar().getColor() = ${person.car.color}<br>
'WebBack > Spring' 카테고리의 다른 글
[Spring] RequestParam이란? (0) | 2024.07.14 |
---|---|
[Spring] JSTL를 써보자 (0) | 2024.07.13 |
[Spring] 서블릿의 구조 (0) | 2024.07.12 |
[Spring] 자바 버전을 바꿔보자 (0) | 2024.07.09 |
[Spring] 어떻게 view로 전달이 될까? (0) | 2024.07.09 |