一、解析视图流程
不管请求处理方法返回值类型是什么,都会封装成一个ModelAndView
返回,然后通过ViewResolve
解析器得到一个View
对象,通过View
对象去渲染页面。
二、视图和视图解析器
- 请求处理方法执行完成后,最终返回一个
ModelAndView
对象。对于那些返回String
,View
或ModelMap
等类型的处理方法,SpringMVC也会在内部将它们装配成一个ModelAndView
对象,它包含了逻辑名和模型对象的视图。 - SpringMVC借助视图解析器(
ViewResolver
)得到最终的视图对象(View
),最终的视图可以是JSP
,也可能是Excel
、JFreeChart
等各种表现形式的视图。 - 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现MVC的充分解耦。
视图
- 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
- 为了实现视图模型和具体实现技术的解耦,Spring在
org.springframework.web.servlet
包中定义了一个高度抽象的View
接口 - 视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。
常用的视图实现类
视图解析器
- SpringMVC为逻辑视图名的解析提供了不同的策略,可以在SpringWEB上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。
- 视图解析器的作用比较单一,是将逻辑视图解析为一个具体的视图对象。
- 所有的视图解析器都必须实现
ViewResolver
接口。
常用的视图解析器实现类
三、自定义视图
编写自定义的视图解析器和视图实现类
MyViewResolver
视图解析器需要实现ViewResolver接口并实现返回视图对象的方法,还要实现Ordered
接口,改变自定义视图解析器的执行优先级
public class MyViewResolver implements ViewResolver,Ordered{
private Integer order = 0;
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
//根据视图名返回视图对象
if (viewName.startsWith("myView:")){
return new MyView();
}else {
//不能处理返回null
return null;
}
}
@Override
public int getOrder() {
return order;
}
//改变视图解析器执行顺序
public void setOrder(Integer order){
this.order = order;
}
}
MyView
视图实现类需要实现View
接口,并实现渲染页面的方法render()
public class MyView implements View{
/**
* 返回数据内容的类型
* @return
*/
@Override
public String getContentType() {
return "text/html";
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("之前保存的数据:" + model);
response.setContentType("text/html");
List<String> vname = (List<String>)model.get("vname");
List<String> imgsname = (List<String>)model.get("imgsname");
for (String s : vname){
response.getWriter().write(s);
}
}
}
有了自定义的视图解析器和视图实现类,然后编写MyViewResolverController
处理器来处理自定义的视图
@Controller
public class MyViewResolverController {
@RequestMapping("/myview")
public String myView(Model model){
//自定义的处理逻辑
List<String> vname = new ArrayList<String>();
List<String> imgname = new ArrayList<String>();
vname.add("火影忍者");
vname.add("海贼王");
vname.add("死神");
imgname.add("漩涡鸣人");
imgname.add("佐助");
model.addAttribute("video",vname);
model.addAttribute("imgs",imgname);
return "myview:/success";
}
}
还需要将自定义的视图解析器放在IOC容器中,这样SpringMVC才能识别自定义的视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描所有组件-->
<context:component-scan base-package="controller"></context:component-scan>
<!--配置一个视图解析器,能帮助我们拼接页面地址-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--自定义的视图解析器-->
<bean class="view.MyViewResolver">
<!--设置order属性,改变自定义视图执行的优先级,值越小优先级越高-->
<property name="order" value="1"></property>
</bean>
</beans>
输出结果:
版权声明:本文为qq_39794062原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。