随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、搭建环境

创建一个 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 的转发操作;

posted on   格物致知_Tony  阅读(68)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示

目录导航