redirect 이동

Controller에서 JSP로 이동할 때 WEB-INF/views폴더에 존재하는 JSP와 webapp애 존재하는 HTML이나, JSP로 이동할 수 있다.

  • redirect는 ViewResolver를 거치지 않고 요청한다.
    (Controller의 method에서 반환되는 JSP명에 prefix와 suffix가 붙지 않는다.)
    => WEB-INF/views를 찾지 않는다.
  • .do, .html, .jsp를 모두 요청할 수 있다.

-*.do : DispatcherServlet에 요청을 보낸다.
@GetMapping(...)
public String method(){

return "JSP명"; => return "redirect:*.do";
}

-.html, .jsp를 요청:
@GetMapping(...)
public String method(){

return "JSP명"; => return "redirect:*.jsp";
}


do에서 다른 do를 직접 요청하기(do chain)

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";
}

include

여러 JSP를 한번에 보여줄 때.
중복 디자인이나 중복 코드를 줄일 목적으로 사용.

- 중복코드 처리할 때
<% @include %> 
(속도 빠름, 변수, method가 공유, 지시자 충동발생)

---------------------------------------------------

- 중복 디자인을 처리할 때
<jsp:include> - URI만 사용가능.
<c:import> - URI, URL 모두 사용가능.
(속도느림, 변수, method가 공유 X, 지시자 충돌발생 X)
  • JSP 파일 include
    -webapp폴더 하위 폴더에 JSP가 존재하는 경우.
    (공통디자인 파일을 외부에서 직접 호출 가능)
    <jsp:include page="/경로/JSP명"/>//*.do(controller)를 거치지않고 응답되는 JSP

-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를 받을 수 있다.


${ pageContext.request.contextPath} 속성

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사용
}
  • HttpSession 사용
값 설정 : session.setAttribute("이름",)
값 얻기 : session.getAttribute("이름")
생존시간 설정 : session.setMaxInactiveInterval()
값 삭제 : session.removeAttribute("이름") //쓰지 않을 것을 권장
무효화 : session.invalidate(); //쓰지 않을 것을 권장

@SessionAttribute

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();
}

0개의 댓글