📌 forward VS redirect

  • forward
    - requestDispatch로 지정한 주소로 넘어가긴 하지만 forwarding 할 시, 처음에 요청받은 요청 action 주소로 출력한다.

  • 예시
    - 원래 주소 : 경로/test.jsp
    - 요청 action : test
    - forward 주소 : ./test2.jsp
    - 요청 후 응답 주소 : 경로/test

  • redirect
    - 사용자가 요청한 action 주소로 가긴하지만 사용자의 요청 정보를 다른 jsp페이지로 건낼 수 없다.
    - 서버가 해당 요청을 redirect 할 시, redirect한 주소로 출력된다.(처음 요청 정보는 없어짐)

  • 예시
    - 원래 주소 : 경로/test.jsp
    - 요청 action : test
    - redirect 주소 : ./test2.jsp
    - 요청 후 응답 주소 : 경로/test2.jsp


📌 Servlet 연결 후 Forward

  • forward 이동
    - 처음 요청을 다른 jsp로 건내주는 서버 내부 이동 방법

  • 수행 방법
    1. req.setAttribute("key", value) : 요청 메시지에 데이터를 담는다.
    2. req.getServletContext() : context를 추출한다.
    3. context.getRequestDispatcher("응답 경로") : 응답경로를 지정한다.
    4. dispatcher.forward(req, resp) : req와 resp 메시지를 응답경로로 전달한다.

  • 용어
    - ServletContext : 서블릿의 context를 관리하는 클래스
    - RequestDispatcher : 요청을 전달하는 클래스

  • 형식
req.setAttribute("isSuccess", isSuccess);
ServletContext context = req.getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/member/list.jsp");
dispatcher.forward(req, resp);


📌 Scope(영역)

  • 종류
    - request 영역 : HTTP request 요청 메시지에 담는 영역
    - session 영역 : HTTP session에 담는 영역

  • request
    - 불특정 다수가 요청한 사항에 대해 응답을 해도 연결을 request를 끊지 않아 메모리를 많이 찾이하게 된다.

  • session
    - 불특정 다수가 요청한 사항을 응답하고 바로 연결을 끊는다.
    - 페이지를 나가도 특정 시간동안 세션은 유지된다.
    - 로그인한 페이지는 세션이 남아있는 사용자가 돌아올 시, 쿠키와 세션을 통해 다시 연결한다.


📌 HttpSession

  • HttpSession
    - 개발자가 쿠키 걱정 없이 HttpSession 객체가 내부적으로 알아서 처리한다.
    - 응답을 하더라도 session에 저장된 데이터는 유지된다.
    - request처럼 다른 jsp 페이지로 전달하기 위해 forward에 넣어서 전달하지 않아도 된다.

  • 수행 방법
    1. req.getSession() : request로부터 HttpSession 객체를 가져온다.
    2. session.setAttribute("key", value) : session에 데이터를 저장한다.
    3. session.setMaxInactiveInterval(sec) : 요청을 하지 않을 때 몇 초간 session을 유지할지 지정한다.

  • 형식
HttpSession session=req.getSession();
session.setAttribute("nick", nick);
session.setMaxInactiveInterval(60);
  • session 지우기
    - session.removeAttribute("특정 key") : 특정 key를 삭제한다.
    - session.invalidate() : session에 저장된 전체 key를 삭제한다.


📌 WEB-INF 폴더

  • WEB-INF
    - 사용자가 접근하지 못하는 영역의 폴더
    - 사용자가 주소창에서 입력하여 들어갈 수 있는 폴더가 아니다.
    - servlet의 forward로부터 연결될 수 있는 폴더이다.
    - 일반적으로 forward 이동의 타겟이 되는 jsp파일을 WEB-INF 폴더에 넣는다.


📌 Express Language

  • EL
    - ${} 영역 내부에 작성하여 사용한다.
    - EL 내부에 자바 변수를 사용하려면 page, request, session, application 영역 중 하나의 영역으로 저장해야 한다.

  • 연산자
    - ${+,-,*,/} : 사칙 연산 모두 가능
    - ${gt} : > 와 동일
    - ${ge} : >= 와 동일
    - ${lt} : < 와 동일
    - ${le} : <= 와 동일
    - ${eq} : == 와 동일
    - ${ne} : != 와 동일
    - ${empty 변수 } : 변수가 비어있으면 true
    - ${not empty 변수 } : 변수가 비어있지 않으면 true
    - ${논리? 변수:변수} : 삼항 연산자

  • 변수
    - page or request or session or application 영역으로 저장한 변수를 가져올 수 있다.
    - ${변수명} == <%=request.getAttribute("변수명") %>

  • DTO 핸들링
    - EL에서는 DTO에 저장된 필드를 가져올 때, get 메소드를 사용하지 않아도 된다.
    - ${dto.num} == <%=dto.getNum() %>

  • 요청 Parameter
    - param. 을 이용해 요청 파라미터를 쉽게 받아 사용할 수 있다.
    - ${param.msg} == <%=request.getParameter("msg") %>

  • cookie
    - cookie. 을 이용해 해당 URL에 저장된 쿠키를 가져올 수 있다.
    - ${cookie.키 이름}


📌 쿠키

  • cookie
    - key, value 형태로 저장된 것
    - 클라이언트가 요청을 보낼 때, 쿠키 값이 요청과 함께 전달된다.
    - 해당 쿠키가 필요하다면 서버는 사용할 수 있다.

  • 쿠키 생성
    1. Cookie 변수명 = new Cookie("key", value);
    2. 변수명.setMaxAge(sec) : 쿠키가 유지되는 시간을 지정한다.
    3. response.addCookie(변수명) : 응답 객체에 쿠키를 추가한다.

  • 쿠키 읽기
    1. Cookie[] 변수명 = request.getCookies();
    2. String 저장할 변수명 = null;
    3. if(변수명 != null) {
    4. for(Cookie tmp:변수명) {
    5. if(tmp.getName().equals("원하는 키 이름") {
    _6. 저장할 변수명 = URLDecoder.decode(tmp.getValue(), "utf-8") }}}

  • 형식
Cookie[] cooks=request.getCookies();
String savedMsg=null;
if(cooks!=null){
	for(Cookie tmp:cooks){
	String key=tmp.getName();
		if(key.equals("savedMsg")){
			savedMsg=tmp.getValue();
		}
	}
}


📌 JSTL (JSP Standard Tag Library)

  • jstl
    - JSP 파일에서 자바 로직 대신 자바용 html 문법을 외부에서 가져와 사용하는 것
    - JDBC처럼 라이브러리 파일이 WEB-INF 폴더의 lib 폴더 내부에 있어야 한다.

  • 사용 방법
    1. WEB-INF 폴더 lib 폴더 jstl-2.1.jar 파일 넣기
    2. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 작성

  • for 문
    <c:forEach var="i" begin="1" end="5"> : for(int i=1; i<6; i++) 와 동일
    <c:forEach var="tmp" items="${list }" varStatus="status"> : for(String tmp:list) 와 동일
    • status의 종류
      - status.index : 각 요소의 INDEX 값을 추출
      - status.count : 각 요소의 순위를 추출
      - status.first : 첫번째 요소 추출
      - status.last : 마지막 요소 추출
  • if 문
    <c:if test="${조건절}"> : if문과 동일
    <c:choose> : if문 선언부(조건절 X)와 동일
    <c:when test="${조건절}"> : if문, else if문 조건절과 동일
    <c:otherwise> : else문과 동일

  • formatNumber
    <fmt:formatNumber value="${변수명 }" pattern="#,###"/> : 지정 패턴으로 숫자 표시
    • 패턴 형태
      - 사용자 지정 형태 : # 문자로 표현할 패턴을 지정
      - currency : 돈 형태로 표시
  • replace
    <c:forTokens var="tmp" items="${변수명 }" delims="분리 문자"> : 분리할 문자를 기준으로 replace 한다.

  • EL에서 사용하는 함수
    ${fn:contains('타겟 변수', '원하는 문자열')} : 타겟 변수에 원하는 문자열이 있는지 논리값으로 추출
    ${fn:escapeXml(html문법을 갖는 문자열)} : 문자열을 출력할 때, html을 사용할 수 있도록 한다.
    ${fn:replace(content, 타겟문자열, 변경할 문자열)} : content에서 타겟 문자열을 변경할 문자열로 replace 한다.

  • 형식
<!-- for문 -->
<c:forEach var="i" begin="1" end="5" step="1">
	<p>안녕 ${i }</p>
</c:forEach>

<!-- 확장 for문 -->
<c:forEach var="tmp" items="${list }" varStatus="status">
	<li>${tmp } <strong>${status.index }</strong></li>
</c:forEach>

<!-- 확장 for문의 DTO 객체 다루기 -->
<c:forEach var="tmp" items="${list }">
	<tr>
		<td>${tmp.num }</td>
		<td>${tmp.writer }</td>
		<td>${tmp.title }</td>
	</tr>
</c:forEach>

<!-- if문 -->
<c:if test="${ 10%2 eq 0 }">
	<p>10 은 짝수 입니다.</p>
</c:if>

<!-- if문 choose 사용 -->
<c:choose>
	<c:when test="${ empty id }">
		<p>로그인이 필요 합니다.</p>
	</c:when>
	<c:otherwise>
		<p> <strong>${id }</strong> 님 로그인중...</p>
	</c:otherwise>
</c:choose>

<!-- formatNumber -->
<fmt:formatNumber value="${size }" pattern="#,###"/>
<fmt:formatNumber value="${price }" type="currency"/>

<!-- replace -->
<c:forTokens var="tmp" items="${hobby }" delims="/">
	<li>${tmp }</li>
</c:forTokens>

<!-- EL에서 사용하는 jstml 함수 -->
${fn:contains(msg, 'aa')}
${fn:escapeXml("<h1></h1>은 태그이다.") }
${fn:replace(content, '<h1>', '') }


profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글