zoukankan      html  css  js  c++  java
  • 第一节: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.jsp</welcome-file>
        </welcome-file-list>
    
    
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 配置DispatcherServlet的初始化參數:设置文件的路径和文件名称 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!--
               servlet 启动加载,servlet 原本是第一次访问创建对象
               load-on-startup:服务器启动的时候就创建对象,值越小优先级越高,越先创建对象
             -->
            <load-on-startup>1</load-on-startup>
        </servlet>
    
    
        <!--
          /* 和 / 都是拦截所有请求,/:会拦截所有请求,但是不会拦截 *.jsp,能保证 jsp访问正常;
          /* 的范围更大,还会拦截 *.jsp 这些请求,一旦拦截 jsp 页面就不能显示了
        -->
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>     <!-- / 这样写,只有请求才处理,页面会过滤掉 -->
        </servlet-mapping>
    
        <!--  字符编码过滤器  -->
        <filter>
            <filter-name>characterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <!-- 设置字符编码 -->
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <!-- 强制设置响应进行编码 -->
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
    
        <filter-mapping>
            <filter-name>characterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>  <!-- 对所有的请求都拦截,处理所有响应-->
        </filter-mapping>
    
        <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>
    
    
    </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">
    
        <!--  扫描所有的组件  -->
        <!-- 扫描组件,将加上@Controller注解的类作为springMVC的控制层 -->
        <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、测试

        页面请求:

    <a href="/hello">hello</a>
    

        后端控制器:

    @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 的转发操作;
      
     
  • 相关阅读:
    Beyond Compare保存快照和CRC比较相结合的方法
    如何在Beyond Compare文本比较时设置书签
    如何使用Navicat for SQLite 触发器
    Navicat Premium 中实用工具介绍
    Beyond Compare查看合并文本后相同内容的方法
    Marriage Match II HDU
    Escape HDU
    kebab HDU
    Task Schedule HDU
    网络流深入
  • 原文地址:https://www.cnblogs.com/niujifei/p/15566846.html
Copyright © 2011-2022 走看看