自定义视图的执行过程

既然是自定义视图的执行过程,我们得先自定义一个视图;

这里就一自定义 MyView 视图为例:

import java.io.PrintWriter;
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 {

	public String getContentType() {
		return "text/html";
	}

	public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		PrintWriter out = response.getWriter();
		out.println("Hello View");
		out.flush();
		out.close();
	}
}

然后进行 application.xml 配置,将其放在 IOC 容器中;

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
	p:prefix="/WEB-INF/view/" p:suffix=".jsp"></bean>

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"></bean>

然后在 Controller 中返回视图名称即可;

import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserInfoController {

	@RequestMapping("userinfo/toView.do")
	public String toView(Map<String,Object> map) {
		map.put("name", "Tom");
		return "myView";
	}
}

网页访问效果如下图:

         

紧接着我们看下源码(Debug模式):

根据我之前的博客: 一个*.do请求的执行过程 可知:请求的过程必会执行 doDispatch 方法,因此这次我们直接从 doDispatch 方法开始看:

执行到第一个红框的代码时,获取 mv 的信息,执行完之后我们鼠标放在 mv 上会显示此时 mv 的信息:

我们自定义视图的名字(默认自定义视图类的类名首字母小写)和 model 数据已经获取到 mv 中了;然后执行第二个红框的代码,执行 processDispatchResult 方法,该方法代码如下:

红框上的那段 if 语句是判断程序是否出现异常,这里没有异常,于是执行红框的 render 方法,该方法代码如下:

执行到第一个红框的代码,获取我们需要的视图对象;因此执行 resolveViewName 方法,该方法代码如下:

遍历已配置的视图解析类;找到需要的视图解析类;

将鼠标移至 this.viewResolvers 我们会发现我们配置的两个视图解析类;其中第一个就是自定义视图解析类;然后执行 resolveViewName 方法;即上图第二个红框的 resolveViewName 方法,该方法继承于 BeanNameViewResolver 类(自定义视图解析类),代码如下:

该方法将返回获取的视图对象;于是便回到上图 render 方法的第二个红框处,我们可以看到,此时的 view 对象已是我们的自定义视图对象:

然后执行我们自定义视图的 render 方法,即我们写的方法,输出结果:

 

发布了99 篇原创文章 · 获赞 3 · 访问量 1203

猜你喜欢

转载自blog.csdn.net/qq_44971038/article/details/104556163