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

原文地址:https://www.cnblogs.com/yimengxianzhi/p/12375356.html

时间: 2024-10-06 16:17:39

SpringMVC:自定义视图及其执行过程的相关文章

SpringMVC自定义视图 Excel视图和PDF视图

1. 模板视图 FreeMarkerViewResolver . VolocityViewResolver 这两个视图解析器都是 UrlBasedViewResolver 的子类. FreeMarkerViewResolver 会把 Controller 处理方法返回的逻辑视图解析为 FreeMarkerView ,而 VolocityViewResolver 会把返回的逻辑视图解析为 VolocityView .这两个视图解析器是类似的. 对于 FreeMarkerViewResolver 而

SpringMVC自定义视图

一.首先在SpringMVC的配置文件中添加一个新的视图解析器 在里面配置order属性 <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"></property> &

Web API之过滤器执行过程原理解析【二】(十一)

前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授权上的自定义特性的执行过程. APiController 之前有讲到该APiController,也就稍微介绍了,这节我们来详细此Web API控制器的基类: 1 public abstract class ApiController : IHttpController, IDisposable 2

基于BeanNameViewResolver解析器,自定义视图

概述 基于spring-mvc自定义视图,以BeanNameViewResolver作为解析器,以满足特殊需求. 本文以输出多个pdf文件的压缩文件,供前台下载的需求为例:但是不提供服务层实现. 实现 创建AbstractView的实现类 package cn.sinobest.jzpt.zfba.fzyw.xzfy.dfcl.view; import java.util.List; import java.util.Map; import javax.annotation.Resource;

浅谈SpringMVC执行过程

通过深入分析Spring源码,我们知道Spring框架包括大致六大模块, 如Web模块,数据库访问技术模块,面向切面模块,基础设施模块,核心容器模块和模块, 其中,在Spring框架的Web模块中,又包含很多前端技术,如SpringMVC,Spring WebSocket,Spring WebPortlet等,在本篇文章中,我们主要分析SpringMVC模块, 在分析SpringMVC技术时,本篇文章将通过解读SpringMVC源码,并通过编译器断点调试追踪,研究Spring核心类的UML图,来

springmvc原理|执行过程|解决了什么问题?

springmvc原理|执行过程|解决了什么问题? 答:我对springmvc的理解是这样的: (1)首先Springmvc是一个基于MVC的框架,解决了: 前端页面和后台代码的分离问题: 实现了一个请求对应一个方法. (2)Springmvc的配置流程是这样的: 一个url请求发送过来,首先进到web.xml,所以我们需要在web.xml配置一个dispatchServlet核心控制器. 核心控制器将这个请求交给对应的方法来处理,因此需要解决一个url和一个一个方法的映射问题. 而spring

springmvc组件组成以及springmvc的执行过程

springmvc三大组件 处理器映射器:用户请求路径到Controller方法的映射 处理器适配器:根据handler(controlelr类)的开发方式(注解开发/其他开发) 方式的不同区寻找不同的处理器适配器 视图解析器:根据handler返回的view地址文件类型(jsp/pdf….)去寻找相应的视图解析器来进行解析 springmvc的执行过程 执行流程: 1. 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获(捕获) 2.

深入源码分析SpringMVC执行过程

本文主要讲解 SpringMVC 执行过程,并针对相关源码进行解析. 首先,让我们从 Spring MVC 的四大组件:前端控制器(DispatcherServlet).处理器映射器(HandlerMapping).处理器适配器(HandlerAdapter)以及视图解析器(ViewResolver) 的角度来看一下 Spring MVC 对用户请求的处理过程,过程如下图所示: SpringMVC 执行过程 用户请求发送到前端控制器 DispatcherServlet. 前端控制器 Dispat

自定义msi安装包的执行过程

有时候我们需要在程序中执行另一个程序的安装,这就需要我们去自定义msi安装包的执行过程. 比如我要做一个安装管理程序,可以根据用户的选择安装不同的子产品.当用户选择了三个产品时,如果分别显示这三个产品的安装交互UI显然是不恰当的.我们期望用一个统一的自定义UI去取代每个产品各自的UI. 平时使用msiexec.exe习惯了,所以最直接的想法就是在一个子进程中执行: msiexec.exe /qn 这样固然是能够完成任务,但是不是太简陋了? 安装开始后我们想取消这次安装怎么办? 或者我们还想要拿到