第六节:SpringMVC 视图解析【6】自定义视图和自定义视图解析器
一、自定义视图和视图解析器的步骤
1、编写自定义的视图解析器和视图实现类;
2、视图解析器放在 IOC 容器中;
3、让SpringMVC来进行视图的解析;
二、案例
1、页面请求连接
下载敏感资源----福利
2、定义控制器
@Controller
public class MyViewResolveController {
/**
* 自定义前缀为 mm
* 如果方法返回值前缀为 mm,使用自定义的视图解析器和视图进行解析渲染
* @param model
* @return
*/
@RequestMapping(value = "/handlePlus")
public String handlePlus(Model model) {
List vname = new ArrayList<>();
List 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 model, HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("之前保存的数据:" + model);
List video = (List) model.get("video");
response.setContentType("text/html");
response.getWriter().write("哈哈,即将展现精彩内容
");
for (String s : video) {
response.getWriter().write("" + s +"
");
}
}
}
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、配置自定义视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/">property>
<property name="suffix" value=".jsp">property>
bean>
<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 值即可;