1. Servlet과 Controller의 비교
Jsp & Servlet(DispatcherServlet)거의같음 >>> 발전 >>> Spring
Servlet을 발전시킨게 Spring( Servlet을 이용해서 동작함 )
Servlet Controller 1 @WebServlet 어노테이션은 클래스앞에
= ( Spring의 @Controller + @RequestMapping)
즉, 클래스를 여러개 만들어야함;클래스앞에 @Controller
메서드앞에 @RequestMapping 사용
클래스안에 새 메서드 만들면 맵핑 추가로가능함.2 자바는 단일상속인데, HttpServlet을 고정으로 상속받아야함 상속x , 자유로움 3 메서드이름 고정 = Service 4 Service메서드의 매개변수 고정 ( request, response ) 매개변수 필요하는 것만 작성하면도미
2. Servlet의 생명주기
서블릿의 메서드
메서드 내용 기타 1 init() 서블릿이 생성시, 초기화를 위해 사용 초기화 2 service(HttpServlet request, HttpServlet reponse) 실제작업을 하는 메서드 처리 3 destroy() 서블릿이 제거될 때 사용
(한 번만 수행됨)뒷정리
3. JSP(Java Server Page) 란?
JSP : HTML 안에 Java코드가 있는 것
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>
4. JSP와 Servlet비교
1 | 값출력시 | <%= 값 %> |
2 | 메서드영역 | <% service() 메서드영역 %> |
3 | 클래스영역 ( iv, cv 선언 ) | <%! 클래스영역 %> |
5. JSP의 호출과정
서블릿 : 처음 호출시 시간지연발생 lazyInit() → 개선 → 스프링 : early-init을 함
JSP에는 기본객체가 있어, 생성없이 사용할수 있는 객체가있다.
( service() 메서드 내 지역변수로 선언이 되어있다. request, response, session, config, out, page...)
Servlet | Spring | |
초기화 | lazy-Init() 처음호출시 시간지연 발생 요청이 올때 초기화 |
early-Init() 요청이 오지않아도, 미리객체를 만들어두고 초기화 |
기타 | 싱글톤(1개의 인스턴스만 만들어짐) |
6. JSP와 서블릿으로 변환된 JSP의 비교 ( 4번내용과비슷)
7. JSP의 기본객체
JSP에는 기본객체가 있어, 생성없이 사용할수 있는 객체가있다.
( service() 메서드 내 지역변수로 선언이 되어있다. request, response, session, config, out, page...)
8. 유효범위(scope)와 속성(attribute)
HTTP의 특징 : 상태정보 저장X (stateless), 반대표현은 <> 상태정보 저장 O (statefal)
HTTP가 상태정보를 저장하지 않기 때문에, 저장소가 필요하다.
범위에 따라 4개의 저장소(Map형태)를 제공함.
Key Value 속성1 속성값 속성2 속성값 ... ...
속성관련 메서드 1 void setAttribute(String name, Object value) 저장 (쓰기) 2 object getAttribute(String name) 읽기 3 void removeAttribute(String name) 삭제 4 Enumberation getAttributeNames() 기본객체에 저장된모든 속성이름 읽기
기본객체
저장소 설명 유효범위 생존기간 1 pageContext
: lv(기본객체)를저장 (기본객체? request, response ... )
pageContext내 에서만 접근(읽기,쓰기) 가능
(EL은 lv에 직접접근X, pageContext에 저장한것만
EL사용O)
즉, pageContext저장소를 거쳐서 사용해야함.
EL 때문에사용1개의
JSP페이지요청할 때마다 초기화
jsp페이지의
시작~끝request 다른 JSP로 전달 가능. 요청마다 1개 1개 이상의
JSP페이지요청 시작~응답 3 session
클라이언트마다 1:1 관계의 개별저장소
사용자만 사용하는 개별정보를 담는다( id, 장바구니...)
사용자마다 개별저장소 1개이기 때문에,
서버 메모리부담이 크므로 최소한의data만 담도록 함
(session은 쿠키를 이용해서 session이 어느 클라이언트껀지 연결함)n개의
JSP페이지에서
접근가능로그인~로그아웃 4 application
공통저장소. context마다 1개
어디서나 접근가능
프로그램 전체에서 사용하는 데이터를 담는다context 전체 WebApp
시작~종료
9. URL패턴
@ WebServlet(urlPatterns={"/hello", "/hello/*"}, loadOnStartup=1)
@ WebServlet("/hello")
public class HelloServlet extends HttpServlet{
우선순위 | 종류 | URL 패턴 | 매칭 url |
1 | exact mapping (정확한것만 맵핑) | /login/hello.do | http://localhost/ch2/login/hello.do |
2 | path mapping (경로맵핑) | /login/* | http://localhost/ch2/login/ http://localhost/ch2/login/hello http://localhost/ch2/login/hello.do http://localhost/ch2/login/test/ |
3 | extension mapping (확장자 맵핑) | *.do | http://localhost/ch2/hi.do http://localhost/ch2/login/hello.do |
4 | default mapping | / (모든주소와맵핑) | http://localhost/ch2/ http://localhost/ch2/hello.do http://localhost/ch2/login/ http://localhost/ch2/login/hello http://localhost/ch2/login/hello.do |
10. EL (Expression Language)
<%= 값 %> → ${값} 간단하고, 편리하게 사용
11. JSTL (JSP Standard Tag Library)
<%= 값 %> 쓰는걸 간편히하기위해서 JSTL 사용
<c:if> = if 문
<c:choose> = if ~else 문
<c:when>
< c:otherwise>
</c:choose>
코드 설명 1 <c:if> ~ </c:if> if문 2 <c:choose>
<c:when> ~ </c:when>
<c:otherwise> ~ </c:otherwise>
</c:choose>if ~else 문 <c:foreach> for <c:set var="to" value="10"/> to라는 변수를 10으로 셋팅 ( EL은 lv를 사용못함 ) ${param.msg}
<c:out value="${param.msg}"/> /주소표시줄 파라미터를 ?~ 이하태그를 그대로 찍어준다. (해석x)
out은 주소표시줄 파라미터를 ?~ 이하태그를 찍어준다. (해석O)
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>JSTL</title>
</head>
<body>
<c:set var="to" value="10"/> // to라는 변수를 10으로 셋팅 ( EL은 lv를 사용못함 )
<c:set var="arr" value="10,20,30,40,50,60,70"/>
<c:forEach var="i" begin="1" end="${to}">
${i}
</c:forEach>
<br>
<c:if test="${not empty arr}">
<c:forEach var="elem" items="${arr}" varStatus="status">
//status에는 conunt(1~), index(0~)멤버를 가지고있음
${status.count}. arr[${status.index}]=${elem}<BR>
</c:forEach>
</c:if>
<c:if test="${param.msg != null}">
msg=${param.msg} // out은 주소표시줄 ?~ 이하태그를 찍어준다. (해석O)
msg=<c:out value="${param.msg}"/> // out은 주소표시줄 ?~ 이하태그를 그대로 찍어준다. (해석x)
</c:if>
<br>
<c:if test="${param.msg == null}">메시지가 없습니다.<br></c:if>
<c:set var="age" value="${param.age}"/>
<c:choose>
<c:when test="${age >= 19}">성인입니다.</c:when>
<c:when test="${0 <= age && age < 19}">성인이 아닙니다.</c:when>
<c:otherwise>값이 유효하지 않습니다.</c:otherwise>
</c:choose>
<br>
<c:set var="now" value="<%=new java.util.Date() %>"/>
Server time is <fmt:formatDate value="${now}" type="both" pattern="yyyy/MM/dd HH:mm:ss"/>
</body>
</html>
12. Filter
공통적인 요청 전처리와 응답 처리후에 사용. 로깅, 인코딩 등
필터가 여러개일수도 있다.
참고 :
남궁성, 스프링의 정석
'Spring의 정석' 카테고리의 다른 글
SpringMVC 7 ( @GetMapping, @PostMapping, redirect, forward) (0) | 2023.03.12 |
---|---|
SpringMVC 6 (@RequestParam, @ModelAttribu) (0) | 2023.03.11 |
SpringMVC 4 ( 관심사의분리, MVC패턴 ) (0) | 2023.03.06 |
SpringMVC 3 (HTTP 요청과 응답) (0) | 2023.03.05 |
SpringMVC 2 (클라이언트와 서버) (0) | 2023.03.04 |