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

分类:
SpringMVC
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战