복붙노트

[SPRING] 추가 매개 변수가있는 봄 전달?

SPRING

추가 매개 변수가있는 봄 전달?

거기에 매개 변수 데이터를 추가하는 동안 요청을 다른 컨트롤러로 전달할 수 있습니까? ModelMap에 추가하려고했지만 주위에 매달려있는 것처럼 보이지 않습니다. 나는 다음과 같이하고있다.

return "forward:/my-other-controller";

내가 생각할 수있는 다른 방법은 세션에 매개 변수를 넣은 다음 대상 컨트롤러에서 매개 변수를 팝하는 것입니다.

해결법

  1. ==============================

    1.가장 간단한 방법은 요청에 데이터를 추가하는 것입니다. 이것이 앞으로이므로 동일한 요청이 서버 내의 다른 핸들러로 전달됩니다.

    가장 간단한 방법은 요청에 데이터를 추가하는 것입니다. 이것이 앞으로이므로 동일한 요청이 서버 내의 다른 핸들러로 전달됩니다.

    예를 들어, 두 컨트롤러의 간단한 설정부터 시작하여 다른 컨트롤러로 전달하는 방법부터 살펴 보겠습니다.

    @Controller
    public class TestController {
        @RequestMapping(value="/test")
        public String showTestPage() {
            return "forward:/test2";
        }
    }
    
    @Controller
    public class TestController2 {
        @RequestMapping(value="/test2")
        public String showTestPage() {
            return "testPageView";
        }
    }
    

    데이터를 추가하는 첫 번째 방법은 요청에서 속성으로 설정하는 것입니다. 새 컨트롤러는 다음과 같습니다 (A) :

    @Controller
    public class TestController {
        @RequestMapping(value="/test")
        public String showTestPage(HttpServletRequest request) {
            request.setAttribute("param1", "foo");
            request.setAttribute("param2", "bar");
            return "forward:/test2";
        }
    }
    
    @Controller
    public class TestController2 {
        @RequestMapping(value="/test2")
        public String showTestPage(HttpServletRequest request) {
            String param1 = (String) request.getAttribute("param1");
            String param2 = (String) request.getAttribute("param2");
            return "testPageView";
        }
    }
    

    전달 접두사의보기 이름은 기본적으로 URL이므로 다음 버전 (속성이 매개 변수로 변경됨)을 가질 수도 있습니다 (B).

    @Controller
    public class TestController {
        @RequestMapping(value="/test")
        public String showTestPage() {
            return "forward:/test2?param1=foo&param2=bar";
        }
    }
    
    @Controller
    public class TestController2 {
        @RequestMapping(value="/test2")
        public String showTestPage(HttpServletRequest request) {
            String param1 = request.getParameter("param1");
            String param2 = request.getParameter("param2");
            return "testPageView";
        }
    }
    

    또한 주석을 대신 사용하여 두 번째 컨트롤러를 더 단순화 할 수 있습니다.

    @Controller
    public class TestController2 {
        @RequestMapping(value="/test2")
        public String showTestPage(@RequestParam String param1, @RequestParam String param2) {
            return "testPageView";
        }
    }
    

    그리고 그것의 재미를 위해서, 그리고 Spring의 행동에있어서의 바인딩 행동을 보여주기 위해서, 당신은 다음과 같이 그것을 할 수 있습니다 (C) :

    @Controller
    public class TestController {
        @RequestMapping(value="/test")
        public String showTestPage() {
            return "forward:/test2?param1=foo&param2=bar";
        }
    }
    
    @Controller
    public class TestController2 {
        @RequestMapping(value="/test2")
        public String showTestPage(@ModelAttribute DummyBinder params) {
            String param1 = params.getParam1();
            String param2 = params.getParam2();
            return "testPageView";
        }
    }
    
    class DummyBinder {
        private String param1;
        private String param2;
    
        public String getParam1() {
            return param1;
        }
    
        public void setParam1(String param1) {
            this.param1 = param1;
        }
    
        public String getParam2() {
            return param2;
        }
    
        public void setParam2(String param2) {
            this.param2 = param2;
        }
    }
    

    개인적으로 많은 매개 변수에 대해 솔루션 A를 사용하고 몇 가지 경우에는 솔루션 B를 사용합니다. 솔루션 C에는 일종의 "허 ... ...!" 효과 그래서 나는 그것을 피할 것입니다 (또한 URL에 매개 변수를 추가하여 작동하기 때문에 그 중 일부 또는 더러운 URL을 얻을 수 있습니다).

    세션에서 데이터를 추가하는 것은 물론 효과가 있지만 데이터 수명을 불필요하게 연장 할 수 있으므로 두 번째 컨트롤러로 전환하는 동안 요청에 추가하는 것이 가장 좋습니다.

  2. ==============================

    2.리다이렉트와 마찬가지로 앞으로 컨텍스트와 호스트가 필요 없다는 점을 고려하십시오 (전달은 서버에 의해 내부적으로 처리되지만 리다이렉션은 사용자의 브라우저가 다른 URL을 요청하도록 지시합니다).

    리다이렉트와 마찬가지로 앞으로 컨텍스트와 호스트가 필요 없다는 점을 고려하십시오 (전달은 서버에 의해 내부적으로 처리되지만 리다이렉션은 사용자의 브라우저가 다른 URL을 요청하도록 지시합니다).

    예, 세션, 쿠키 또는 게시를 사용하거나 매개 변수를 가져옵니다.

  3. ==============================

    3.필터를 고려해 보셨습니까? 위임 필터 프록시를 사용하여 필터를 만들 수 있습니다.이 필터 프록시를 사용하면 요청 빈도뿐만 아니라 요청 빈도에 액세스 할 수 있습니다.

    필터를 고려해 보셨습니까? 위임 필터 프록시를 사용하여 필터를 만들 수 있습니다.이 필터 프록시를 사용하면 요청 빈도뿐만 아니라 요청 빈도에 액세스 할 수 있습니다.

  4. ==============================

    4.나는 HttpRequestWrapper를 사용하는이 게시물을 발견했다.

    나는 HttpRequestWrapper를 사용하는이 게시물을 발견했다.

    먼저: HttpRequestWrapper를 정의하고 포스트 에서처럼 getParameter, getParameterMap, getParameterNames 및 getParameterValues ​​메소드를 대체하십시오.

    둘째: 메서드 매개 변수에서 래핑 된 요청을 사용하여 RequestDispatcher를 통해 URL로 전달합니다.

    request.getRequestDispatcher("myForwardUrl").forward(new MyRequestWrapper(request), response);
    

    나는 매개 변수를 삭제하기 위해 이것을 시도했다. (이것은 더 어렵다!) 작동한다.

  5. from https://stackoverflow.com/questions/8585216/spring-forward-with-added-parameters by cc-by-sa and MIT license