第一节:SpringMVC 视图解析【1】应用案例


一、搭建环境

  创建一个 web 工程,进行环境配置

  1、web.xml 的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <welcome-file-list>
        <welcome-file>index.jspwelcome-file>
    welcome-file-list>


    <servlet>
        <servlet-name>DispatcherServletservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springmvc.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
    servlet>


    
    <servlet-mapping>
        <servlet-name>DispatcherServletservlet-name>
        <url-pattern>/url-pattern>     
    servlet-mapping>

    
    <filter>
        <filter-name>characterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        
        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
        
        <init-param>
            <param-name>forceEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>

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

    <filter>
        <filter-name>HiddenHttpMethodFilterfilter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>


web-app>

  2、springmvc.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"
       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">

    
    
    <context:component-scan base-package="com.njf.mvc">context:component-scan>


    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/">property>
        <property name="suffix" value=".jsp">property>
    bean>

beans>

  3、测试

    页面请求:

hello

    后端控制器:

@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "success";
    }
}

  通过上面的配置,保证项目可以正常运行。测试运行:

  

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

  因为在springmvc的配置文件中配置了视图解析器,对于方法中返回的字符串类型,就会被视图解析器进行解析,然后拼接上前缀和后缀,然后进行页面的渲染:

/WEB-INF/pages/success.jsp

  而且这是通过请求转发的方式来进行的页面跳转。

二、实现请求转发

  上面是通过视图解析器来实现的请求转发,我们还可以使用以下几种方式

  1、相对路径

    @RequestMapping("/hello")
    public String hello() {
        /*
            使用相对路径
            "../../hello" 解析后: /WEB-INF/pages/hello.jsp ==> hello.jsp

            如果只写 "hello" 解析为: /WEB-INF/pages/hello.jsp
         */
        return "../../hello";
    }

  2、使用 forward 

    /**
     *  forward:前缀指定一个转发操作,转发到一个页面
     *  /hello.jsp:转发当前项目下的 hello.jsp
     *
     *  一定要加上 /:如果不加 / 就是相对路径,容易出问题
     *  forward:/hello.jsp
   * forward:前缀的转发,不会由我们配置的视图解析器进行拼串 * *
@return */ @RequestMapping(value = "/handle01") public String handle01() { System.out.println("handle01..."); return "forward:/hello.jsp"; }

  3、方式二变种

    @RequestMapping(value = "/handle02")
    public String handle02() {
        System.out.println("handle02...");
        return "forward:/handle01";
    }

  因为 handle01 已经实现了重定向,可以通过再次请求转发到 handle01 来进行处理。

三、实现重定向

  上面都是请求转发,可以使用 redirect 实现重定向:

  1、方式一

    /**
     *  重定向到 hello.jsp 页面
     *
     *  有前缀的转发和重定向操作,配置的视图解析器就不会进行拼串
     *  转发:     forward:转发的路径
     *  重定向:   redirect:重定向的路径
     *
     *            /hello.jsp:代表就是从当前项目下开始,SpringMVC 会为路径自动的拼接上项目名
     *
     *            原生的 Servlet 重定向/路径需要加上项目名才能成功
     *            response.sendRedirect("/hello.jsp");
     * @return
     */
    @RequestMapping(value = "/handle03")
    public String handle03() {
        System.out.println("handle03...");
        return "redirect:/hello.jsp";
    }

  2、方式一的变种

    @RequestMapping(value = "/handle04")
    public String handle04() {
        System.out.println("handle04...");
        return "redirect:/handle03";
    }

  通过重定向到 handle03 来进行重定向操作。

四、小结

  1、一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理   2、如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进行特殊处理:将 forward:和 redirect: 当成指示符,其后的字符串作为 URL 来处理   3、redirect:success.jsp :会完成一个到 success.jsp 的重定向的操作;   4、forward:success.jsp :会完成一个到 success.jsp 的转发操作