📌 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 한다.
- 형식
<c:forEach var="i" begin="1" end="5" step="1">
<p>안녕 ${i }</p>
</c:forEach>
<c:forEach var="tmp" items="${list }" varStatus="status">
<li>${tmp } <strong>${status.index }</strong></li>
</c:forEach>
<c:forEach var="tmp" items="${list }">
<tr>
<td>${tmp.num }</td>
<td>${tmp.writer }</td>
<td>${tmp.title }</td>
</tr>
</c:forEach>
<c:if test="${ 10%2 eq 0 }">
<p>10 은 짝수 입니다.</p>
</c:if>
<c:choose>
<c:when test="${ empty id }">
<p>로그인이 필요 합니다.</p>
</c:when>
<c:otherwise>
<p> <strong>${id }</strong> 님 로그인중...</p>
</c:otherwise>
</c:choose>
<fmt:formatNumber value="${size }" pattern="#,###"/>
<fmt:formatNumber value="${price }" type="currency"/>
<c:forTokens var="tmp" items="${hobby }" delims="/">
<li>${tmp }</li>
</c:forTokens>
${fn:contains(msg, 'aa')}
${fn:escapeXml("<h1></h1>은 태그이다.") }
${fn:replace(content, '<h1>', '') }