自定义视图一般来讲,SpringMVC中对一个请求,拦截-handler方法执行--执行后根据返回结果判断是请求转发还是是重定向,其中在判断请求转发和重定向的过程中需要用到视图解释器进行解析,之后执行视图中的render方法
a、如何实现
下面简答的介绍一个继承了View类从而自定义视图的方法
一、自定义View类
package com.jd.view;
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 ToView implements View{
public String getContentType() {
return " text/html; charset=UTF-8";
}
public void render(Map model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
response.getWriter().print("Hello World.");
}
}
1、getContentType()中返回的是页面的contentType
2、render()中可以用来保存在页面中显示的值等等
二、spring配置
此处我们设置视图解释器,此时的使用BeanNameViewResolver,这是会根据IOC容器中的类对象寻找,最后执行其中的render方法,其中注意优先级
三、handler方法
package com.jd.userinfo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserInfoController {
@RequestMapping("/userinfo/toView.do")
public String toView() {
System.out.println("Handler Methods");
return "toView";
}
}
此时的请求拦截/userinfo/toView.do请求,其中返回的toView被BeanNameViewResolver解析,这时我们会自动解析出:
toView(自定义)的类
b、运行原理
一、在服务器发布的时候执行的:
首先执行--initServletBeans()--initWebApplicationContext()àonfresh(was)-- initViewResolvers(context);
this.viewResolvers=new ArrayList
将全部spring配置文件已经配置的视图解释器加入加载好
二、当请求开始时
Dispatch--
一、处理完后将结果使用mv储存(ha是一个HandlerAdapter,该方法调用目标方法,返回一个ModelAndView对象,无论目标方法返回String类型、ModelMap类型、ModelAndView类型还是View类型,SpringMVC都会转化成一个ModelAndView类型对象)--
二、执行processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);方法à
render(mv,re,res)方法
三、view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request)使用视图解释器进行解析(注意优先级)
四、执行View对象中的render方法
注意此时若是继承的AbstractView,其后执行的时是renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);【以org.springframework.web.servlet.view.InternalResourceViewResolver为例】
自定义视图你自定义的视图是使用beansName加以解析,所以其中的render执行的结果使我们自己编码完成的,只要设计得当,就可以实现文件的上传等