SpringMVC:自定义视图及其执行过程
一:自定义视图
1、自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器
package com.zzj.view; import java.io.PrintWriter;
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
public class ToView implements View{ @Override
public String getContentType() { return "text/html";
} @Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
PrintWriter out = response.getWriter();
out.print("Hello View");
out.flush();
out.close(); } }
2、配置视图解析器,使用视图名字解析视图
order属性用于设定视图解析器的优先级,order值越小优先级越高,InternalResourceViewResolver优先级为Integer所能表示的最大值
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"></bean>
3、Controller定义Handler方法,该方法返回自定义视图的名字(默认情况下为首字母小写的类名)
@RequestMapping("helloView")
public String helloView() {
return "toView";
}
4、启动服务器,访问相关页面,成功
二、执行过程
根据springMVC的执行请求过程可知(https://www.cnblogs.com/yimengxianzhi/p/12323544.html)
我们发送请求后必定会执行DispatcherServlet中的doDispatch方法:
获取到请求相关的数据和视图名,随后我们执行Handler方法返回一个视图:
随后我们执行processDispatchResult方法:
若整个过程没有异常则执行render方法,若有异常则执行如下方法,定义异常视图:
我们查看render方法,在此处进行了视图的适配:
而此处resolverViewName就已经获取到了我们自定义的视图(优先级高的先获取)
随后根据给定的视图名构建自定义视图,就会返回到我们自定义的视图界面了
三、自定义视图的应用示例
自定义Excel视图
1、添加相关jar包:
2、自定义Excel视图
package com.zzj.view; import java.io.OutputStream;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.document.AbstractXlsView; import com.zzj.userinfo.vo.UserInfo; @Component
public class ExcelView extends AbstractXlsView { @Override
protected void buildExcelDocument(Map<String, Object>model, Workbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String fileName = "用户信息.xls";
response.setCharacterEncoding("UTF-8");
response.setContentType("application/ms-excel");
response.setHeader("Content-Disposition", "inline; filename=" + new String(fileName.getBytes(), "iso8859-1"));
OutputStream outputStream = response.getOutputStream(); @SuppressWarnings("unchecked")
List<UserInfo> userInfoes = (List<UserInfo>) model.get("userInfoes");
// 产生Excel表头
Sheet sheet = workbook.createSheet("基本信息");
sheet.setColumnWidth(0, 35*256);//设置第一列列宽
sheet.setColumnWidth(1, 10*256);//设置第二列列宽
sheet.setColumnWidth(2, 15*256);//设置第三列列宽
sheet.setColumnWidth(3, 30*256);//设置第四列列宽 CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平布局:居中
cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 垂直布局:居中 // 标题列
Row header = sheet.createRow(0);
header.setRowStyle(cellStyle);
header.setHeightInPoints(20);// 设置行高
Cell idCell = header.createCell(0);
idCell.setCellStyle(cellStyle);//设置单元格样式
idCell.setCellValue("ID");//设置单元格内容
Cell nameCell = header.createCell(1);
nameCell.setCellStyle(cellStyle);
nameCell.setCellValue("姓名");
Cell mobileCell = header.createCell(2);
mobileCell.setCellStyle(cellStyle);
mobileCell.setCellValue("手机号");
Cell addressCell = header.createCell(3);
addressCell.setCellStyle(cellStyle);
addressCell.setCellValue("家庭地址"); int rowNumber = 1;
for (UserInfo userInfo : userInfoes) {
Row row = sheet.createRow(rowNumber++);
row.setHeightInPoints(18);// 设置行高
row.createCell(0).setCellValue(userInfo.getId());
row.createCell(1).setCellValue(userInfo.getName());
row.createCell(2).setCellValue(userInfo.getMobile());
row.createCell(3).setCellValue(userInfo.getAddress());
}
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
}
}
3、配置视图解析器
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"></bean>
4、Controller定义Handler方法,该方法中指定响应Excel视图
@RequestMapping("toView.do")
public ModelAndView excel(){ ModelAndView modelAndView = new ModelAndView("excelView"); List<UserInfo>userInfoes = new ArrayList<UserInfo>();
String id = UUID.randomUUID().toString();
userInfoes.add(new UserInfo(id, "Lucy", "18898763401", "吉林省长春市宽城区"));
id = UUID.randomUUID().toString();
userInfoes.add(new UserInfo(id, "Kate", "17749219035", "河南省郑州市高新区升龙又一城"));
modelAndView.addObject("userInfoes", userInfoes);
return modelAndView; }
5、启动服务器,访问相关页面链接即可创建
SpringMVC:自定义视图及其执行过程的更多相关文章
- SpringMVC自定义视图Excel视图和PDF视图
SpringMVC自定义视图 Excel视图和PDF视图 SpringMVC杂记(十一) 使用Excel视图 Spring MVC 视图解析器(ViewResolver ) java实现导出excel ...
- SpringMVC自定义视图 Excel视图和PDF视图
一.自定义视图-Excel视图 1.Maven依赖 引入POI <dependency> <groupId>org.apache.poi</groupId> < ...
- springmvc自定义视图
自定义视图 可以整合jfreechart.excel @RequestMapping("/testView") public String testView(){ System.o ...
- Web APi之过滤器执行过程原理解析【二】(十一)
前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授 ...
- (翻译)为你的MVC应用程序创建自定义视图引擎
Creating your own MVC View Engine For MVC Application 原文链接:http://www.codeproject.com/Articles/29429 ...
- 基于BeanNameViewResolver解析器,自定义视图
概述 基于spring-mvc自定义视图,以BeanNameViewResolver作为解析器,以满足特殊需求. 本文以输出多个pdf文件的压缩文件,供前台下载的需求为例:但是不提供服务层实现. 实现 ...
- Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)
勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...
- 浅谈SpringMVC执行过程
通过深入分析Spring源码,我们知道Spring框架包括大致六大模块, 如Web模块,数据库访问技术模块,面向切面模块,基础设施模块,核心容器模块和模块, 其中,在Spring框架的Web模块中,又 ...
- 自定义视图(SpringMVC)
一.首先理解视图的解析过程 1)请求处理方法执行完成后,最终返回一个 ModelAndView 对象. ModelAndView 对象,它包含了逻辑名(访问URL)和模型对象(javaBean数据)的 ...
随机推荐
- Python学习第二十八课——Django(templates)
templates 讲后台得到的数据渲染到页面上:话不多说,先看具体代码. urls: from django.conf.urls import url from django.contrib imp ...
- firefox插件hostadmin自由切换host
在Mac下firefox插件hostadmin切换host,遇到的第一个问题就是提示权限不足,解决办法,在终端输入以下命令即可: sudo chmod og+w /etc/hosts chmod修改权 ...
- C语言笔记 11_头文件&强制类型转换&错误处理&递归
头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享.有两种类型的头文件:程序员编写的头文件和编译器自带的头文件. 在程序中要使用头文件,需要使用 C 预处理指 ...
- 棍子Sticks(poj_1011)[经典搜索]
[题意描述] George用相同的长度棍子,将他们随机切成最多64个单位的长度,现在,他想回到原来的状态,但他忘了他原来的多少根,以及他们原本是多长.请帮助他和设计一个程序,计算最小的可能的原始长度. ...
- 商品呢拖拽到购物车,appendChild的剪切功能
今天来到了妙味课堂的html5课程的第2张的第8节,讲的是把商品拖拽到购物车的演示.其中有一个关于appendChild的使用,,每次拖拽都会触发这个方法,但是每次之后,却还是只有一个总价,好吧,说不 ...
- openjudge(POJ)-1664 放苹果
对于n个盘子,m个苹果,我们要么在每个盘子上都放苹果,要么至少有一个盘子不放. 一个盘子不放就是f(m,n-1),全部都放的时候苹果就变成了n-m个,但是盘子的数目是不变的,因为此时还没有产生方案数, ...
- socket 多连接
socket 多连接 本文档为文档https://www.cnblogs.com/wodeboke-y/p/11241472.html 后续内容. 上一文档中的案例2给出了一个阻塞型socket se ...
- 模块学习-json pickle
json json序列化 import json def sayhi(name): print("hello",name) info = { 'name':'mogu', 'age ...
- Euler Sums系列(二)
\[\Large\sum_{n=0}^\infty \frac{H_{2n+1}}{(2n+1)^2}=\frac{21}{16}\zeta(3)\] \(\Large\mathbf{Proof:}\ ...
- 临时解决执行 Composer Install 返回 Killed 的问题
昨天在 Linux 服务器上部署 PHP 项目时遇到了一个问题,系统为 Centos 7 ,1 核 1G 的配置.通过 Git 拉取代码后,由于是基于 Laravel 框架的项目,所以需要使用 Com ...