SpringMVC:重定向、转发总结

本文总结了SpringMVC中重定向和转发的区别。转发是在同一个请求内完成,浏览器地址栏路径不变,效率高,适合内部跳转;而重定向会产生新的请求,路径会变化,适用于需要用户看到跳转的过程。文中通过实例展示了如何在SpringMVC中实现这两者,并解释了ModelAndView类在重定向中的应用。
摘要由CSDN通过智能技术生成

需要两个jar包,能让JSP使用c标签。分别是:standard.jar和jstl.jsp。
c标签属于JSTL库标签。专用于Java Web。
JSTL库存在的意义是:让JSP文件中,不再使用Java代码。当然,这也存在着弊端,前台WEB开发人员需要熟悉JSTL库。

先配置好SpringMVC。如果不会配置,可以参考博文:点击参考

新建好login.html:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
	<form action="Login.spring" method="post">
		账号:<input type="text" name="username" id="username"> <br />
		密码:<input type="text" name="password" id="password"> <br /> <input
			type="submit" value="提交">
	</form>
</body>
</html>

注意:这里表单提交的地址为:Login.spring。也就意味着需要在web.xml中让Spring核心servlet拦截.spring这个字符串

Login.java:

package controller;

import java.util.ArrayList;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller // 设置该类为拦截器
public class Login {
	// 处理Login.spring请求
	@RequestMapping("/Login")
	public String login(HttpServletRequest request, HttpServletResponse response, Model model) {
		try {
			// 设置编码
			request.setCharacterEncoding("utf-8");
			response.setCharacterEncoding("utf-8");

			// 得到前台的数据
			String username = request.getParameter("username");
			String password = request.getParameter("password");

			// 将数据装在ArrayList中
			ArrayList<HashMap<String, String>> arrayList = new ArrayList<>();
			
			HashMap<String, String> hashMap = new HashMap<>();
			hashMap.put("username", username);
			hashMap.put("password", password);

			arrayList.add(hashMap);
			
			// 将ArrayList装到model中
			model.addAttribute("arrayList", arrayList);
			// 跳转到show.jsp
			return "show.jsp";
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 跳转到login.html
		return "login.html";
	}
}

接着show.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示提交信息</title>
</head>
<body>
	<c:forEach var="item" items="${arrayList}">
		<c:out value="账号:${item.username}" />
		<br />
		<c:out value="密码:${item.password}" />
	</c:forEach>
</body>
</html>

效果:
这里写图片描述

这里写图片描述
在显示提交信息的网页中,浏览器的地址为:http://localhost:8080/TestSpring/Login.spring,也就是意味着路径并没有发生改变。也就是说,Login类中的login()方法return出来的字符串属于转发

转发与重定向的区别:
转发:JSP会调用一个内部方法来调用目标【show.jsp】。新的页面会继续处理刚刚的请求,但是浏览器并不知道请求的内容。所以路径并未发生改变。
请求过程如下:
用户请求->服务器->组件1->组件2->服务器->用户

重定向:当前页面会向浏览器请求新的页面。所以路径会发生改变。
请求过程如下:
用户请求->服务器->组件->服务器->用户->新的请求

可以看出,转发较重定向而言,效率高、速度快,还保存着request中的数据。

所以,上述的请求属于转发。但是,重定向也有一定的需求。因为有的用户还是希望能看到路径的。SpringMVC已经封装好了ModelAndView类。
我们改写:Login.java:

package controller;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller // 设置该类为拦截器
public class Login {
	// 处理Login.spring请求
	@RequestMapping("/Login")
	public ModelAndView login(
			// 通过注解的方式,自动获取前台的值,如果未获取成功会报错
			@RequestParam("username") String username,
			@RequestParam("password") String password,
			HttpServletRequest request, HttpServletResponse response) {
		try {
			HashMap<String, Object> hashMap = new HashMap<>();
			hashMap.put("username", username);
			hashMap.put("password", password);
			
			// 将modelMap装进ModelAndView中
			ModelAndView modelAndView = new ModelAndView("redirect:show.jsp", hashMap);
			return modelAndView;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

在修改show.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示提交信息</title>
</head>
<body>
	账号:<c:out value="${param.username}" />
	<br />
	密码:<c:out value="${param.password}" />
</body>
</html>

我们试着运行代码:
这里写图片描述
我们可以看到,在账号输入框填写“账号”,密码输入框填写“密码”。提交表单后,路径变成了:http://localhost:8080/TestSpring/show.jsp?password=%E5%AF%86%E7%A0%81&username=%E8%B4%A6%E5%8F%B7 。已经显示路径了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值