SpringMVC提供View接口方式实现自定义视图,先看两种写法
一、使用ModelAndView
这种方式简单易懂,就是SpringMVC是在DispatcherServlet.render方法中调用了MyView.render
package jv.springmvc.requestmapping;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;
@Component
public class MyView implements View{
@Override
public String getContentType() {
// TODO Auto-generated method stub
return "text/html";
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.getOutputStream().println("Test SpringMVC user-defined View");
}
}
@RequestMapping("testMyView")
public ModelAndView testMyView(){
System.out.println("testMyView ,return ModelAndView");
ModelAndView mv = new ModelAndView(new MyView());
return mv;
}
二、使用String
@RequestMapping("testMyView1")
public String testMyView1(){
System.out.println("testMyView ,return String \"myView\"");
return "myView";
}
这种方式可能有的同学会觉得好神奇,居然返回一个字符串就能找到对应的视图,说白了就是通过@component注解将MyView在Spring容器中注册了一个实例,而SpringMVC在使用的时候直接拿来用
protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
HttpServletRequest request) throws Exception {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
return null;
}
public View resolveViewName(String viewName, Locale locale) throws BeansException {
ApplicationContext context = getApplicationContext();
if (!context.containsBean(viewName)) {
// Allow for ViewResolver chaining.
return null;
}
return context.getBean(viewName, View.class);
}
因为在SpringMVC配置文件中设置了BeanNameViewResolver为优先级最高的视图解析器,所以在循环viewResolvers时就拿到了BeanNameViewResolver,从而得到MyView的实例