首先需要知道什么是MVC,MVC是一种软件工程的架构模式,也是一种分类的思想。它将软件工程分为模型(model),视图(view),控制器(controller)三个部分。
模型:处理数据逻辑
视图:处理数据显示
控制器:处理与用户交互的部分
Spring MVC就是对MVC思想的一种实现,并且继承了servlet的Web框架。
Spring MVC的主要功能:
spring MVC能够实现用户与程序之间的交互。将用户的浏览器与Java程序链连接,用户通过一个url能够调用程序,实现用户与程序之间的交互。
要创建一个SpringMVC项目,先打开idea,创建一个spring-boot项目
spring-boot里集成了多种框架,我们选中的spring web其实就是表明我们创建的项目也是spring mvc项目。
项目创建完成以后,创建一个controller包,再创建一个 UserController类,编写以下代码并运行:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller//将它交给spring管理
@ResponseBody//返回非页面数据
@RequestMapping("/user") //一级路由映射
public class UserController {
@RequestMapping("/springMVC")//二级路由映射(默认为get请求)
public String saySpringMVC(){
return "springMVC";
}
}
然后在浏览器输入以下URL就能访问到相应的返回数据。对于URL,访问本机:
127.0.0.1:8080/一级路由映射/二级路由映射
其中的一级路由映射和二级路由映射是代码中可以自己指定的。
以上是对于以上的代码,它们的意思分别是:
@Controller:将该类交给spring管理
@ResponseBody:返回非页面数据,之所以要加这个注解,是因为默认情况下,SpringMVC默认返回给浏览器的是一个页面,如果要返回像字符串等非页面数据,需要加上这个注解。
@RequestMapping :一级路由映射,这个注解里的("/user")是一级路由映射,对应url的一级路径。
@RequestMapping默认支持的是GET请求,如果要指定GET请求或者POST请求,可以有以下写法:
1.关于GET请求有三种写法
//get请求三种写法
//写法一:
@RequestMapping("/springMVC")//二级路由映射(默认是get请求)
public String saySpringMVC(){
return "springMVC";
}
//写法二:
@GetMapping("/springMVC2")
public String saySpringMVC2(){
return "springMVC";
}
//写法三:
@RequestMapping(value = "/springMVC3",method = RequestMethod.GET)//二级路由映射
public String saySpringMVC3(){
return "springMVC";
}
2.关于POST请求有两种写法
//post请求的两种写法
//写法一:
@PostMapping("/hi")
public String sayHai(){
return "hi";
}
//写法二:
@RequestMapping(value = "/hi",method = RequestMethod.POST)
public String sayHi2(){
return "hi";
}
从发送的请求中获取参数,可以在方法中定义参数
//获取参数
@GetMapping("/getPar")
public Object getPar(String name){
System.out.println("name" + name);
return name;
}
使用postman发送请求,可以看到,返回参数name=zhangsan。
先定义一个对象类Person,使用lombok的@data给对象类加入getter、setter等方法。
package com.example.demo.model;
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
private String gender;
}
再传递一个Person对象
//传递对象
@GetMapping("/getPerson")
public Person getPerson(Person person){
System.out.println("名字:" + person.getName());
System.out.println("年龄:" + person.getGender());
System.out.println("性别: "+ person.getGender());
return person;
}
使用postman传递一个person对象,指定属性值,可以看到返回了相应的person对象
//后端参数重命名
//后端参数重命名,前端传参url用time,后端参数重命名为createTime
@GetMapping("/reName")
public Object reName(@RequestParam("time") String createTime){
System.out.println("时间:" + createTime);
return createTime;
}
url里的参数有时是可传的,有时是不必须传的,,那么就可以使用@RequestParam(value = "重命名",required = false),value里的值是url里需要传递的值,有了value以后,java的形参就可以改变,required = false,表示这个参数可传也可不传。
//设置参数为非必传
//value = "time",required = false 代表前端参数为time,非必传,可传可不传,程序都不会报错
@GetMapping("/method1")
public Object method1(@RequestParam(value = "time",required = false) String createTime){
System.out.println("时间:" + createTime);
return createTime;
}
使用postman发送请求可以看到没传参数没有报错。
//获取url中的参数
@PostMapping("/param/{name}/{age}")
public Object method2(@PathVariable String name,@PathVariable String age){
System.out.println("name" +name);
System.out.println("age" + age);
return "name :" + name + " age: " + age;
}
sesion存储:
request.getSession()置为true,表明如果session不存在,自动创建
//session存储
@GetMapping("/sess")
public String sess(HttpServletRequest request){
//置为true,如果session不存在,自动创建
HttpSession session=request.getSession(true);
if(session != null ){
session.setAttribute("name","张三");
}
return "存储成功";
}
session获取:
request.getSession()置为false,表明如果session不存在,不自动创建
//session获取,从HttpServletRequest中获取
@GetMapping("/session")
public String session(HttpServletRequest request){
//置为false,如果session不存在,不会自动创建
HttpSession session=request.getSession(false);
String username="";
if(session != null || session.getAttribute(username) != null){
username=(String)session.getAttribute("username");
}
return "username" +username;
}