SpringMVC是一个Java框架,用于开发基于Java的Web应用程序。它是Spring框架的一部分,专注于在Web应用程序中实现Model-View-Controller(MVC)设计模式。MVC模式是一种常用的软件设计模式,用于将应用程序的逻辑分离成三个主要组件:模型(Model)、视图(View)和控制器(Controller),从而实现代码的解耦和更好的可维护性。
大家看下面的图片,就知道现在这个流程了.
MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的逻辑分离成三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这个模式的目的是实现代码的解耦和更好的可维护性。
SpringMVC是Spring框架的一部分,专注于在Java Web应用程序中实现MVC设计模式。因此,可以说SpringMVC是Spring框架对MVC模式的具体实现。它提供了一组组件和工具,用于开发基于Java的Web应用程序,并按照MVC模式来组织应用程序的代码结构。
下面是MVC和SpringMVC之间的关系:
MVC是一种设计模式:MVC是一种通用的设计模式,不仅用于Web应用程序,还可以用于其他类型的应用程序。它将应用程序划分为模型、视图和控制器,每个组件有自己的职责,从而实现了代码的分离和解耦。
SpringMVC是MVC在Spring框架中的实现:SpringMVC是Spring框架为Web应用程序提供的MVC实现。它通过控制器(Controller)、视图(View)、模型(Model)、处理器映射器(Handler Mapping)、视图解析器(View Resolver)等组件来实现MVC模式。
Spring框架是更大范围的解决方案:Spring框架提供了广泛的功能和模块,用于开发企业级Java应用程序。除了SpringMVC,它还包括Spring Core(核心容器)、Spring Security(安全)、Spring Data(数据访问)、Spring AOP(面向切面编程)等模块。SpringMVC是Spring框架的一个模块,用于处理Web应用程序的请求和响应。
综上所述,MVC是一种通用的设计模式,而SpringMVC是Spring框架对MVC模式在Web应用程序中的具体实现。使用SpringMVC,开发者可以更轻松地构建灵活可扩展的Java Web应用程序,并且能够充分利用Spring框架的其他功能和特性。
我们学习SpringMVC需要掌握一下3个功能:
实际上springMVC项目可以基于springboot创建,创建一个sprigboot项目,再勾选上springWeb就创建好了.
创建一个UserController 类,实现用户到Spring程序的互联互通.
代码入下:
public class UserController {
public String hi(String name) {
return "spring mvc hi" +name;
}
}
获取参数的功能,就是依赖一个注解,代码如下:
public class UserController {
@RequestMapping("/hi")
public String hi(String name) {
return "spring mvc hi" + name;
}
}
输出参数的功能,要在类上加入一个注解,这个注解就是@RestController
代码如下:
@RestController
public class UserController {
@RequestMapping("/hi")
public String hi(String name) {
return "spring mvc hi" + name;
}
}
看了上面的流程之后,我接下来会介绍获取参数和答应参数的一些注解
三种请求方式
@RequestMapping
@GetMapping
@PostMapping
代码如下:
@RequestMapping("/e1")
public String example(String str){
return "hello world "+str;
}
@GetMapping("/e2")
public String example2(String str){
return "hello world "+str;
}
@PostMapping("/e3")
public String example3(String str){
return "hello world "+str;
}
代码如下:
@RequestMapping("/e4")
public String example4(String username,String password){
return "hello world "+ username +" "+ password;
}
获取对象的步骤
1.检查控制器方法的参数列表,发现有一个类型为User的参数。
2.根据请求参数名username和password ,id 和age 与User类中的属性名匹配,创建User对象。
3.将请求参数的值绑定到User对象的属性上。
4.将创建并填充好的User对象传递给saveUser方法,作为参数。
@RequestMapping("/reg")
public Object example6(User user){
System.out.println(user);
return user;
}
这里具体的步骤就是:
1.前端发送JSON数据:前端通过AJAX或其他方式将JSON数据发送给后端。确保请求的Content-Type设置为application/json,以便告知后端该请求包含JSON数据。
2.创建Java对象:在后端的控制器方法中,创建对应的Java对象,用于接收JSON数据。这个Java对象通常是一个POJO(Plain Old Java Object),包含与JSON数据字段对应的属性。
3.使用@RequestBody注解:在控制器方法参数中使用@RequestBody注解来接收JSON数据,并将其转换为Java对象。
4.处理JSON数据:在控制器方法中,你可以对接收到的Java对象进行业务逻辑的处理。
代码如下:
@RequestMapping("/reg2")
public Object example7(@RequestBody User user){
System.out.println(user);
return user;
}
这里我们就不构造前端界面了,我们直接使用postman来构造请求.
代码如下:
//6.从基础的url获取参数
@RequestMapping("/url/{username}/{password}")
public String example8(@PathVariable String username,@PathVariable String password){
return "username "+ username + "password " +password;
}
具体步骤:
1.客户端发送一个带有文件上传的multipart/form-data类型的POST请求时
2.Spring MVC会将上传的文件数据自动绑定到file参数,
具体代码如下:
@RequestMapping("/myupload1")
public Object upload1(@RequestPart("myimg") MultipartFile file){
File file1=new File("D:\\Study\\java\\myimg.jpg");
try {
file.transferTo(file1);
return true;
}catch (IOException ioException){
ioException.printStackTrace();
}
return false;
}
这里的如果反复提交文件,文件会被覆盖,为了防止我们上传文件,被覆盖,我们修改了一下代码:
@RequestMapping("/myupload2")
public Object upload2(@RequestPart("myimg") MultipartFile file) {
String fileName = UUID.randomUUID() + // 文件名
file.getOriginalFilename().substring( // 文件后缀
file.getOriginalFilename().lastIndexOf("."));
File saveFile = new File("D:\\Data\\" + fileName);
try {
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
@RequestMapping("/getCk")
public Object getCk(@CookieValue(value = "java",required = false) String java){
return java;
}
@RequestMapping("/gethd")
public Object getHeader(@RequestHeader("Host") String ht) {
return "Host -> " + ht;
}
/**
* 存储 session
*/
private static final String SESSION_KEY = "USERINFO_SESSION_KEY";
@RequestMapping("/setsess")
public void setSess(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute(SESSION_KEY, "zhangsan");
}
/**
* 获取 session
*/
@RequestMapping("/getsess")
public Object getSession(@SessionAttribute(SESSION_KEY) String name) {
return "session->" + name;
}
补充以下请求转发和充定向的区别:
执行位置:
重定向:是在客户端(浏览器)发生的,即在服务器端处理完当前请求后,服务器会发送一个特殊的HTTP响应状态码(302或者303)和一个新的URL给客户端,然后客户端会重新向新的URL发送请求,实现页面跳转。
请求转发:是在服务器端发生的,即在服务器端处理完当前请求后,服务器会将请求转发到指定的目标URL,并由服务器端直接返回目标URL对应的响应,客户端并不知道页面的跳转。
URL变化:
重定向:会改变浏览器的URL地址,因为在重定向后客户端会重新向新的URL发送请求,所以浏览器的地址会变成新的URL。
请求转发:浏览器的URL地址不会改变,因为请求转发是服务器端直接转发请求,客户端并不知道页面的实际跳转。
请求对象和响应对象:
重定向:在重定向中,客户端会发送两次请求,第一次请求由服务器处理并发送重定向响应,第二次请求是客户端根据重定向响应重新发送的。
请求转发:在请求转发中,只有一次请求,请求是直接由服务器处理的,并直接将响应返回给客户端。
数据传递:
重定向:由于两次请求,因此数据传递比较麻烦,一般通过URL参数或Session来传递数据。
请求转发:由于只有一次请求,因此数据传递相对简单,可以通过请求属性(Request Attribute)来传递数据。
适用场景:
重定向:适用于页面跳转后,客户端需要刷新或新加载数据的情况,例如表单提交成功后的跳转、登录成功后的跳转等。
请求转发:适用于页面跳转后,客户端不需要刷新或新加载数据的情况,例如服务器内部的页面跳转、过滤器的页面跳转等。