Controller에서 JSP로 이동할 때 WEB-INF/views폴더에 존재하는 JSP와 webapp애 존재하는 HTML이나, JSP로 이동할 수 있다.
-*.do : DispatcherServlet에 요청을 보낸다.
@GetMapping(...)
public String method(){
return "JSP명"; => return "redirect:*.do";
}
-.html, .jsp를 요청:
@GetMapping(...)
public String method(){
return "JSP명"; => return "redirect:*.jsp";
}

ViewResolver를 사용하지 않고 요청.
이전 페이지에서 사용했던 값들을 이동한 페이지에서 사용할 수 있다.

@GetMapping
public String method(){
return "forward:요청do URI";
}
* 요청
@GetMapping("/a.do")
public String method(){
return "forward:b.do";
//ViewResolver를 거치지 않고, 해당 do로 직접 요청을 수행.(JSP로 응답이 되지 않는다.)
}
@GetMapping("/b.do")
public String method(){
return "forward:b.do";
}
여러 JSP를 한번에 보여줄 때.
중복 디자인이나 중복 코드를 줄일 목적으로 사용.
- 중복코드 처리할 때
<% @include %>
(속도 빠름, 변수, method가 공유, 지시자 충동발생)
---------------------------------------------------
- 중복 디자인을 처리할 때
<jsp:include> - URI만 사용가능.
<c:import> - URI, URL 모두 사용가능.
(속도느림, 변수, method가 공유 X, 지시자 충돌발생 X)
-WEB-INF/views폴더 하위에 JSP가 존재하는 경우
(공통디자인 파일을 외부에서 직접 호출 불가능)
<jsp:include page="/WEB-INF/views/경로/JSP명"/>
=> 외부에서 직접요청은 불가능하지만 include는 가능
do include
-표준액션, JSTL만 사용가능(지시자 <%@ include %>는 사용할 수 없다. 코드의 병합X)
<jsp:include page="요청.do"/>
<c:import url="요청.do"/>
include되는 JSP에서는 URI를 사용했을 때 외부페이지에 요청 web parameter를 받을 수 있다.
JSP의 EL에서 제공하는 pageContext내장객체를 사용하면 현재 web application의 Context 경로를 동적으로 가져올 수 있다.
http://localhost/spring_mvc/common/jsp/header.jsp
-----------> contextPath( /spring_mvc )
-URL변경의 용이성 : context경로가 변경되어도 코드를 수정하지 않고, URL을 손쉽게 구성할 수 있다.(개발환경, 로컬환경, 운영환경에 유연하게 사용가능)
-보안강화 : URL이 하드코딩 되지 않기 때문에.
session
접속자의 정보를 (접속자의 브라우저에 id를 부여)서버 측 메모리에 저장하는 기술.
브라우저를 구분하지 않고, 정보를 저장할 수 있다.
사용할 수 있는 객체 : HttpServletRequest, HttpSession, Model, ModelAndView
사용법
1. HttpServletRequest 사용
@GetMapping
public String method명(HttpServletRequest request){
1. HttpServletRequest로부터 HttpSession을 얻는다.
HttpSession session = request.getSession();
2. session 사용
}
2. HttpSession 사용
@GetMapping
public String method명(HttpSession session){
1. session사용
}
값 설정 : session.setAttribute("이름", 값)
값 얻기 : session.getAttribute("이름")
생존시간 설정 : session.setMaxInactiveInterval(초)
값 삭제 : session.removeAttribute("이름") //쓰지 않을 것을 권장
무효화 : session.invalidate(); //쓰지 않을 것을 권장
Model을 사용하여 session에 값을 넣을 때 사용하는 annotation
class위 선언
1. SessionAttribute선언
@SessionAttribute("이름") //@SessionAttribute({"이름", "이름",,,})
@Controller
public class TestController{
2. method의 매개변수로 Model 선언
@GetMapping(...)
public String method(Model model){
3. SessionAttribute에 존재하는 이름과 동일한 이름으로 값을 설정
model.addAttribute("이름", 값);//request scope객체와 session scope객체 동시 할당.
}
}
4. 값 얻기
* Controller에서 값얻기
-HttpSession 사용
public String method(HttpSession session){
session.getAttribute("이름");
}
-Model 사용(Spring 5.2에서 부터 사용가능)
public String method(Model model){
model.getAttribute("이름");
}
* JSP에서 값 얻기
-scriptlet
<% session.getAttribute("이름") %>
-EL
${ sessionScope.이름 }
5. 값 삭제
* HttpSession 인터페이스에서 제공하는 method로는 삭제할 수 없다.
* org.springframework.web.bind.support.SessionStatus 인터페이스를 사용.//로그인에 사용.
-SessionStatus를 매개변수로 하는 method 생성
@GetMapping(...)
public String method(SessionStatus ss){
-세션의 모든 값을 삭제
ss.setComplete();
}