什么时候用到自定义视图
通常我们所用到的视图就是jsp等网页,有些时候,我们会根据我们的需求自定义视图。比如我们要提交一个表单,然后把表单的内容导出为Excel,这时候我们就可以定义一个导出Excel的视图。
springmvc给我们提供了一些接口,包括导出Excel的接口:AbstractExcelView
这里我就不细说怎么导出Excel(其实我暂时还不会,哈哈),只简单说说怎么自定义视图。
导出excel可以参考导出excel
如何自定义视图
1.new一个类,实现View接口
package com.zj.views;
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 HelloView implements View{
/**
* 视图类型
*/
@Override
public String getContentType() {
return "text/html";
}
/**
* 渲染视图
*/
@Override
public void render(Map<String, ?> map, HttpServletRequest reqeust,
HttpServletResponse response) throws Exception {
response.getWriter().write("hello");
}
}
注意:我们定义的视图类要加上注解@Component,这样spring容器才会帮我们创建这个视图的实例。
2.在springmvc配置文件中加入以下配置
<!-- 配置视图 BeanNameViewResolver 解析器: 使用视图的名字来解析视图 -->
<!-- 通过 order 属性来定义视图解析器的优先级, order 值越小优先级越高 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
上方配置中,有个property为order值得注意。值越小优先级越高。当我们在目标方法中return一个视图的时候,会先通过优先级高的视图解析器来解析,如果搞不定,再由优先级低的视图解析器去解析。
我们想要我们自定义的视图解析器起作用,就必须让这个视图解析器优先级比InternalResourceViewResolver这个视图解析器高,InternalResourceViewResolver的order默认是Integer.MAX_VALUE(如果我们没记错的话)
BeanNameViewResolver是一个视图解析器,大家应该还记得在配置springmvc项目时配置的一个视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean>
springmvc给我们提供了多个视图解析器,一般情况下我们配置InternalResourceViewResolver这个视图解析器,而本次,我们则使用BeanNameViewResolver,使用视图的名字来解析视图。
3.在控制层添加目标方法
@RequestMapping("/testView")
public String testView(){
return "helloView";
}
代码解析: 这里我们
return "helloView";
视图解析器就会去找相应的视图。我们自定义的视图是HelloView,spring容器帮我们实例对象的时候,首字母会小写,即HelloView helloView = new HelloView()
运行流程
- 用户访问/testView这个目标方法,该方法返回”helloView”这个视图
- BeanNameViewResolver视图解析器优先级比较高,解析helloView,并且解析成功。
- 自定义视图HelloView中的render方法被调用
- 用户得到视图(界面)