1、什么是MVC
1.1MVC设计思想
MVC是一种软件架构的思想,讲软件按照模型、视图、控制器来划分
● M
Model,模型层,负责业务逻辑判断,数据存取
● V
View,视图层,负责界面展示,向用户呈现数据的方式(html页面、图片、文本等)
● C
Conteoller,控制器,负责接收用户请求,并根据请求调用相应的模型来处理业务逻辑
1.2Spring MVC
SpringMVC是一种基于MVC(模型,视图,控制器)模式的Web框架,它是基于Spring框架的一个子项目,
它通过将请求分派给相应的控制器来处理Web请求,然后将处理结果发送回客户端
2 SpringMVC处理请求
2.1 请求分类及处理方式
● 静态请求
定义
指请求的页面由服务器上预先准备好的静态Web资源组成,入HTML、CSS、JS、IMG等,返回给客户端的信息内容是不变的。
处理方式
由服务器直接将请求的资源返回给客户端,服务器不处理任何逻辑,只是将预先准备好的资源 返回给客户端。
● 动态请求
定义
服务器会根据用户的请求动态生成内容,将数据返回到客户端显示页面内容。
处理方式
由服务器从数据库中获取数据,并进行相应的逻辑处理后将处理结果返回客户端
2.2处理动态请求
通过在controller中定义对应的类及方法实现动态请求的业务逻辑处理
2.2.1注解说明
@Controller注解
标注一个类;
表示该类是一个控制器,负责处理用户的请求,并将处理结果生成响应返回给客户端。
@RequestMapping注解
请求注解;
添加在控制器类或控制器方法上;
将HTTP请求映射到控制器中的方法,指定处理请求的路径
● 控制器类上:为整个控制器指定一个基础路径
● 控制器方法上:指定相对于基础路径的具体路径
@ResponseBody注解
响应注解;
添加在控制器方法上;
可以使控制器方法通过返回值的方式将响应返回给客户端
3 HTTP请求方法
3.1 GET请求 (数据不敏感)
GET请求通常用户获取服务器资源,将请求参数放在URL中
1)URL统一资源定位符
是标准的Web地址,用于唯一地表示互联网上的资源(如网页、图片、文档等)
其中http是协议名,www.example.com是域名,search是路径名,q是查询参数,keyword是查询参数
2)特点
● 如果请求参数过多,GET请求会导致URL变长,并且传输的数据量也有一定限制
● 安全性较低
所以GET请求适合于请求数据不敏感的情况,如查询信息、浏览网页等。
4 POST请求(数据敏感)
● POST请求时将请求采纳数放在请求体中发送的;
● POST请求相对于GET请求传输的数据量更大,数据更加安全
所以POST请求适合于请求数据敏感的情况,如登录、注册等
5 客户端传递参数
客户端负责发送请求,服务端负责处理请求;
客户端在发送请求时可能需要向服务端传递数据,具体传递数据的方式有如下几种
5.1 GET请求(查询参数)
在浏览器地址栏输入URL地址,在URL中添加查询参数,默认发送的是GET请求。
完成登录功能,客户端需要将用户名 username 和 密码 password 传递给服务端
http://localhost:8080/v1/users/login?username=liying&password=123456
第一步:新建controller.UserConteoller处理请求
@Controller
public class UserController {
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
return username + ":" + password;
}
}
第二步:重启工程后浏览器输入地址测试
5.2 POST请求(请求体)
POST请求无法在浏览器地址栏中发送,一般会通过如下方式发送:
● html中:Form表单完成POST请求方式的发送
● IDEA中:.http后缀文件完成POST请求的发送
5.3 .http文件测试接口
使用SpringMVC提供的.http后缀的文件来测试Controller层接口。
第一步:在test目录下创建Directory:http
第二步:创建.http后缀的文件进行测试:testUserController.http
### GET请求测试
GET http://localhost:8080/v1/users/login?username=liying&password=123456
Accept: application/json
### POST请求测试
POST http://localhost:8080/v1/users/login
Content-Type: application/x-www-form-urlencoded
username=liying&password=123456
6 服务端接收参数
6.1 HttpServlerRequest接收
以上述案例为准,客户端把用户名和密码信息传递给服务端,服务端接收传递过来的用户名和密码信息。
第1步:controller.UserController处理请求
/**方式1:使用HttpServletRequest接收数据*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
return username + ":" + password;
}
第2步:重启工程后执行对应的测试脚本(testCase.http)测试
6.2声明参数接收
可以在处理请求的方法中通过声明参数的方式来接收客户端传递过来的数据
第一步:处理登录请求
/**方式2:通过声明参数的方式接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
// 好处:代码简洁,并且可以自动根据声明的类型进行转换
public String login(String username, String password){
return "username = " + username + ", password = " + password;
}
第二步:重启工程,执行测试脚本测试
6.3声明POJO类接收
如果客户端传递数据过多,
通过HttpServletRequest方式接收复用性较差,通过声明参数接收很繁琐
所以可以将数据封装到POJO类中来接收
第一步:处理登录请求
/**方式3:通过声明Pojo类接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(User user){
return user.toString();
}
第二步:自定义pojo类,工程目录下创建entity.User
public class User {
// 客户端传递几个参数,此处就有几个属性
private String username;
private String password;
// 省略 setter() getter() 和 toString() 方法
}