【快速入门】SpringMVC

一.SpringMVC是什么

1.MVC模式

MVC模式是一种软件架构设计模式,它把软件系统分为模型(Model)、视图(View)、控制器(Controller)。三者之间的逻辑如下图:

2.SpringMVC

SpringMVC是实现了MVC模式的web框架。其在实现MVC的基础上,结合了一些其他的需求,做了一些改变。

学习SpringMVC要有HTTP协议的前置知识,HTTP协议的学习可以看这篇文章: 详解:HTTP/HTTPS协议_协议网址-CSDN博客

二.连接

我们要实现浏览器与程序的交互,第一步必须先建立连接。

1.如何连接

我们最终要实现的效果就是在浏览器中输入某一个地址,可以访问到用户想要访问的页面。要想实现这个效果,我们要写一个注解。

java 复制代码
@RestController
public class HelloCon {
    @RequestMapping("/hello")
    public String hello(){
        return "Hello Spring Boot";
    }
}

上面的 @RequestMapping 就是我们要写的注解,括号里的/hello就是路径。这么说可能还是不理解,下面我们启动程序,在框内输入:

即可得到下面的页面:

也就是说,我们在程序中写上 @RequestMapping这个注解,我们就设置好了路径,别人就可以通过输入网址来找到我们写的这个程序。

为什么这里的端口号是8080,这个在我们启动程序后可以自己看到(Tomcat的默认端口就是8080):

2.@RequestMapping

@RequestMapping这个注解的作用准确的来说是用来时间接口的路径映射的,就是用户访问一个URL,可以通过这个URL来找到某个类的某个方法。

@RequestMapping既可以修饰类又可以修饰方法,刚刚上面就是修饰方法。

三.请求

某个路径向服务器发送请求,这个请求可能会携带参数,这里要说的就是如何传递参数。

1.单个参数

顾名思义,就是传递单个参数,像下面这个例子:

java 复制代码
@RequestMapping("/request")
public String request(int data){
    return "接收到数据"+data;
}

我们可以通过Postman,来实现模拟传递。

如果我们输入的参数不是data,也就是不与我们写的名字相同,我们是接收不到参数的。如果我们传输的参数类型不是int,那么会报400错误(客户端错误)。如果我们不传入参数,那么会报500错误(服务端错误)。

注意,如果我们使用包装类,可以不传参数,包装类会和String一样接收到null。

2.多个参数

与单个参数相同,就是多写一个参数罢了:

java 复制代码
@RequestMapping("/request")
public String request2(String name,String password){
    return "用户名:"+name+"  密码:"+password;
}

3.不同类型的参数传递

1)传递对象

java 复制代码
@RequestMapping("/request")
public Object request(Book book){
    return book.toString();
}

2)传递数组

java 复制代码
@RequestMapping("/request")
public String request(int[] arr){
    return "接收到数组:"+ Arrays.toString(arr);
}

3)传递集合

使用@RequestParam可以清晰地告诉 Spring MVC 从请求中获取哪个参数名对应的多个值并封装成List。

java 复制代码
@RequestMapping("/request")
public String request(@RequestParam List<Integer> data){
    return "接收到集合:"+ data;
}

4)传递JSON

java 复制代码
@RequestMapping("/request")
public Object request(@RequestBody Book book){
    return book.toString();
}

4.其他常用注解

1)@RequestParam

如果前端传递的参数名字与后端接收的参数出现不同,我们可以使用@RequestParam这个注解实现重命名,比如:

java 复制代码
@RequestMapping("/request")
public String request(@RequestParam("OtherData") String data){
    return "接收到数据:"+data;
}

我们在Postman中输入的参数名叫OtherData,而后端接收的参数名就是data。

注意,我们使用@RequestParam这个注解后,参数就变成了必传参数,不传不行。为什么就变成必传参数了呢?

使用idea打开@RequestParam的源码:

我们可以看到required是true,这个就保证参数必传。如果我们不要必传,就把required写成false:

java 复制代码
@RequestMapping("/request")
public String request(@RequestParam(value = "OtherData",required = false) String data){
    return "接收到数据:"+data;
}

2)@PathVariable

这个注解的作用就是从URL上获取数据。比如下面这个:

java 复制代码
@RequestMapping("/request/{data}")
public String request(@PathVariable String data){
    return "接收到数据:"+data;
}

我们写的URL上是abc,那我们接收的数据就是abc。但是要注意,我们在上面路径的那个地方写的是{data}。如果方法的参数名称与URL上写的不一样,那么我们要修改一下@PathVariable的value:

java 复制代码
@RequestMapping("/request/{OtherData}")
public String request(@PathVariable("OtherData") String data){
    return "接收到数据:"+data;
}

3)@RequestPart

这个注解是用来上传文件的。

java 复制代码
@RequestMapping("/request")
public String request(@RequestPart("file") MultipartFile file) throws IOException {
    file.transferTo(new File("C://code//"+file.getOriginalFilename()));
    return "接收到文件:"+file.getOriginalFilename();
}

上面的代码可以将file文件复制到C://code这个文件夹里。

5.获取Cookie和Session

关于Cookie和Session的细节,请看这篇文章:详解:HTTP/HTTPS协议_协议网址-CSDN博客

1)获取Cookie

方法一:

java 复制代码
@RequestMapping("/request")
public String request(HttpServletRequest request, HttpServletResponse response){
    Cookie[] cookies=request.getCookies();
    StringBuilder builder=new StringBuilder();
    if(cookies!=null){
        for(Cookie cookie:cookies){
            builder.append(cookie.getName()+":"+cookie.getValue());
        }
    }
    return "获取到Cookie:"+builder;
}

方法二:

java 复制代码
@RequestMapping("/request")
public String request(@CookieValue("name") String name){
    return "获取到Cookie:"+name;
}

2)Session

存储Session:

java 复制代码
@RequestMapping("/request")
public String request(HttpServletRequest request){
    HttpSession session=request.getSession();
    if(session!=null){
        session.setAttribute("username","abc");
    }
    return "Session存储成功";
}

获得Session方法一:

java 复制代码
@RequestMapping("/request")
public String request(HttpServletRequest request){
    HttpSession session=request.getSession(false);
    if(session==null){
        return "用户未登录";
    }else{
        String userName=(String)session.getAttribute("username");
        return "登录用户名为"+userName;
    }
}

获得Session方法二:

java 复制代码
@RequestMapping("/request")
public String request(HttpSession session){
    String userName=(String)session.getAttribute("username");
    return "登录用户名为"+userName;
}

获得Session方法三:

java 复制代码
@RequestMapping("/request")
public String request(@SessionAttribute("username") String username){
    return "登录用户名为" + username;
}

6.获取Header

方法一:

java 复制代码
@RequestMapping("/request")
public String request(HttpServletRequest request){
    String userAgent=request.getHeader("User-Agent");
    return "从Header中获得userAgent:"+userAgent;
}

方法二:

java 复制代码
@RequestMapping("/request")
public String request(@RequestHeader("User-Agent") String userAgent){
    return "从Header中获得userAgent:"+userAgent;
}

四.响应

用户给服务器发了请求,服务器要给用户响应。前面我们return的那些东西就是给用户的响应,但是那些都是字符串。服务器其实还可以返回其他的东西。

先介绍一下 @RestController 这个注解。

在上面说的代码所在的类前有 @RestController 这个注解。@RestController这个注解是由@Controller 和 @ResponseBody 这两个注解合成的。简单来说,@Controller是用来返回视图的,@ResponseBody是用来返回数据的。如果我们使用 @RestController 时,方法默认就会返回数据作为响应体,而不是视图。如果我们想要响应视图,那就只写 @Controller,一但写上 @ResponseBody ,那么就会返回数据。

注意,@Controller 只能是类注解,不可以是方法注解。@ResponseBody既是类注解又是方法注解。

1.返回静态页面

我们想要返回一个页面就要使用 @Controller。

java 复制代码
@Controller
public class ResponseController {
    @RequestMapping("/response")
    public String returnPage(){
        return "/Test.html";
    }
}

2.返回HTML

浏览器会自动解析我们写的HTML代码。

java 复制代码
@RequestMapping("/response")
@ResponseBody
public String returnHtml(){
    return "<h1>Hello,World</h1>";
}

3.返回JSON

java 复制代码
@RequestMapping("/response")
@ResponseBody
public Book returnJson(){
    return new Book("abc","Tom",123);
}

4.设置状态码

注意状态码不影响界面现实。即使我们将状态码设置成404,也还是会返回数据的。

java 复制代码
@RequestMapping("/response")
@ResponseBody
public Book setStatus(HttpServletResponse response){
    response.setStatus(404);
    return new Book("abc","Tom",123);
}

5.设置Header

java 复制代码
@RequestMapping("/response")
@ResponseBody
public String setHeader(HttpServletResponse response){
    response.setHeader("myHeader","myHeader");
    return "设置成功";
}
相关推荐
吃辣椒的年糕1 小时前
C++ 课程学习笔记:从对象生命周期看资源管理之道
java·c语言·开发语言·c++
阿志iiii1 小时前
高效便捷Java代理技术:轻松实现Web集成
java·开发语言·代理模式
m0_748240912 小时前
Auto-go 环境配置
开发语言·后端·golang
B站计算机毕业设计超人3 小时前
计算机毕业设计制造业MES生产管理平台 MES 生产制造源码+文档+运行视频+讲解视频)
java·spring boot·mysql·eclipse·tomcat·maven·web
技术咖啡馆C4 小时前
二、通义灵码插件保姆级教学-IDEA(使用篇)
java·intellij-idea·通义灵码·ai助手·idea-plugin
星星点点洲4 小时前
【SpringBoot实现全局API限频】 最佳实践
java·spring boot·后端
华梦岚4 小时前
F#语言的学习路线
开发语言·后端·golang
linwq84 小时前
Java网络编程学习(一)
java·网络·学习
翻晒时光5 小时前
24、深入理解与使用 Netty:Java 高性能网络编程的利器
java·网络