Spring MVCにrefer Viewを追加


開発でよく見られる例で、操作が完了したら操作ページに戻ります.
コードで表すと次のようになります.
response.sendRedirect(request.getHeader("referer"));

Spring MVCにはRedirectViewがあるので、referを持っていけばもっと便利です.スプリングが柔軟なので、自分でこの機能を増やしましょう.
Viewインタフェースを実装するには、次の手順に従います.
public class RefererRedirectView implements View{
	
	protected static final Log logger = LogFactory.getLog(RefererRedirectView.class);

	/* (non-Javadoc)
	 * @see org.springframework.web.servlet.View#getContentType()
	 */
	public String getContentType() {
		return null;
	}

	/* (non-Javadoc)
	 * @see org.springframework.web.servlet.View#render(java.util.Map, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public void render(Map model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		String returnUrl = request.getHeader("referer");
		if(returnUrl==null || returnUrl.trim().equals("")){
			returnUrl = "/";
		}
		logger.debug("referer url["+returnUrl+"]");
		response.sendRedirect(returnUrl);
	}

}

 
ViewResolverというインタフェースの例はspringコンテナに複数あり、チェーン構造を構成することができ、最初の処理ができなければ次の処理に渡され、処理されるかすべて失敗するまで処理できない.
ViewResolverインタフェースをもう1つ実装します.
public class RefererViewResolver implements ViewResolver,Ordered {
	
	protected Log logger = LogFactory.getLog(getClass());
	// referer:   viewName,   ViewResolver  
	public static final String REFERER_PROFIX = "referer:";

	/* (non-Javadoc)
	 * @see org.springframework.web.servlet.ViewResolver#resolveViewName(java.lang.String, java.util.Locale)
	 */
	public View resolveViewName(String viewName, Locale locale)
			throws Exception {
				if (!viewName.startsWith(REFERER_PROFIX)) {
						return null;
		}
		logger.debug("this is referer view.");
		return new RefererRedirectView();
	}

	/* (non-Javadoc)
	 * @see org.springframework.core.Ordered#getOrder()
	 */
	public int getOrder() {
		return Integer.MAX_VALUE-1;//  ViewResolver  UrlBasedViewResolver      
	}

}

最後に、このviewResolverをプロファイルに宣言します.
<bean class="com.........RefererViewResolver"/>

これにより、refer:で始まるviewNameは、リクエストが開始されたページにredirectされます.
テストクラスを添付:
@Controller
public class SomeController {

	@RequestMapping("/test_referer.do")
	public String referer(){
		System.out.println("do some thing ,then return to referer.");
		return "referer:";
	}
	
	@RequestMapping("/test_test1.do")
	public String test1(){
		return "front/user/test1";
	}
	
	@RequestMapping("/test_test2.do")
	public String test2(){
		return "front/user/test2";
	}
}