MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分
• View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
• Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
• Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型
Spring Boot 通过添加Spring WebMVC框架, 来实现web功能.
从实际得业务处理来说,这个模型更好解释MVC
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @RestController public class UserController { // 路由器规则注册 @RequestMapping("/sayHi") public String sayHi(){ return "hello,Spring MVC"; } }
@RequestMapping
1.注册接⼝的路由映射的
2.路由映射: 当⽤⼾访问⼀个 URL 时, 将⽤⼾的请求对应到程序中某个类的某个⽅法的过程
通过浏览器访问: http://127.0.0.1:8080/sayHi
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/param") public class ParamController { @RequestMapping("/m1") public String method1(String name){ return "接收到参数name:"+ name; } }
@RequestMapping("/m2") public Object method2(String name, String password) { return "接收到参数name:" + name + ", password:" + password; }
public class Person { private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
@RequestMapping("/m3") public Object method3(Person p){ return p.toString(); }
@RequestMapping("/m4") public Object method_4(@RequestParam("time") String createtime) { return "接收到参数createtime:" + createtime; }
注意:
@RequestMapping("/m4") public Object method4(@RequestParam(value = "time", required = false) String cre return "接收到参数createtime:" + createtime; }
@RequestMapping("/m5") public String method5(String[] arrayParam) { return Arrays.toString(arrayParam); 4}
@RequestMapping("/m6") public String method6(@RequestParam List listParam){ return "size:"+listParam.size() + ",listParam:"+listParam; }
JSON的两种结构
JSON优点
传递JSON对象
@RequestBody 可以用于将 HTTP 请求体的内容转化为 Java 对象,并绑定到方法的参数上。这使得我们能够轻松地处理来自客户端发送的 JSON、XML 或其他格式的数据,并将其转换为相应的 Java 对象
@RequestMapping("/m8/{id}/{name}") public String method8(@PathVariable Integer id, @PathVariable("name") String use return "解析参数id:"+id+",name:"+userName; }
如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不⽤给@PathVariable的属性赋值, 如上述例⼦中的id变量
如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值,
如上述例⼦中的userName变量
@RequestMapping("/m9") public String getfile(@RequestPart("file") MultipartFile file) throws IOExceptio //获取⽂件名称 String fileName = file.getOriginalFilename(); //⽂件上传到指定路径 file.transferTo(new File("D:/temp/" + file.getOriginalFilename())); return "接收到⽂件名称为: "+fileName; }
Cookie 和 Session 的区别
• Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
• Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.
◦ 完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是
SessionId
◦ Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.
获取Cookie
1 @RequestMapping("/m10") 2 public String method10(HttpServletRequest request,HttpServletResponse response) 3 // 获取所有 cookie 信息 4 Cookie[] cookies = request.getCookies(); 5 //打印Cookie信息 6 StringBuilder builder = new StringBuilder(); 7 if (cookies!=null){ 8 for (Cookie ck:cookies) { 9 builder.append(ck.getName()+":"+ck.getValue()); 10 } 11 } 12 return "Cookie信息:"+builder; 13 }
HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请
求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信
息.
HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾
端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容
1 @RequestMapping("/getCookie") 2 public String cookie(@CookieValue("bite") String bite) { 3 return "bite:" + bite; 4 }
获取Session
Session 存储和获取
Session是服务器端的机制, 我们需要先存储, 才能再获取
Session 也是基于HttpServletRequest 来存储和获取的
Session存储
1 @RequestMapping("/setSess") 2 public String setsess(HttpServletRequest request) { 3 // 获取Session对象 4 HttpSession session = request.getSession(); //getSession 操作内部提取到请求中的Cookie ⾥的SessionId, 然后根据SessionId获取到对应的Session 对象 5 if (session != null) { 6 session.setAttribute("username", "java"); 7 } 8 return "session 存储成功"; 9 }
1 HttpSession getSession(boolean create); 2 3 HttpSession getSession();
Session读取
1 @RequestMapping("/getSess") 2 public String sess(HttpServletRequest request) { 3 // 如果 session 不存在, 不会⾃动创建 4 HttpSession session = request.getSession(false); 5 String username = null; 6 if (session != null && session.getAttribute("username") != null) { 7 username = (String) session.getAttribute("username"); 8 } 9 return "username:" + username; 10 }
1 2 3 4 5 Index⻚⾯ 6 7 8 Hello,Spring MVC,我是Index⻚⾯. 9 10
后端
1 @RestController 2 public class IndexController { 3 @RequestMapping("/index") 4 public Object index(){ 5 //返回index.html 6 return "/index.html"; 7 } 8 }
结果却发现, ⻚⾯未正确返回, http响应把 “/index.html” 当做了http响应正⽂的数据
那Spring MVC如何才能识别出来 index.html 是⼀个静态⻚⾯, 并进⾏返回呢?
正确
1 @Controller 2 public class IndexController { 3 @RequestMapping("/index") 4 public Object index(){ 5 return "/index.html"; 6 } 7 }
@Controller和@RestController 区别
由于开发流⾏"前后端分离"模式,View不再返回视图, ⽽是返回显⽰视图时需要的数据.
@RestController = @Controller + @ResponseBody
@RestController 其实是返回的数据
@Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
@ResponseBody : 定义返回的数据格式为⾮视图, 返回⼀个 text/html 信息
1 @Controller 2 @ResponseBody 3 public class IndexController { 4 @RequestMapping("/index") 5 public Object index(){ 6 return "/index.html"; 7 } 8 }
1 @RequestMapping("/returnHtml") 2 @ResponseBody 3 public String returnHtml() { 4 return "Hello,HTML~
"; 5 }
响应中的 Content-Type 常⻅取值有以下⼏种:
• text/html : body 数据格式是 HTML
• text/css : body 数据格式是 CSS
• application/javascript : body 数据格式是 JavaScript
• application/json : body 数据格式是 JSON
如果请求的是js⽂件, Spring MVC会⾃动设置Content-Type为 application/javascript
如果请求的是css⽂件, Spring MVC会⾃动设置Content-Type为 text/css
1 @RequestMapping("/returnJson") 2 @ResponseBody 3 public HashMap returnJson() { 4 HashMap map = new HashMap<>(); 5 map.put("Java", "Java Value"); 6 map.put("MySQL", "MySQL Value"); 7 map.put("Redis", "Redis Value"); 8 return map; 9 }
Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
1 @RequestMapping(value = "/setStatus") 2 @ResponseBody 3 public String setStatus(HttpServletResponse response) { 4 response.setStatus(401); 5 return "设置状态码成功"; 6 }
注意:状态码不影响⻚⾯的展⽰