SpringMVC
SpringMVC(Spring Web MVC、Spring Web):是基于Servlet构建的原生Web框架。
1.什么是MVC
MVC(Model View Controller):是软件工程中的一种软件架构模式。分别为为模型、视图、控制器。各个部分实现不同的功能,方便开发。
视图:负责界面的显示
控制器:对请求参数处理和决定使用哪一个模型。
模型:执行业务逻辑和获取数据。
MVC是一种思想、Spring MVC是具体的实现,继承了Servlet API的Web框架。Spring功能的具体使用,在SpringMVC中得到了很大的体现,大部分Java项目都是SpringMVC项目,因此也是学习SpringMVC的原因。
2.请求映射到程序
对于用户发来的请求,如何实现请求到具体程序的映射呢?Spring MVC使用了一个DispatcherServlet来处理所有的HTTP请求。这个Servlet的作用是将请求分派到相应的Controller。因此我们需要在Controller对象提供一些映射信息,来保证我们的请求被准确分发。
路由映射:将用户请求的url,映射到具体的某一个方法的过程。
@Controller //添加控制器
@ResponseBody //返回非view示图
@RequestMapping("/hello") //路由器规则注册
public class DemoController {
@RequestMapping(value="/Hi")//路由器规则注册
public Object sayHi(){
return "Hi~~~";
}
}
@RequestMapping:接口路由注册,既可以修饰类也可以修饰方法、method的参数指定url请求的方法的类型。
@PostMapping:接口路由注册,限制使用post方法。
@GetMapping:接口路由注册,限制使用get方法。
注意:请求映射标记需要具体到方法。SpringMvc默认返回的是视图(页面)。
3.获取参数
每一个请求方法都有两个隐藏参数,分别是HttpServletRequest和HttpServletResponse,如果需要使用,只需要在方法中声明即可。
1.获取单个参数
认识参数有关的注解:
-
@RequestBody:。在Spring MVC中,一个请求方法中只能有一个@RequestBody参数。如果再次读取,stream已经关闭,会出现400错误,一般用于接收JSON格式的数据。
@RequestMapping("/info") public Object person(@RequestBody Info info, Integer id){ return info.toString()+id; }
-
@RequestParam:它可以映射URL查询参数(query string parameters)和表单数据(form data)。还可以对参数进行重命名和配置某个参数是否为必要参数,默认为true。设置非必要时,不存在则对象为null。
-
@PathVariable:用于将URL路径参数绑定到方法的参数上。参数的类型只能是String类型
@RequestMapping("/user/{id}/{name}") public String getUser(@PathVariable("id") Integer id, @PathVariable String name) { // 使用路径参数id执行相应的操作 return "User with ID: " + id; }
-
@CookieValue(“cookieKey”):@CookieValue注解主要用于将请求的Cookie数据映射到控制器处理方法的参数上。其中,"cookieKey"是用来绑定和获取特定Cookie的键值。
@GetMapping("/userinfo") public String getUserInfo(@CookieValue("cookieKey") String cookieKey) { // 从Cookie中获取用户的ID,并执行相应的操作 // ... return "user-info"+cookieKey; }
-
@SessionAttribute:@SessionAttributes(“user”)接收到请求之后,会自动根据请求的cookie匹配session,并拿到session中的属性user。可以设置必要or非必要。
-
@RequestHeader(“User-Agent”):可以指定想要拿到的头部,赋给参数。
-
通过HttpServletRequest对象获取
@RequestMapping("/hi") public Object sayHi(HttpServletRequest request, HttpServletResponse response){ //根据参数获取,如何没有该参数会空指针异常 String name = request.getParameter("name"); return "Hi~~~" + name; }
-
直接通过参数映射获取(存在多个参数时,参数顺序没有关系)
@RequestMapping("/Hey") public Object sayHey(String name){ return "Hey~~~"+name; }
-
获取一个对象
//属性名建议所有都小写 @Data public class Info { private String name; private Integer age; private String sex; } @RequestMapping("/Info") public Object person(Info info, Integer id){ return "id:"+ id+ " " +info.toString(); }
2.传输文件
@RequsetPart(“key”):用于处理multipart/form-data类型的请求参数,它通常被用在文件上传的情况下。
@RequestMapping("/upload")
public Object upload(@RequestPart("file")MultipartFile multipartFile) throws IOException {
//将文件保存到指定的路径
multipartFile.transferTo(new File("D:\\gitee\\java\\springboot-demo\\img.png"));
return "success";
}
4.请求转发和重定向
主要使用在页面跳转。
-
forward:是请求转发
-
redirect:请求重定向
-
定义不同:请求转发是服务器端实现的,服务器代为请求并将结果返回给客户端。而请求重定向是客户端的跳转,服务器返回新的URL地址给客户端,让客户端访问新的URL所指向的资源。
-
请求方不同:在请求转发中,客户端只需要发送一次请求,而在请求重定向中,客户端需要发送两次完全不同的请求。
-
最终URL地址不同:请求转发过程中,URL地址不变。而请求重定向中,URL地址发生了改变,显示的是最终跳转的地址。
URL地址给客户端,让客户端访问新的URL所指向的资源。
2. 请求方不同:在请求转发中,客户端只需要发送一次请求,而在请求重定向中,客户端需要发送两次完全不同的请求。
3. 最终URL地址不同:请求转发过程中,URL地址不变。而请求重定向中,URL地址发生了改变,显示的是最终跳转的地址。