문제

조랑말의 속성을 편집하기위한 양식이 있다고 가정 해 봅시다. 내 웹 애플리케이션에는 조랑말 편집을 선택할 수있는 여러 장소가 있습니다. 예를 들어, 조랑말 목록에는 각 조랑말 옆에 "편집"링크가있을 수 있으며 사용자가 조랑말을 보면 해당보기에 "편집"링크가있을 수 있습니다.

사용자가 조랑말을 편집 한 후 "제출"을 클릭하면 "편집"링크를 클릭 할 때 사용자를 페이지로 반환하고 싶습니다.

컨트롤러를 작성하여 사용자를 시작한 위치로 다시 리디렉션하려면 어떻게해야합니까? 확실히 나는 매개 변수를 컨트롤러에 전달함으로써 이것을 할 수 있지만, 그것은 약간 구피처럼 보인다. 나는 이것 모두에 대해 생각하고 있습니까? 아니면 그게 내가해야 할 일입니까?

도움이 되었습니까?

해결책

물론 한 가지 옵션은 새 창에서 편집 양식을 열 수 있으므로 모든 사용자가해야 할 일이 닫히고 그들이있는 곳으로 돌아 오는 것입니다.

현재 응용 프로그램에는 복잡한 일을 해야하는 다음 사용자를 양식으로 전달한 다음 출발점으로 돌아가도록해야합니다. 이 경우 세션의 출발점을 전달하기 전에 출발점을 저장합니다. 아마도 당신이하는 일에 대한 과잉 일 것입니다.

기타 옵션 : 1) "참조"헤더를 저장하고 사용할 수는 있지만 신뢰할 수 없을 수도 있습니다. 모든 브라우저가 해당 헤더를 설정하는 것은 아닙니다. 2) 전화를받는 양식 제출 후 확인 페이지에 JavaScript가있을 수 있습니다. "history.go(-2)".

다른 팁

소년을 수행하는 방법은 다음과 같습니다 (이것은 RESTFUL SPRING 3 MVC 구문이지만 구형 스프링 컨트롤러에서 작동합니다) :

@RequestMapping(value = "/rate", method = RequestMethod.POST)
public String rateHandler(HttpServletRequest request) {
    //your controller code
    String referer = request.getHeader("Referer");
    return "redirect:"+ referer;
}

내 대답은 Sam Brodkins와 비슷합니다 (나도 권장했습니다). 그러나 "참조 자"값을 사용할 수 없다는 카운트를 사용하면 컨트롤러 에서이 기능을 사용했습니다.

/**
* Returns the viewName to return for coming back to the sender url
*
* @param request Instance of {@link HttpServletRequest} or use an injected instance
* @return Optional with the view name. Recomended to use an alternativa url with
* {@link Optional#orElse(java.lang.Object)}
*/
protected Optional<String> getPreviousPageByRequest(HttpServletRequest request)
{
   return Optional.ofNullable(request.getHeader("Referer")).map(requestUrl -> "redirect:" + requestUrl);
}

따라서 컨트롤러 발신자 기능에서 다음과 같은 것을 반환해야합니다.

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody
String testRedirection(HttpServletRequest request)
{
      //Logic....
      //Returns to the sender url
      return getPreviousPageByRequest(request).orElse("/"); //else go to home page
}

예, 새 창에서 양식에 대한 Jacob의 아이디어가 좋은 선택 일 수 있다고 생각합니다. 또는 숨겨진 div. 도조 대화처럼. http://dojocampus.org/explorer/#dijit_dialog_basic

또 다른 옵션 중 하나는 URL을 설계하여 현재하고있는 일의 맥락을 드러내고 협약에 따라 작업 시작이 어디에 있는지 알 수 있습니다.

예를 들어, URL과 같은 URL을 가질 수 있습니다

site/section1/pony/edit
site/section1/pony/delete

site/somewhere/else/entirely/pony/edit
site/somewhere/else/entirely/pony/delete

이 두 URL은 조랑말 편집 및 삭제를 허용합니다. 둘 다 시작으로 돌아가려면 단순히 "Up"2 폴더로 이동합니다. 이것은 현재 URL을 보는 JavaScript 함수를 통해 수행 될 수 있으며 2 개의 폴더를 올라가거나 서버 측 2에서 파악하고 이와 같은 리디렉션을 수행 할 수 있습니다.

또한 인터셉터로 사용자에게 마지막으로 제시된 ModelandView (또는보기)를 추적 할 수도 있습니다. 이 예제는 마지막 모델과보기 만 추적하지만 목록을 사용하여 더 많은 레벨을 다시 탐색 할 수 있습니다.

package com.sample;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LastModelAndViewInterceptor extends HandlerInterceptorAdapter {

    public static final String LAST_MODEL_VIEW_ATTRIBUTE = LastModelAndViewInterceptor.class.getName() + ".lastModelAndView";

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        request.getSession(true).setAttribute(LAST_MODEL_VIEW_ATTRIBUTE, modelAndView);
        super.postHandle(request, response, handler, modelAndView);
    }

}

스프링 XML 구성 :

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="com.sample.LastModelAndViewInterceptor"/>
    </property>
</bean>

그런 다음 다음 코드를 사용하여 컨트롤러에서 해당보기로 돌아갑니다.

ModelAndView mv = (ModelAndView)request.getSession().getAttribute(LastModelAndViewInterceptor.LAST_MODEL_VIEW_ATTRIBUTE);
return mv;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top