2024.06.10

김무영·2024년 6월 11일

redirect이동

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

  • redirect는 ViewResolver를 거치지 않고 요청한다.
    (Controller의 method에서 반환되는 JSP명에 prefix와 suffix가 붙지 않는다.)
    => WEBA-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";
    }
    • .jsp : ViewResolver를 거치지 않고 이동하기 때문에 폴더명과 파일의 확장자를 모두 기술해야한다.(webapp의 하위 폴더를 사용하여 이동)
    • URL 사용할 수 있다.

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

  • ViewResolver를 사용하지 않고 요청

  • 이전 페이지에서 사용했던 값들을 이동한 페이지에서 사용할 수 있다.

    • b.do : 요청 - a.do를 통해서 호출될 수도 있고, 직접 호출될 수도 있다.
  • 사용법 )

    @GetMapping
    public String method(){
    	return "forward:요청do URI";
    }
    
      @GetMapping("/a.do")
    public String method(){
    	return "forward:b.do";
    }
    // forward를 사용하면 ViewResolver를 거치지 않고, 해당 do로 직접 요청을 수행.(JSP로 응답이 되지 않는다.)
    
    @GetMapping("/b.do")
    public String method(){
    	return "응답할 JSP명";
    }

include

  • 여러 JSP를 한번에 보여줄 때.
  • 중복 디자인이나 중복 코드를 줄일 목적으로 사용.
  • <%@include %>;
    • 중복코드를 처리할 때. (속도빠름, 변수, method가 공유, 지시자 충돌발생)
  • <jsp:include>
    • include action
    • 중복 디자인을 처리할 때. (속도느림, 변수, method가 공유 x, 지시자 충돌발생 x)
    • URI만 사용가능
  • <c:import>
    • jstl
    • 중복 디자인을 처리할 때. (속도느림, 변수, method가 공유 x, 지시자 충돌발생 x)
    • URI와 URL 모두 사용 가능

JSP 파일 include

  • webapp폴더 하위폴더에 JSP가 존재하는 경우.
    • 공통 디자인 파일을 외부에서 직접 호출 가능
      <jsp:include page="/경로/JSP명"/>
      //JSP명 : *.do를(controller)거치지 않고 응답되는 JSP
  • WEB-INF/views폴더 하위에 JSP가 존재하는 경우.
    • 공통 디자인 파일을 외부에서 직접 호출 불가능
      <jsp:include page="/WEB-INF/views/경로/JSP명"/>
      // views : 외부에서 직접요청은 불가능하지만 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 경로를 동적으로 가져올 수 있다.
  • URL변경의 용이성 : context 경로가 변경되어도 코드를 수정하지 않고, URL을 손쉽게 구성할 수 있다.(개발환경, 로컬환경, 운영환경에 유연하게 사용가능)
  • 보안 강화 : URL이 하드코딩 되지 않기 때문에.

관계유지

  • session,cookie

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 사용
      - 값설정 : session.setAttribute("이름",값);
      • 값얻기 : session.getAttribute("이름");
      • 생존시간 설정 : session.setMaxInactiveInterval(초)
      • 값 삭제 : session.removeAttribute("이름");
      • 무효화 : session.invalidate();
      @GetMapping
      public String method명(HttpSession session){
          1. session 사용
      }

@SessionAttribute

  • Model을 사용하여 session에 값을 넣을 때 사용하는 annotation
  • class위 선언.
  • 사용법 )
    1. SessionAttribute선언

      @SessionAttribute("이름")//@SessionAttributes({"이름","이름",,,,})
      @Controller
      public class TestController(){
    2. method의 매개변수로 Model 선언

      
      @GetMapping(..)
      public class method(Model model){
    3. SessionAttribute에 존재하는 이름과 동일한 이름으로 값을 설정

      model.addAttribute("이름",값);//request scope객체와 session scope객체 동시 할당.}
    4. 값 얻기

        1. Controller에서 값 얻기
        • HttpSession 사용

          public String method(HttpSession session){
          	session.getAttribute("이름");
        • Model 사용(Spring5.2에서부터 가능)

          public String method(Model model){
          	model.getAttribute("이름");
          
        1. JSP에서 값 얻기
        • scriptlet
          <% session.getAttribute("이름")%>
        • EL
          ${sessionScope.이름}
    5. 세션 삭제

      • HttpSession 인터페이스에서 제공하는 method로는 삭제할 수 없다.
      • org.springframework.web.bind.support 인터페이스를 사용.
      • 사용법 )
        1. SessionStatus를 매개변수로 하는 method를 생성
          @GetMapping(..)
          public String method(SessionStatus ss){
        2. 세션의 모든 값을 삭제
          ss.setComplete();
      • Controller의 method에서 redirect로 이동하면 SessionAttribute로 설정한 세션명과 값이 QeuryString으로 생성되는 현상이 생길 수 있다.
        • 해결 redirect:를 직접 사용하지 않는다.

0개의 댓글