什么是 Spring MVC
MVC 是一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
学习 Spring MVC 需要掌握以下三个功能:
-
连接的功能:将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用到我们的 Spring 程序。
@RequestMapping("/hi")
@RequestMapping的作用就是用来注册一个url路由,通过这个路由,前端的请求就可以实现和后端程序的交互了。而@RequestMapping这个注解既能修饰方法,又能修饰类;访问层次的不同。
@RequestMapping在不指定任何参数的情况下(只设置路由地址),那么此方法是既支持Get请求又支持Post请求类型的。
当给@RequestMapping设置了method 属性之后,那么它只能支持设置的请求类型,其他类型会报错(405)总结:@RequestMapping,@GetMapping,@PostMapping
-
获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。
2.1 获取单个参数@GetMapping("/reg") // 注意,前端传的参数 命名必须也是 name. public String reg(String name){ return "注册:"+name; }
@GetMapping("/reg") // 注意,前端传的参数 命名必须也是 name. public String reg(String name){ return "注册:"+name; }
@RequestParam既能重命名请求参数,又能保证此参数为必传参数。
前端传的是time ,后端是createtime。required@GetMapping("/time") public String setTime(@RequestParam(value="time",required = false) String createtime){ return "时间:"+createtime; }
2.2 获取对象
当需要传入的参数太多的时候,可以考虑直接传入对象。首先创建model下的User实体类@Setter @Getter @ToString public class User { private String name; private int age; private String password; private int sex; }
@GetMapping("/reg2") public Object reg2(User user){ return user; }
2.3 传递json对象
使用Postman传递json对象
发现后端没有拿到JSON对象!解决办法:要获得JSON对象,需要添加注解@RequestBody
@GetMapping("/reg2") public Object reg2(@RequestBody User user){ return user; }
2.4 获取URL中参数@PathVariable
@PostMapping("/p/{name}/{password}") public Object param(@PathVariable String name,@PathVariable String password){ return name+" "+password; }
2.5 上传文件@RequestMapping("/file") public String upload(@RequestPart("myfile") MultipartFile file) throws IOException { // 保存文件 file.transferTo(new File("D:\test.jpg")); return "上传成功"; }
@RequestMapping("/file2") public String upload2(@RequestPart("myfile") MultipartFile file) throws IOException { // 1.上传文件目录(从配置文件中读取) String basePath = uploadPath; // 2.生成动态的文件名 String fileName = UUID.randomUUID()+ (file.getOriginalFilename().substring( file.getOriginalFilename().lastIndexOf(".") )); file.transferTo(new File(basePath+fileName)); return "上传成功"; }
2.6 原始的获取Cookie的方式/** * Spring MVC(基于Servlet)所有映射方法中都会内置两个参数:HttpServletRequest HttpServletResponse * */ @RequestMapping("/getCk") public Cookie[] getCk(HttpServletRequest request, HttpServletResponse response){ Cookie[] cookies = request.getCookies(); return cookies; }
构造Cookie
更简单的获取Cookie和Session的方法
注解:@CookieValue@RequestMapping("/getCk2") public String getCk2(@CookieValue("bite") String bite){ return bite; }
获取 Header:@RequestHeader@RequestMapping("/getua") public String getUa(@RequestHeader("User-Agent") String userAgent){ return userAgent; }
Session存取和获取// 相当于登录存储Session的 *** 作 @RequestMapping("/getSession") public String setSession(HttpServletRequest request){ HttpSession session = request.getSession(true); if(session!=null){ session.setAttribute("username","ls"); } return "用户登录成功"; }
/** * 验证用户是否登录 * */ @RequestMapping("/getSession2") public String getSession(HttpServletRequest request){ String username = "无"; HttpSession session = request.getSession(false); if(session!=null && session.getAttribute("username")!=null){ username = (String) session.getAttribute("username"); } return username; }
更简单的读取Session的方式:
@RequestMapping("/getSession3") public String getSession3(@SessionAttribute(value = "username",required = false) String username){ return username; }
-
输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。
默认情况下会返回一个html页面,当加上@ResponseBody注解之后就能返回非页面数据了。使用@ResponseBody修饰一个类的时候,表示此类中的所有方法都会返回一个非页面的数据
如果不加@ResponseBody会报错
@RequestMapping("/gethtml") public String getHtml(String name){ return "你好:"+name+""; }
关于请求转发和请求重定向
@RequestMapping("/index")
public String index(){
return "redirect:/index.html";
}
@RequestMapping("/index2")
public String index2(){
return "forward:/index.html";
}
- 请求转发(forward):服务器帮客户进行请求转发并将结果相应给客户端,URL地址不发生改变。使用请求转发有可能出现外部资源会丢失,访问不到的情况。
- 请求重定向(redirect):服务器将请求重新定义到要访问的地址上,URL地址会发生改变。所以请求重定向和直接访问目标地址的效果是一模一样的,不会出现外部资源丢失的情况。
组合注解
@RestController = @Controller + @ResponseBody
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)