自定义视图(SpringMVC)
一、首先理解视图的解析过程
1)请求处理方法执行完成后,最终返回一个 ModelAndView 对象。
ModelAndView 对象,它包含了逻辑名(访问URL)和模型对象(javaBean数据)的视图
2)视图解析器(ViewResolver)负责根据返回值(ModelAndView )作为页面地址得到视图对象。
即:将逻辑视图解析为一个具体的视图对象
常用的解析器:
InternalResourceViewResolver
3) 视图(view)的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
常见的视图实现类:
InternalResourceView,JstlView
二、自定义视图
假设:return "download:/aaa.txt";"sql:/aaaa","img:/haha.jpg" --->自定义的ViewResolver;---->根据返回值创建一个我们想要实现的视图功能View;
ViewResolver和view都是两个接口,要实现返回值到视图的实现,必须得实现这两个接口
//多个视图解析器依次解析,如果某个解析成功就直接返回值;如果没有成功下一个解析器继续 for (ViewResolver viewResolver : this.viewResolvers) { View view = viewResolver.resolveViewName(viewName, locale); if (view != null) { return view; } }
1、自定义一个ViewResolver;
public class MyCustomViewResolver implements ViewResolver,Ordered { //保存当前视图解析器的优先级 private int order = Integer.MAX_VALUE; /** * 将ModelAndView 中视图名解析成View对象返回 */ @Override public View resolveViewName(String ViewName, Locale arg1) throws Exception { // TODO Auto-generated method stub //如果ModelAndView的视图名字是以download:或sql:开头的,那么创建一个 MyCustomView()视图对象 if(ViewName.startsWith("download:")||ViewName.startsWith("sql:")){ //返回视图对象,该视图对象为自定义的 return new MyCustomView(); } return null; } @Override public int getOrder() { // TODO Auto-generated method stub return order; } public void setOrder(Integer order){ this.order = order; } }
2、自定义了一个视图(View)对象
public class MyCustomView implements View{ /** * 返回内容类型 */ @Override public String getContentType() { // TODO Auto-generated method stub //相当于response.setContextType() return "text/html;charset=utf-8"; } /** * 渲染<br/> * Map<String, ?> model 隐含模型中的数据 */ @Override public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO Auto-generated method stub System.out.println("这是我自定义的视图"); response.getWriter().write(UUID.randomUUID().toString()); } }
3、视图解析器默认是先从ioc容器中拿到所有的解析器;如果没有就用出厂设置;
4、我们可以在配置文件中配置多个视图解析器;
<!-- 加载自定义的视图解析器 --> <bean class="com.atguigu.customview.MyCustomViewResolver"> <property name="order" value="1"></property> </bean> <!--默认的视图解析器:对于forword; rdirect: 字符串等,生成一个重定向或者转发的视图对象 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> <!-- 设置优先级,数字越小,优先级越高 --> <property name="order" value="2"></property> </bean>
5、多个视图解析器轮着尝试解析方法的返回值将其整成一个视图对象;
6、我们需要为任何自定义的视图解析器,或者任何非InternalResourceViewResolver,的解析器都要优先于InternalResourceViewResolver运行;
public class MyPlusViewResolver implements ViewResolver,Ordered{
7、我们的视图解析器创建出了我们的视图对象(View)
8、我们就可以在自己的View对象的render方法中定义对这次请求如何响应;
因为追求卓越,成功在不经意间追上了你