一、自定义视图和视图解析器的步骤
1、编写自定义的视图解析器和视图实现类;
2、视图解析器放在 IOC 容器中;
3、让SpringMVC来进行视图的解析;
视图解析器:
二、案例
1、页面请求连接
<a href="/handlePlus">下载敏感资源----福利</a><br>
2、定义控制器
@Controller
public class MyViewResolveController {
/**
* 自定义前缀为 mm
* 如果方法返回值前缀为 mm,使用自定义的视图解析器和视图进行解析渲染
* @param model
* @return
*/
@RequestMapping(value = "/handlePlus")
public String handlePlus(Model model) {
List<String> vname = new ArrayList<>();
List<String> imgname = new ArrayList<>();
vname.add("苍老师");
vname.add("刘老师");
imgname.add("a");
imgname.add("b");
model.addAttribute("video", vname);
model.addAttribute("imgs", imgname);
return "mm:/gaoqing";
}
}
3、自定义视图
/*
自定义视图
*/
public class MyView implements View {
/*
返回的内容类型
*/
@Override
public String getContentType() {
return "text/html";
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("之前保存的数据:" + model);
List<String> video = (List<String>) model.get("video");
response.setContentType("text/html");
response.getWriter().write("哈哈,<h1>即将展现精彩内容</h1>");
for (String s : video) {
response.getWriter().write("<h2><a href='http://www.baidu.com'>" + s +"</a></h2>");
}
}
}
4、自定义视图解析器
public class MyMMViewResolve implements ViewResolver, Ordered { private Integer order = 0; @Override public View resolveViewName(String viewName, Locale locale) throws Exception { //根据视图名返回视图对象 /* return "mm:/gaoqing"; */ if (viewName.startsWith("mm")) { return new MyView(); } else { //如果不能处理返回 null 即可 return null; } } @Override public int getOrder() { return this.order; } //改变视图解析器的顺序 public void setOrder(Integer order) { this.order = order; } }
5、配置自定义视图解析器
<!--InternalResourceViewResolver 的优先级最低-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--
自定义视图解析器
调整视图解析器的顺序
value = "1" 数字越小优先级越高
-->
<bean class="com.njf.ext.MyMMViewResolve">
<property name="order" value="1"></property>
</bean>
每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过order 属性指定解析器的优先顺序, order 越小优先级越高;
SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常;
可以配置多个视图解析器,并且可以指定视图解析器的顺序,SpringMVC 会按照视图解析器的 order 属性从小到大依次进行解析,如果匹配到一个视图解析器能够解析,则进行解析渲染;如果不能返回 null,由下一个视图解析器进行解析;
配置的 InternalResourceViewResolver 的 order 属性为 Integer 的最大值,在自定义的视图解析器实现 Ordered 接口并设置 order 值即可;
三、Excel 视图
1、若希望使用 Excel 展示数据列表,仅需要扩展 SpringMVC 提供的 AbstractExcelView 或 AbstractJExcel View 即可。实现 buildExcelDocument() 方法,在方法中使用模型数据对象构建 Excel 文档就可以了。
2、AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。
3、视图对象需要配置 IOC 容器中的一个 Bean,使用 BeanNameViewResolver 作为视图解析器即可;
4、若希望直接在浏览器中直接下载 Excel 文档,则可以设置响应头 Content-Disposition 的值为 attachment;filename=xxx.xls