一、自定义视图和视图解析器的步骤
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?