SpringMVC 学习(五)——视图和视图解析器

Spring MVC如何解析视图

 

视图视图解析器

理方法行完成后,最返回一个 ModelAndView  象。于那些返回 StringView ModeMap 型的 理方法,Spring MVC 也会在内部将它装配成一个

ModelAndView ,它包含了逻辑名和模型象的视图

Spring MVC 借助视图解析器ViewResolver得到最视图对View),视图可以是 JSP ,也可能是

ExcelJFreeChart  等各形式的视图

于最究竟采取何种视图对模型数据染,理器并不心,理器工作重点聚焦在生模型数据的工 作上,从而实现 MVC 的充分解

视图

视图的作用是染模型数据,将模型里的数据以某形式呈现给

实现视图模型和具体实现的解Spring

org.springframework.web.servlet 包中定了一个高度抽象的 View

接口:

视图对象由视图解析器负责实例化。由于视图无状的,所以他

不会有线程安全问题

 

常用的视图实现类

视图解析器

SpringMVC 为逻辑视图名的解析提供了不同的策略,可 以在 Spring WEB 上下文中配置一或多解析策略并 指定他的先后映射策略对应一个具体 的视图解析器实现类

视图解析器的作用比较单一:将逻辑视图解析一个具体 的视图对象。

所有的视图解析器都必须实现 ViewResolver 接口:

常用的视图解析器实现类

程序可以选择种视图解析器或混用多种视图解析器

视图解析器都实现 Ordered 接口并放出一个 order 属性,可 以通 order 属性指定解析器的order  越小越高

SpringMVC 会按视图解析器序的对逻辑视图行解

析,直到解析成功并返回视图对象,否将抛出 ServletException

 

InternalResourceViewResolver

JSP 是最常视图,可以使用

InternalResourceViewResolver 为视图解析器:

 

InternalResourceViewResolver

目中使用了 JSTL SpringMVC 会自视图

InternalResourceView 转为 JstlView

若使用 JSTL fmt 标签则需要在 SpringMVC 的配置文件中配置国源文件

若希望直接响应 SpringMVC 染的面,可以使用 mvc:view-

controller 标签实现

Excel 视图

若希望使用 Excel 展示数据列表,需要

SpringMVC 提供的 AbstractExcelView AbstractJExcel View 即可。实现 buildExcelDocument()  方法,在方法中使用模型数据 Excel 文档就可以 了。

AbstractExcelView 基于 POI API

AbstractJExcelView 是基于 JExcelAPI 的。

视图对象需要配置 IOC 容器中的一个 Bean使用

BeanNameViewResolver 为视图解析器即可

若希望直接在浏览器中直接下 Excel 文档,可以响应头 Content-Disposition 值为 attachment;filename=xxx.xls

于重定向

一般情况下,控制器方法返回字符串型的会被当成逻 辑视图

如果返回的字符串中 forward: redirect:

SpringMVC 们进行特殊理:将 forward:

redirect: 当成指示符,其后的字符串作 URL

redirect:success.jsp会完成一个到 success.jsp 的重定向的操作

forward:success.jsp会完成一个到 success.jsp 转发操作

test,java

package com.xuehj.springmvc.handler;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

/**
 * @program: SpringMVC
 * @description: TODO
 * @author: Mr.Xue
 * @create: 2018-12-24 09:36
 **/
@SessionAttributes(value = {"user"}, types = {String.class})
@Controller
@RequestMapping("/view")
public class HelloWorld {

    @RequestMapping("/testViewAndViewResolver")
    public String testViewAndViewResolver(){
        System.out.println("testViewAndViewResolver");
        return "success.jsp";
    }

    @RequestMapping("/testView")
    public String testView(){
        System.out.println("testView");
        return "helloView";
    }

    @RequestMapping("/testRedirect")
    public String testRedirect(){
        System.out.println("testRedirect");
        return "redirect:/index.jsp";
    }
}

helloview.java

package com.xuehj.springmvc.view;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @program: SpringMVC-1
 * @description: TODO
 * @author: Mr.Xue
 * @create: 2018-12-25 01:53
 **/
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, ?> model, HttpServletRequest request,
                       HttpServletResponse response) throws Exception {
        response.getWriter().print("hello view, time: " + new Date());
    }

}

success.jsp

<%@ taglib prefix="fmt" uri="http://www.springframework.org/tags" %>
<%--<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>--%>
<%--
  Created by IntelliJ IDEA.
  User: 薛恒杰
  Date: 2018/12/24
  Time: 9:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>Hello World</h1>

        <fmt:message code="i18n.username"/>
        <br><br>

        <fmt:message code="i18n.password"/>

        <br><br>
    </body>
</html>

dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 配置自定扫描的包 -->
    <context:component-scan base-package="com.xuehj.springmvc"/>

    <!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--<property name="prefix" value="/view/"/>-->
        <!--<property name="suffix" value=".jsp"/>-->
        <property name="prefix" value=""/>
        <property name="suffix" value=""/>
    </bean>

    <!-- 配置视图  BeanNameViewResolver 解析器: 使用视图的名字来解析视图 -->
    <!-- 通过 order 属性来定义视图解析器的优先级, order 值越小优先级越高 -->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="100"/>
    </bean>

    <!-- 配置国际化资源文件 -->
    <bean id="messageSource"
          class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n"/>
    </bean>

    <!-- 配置直接转发的页面 -->
    <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法.  -->
    <mvc:view-controller path="/success" view-name="/view/success.jsp"/>

    <!-- 在实际开发中通常都需配置 mvc:annotation-driven 标签 -->
    <mvc:annotation-driven/>
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--
	配置 org.springframework.web.filter.HiddenHttpMethodFilter: 可以把 POST 请求转为 DELETE 或 PUT 请求
	-->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 配置 DispatcherServlet -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 -->
        <!--
            实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的.
            默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml
        -->
        <!--
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: 薛恒杰
  Date: 2018/12/24
  Time: 9:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>$Title$</title>
    </head>
    <body>
        <a href="view/testViewAndViewResolver">Test ViewAndViewResolver</a>
        <br><br>

        <a href="view/testView">Test View</a>
        <br><br>

        <a href="view/testRedirect">Test Redirect</a>
        <br><br>
    </body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_41577923/article/details/85241880