Spring MVC:以前在编写网页时,会将网页的编写分为三个部分,MVC其分别表示三个不同的部分模型(Mode),视图(View),控制器(Controller),来进行分布实现,同时展开。
现在,由于前端和后端的界线开始划清,工作中的分工开始明显,所以后端现在基本上只负责后端的处理,也就没有了View层了,现在View表示的是视图所需要的数据。
Spring MVC分为三大部分,建立连接,请求,响应。
1.建立连接
RequestMapping路由映射,可以通过url来进行连接的建立,并且其修饰方法,也修饰类。
访问地址:类的路径+方法路径
RequestMapping支持get和post
POSt(????)
传递请求数据
请求最关键的就是使用如何传递不同的参数,传递一个参数,多个参数,对象,数组/集合
1.传递单个参数
@RequestMapping("/t3")
public String t3(String name){
return "name:" + name;
}
当请求传递name时,接收到了name,并返回
2.传递多个参数
@RequestMapping("/t4")
public String t4(String name,int age){
return "name:" + name +"age:"+age;
}
和传递单个参数一样,传递name和age,接收然后并返回,并且这两个参数的位置不是必需与代码中的参数位置一一对应。
并且使用基本数据类型必需进行有效传值,0或者NULL这种一样会报错。
但是使用包装类型可以不用传值,其返回的是NULL
@RequestMapping("/t5")
public String t5(String name,Integer age){
return "name:" + name +"age:"+age;
}
3.传递对象
@RequestMapping("/t6")
public String t5(Student student){
return "Student" + student.toString();
}
4.后端参数重命名
使用@RequestParam重命名时,
1)传递的参数必须和@RequestParam声明的参数名称一样,这个参数为必传
@RequestMapping("/t7")
public String t7(@RequestParam("name")String student_name){
return "Student_name" + student_name ;
}
- 后面定义的为重命名的,随着程序的运行数据增多可能分不清这个是什么具体的数据,态笼统,不能细分,这样就可以细分。如最开始设计的时候只有姓名,随着功能开始拓展就可能会出现各种名字的 划分如学生名,老师名等,不想大变的情况下这样较好,最主要不会改变原有的逻辑。
2)使用required=faslse设置为不是必需要传递
@RequestMapping("/t8")
public String t8(@RequestParam(value = "name",required = false)String student_name,int age){
return "Student_name" + student_name +age;
}
5.传递数组
当请求中,同一个参数有多个时,浏览器会将其封装成一个数组
@RequestMapping("/t9")
public String t9(String[] array){
return "接收到的数组"+ Arrays.toString(array)+array.length;
}
6.传递集合
@RequestMapping("/t1")
public String t1(@RequestParam List<String> array){
return "长度"+ array.size();
}
如果不在参数列表中写@RequestParam就会报错并且一般情况下
5开头的通常旨服务端发生错误
4开头的通常旨客户端发生错误
上面那些响应码是叫HTTP响应码,不是后端自定义的
2XX:成功3XX:重定向4XX:客户端错误5XX:服务端错误
后端自定义的叫做业务状态码
比如用户登录:
1.密码正确:恭喜登录成功
2.密码错误:密码错误
这样根据自己写的业务逻辑返回的。
这里也可以将参数设置为不是必需要传递
Kotlin
@RequestMapping("/t1")
public String t1(@RequestParam(required = false) List<String> array){
return "长度"+ array.size();
}
7.传递json数据
传递JSON数据使用需要使用@RequestBody
Kotlin
@RequestMapping("/t2")
public String t2(@RequestBody Student student ){
student.getAge();
student.getAge();
return student.toString() +" ";
}
8.获取URL中的参数
注意里面的注解变化为了@PathVariable,以及请求URL格式必须和后端定义的URL格式必需匹配
,切记不要错误,并且也可以一次获取多个,并进行重命名。
获取一个:
Kotlin
@RequestMapping("/t3/{studentid}")
public String t3(@PathVariable Integer studentid ){
return "studentid"+studentid;
}
获取多个:
获取多个URL时,注意/一定要将其分隔开
Kotlin
//获取多个并进行重命名
@RequestMapping("/t3/{studentid}/{studentage}")
public String t3(@PathVariable Integer studentid ,@PathVariable("studentage") Integer age){
return "studentid"+studentid + "age"+age;
}
9.上传图片
注意注解名称和文件类型
Kotlin
@RequestMapping("/t4")
public String t4(@RequestPart MultipartFile file) {
System.out.println(file.getOriginalFilename());
return "success";
}
10.获取cook,session,Header
Cookie是客户端机制用来保存记录的,Session是服务端机制用来保存记录的二者的联系在于会与Sessionid联系起来,通过Sessionid来确保这份记录在Cookie和Session都有。
cookie
其下面获cookie代码中如果不加判断为空会出现空指针异常。切记当页面中出现500错误时,一定要返回编辑器的控制台看报错信息
第一种获取cookie//想错了(????)
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + cookie.getValue());
return "cookie的值"+cookie;
}
Arrays.stream(cookies).forEach(cookie -> {
System.out.println(cookie.getName() +":" +cookie.getValue());
});
}
return "success";
}
注解获取cookie
@RequestMapping("/getCookie2")
public String getCookie2 (@CookieValue String test) {
return "cookie存取的值"+test;
}
测试能不能取到cookie 在浏览器中按F12或者在网页中右键有个检查按钮点进去其中应用里面就可以设置cookie值
并且其最后输出时
第一种方式会直接获取到所有cookie的值????
第二种方式只能获取到指定cook的值,但是可以一定获取多个,由自己定义的参数决定
session
因为要从请求中来获取session,我们要先设置一个session。在设置session时,我们可以从抓到的包中看到请求发出之后,响应那边会出现Set-Cookie,并且其在其后面的JSESSIONID就是设置的session的id,右侧就是其值,相互对应,返回到客户端中存储起来。
Set-Cookie: JSESSIONID=B4409B5559B2E5966289A99290C51E6B;
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
session.setAttribute("name","张三");
return "success";
}
在获取session时,因为会将想要读取的seesionid也进行enconde解码变成一串字母只有相同的才会变成相同的字母,如果在客户端字母相同的话,就会返回其存储的值。
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession(false);
if(session !=null){
String username = (String) session.getAttribute("name");
return "用户名"+username;
}
return "没有记录";
}
注解获取session
@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute String name){
return "session" + name ;
}
在参数列表中直接创建session对象
@RequestMapping("/getSession3")
public String getSession3(HttpSession session){
String name = (String) session.getAttribute("name");
return "session" + name ;
}
获取Header
两中方式创建没有太大区别
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String userAgent = request.getHeader("user-Agent");
return "userAgent" +userAgent ;
}
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("user-Agent") String userAgent){
return "userAgent" +userAgent ;
}