`
steven_cheng
  • 浏览: 27682 次
  • 来自: 北京
社区版块
存档分类
最新评论

给Spring MVC增加一个referer View

    博客分类:
  • java
阅读更多

开发中很常见的一个用例,操作完成后返回操作页面。

用代码表示就是:

response.sendRedirect(request.getHeader("referer"));

spring MVC里有RedirectView,如果能够把referer带上就更方便了。好在spring很灵活,自己增加这个功能吧。

实现一个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接口:

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"/>

 这样,凡是以referer:起始的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";
	}
}

 

 

分享到:
评论
5 楼 ispring 2008-12-28  
Ahha, actually there are many people work with SpringMVC, it's a very excellent framework, maybe they dont agree with you that this is a very common requirement. They are more prefered to see your extention to do with EXCEL or PDF and so on
4 楼 DoubleEO 2008-12-26  
真不错,我用springmvc,不过还没想到你这里呢~呵呵
@RequestMapping("/test_test2.do")
是stripes框架吗?
3 楼 vdgame 2008-12-26  
steven_cheng 写道
这个...真的这么无聊,没有人感兴趣吗...

估计这里用springmvc的人不多
2 楼 shiren1118 2008-12-25  
hehe,确实没这么用过呢~很欣赏springmvc
Grails就是基于springmvc的
1 楼 steven_cheng 2008-12-25  
这个...真的这么无聊,没有人感兴趣吗...

相关推荐

Global site tag (gtag.js) - Google Analytics