给公司做网站这个工作怎么样,天津网站优化公司电话,万一打仗哪个省最安全,网络销售哪个平台最好1. 什么是 Spring Web MVC#xff1f;
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)#xff0c;但它通常被称为SpringMVC.Servlet
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)但它通常被称为SpringMVC.Servlet⼀套Java Web 开发的技术标准通过编写代码去实现 Servlet 规范提到的各种功能
1.1 MVC 定义 MVC 是 Model View Controller 的缩写它是软件⼯程中的⼀种软件架构设计模式它把软件系统分为模型、视图和控制器三个基本部分 • View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互展⽰数据的资源. • Model(模型) 是应⽤程序的主体部分⽤来处理程序中数据逻辑的部分. • Controller控制器可以理解为⼀个分发器⽤来决定对于视图发来的请求需要⽤哪⼀个模型来处理以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型 Spring Boot 通过添加Spring WebMVC框架, 来实现web功能. 从实际得业务处理来说这个模型更好解释MVC
2. 学习Spring MVC
建⽴连接将⽤⼾浏览器和 Java 程序连接起来也就是访问⼀个地址能够调⽤到我们的Spring 程序。请求: ⽤⼾请求的时候会带⼀些参数在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能.响应: 执⾏了业务逻辑之后要把程序执⾏的结果返回给⽤⼾, 也就是响应.
2.1 项⽬准备 2.2 建⽴连接
RequestMapping 来实现 URL 路由映射 也就是浏览器连接程序的作⽤
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;}}RestController作用
声明控制器类用于标识一个类是 Spring MVC 控制器并且处理 HTTP 请求简化响应体的返回不需要额外使用 ResponseBody 来指定方法返回的内容直接作为响应体RestController 已经默认包含了这个功能在上面这个代码中打开浏览器就会看到hello,Spring MVCSpring MVC 会自动根据请求的 Content-Type 头信息来决定将方法返回的对象转换为对应的格式然后作为响应返回给客户端。 RequestMapping 1.注册接⼝的路由映射的 2.路由映射: 当⽤⼾访问⼀个 URL 时, 将⽤⼾的请求对应到程序中某个类的某个⽅法的过程 通过浏览器访问: http://127.0.0.1:8080/sayHi
2.2.2 RequestMapping 使⽤
即可修饰类也可以修饰⽅法 当修饰类和⽅法时访问的地址是类路径 ⽅ 法路径 RequestMapping标识⼀个类设置映射请求的请求路径的初始信息 RequestMapping标识⼀个⽅法设置映射请求请求路径的具体信息 注意: RequestMapping 的URL 路径最前⾯加不加 / (斜杠)都可以, Spring程序启动时, 会进⾏判断, 如果 前⾯没有加 / , Spring会拼接上⼀个 /
2.2.3传参介绍
URL的格式
2.3 请求
访问不同的路径, 就是发送不同的请求
2.3.1 传递单个参数
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(/param)public class ParamController {RequestMapping(/m1)public String method1(String name){return 接收到参数name: name;}}注意路径 使用基本类型进行传参的时候必须传值建议直接使用包装类基本类型不具备能够直接表示为空的特性因为它们不是对象而是直接存储在栈内存中的数据
2.3.2传递多个参数
和接收单个参数⼀样, 直接使⽤⽅法的参数接收即可. 使⽤多个形参. RequestMapping(/m2)public Object method2(String name, String password) {return 接收到参数name: name , password: password;}注意当有多个参数时前后端进⾏参数匹配时是以参数的名称进⾏匹配的因此参数的位置是不影响后端获取参数的结果
2.3.3传递对象
如果参数⽐较多时, ⽅法声明就需要有很多形参. 并且后续每次新增⼀个参数, 也需要修改⽅法声明.我们不妨把这些参数封装为⼀个对象
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;}Overridepublic String toString() {return Person{ id id , name name \ , password password \ };}}传递对象代码实现
RequestMapping(/m3)public Object method3(Person p){return p.toString();}可以看到, 后端程序正确拿到了Person对象⾥各个属性的值 注意Spring 会根据参数名称⾃动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则赋值为默认初识值, ⽐如int类型的属性, 会被赋值为0)
2.3.4后端参数重命名后端参数映射
由于映射是根据参数的名字来进行匹配的就会出现前后端的参数名字不一样的情况比如前端传递了⼀个time 给后端⽽后端是使⽤ createtime 字段来接收的我们就可以使**RequestParam** 来重命名前后端的参数值.
RequestMapping(/m4)
public Object method_4(RequestParam(time) String createtime) {return 接收到参数createtime: createtime;}将time重命名为createtimeSpring可以正确的把浏览器传递的参数time绑定到了后端参数caretetime参数上
注意
使⽤ RequestParam 进⾏参数重命名时, 请求参数只能和 RequestParam 声明的名称⼀ 致, 才能进⾏参数绑定和赋值.使⽤ RequestParam 进⾏参数重命名时, 参数就变成了必传参数.
如何设置为非必传参数呢我们可以通过设置 RequestParam 中的 requiredfalse 来避免不传递时报错
RequestMapping(/m4)
public Object method4(RequestParam(value time, required false) String crereturn 接收到参数createtime: createtime;}2.3.5传递数组
Spring MVC 可以⾃动绑定数组参数的赋值
RequestMapping(/m5)public String method5(String[] arrayParam) {return Arrays.toString(arrayParam);
4}2.3.6传递集合
集合参数和数组类似, 同⼀个请求参数名有为多个, 且需要使⽤ RequestParam 绑定参数关系
RequestMapping(/m6)public String method6(RequestParam ListString listParam){
return size:listParam.size() ,listParam:listParam;
}2.3.7传递JSON数据
JSONJavaScript Object Notation 【JavaScript 对象表⽰法】JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换. JSON的语法:
数据在 键值对(Key/Value) 中数据由逗号 , 分隔对象⽤ {} 表⽰数组⽤ [] 表⽰值可以为对象, 也可以为数组, 数组中可以包含多个对象
JSON的两种结构
对象: ⼤括号 {} 保存的对象是⼀个⽆序的 键值对 集合. ⼀个对象以左括号 { 开始 右括号 } 结束。每个键后跟⼀个冒号 : 键值对使⽤逗号 , 分隔数组: 中括号 [] 保存的数组是值value的有序集合. ⼀个数组以左中括号 [ 开始 右中括 号 ] 结束值之间使⽤逗号 , 分隔。
JSON优点
简单易⽤: 语法简单易于理解和编写可以快速地进⾏数据交换跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成, 可以在不同的平台和语⾔之间进⾏数据交换和 传输轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占⽤带宽较⼩, 可以提⾼数据传输 速度易于扩展: JSON的数据结构灵活⽀持嵌套对象和数组等复杂的数据结构便于扩展和使⽤安全性: JSON数据格式是⼀种纯⽂本格式不包含可执⾏代码, 不会执⾏恶意代码因此具有较⾼ 的安全性
传递JSON对象 RequestBody 可以用于将 HTTP 请求体的内容转化为 Java 对象并绑定到方法的参数上。这使得我们能够轻松地处理来自客户端发送的 JSON、XML 或其他格式的数据并将其转换为相应的 Java 对象
2.3.8获取URL中参数PathVariable
path variable: 路径变量作⽤在请求URL路径上的数据绑定
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变量
2.3.9上传⽂件RequestPart
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;}2.3.10获取Cookie/Session Session的本质就是⼀个 “哈希表”, 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计)
当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过 HTTP 响应中的 Set-Cookie 字段返回).客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的 Cookie 字段带上).服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后续操作.找不到则重新创建Session, 并把SessionID返回 Cookie 和 Session 的区别 • Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制. • Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁 • Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合. ◦ 完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是 SessionId ◦ Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.
获取Cookie
传统获取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响应的信息都在这个对象中, ⽐如向客⼾ 端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容
简洁获取Cookie手动添加Cookie
1 RequestMapping(/getCookie)
2 public String cookie(CookieValue(bite) String bite) {
3 return bite bite;
4 }CookieValue 是 Spring MVC 提供的注解之一用于从 HTTP 请求中获取指定名称的 Cookie 值并将其绑定到方法的参数上。 获取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 }获取Session有两种⽅式
1 HttpSession getSession(boolean create);
2
3 HttpSession getSession();HttpSession getSession(boolean create) : 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 nullHttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为truevoid setAttribute(String name, Object value): 使⽤指定的名称绑定⼀个对象到该 session 会话
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 }2.4响应
2.4.1返回静态⻚⾯
创建前端⻚⾯ index.html(注意路径) html
1 !DOCTYPE html
2 html langen
3 head
4 meta charsetUTF-8
5 titleIndex⻚⾯/title
6 /head
7 body
8 Hello,Spring MVC,我是Index⻚⾯.
9 /body
10 /html后端
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 信息
2.4.2返回数据ResponseBody
1 Controller
2 ResponseBody
3 public class IndexController {
4 RequestMapping(/index)
5 public Object index(){
6 return /index.html;
7 }
8 }2.4.3返回HTML代码⽚段
后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析
1 RequestMapping(/returnHtml)
2 ResponseBody
3 public String returnHtml() {
4 return h1Hello,HTML~/h1;
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
2.4.4返回JSON
1 RequestMapping(/returnJson)
2 ResponseBody
3 public HashMapString, String returnJson() {
4 HashMapString, String 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 }2.4.5设置状态码
Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码 通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
1 RequestMapping(value /setStatus)
2 ResponseBody
3 public String setStatus(HttpServletResponse response) {
4 response.setStatus(401);
5 return 设置状态码成功;
6 }注意状态码不影响⻚⾯的展⽰