目录
[3. 请求转发和请求重定向异同](#3. 请求转发和请求重定向异同)
一.SpringMVC
1.什么是SpringMVC
Spring Web MVC 是基于Servlet API 构建的原始Web 框架,从一开始就包含在 Spring 框架中。它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc),但它通常被称为"Spring
MVC''.
2.什么是MVC
MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分
为模型、视图和控制器三个基本部分
3.SpringMVC的功能
1.连接的功能 :将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用到我们的Spring程序。
2.获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。
3.输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。
4.创建SpringMVC项目
勾选SpringWeb即可创建SpringMVC的项目
一个简单的SpringMVC接口(这个只能访问一个页面)
Java代码
java
package com.javastudy.springmvcdemo4.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Chooker
* @create 2023-07-24 16:58
*/
@Controller
@RequestMapping("/web")
public class WebController {
@RequestMapping("/aaa")
public String aaa(){
return "/aaa.html";
}
}
前端html代码
html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>aaa</title>
</head>
<body>
<h1>Hello,SpringMVC</h1>
</body>
</html>
访问页面信息
可以在方法上面加上@Response注解
java
package com.javastudy.springmvcdemo4.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author Chooker
* @create 2023-07-24 16:58
*/
@Controller
@RequestMapping("/web")
public class WebController {
@RequestMapping("/aaa")
@ResponseBody
public String aaa(){
return "Hello2,SpringMVC";
}
}
这样访问的就不是一个html页面了
接下来我们重点介绍这些注解
二.注解介绍
1.RequestMapping注解
@RequestMapping既可以修饰类,也可以修饰方法
同时支持get和post方法,两种方法访问路径的时候都支持
有两个参数,value参数可以指定访问的路径,method方法可以指定访问的方法,当我们使用别的方法访问的时候,会报如下错误
//仅允许get方法访问 @RequestMapping(value = "/aaa",method = RequestMethod.GET)
//仅允许post方法访问
@RequestMapping(value = "/aaa",method = RequestMethod.POST)
也可以直接改为@GetMapping或者@PostMapping
@GetMapping 等同于 @RequestMapping(method = RequestMethod.GET)
@PostMapping等同于 @RequestMapping(method = RequestMethod.POST)
2.ResponseBody注解
@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成
application/json 返回给前端。
@ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者 json,而不是视图。
返回的是一个数据,而不是视图
**3.**RestController注解
可以在类上面加@RestController注解来替代@ResponseBody和@Controller注解,因为@Controller只能修饰类,所以@RestController注解只能修饰类,并且这个类中所有的方法的返回都只能只会返回 html 或者 json,方法一律不能返回视图,因此如果这个类中有的方法需要返回视图,我们不能使用这个组合注解@ResponseBody
三.获取参数
1.通过HttpServletRequest拿到参数
因为SpringMVC是基于Servlet框架的,因此方法的参数中可以使用HttpServletRequest 和HttpServletResponse.
因此通过HttpServletRequest中的getParameter方法可以拿到客户端传递过来的指定参数
java
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/get1")
public String get1(HttpServletRequest httpServletRequest) {
String name = httpServletRequest.getParameter("name");
return "name : " + name;
}
}
2.直接通过参数去取
直接在方法的参数列表写需要的参数,就可以取到参数,要求是参数列表中的参数的名字和url中的名字一致
java
@RequestMapping("/get2")
public String get2(String name) {
return "name : " + name;
}
3.直接获取多个参数
java
@RequestMapping("/get3")
public String get3(String name,Integer age) {
return "name : " + name+" age : "+age;
}
自动匹配名字一致的参数,和url中的顺序无关,并进行了类型的转换
如果不对age进行传参,会有如下结果.
如果类型无法出现转换,会报以下错误
将age的类型改为基本数据类型int,不对age进行传参
java
@RequestMapping("/get3")
public String get3(String name,int age) {
return "name : " + name+" age : "+age;
}
如何此时不对age进行传参,会报500的错误
错误传参和之前的错误一样,都是报400错误
总结:在项目开发的过程中,使用包装类更加的保险
4.对象传参
java
@RequestMapping("/get4")
public String get4(Student student) {
return student.toString();
}
思考:当我们使用其他方式进行传参,比如表单,ajax传参,会发生改变吗?
由上图可知,不会发生改变
总结:前端不论用什么方式进行传参,后端都可以通过这些方法接收到参数,因此后端只需要关心后端的处理逻辑即可
5.后端参数重命名
java
@RequestMapping("/get5")
public String get5(@RequestParam("n") String name) {
return "name : " + name;
}
}
将调用方发送的参数n,重命名为name
那当我们不传这个参数的时候会发生什么情况呢?
可以看到会报这个错误,但是之前我们没有传参数的时候默认为null,不会报这个错误,这个时候为什么会出现这个错误呢?
观察源码可以发现默认required是true,因此加了@RequestParam的参数是必填参数,我们可以进行修改,使为不必填参数
java
@RequestMapping(name = "/get5")
public String get5(@RequestParam(name = "n",required = false) String name) {
return "name : " + name;
}
此时再传参数就不会报错误了.
6.传递json字符串
java
@RequestMapping("/get6")
public String get6(Student student) {
return student.toString();
}
如何我们此时直接发送,我们可以看到student是接受不到json字符串的信息的
此时我们给Student对象加上@RequestBody 注解,再来观察
java
@RequestMapping("/get6")
public String get6(@RequestBody Student student) {
return student.toString();
}
这个时候接收到的信息是正确的,因此只要只有加了@RequestBody注解系统才会将json字符串转换为对象
但当我们加了@RequestBody注解,接收到的却不是json字符串,会报以下的错误
7.从url中拿参数
java
@RequestMapping("/get7/{shopid}/{dealid}")
public String get7(@PathVariable Integer shopid, @PathVariable("dealid") Integer dealId) {
return "shopId=" + shopid + " dealid= " + dealId;
}
注意的是字段需要保持一致,如果不一致的话,需要在@PathVariable中设置参数的名称
8.上传文件
java
@RequestMapping("/get8")
public String get8(@RequestPart("file") MultipartFile file) throws IOException {
log.info(file.getOriginalFilename());
file.transferTo(new File("D:\\java cave\\temp\\" + file.getOriginalFilename()));
return "success";
}
可以看到是成功上传了的
四.获取Cookie,Session,Header
1.获取Cookie
1.通过之前的方法HttpServeletRequest
java
@RequestMapping("/get10")
public String get10(@CookieValue String cookie) {
return cookie;
}
2.通过注解获得
java
@RequestMapping("/get9")
public String get9(HttpServletRequest httpServletRequest) {
Cookie[] cookies = httpServletRequest.getCookies();
String value = cookies[0].getValue();
return value;
}
}
同时这个注解也是必填的参数,可以通过required=false设置为非必填的
2.获取和设置Session
1.设置Session
java
@RequestMapping("/set11")
public String set11(HttpSession session) {
session.setAttribute("username", "张三");
return "success";
}
2.获取Session
java
@RequestMapping("/get11")
public String get11(@SessionAttribute(required = false) String username) {
return "username = " + username;
}
同时这个注解也是必填的参数,可以通过required=false设置为非必填的
3.获取Header
java
@RequestMapping("/get13")
public String get13(@RequestHeader("User-Agent") String userAgent) {
return "User-Agent = " + userAgent;
}
同时这个注解也是必填的参数,可以通过required=false设置为非必填的
五.返回数据
1.返回静态页面
如果注解不加@ResponseBody就是返回直接映射到一个静态的页面
java
package com.javastudy.springmvcdemo4.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Chooker
* @create 2023-07-24 16:58
*/
@Controller
@RequestMapping("/web")
public class WebController {
@RequestMapping("/aaa")
public String aaa(){
return "/aaa.html";
}
}
直接映射到 这个aaa.html页面
2.返回text/html
只需要在方法前面加上@ResponseBody注解竟可以返回一个text/html文字了
java
package com.javastudy.springmvcdemo4.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Chooker
* @create 2023-07-24 16:58
*/
@Controller
@RequestMapping("/web")
public class WebController {
@RequestMapping("/aaa")
@ResponseBody
public String aaa(){
return "/aaa.html";
}
}
3.返回JSON对象
java
@RequestMapping("/get14")
public HashMap<String, String> get14() {
HashMap<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
return map;
}
可以看到当我们返回的是HashMap的时候,自动返回的就是一个Json字符串对象
六.请求转发和请求重定向
1.请求转发
java
package com.javastudy.springmvcdemo4.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Chooker
* @create 2023-07-25 12:25
*/
@RequestMapping("/index")
@Controller
public class IndexController {
//请求转发
@RequestMapping("/forward")
public String forward() {
return "forward:/aaa.html";
}
}
2.请求重定向
java
package com.javastudy.springmvcdemo4.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Chooker
* @create 2023-07-25 12:25
*/
@RequestMapping("/index")
@Controller
public class IndexController {
//请求重定向
@RequestMapping("/redirect")
public String redirect() {
return "redirect:/aaa.html";
}
}
状态码为302
举例区分
forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如,你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求 redirect 重定向。
3. 请求转发和请求重定向异同
同:都会发生网页的跳转
异:
1、请求转发是服务器行为、请求重定向是客户端浏览器行为
2、请求转发是request对象调用方法、请求重定向是response对象调用方法
3、请求转发只有一次请求所以可以实现request域对象中的数据共享,而请求重定向是多次请求、多次响应
4、请求转发的效率要高于请求重定向
5、请求转发url地址栏不变,而请求重定向会发生变化
6、既然请求转发是服务器内部的行为,所以只能访问服务器内部资源.而请求重定向既然是浏览器行为,地址栏会变,所以可以访问服务器外部资源