第六节: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 值即可;