a、如何实现
1、自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器,如下所示:
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 // 将自定义视图放入IOC容器中
public class ToView implements View{
public String getContentType() {
return "text/html";
}
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
response.getWriter().print("Hello World.");
}
2、配置视图解析器,使用视图名字解析视图,如下所示:
<!-- 配置BeanName视图解析器:使用视图名字解析视图 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<!-- order属性用于设定视图解析器的优先级,order值越小优先级越高,InternalResourceViewResolver优先级为Integer所能表示的最大值 -->
<property name="order" value="0"></property>
</bean>
3、Controller定义Handler方法,该方法返回自定义视图的名字(默认情况下为首字母小写的类名),如下所示:
package com.jd.userinfo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/userinfo")
public class UserInfoController {
@RequestMapping("/toView.do")
public String toView() {
System.out.println("Handler Methods");
return "toView";// toView是自定义视图类ToView在IOC容器中默认的名字
}
}
b、运行原理
发布Java Web项目—>执行DispatcherServlet类onRefresh(ApplicationContext context)方法—>执行DispatcherServlet类initStrategies(ApplicationContext context)方法—>执行DispatcherServlet类initViewResolvers(ApplicationContext context)方法,该方法实例化Spring配置文件中配置的ViewResolver并将其赋值给viewResolvers成员变量—>执行resolveViewName方法 return context.getBean(viewName, View.class);根据视图名直接从IOC容器中获取视图对象—>render方法到达请求页面。