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가 상태정보를 저장하지 않기 때문에, 저장소가 필요하다.
Key Value
속성1 속성값
속성2 속성값
... ...
범위에 따라 4개의 저장소(Map형태)를 제공함.


속성관련 메서드
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

공통적인 요청 전처리와 응답 처리후에 사용. 로깅, 인코딩 등

필터가 여러개일수도 있다.

 

 

 

 

 

 

 


참고 :

남궁성, 스프링의 정석

+ Recent posts