Java执行视图_SpringMVC:自定义视图及其执行过程

一:自定义视图

1、自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器

packagecom.zzj.view;importjava.io.PrintWriter;importjava.util.Map;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.View;

@Componentpublic class ToView implementsView{

@OverridepublicString getContentType() {return "text/html";

}

@Overridepublic void render(Mapmodel, HttpServletRequest request, HttpServletResponse response)throwsException {

PrintWriter out=response.getWriter();

out.print("Hello View");

out.flush();

out.close();

}

}

2、配置视图解析器,使用视图名字解析视图

order属性用于设定视图解析器的优先级,order值越小优先级越高,InternalResourceViewResolver优先级为Integer所能表示的最大值

3、Controller定义Handler方法,该方法返回自定义视图的名字(默认情况下为首字母小写的类名)

@RequestMapping("helloView")publicString helloView() {return "toView";

}

4、启动服务器,访问相关页面,成功

38534657841192b4d593dd5f739f1b1d.png

二、执行过程

根据springMVC的执行请求过程可知(https://www.cnblogs.com/yimengxianzhi/p/12323544.html)

我们发送请求后必定会执行DispatcherServlet中的doDispatch方法:

1843d9cc49a344835f555102b2f0e8f6.png

获取到请求相关的数据和视图名,随后我们执行Handler方法返回一个视图:

7fc5e1b74f201af66852894eca2451d8.png

随后我们执行processDispatchResult方法:

cc34097d24cb063c07f7885bcc57e078.png

若整个过程没有异常则执行render方法,若有异常则执行如下方法,定义异常视图:

4fb455b6ce04c503c2b820e91da20e66.png

c5ad49a09e8d59eb56de62060302e928.png

我们查看render方法,在此处进行了视图的适配:

3c24c4044c7c7773f38022257779960f.png

而此处resolverViewName就已经获取到了我们自定义的视图(优先级高的先获取)

64b0ea85072b8dcbd1568ba9d9a7f103.png

随后根据给定的视图名构建自定义视图,就会返回到我们自定义的视图界面了

三、自定义视图的应用示例

自定义Excel视图

1、添加相关jar包:

8d9cc12e18810c062b4a4ba91d77d529.png

2、自定义Excel视图

packagecom.zzj.view;importjava.io.OutputStream;importjava.util.List;importjava.util.Map;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.poi.ss.usermodel.Cell;importorg.apache.poi.ss.usermodel.CellStyle;importorg.apache.poi.ss.usermodel.Row;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.usermodel.Workbook;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.view.document.AbstractXlsView;importcom.zzj.userinfo.vo.UserInfo;

@Componentpublic class ExcelView extendsAbstractXlsView {

@Overrideprotected void buildExcelDocument(Mapmodel, Workbook workbook, HttpServletRequest request,

HttpServletResponse response)throwsException {

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 userInfoes = (List) 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、配置视图解析器

4、Controller定义Handler方法,该方法中指定响应Excel视图

@RequestMapping("toView.do")

public ModelAndView excel(){

ModelAndView modelAndView = new ModelAndView("excelView");

ListuserInfoes = new ArrayList();

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、启动服务器,访问相关页面链接即可创建

ee6a3c67f0b3c9b039bfe8d5af88828b.png

30e3eafc4e59009e7556cb9699f33cbc.png

7f102cb446985c698d35adfcebd3dd06.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值