首先需要继承org.springframework.web.servlet.ViewResolver;因为视图解析器比较多, InternalResourceViewResolver默认的优先级:private int order = Integer.MAX_VALUE;为了保证自定义解析器先执行,需要给它设置执行顺序,因此需要继承org.springframework.core.Ordered接口。
/**
* 自定义视图解析器
*/
public class MyViewResolver implements ViewResolver, Ordered {
int order=0;
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
if (viewName.startsWith("myview:")){
return new MyView();
}else {
return null;
}
}
@Override
public int getOrder() {
return order;
}
public void setOrder(int order){
this.order = order;
}
}
自定义视图
public class MyView implements View {
/**
* 返回的类型
* @return
*/
@Override
public String getContentType() {
return "text/html";
}
/**
* 得到视图对象的方法
* @param model
* @param request
* @param response
* @throws Exception
*/
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("model中保存的是跳转页面携带的参数");
}
}
源码参考
public class BeanNameViewResolver extends WebApplicationObjectSupport implements ViewResolver, Ordered {
private int order = Ordered.LOWEST_PRECEDENCE; // default: same as non-Ordered
/**
* Specify the order value for this ViewResolver bean.
* <p>The default value is {@code Ordered.LOWEST_PRECEDENCE}, meaning non-ordered.
* @see org.springframework.core.Ordered#getOrder()
*/
public void setOrder(int order) {
this.order = order;
}
@Override
public int getOrder() {
return this.order;
}
@Override
@Nullable
public View resolveViewName(String viewName, Locale locale) throws BeansException {
ApplicationContext context = obtainApplicationContext();
if (!context.containsBean(viewName)) {
// Allow for ViewResolver chaining...
return null;
}
if (!context.isTypeMatch(viewName, View.class)) {
if (logger.isDebugEnabled()) {
logger.debug("Found bean named '" + viewName + "' but it does not implement View");
}
// Since we're looking into the general ApplicationContext here,
// let's accept this as a non-match and allow for chaining as well...
return null;
}
return context.getBean(viewName, View.class);
}
}
自定义的视图解析器需要添加到ioc容器中,在xml文件中注册bean并设置执行顺序。
<bean class="xxx.xxx.xxx.MyViewResolver" id="myViewResolver">
<!-- 设置执行顺序,数值越小优先执行-->
<property name="order" value="1"/>
</bean>
controller层
@RequestMapping(value = "/xxxx")
public String pathJump() {
return "myview:xxxx";
}