目录
一.SpringMVC
1.什么是SpringMVC
2.什么是MVC
3.SpringMVC的功能
4.创建SpringMVC项目
二.注解介绍
1.RequestMapping注解
2.ResponseBody注解
3.RestController注解
三.获取参数
1.通过HttpServletRequest拿到参数
2.直接通过参数去取
3.直接获取多个参数
4.对象传参
5.后端参数重命名
6.传递json字符串
7.从url中拿参数
8.上传文件
四.获取Cookie,Session,Header
1.获取Cookie
1.通过之前的方法HttpServeletRequest
2.通过注解获得
2.获取和设置Session
1.设置Session
2.获取Session
编辑
3.获取Header
五.返回数据
1.返回静态页面
2.返回text/html
3.返回JSON对象
六.请求转发和请求重定向
1.请求转发
2.请求重定向
3. 请求转发和请求重定向异同
1.连接的功能:将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用到我们的Spring程序。
2.获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。
3.输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。
一个简单的SpringMVC接口(这个只能访问一个页面)
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代码
aaa
Hello,SpringMVC
访问页面信息
可以在方法上面加上@Response注解
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页面了
接下来我们重点介绍这些注解
@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)
返回的是一个数据,而不是视图
可以在类上面加@RestController注解来替代@ResponseBody和@Controller注解,因为@Controller只能修饰类,所以@RestController注解只能修饰类,并且这个类中所有的方法的返回都只能只会返回 html 或者 json,方法一律不能返回视图,因此如果这个类中有的方法需要返回视图,我们不能使用这个组合注解@ResponseBody
因为SpringMVC是基于Servlet框架的,因此方法的参数中可以使用HttpServletRequest 和HttpServletResponse.
因此通过HttpServletRequest中的getParameter方法可以拿到客户端传递过来的指定参数
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/get1")
public String get1(HttpServletRequest httpServletRequest) {
String name = httpServletRequest.getParameter("name");
return "name : " + name;
}
}
直接在方法的参数列表写需要的参数,就可以取到参数,要求是参数列表中的参数的名字和url中的名字一致
@RequestMapping("/get2")
public String get2(String name) {
return "name : " + name;
}
@RequestMapping("/get3")
public String get3(String name,Integer age) {
return "name : " + name+" age : "+age;
}
自动匹配名字一致的参数,和url中的顺序无关,并进行了类型的转换
如果不对age进行传参,会有如下结果.
如果类型无法出现转换,会报以下错误
将age的类型改为基本数据类型int,不对age进行传参
@RequestMapping("/get3")
public String get3(String name,int age) {
return "name : " + name+" age : "+age;
}
如何此时不对age进行传参,会报500的错误
错误传参和之前的错误一样,都是报400错误
总结:在项目开发的过程中,使用包装类更加的保险
@RequestMapping("/get4")
public String get4(Student student) {
return student.toString();
}
思考:当我们使用其他方式进行传参,比如表单,ajax传参,会发生改变吗?
由上图可知,不会发生改变
总结:前端不论用什么方式进行传参,后端都可以通过这些方法接收到参数,因此后端只需要关心后端的处理逻辑即可
@RequestMapping("/get5")
public String get5(@RequestParam("n") String name) {
return "name : " + name;
}
}
将调用方发送的参数n,重命名为name
那当我们不传这个参数的时候会发生什么情况呢?
可以看到会报这个错误,但是之前我们没有传参数的时候默认为null,不会报这个错误,这个时候为什么会出现这个错误呢?
观察源码可以发现默认required是true,因此加了@RequestParam的参数是必填参数,我们可以进行修改,使为不必填参数
@RequestMapping(name = "/get5")
public String get5(@RequestParam(name = "n",required = false) String name) {
return "name : " + name;
}
此时再传参数就不会报错误了.
@RequestMapping("/get6")
public String get6(Student student) {
return student.toString();
}
如何我们此时直接发送,我们可以看到student是接受不到json字符串的信息的
此时我们给Student对象加上@RequestBody 注解,再来观察
@RequestMapping("/get6")
public String get6(@RequestBody Student student) {
return student.toString();
}
这个时候接收到的信息是正确的,因此只要只有加了@RequestBody注解系统才会将json字符串转换为对象
但当我们加了@RequestBody注解,接收到的却不是json字符串,会报以下的错误
@RequestMapping("/get7/{shopid}/{dealid}")
public String get7(@PathVariable Integer shopid, @PathVariable("dealid") Integer dealId) {
return "shopId=" + shopid + " dealid= " + dealId;
}
注意的是字段需要保持一致,如果不一致的话,需要在@PathVariable中设置参数的名称
@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";
}
可以看到是成功上传了的
@RequestMapping("/get10")
public String get10(@CookieValue String cookie) {
return cookie;
}
@RequestMapping("/get9")
public String get9(HttpServletRequest httpServletRequest) {
Cookie[] cookies = httpServletRequest.getCookies();
String value = cookies[0].getValue();
return value;
}
}
同时这个注解也是必填的参数,可以通过required=false设置为非必填的
@RequestMapping("/set11")
public String set11(HttpSession session) {
session.setAttribute("username", "张三");
return "success";
}
@RequestMapping("/get11")
public String get11(@SessionAttribute(required = false) String username) {
return "username = " + username;
}
同时这个注解也是必填的参数,可以通过required=false设置为非必填的
@RequestMapping("/get13")
public String get13(@RequestHeader("User-Agent") String userAgent) {
return "User-Agent = " + userAgent;
}
同时这个注解也是必填的参数,可以通过required=false设置为非必填的
如果注解不加@ResponseBody就是返回直接映射到一个静态的页面
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";
}
}
只需要在方法前面加上@ResponseBody注解竟可以返回一个text/html文字了
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";
}
}
@RequestMapping("/get14")
public HashMap get14() {
HashMap map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
return map;
}
可以看到当我们返回的是HashMap的时候,自动返回的就是一个Json字符串对象
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";
}
}
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 重定向。
同:都会发生网页的跳转
异: