Spring MVC

(一)什么是MVC?

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常负责在数据库中存储数据

  • View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。

  • Controller(控制器)是应用程序中处理用户交互的部分,通常从视图读取数据,控制用户输 ,并向模型发送数据。

(二)什么是Spring MVC?

1.构建在 Servlet (API) 之上的
2.是一个 Web 框架 (HTTP)
3.来自于 Spring webMVC 模块

MVC 是一种思想, Spring MVC 是对 MVC 思想的具体实现

总结来说,Spring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。

(三)什么是SSM/SM框架?

  • 以前:SSM = Spring + Spring MVC + MyBatis

  • 新 SSM = SpringBoot + Spring Web (Spring MVC) + MyBatis = SSM 项目

  • 更新说法: SM 框架 (Spring Boot[Spring Web] + MyBatis)

注解

@RequestMapping

即可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类 + 方法。
@RequestMapping("/hi")//简写,value为"/hi",method为GET
@RequestMapping(value = "/hi",method= RequestMethod.GET)//全写   GET
@RequestMapping(value = "/hi",method= RequestMethod.POST)//全写  POST

@GetMapping 和 PostMapping

GET的三种写法:
@RequestMapping("/hi")//简写,value为"/hi",method为GET
@RequestMapping(value = "/hi",method= RequestMethod.GET)//全写   GET
@GetMapping("/hi") // 直接使用GETMapping的方法
POST的两种写法:
@RequestMapping(value = "/hi",method = RequestMethod.POST)
@PostMapping("/index")// 直接使用PostMapping

获取参数

(1)传递单个参数

传递单个单参数可以用方法中的参数来实现传参
@GetMapping("/getName")
public String getName(String name) {
    return "Name is " + name;
}

(2)传递对象

SpringMVC中可以自动实现参数赋值,如下Demo
@GetMapping("/getUser")
public String getUser(User user) {
    return user.toString();
}

(3)表单参数传递

@GetMapping("/getUser")
public String getUser(String name, int age, String gender) {
    User user = new User();
    user.setName(name);
    user.setAge(age);
    user.setGender(gender);
    return user.toString();
}

(4)后端参数重命名

假如前端代码的命名不好,需要我们后端重新命名,那么我们就可以通过使用 @RequestParam来重命名前后端的参数值。
@GetMapping("/getName")
public String getName(@RequestParam("n") String name) {
    return "Name is " + name;
}

注意:如果一个参数使用@RequestParam,那么默认前端就必须要传入这个参数值,否则网页就会报错。至于为什么,我们可以看一下@RequestParam的源码,如下图:

@GetMapping("/getName")
public String getName(@RequestParam(value = "n",required = false) String name) {
    return "Name is " + name;
}

(5)接收JSON对象

接收JSON对象使用 @RequestBody.
注意JSON对象和普通对象不一样。接收的时要使用@RequestBody,当项目后端接受不到数据,就可以考虑是不是注解使用错了。
@RequestMapping(value = "/getUserJson",method = RequestMethod.POST)
public String getUser2(@RequestBody User user) {
    return user.toString();
}

(6)获取URL中的参数

@PathVariable

和前面get传参并不一样,而是直接路径URL传参,不再是?后面了,就好比下面的两个链接
www.blog_ system.com/user ?userId=1
www.blog_ system.com/user /userId=1
@Controller
@ResponseBody
public class PostMappingDemo {
    //{}内的 就是在URL里的参数
    @PostMapping("/test/{name}/{password}")
    public String test(@PathVariable("name") String name,@PathVariable("password") String passWord) {
        System.out.println(name);
        System.out.println(passWord);
        return name+":"+passWord;
    }
    //中间可以穿插URL路径
    @PostMapping("/show/{username}/and/{password}")
    public void test2(@PathVariable("password") String passWord,@PathVariable("username")String name){
        System.out.println(name);
        System.out.println(passWord);
    }
}

(7)上传文件

@RequestPart

@ResponseBody
@Controller
public class PartDemo {
    @RequestMapping("/part")
    //MultipartFile 是表示文件的一个类
    public String partTest(@RequestPart("file") MultipartFile file) throws IOException {
        //1.确定文件根路径
        String path = "D:\\part";
        //2.获取唯一的文件名
        String fileName = UUID.randomUUID().toString().replace("-","");
        //3,获取文件的后缀
        String suffix  = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        //4.最后的文件路径+文件名+文件后缀进行保存
        file.transferTo(new File(path+fileName+suffix ));


        return path+fileName+suffix+"上传成功";
    }
}

(8)Cookie/Session/header

Servlet中获取Request 和 Response对象在SpringMVC中也是可以使用的

①获取Cookie的两种方式

//1,Servlet时代 --- 获取Cookie对象
@RequestMapping("/getCookies1")
public void getCookies1(HttpServletRequest request, HttpServletResponse response) {
    Cookie[] cookies = request.getCookies();
    //获取所有的cookie
    for (Cookie cookie:cookies){
        System.out.println(cookie.getName()+":"+cookie.getValue());
    }

}
//2.MVC时代 --- @Cookie注解
@RequestMapping("/getCookies2")
public void getCookies2(@CookieValue("name") String name) {
    System.out.println("name:" + name);
}

②获取Header的两种方式

//1.Servlet时代 --- 获取Headers
@RequestMapping("/getHeader1")
public String getHeader1(HttpServletRequest request) {
    String userAgent = request.getHeader("User-Agent");
    System.out.println(userAgent);
    return userAgent;
}

//2.SpringMVC时代 --- 获取Headers
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent) {
    System.out.println(userAgent);
    return userAgent;
}

③Session的存储和获取

Session的存储和Servlet类似,都是使用HttpServletRequest来获取的
//1.设置Session
@RequestMapping("setSession")
public String setSession(HttpServletRequest request) {
    //设置HttpSession对象参数为 true (表示没有Session对象就创建一个session)
    HttpSession session = request.getSession(true);
    if (session != null) {
        session.setAttribute("userName", "GoodMan");
    }
    return "session存储成功";
}

//2.读取Session
@RequestMapping("getSession")
public String getSession1(HttpServletRequest request) {
    //获取的时候要设置参数为 false (表示没有session也不重新创建)
    HttpSession session = request.getSession(false);
    String ret = "暂无 session 会话";
    if (session != null && session.getAttribute("userName") != null) {
        ret = "Session userName:" + 
q                            String.valueOf(session.getAttribute("userName"));
    }
    return ret;
}

//3.使用注解读取Session -- 相比较而言就是简写了
@RequestMapping("getSession2")
public String getSession2
(@SessionAttribute(value = "userName", required = false) String userName) {
    return "Session userName:" + userName;
}

返回页面/数据

@ResponseBody

  • 返回前端页面(text/html): return "/index.html" 也就是返回一个 前端的页面文件路径

  • 返回数据:return "hello" 返回的是 数据内容

注意当我们返回的内容是数据的时候,要加@ResponseBody注解

组合注解:@RestController = @Controller+@ResponseBody

请求/转发的实现

return不仅可以返回一个视图,还可以实现跳转。
forward:请求转发
redirect:请求重定向
注意下面代码的格式
//注意请求转发/重定向,是不能加@RequestBody的
@Controller
public class Demo {
    //请求转发
    public String index1() {
        return "redirect:/index.html";
    }

    //请求重定向
    public String index2() {
        return "forward:/index.html";
    }
}

forward和 redirect的区别:

请求重定向--->请求重新定位到资源

请求转发---> 服务器端转发

请求重定向-->地址发生改变

请求转发地址 -->不发生改变

去请求重定向和访问新地址的效果一样,不存在原来的外部资源不能访问

请求转发服务器端转发可能造成外部资源不能访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TestDevHub测试宝库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值