SpringMVC程序开发

  1. Spring MVC 是⼀个 Web 框架。
  2. Spring MVC 是基于 Servlet API 构建的

学习 Spring MVC 我们只需要掌握以下 3 个功能:

  1. 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。
  2. 获取参数的功能:⽤户访问的时候会带⼀些参数,在程序中要想办法获取到参数。
  3. 输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户。

对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。

创建 Spring MVC 项⽬

Spring MVC 可以基于 Spring Boot 创建,也就是创建⼀个 Spring Boot 项⽬,勾选上 Spring Web 模块即可,如下图所示:
SpringMVC程序开发_第1张图片
创建⼀个 UserController 类,实现⽤户到 Spring 程序的互联互通,具体实现代码如下:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 让 spring 框架启动时,加载
@ResponseBody // 返回⾮⻚⾯数据
@RequestMapping("/user") // 路由器规则注册
public class UserController {
 // 路由器规则注册
 @RequestMapping("/hi")
 public String sayHi(){
 return "

Hi,Spring MVC.

"
; } }

这样实现之后,当访问地址:http://localhost:8080/user/hi 时就能打印“hello,spring mvc”的信息了。

@ResponseBody说明

@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。
@ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者 json,⽽不是视图

@RestController 返回数据

SpringMVC程序开发_第2张图片

@Controller返回页面和数据

SpringMVC程序开发_第3张图片

@RequestMapping 注解介绍

@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。

路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射

@RequestMapping 即可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类 + ⽅法
@RequestMapping 也可以直接修饰⽅法

@Controller
@RequestMapping("/web")
public class WebController {

    @RequestMapping("/index")
    public String index(){
        return "/index.html";
    }
}

@RequestMapping的Get方法与Post方法

    @ResponseBody
//    @RequestMapping(value = "/indexData",method = RequestMethod.POST)
//    @PostMapping("/indexData")
    @GetMapping("/indexData")

get 请求的 3 种写法:

// 写法1
@RequestMapping("/index")
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")

post 请求的 2 种写法:

// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")

获取参数

@Slf4j
@RestController
@RequestMapping("/param")
public class ParamController {



    @RequestMapping("/get14")
    public Map<String,String> get14(){
        Map<String,String> map = new HashMap<>();
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k3","v3");
        map.put("k4","v4");
        return map;
    }

}

传递单个参数

@RequestMapping("/get1")
    public String get1(HttpServletRequest request){
        String name = request.getParameter("name");
        return "name:"+name;
    }

    @RequestMapping("/get2")
    public String get2(String name){
        return "name:"+name;
    }

表单参数传递/传递多个参数(⾮对象)

@RequestMapping("/get3")
    public String get3(String name,Integer age){
        return "name:"+name +"| age:"+age;
    }
    @RequestMapping("/get4")
    public String get4(Integer age){
        return "age:"+age;
    }

    @RequestMapping("/get5")
    public String get5(int age){
        return "age:"+age;
    }

传递对象

@RequestMapping("/get6")
    public String get6(Student student){
        return student.toString();
    }

后端参数重命名(后端参数映射)

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个 time 给后端,⽽后端⼜是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现 这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。

@RequestMapping("/get7")
    public String get7(@RequestParam(name = "n") String name){
        return "name:"+name;
    }
设置参数必传@RequestParam

SpringMVC程序开发_第4张图片

⾮必传参数设置

如果我们的实际业务前端的参数是⼀个⾮必传的参数,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,

@RequestMapping("/get7")
    public String get7(@RequestParam(name = "n",required = false) String name){
        return "name:"+name;
    }

@RequestBody 接收JSON对象

SpringMVC程序开发_第5张图片

@RequestMapping("/get8")
    public String get8(@RequestBody Student student){
        log.info(student.toString());
        return student.toString();
    }

获取URL中参数@PathVariable

@RequestMapping("/get9/{shopid}/{dealid}")
    public String get9(@PathVariable Integer shopid,@PathVariable("dealid") Integer dealId){
        return "shopId:"+shopid + "|dealId:"+dealId;
    }

上传⽂件@RequestPart

@RequestMapping("/get10")
    public String get10(@RequestPart("file") MultipartFile file) throws IOException {
        log.info(file.getOriginalFilename());
        file.transferTo(new File("D:/temp/"+file.getOriginalFilename()));
        return "success";
    }

获取Cookie/Session/header

@RequestMapping("/get11")
    public String get11(@CookieValue(name = "bite1", required = false) String bite){
        return "bite:"+bite;
    }

    @RequestMapping("/get12")
    public String get12(@SessionAttribute(required = false) String username){
        return "username:"+username;
    }
    @RequestMapping("/set1")
    public String set1(HttpSession session){
        session.setAttribute("username","bite");
        return "success";
    }

    @RequestMapping("/get13")
    public String get13(@RequestHeader("Host") String host){
        return "host:"+host;
    }

请求转发或请求重定向

forward VS redirect
return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:

  • forward :请求转发;
  • redirect:请求重定向。

请求转发如果资源和转发的⻚⾯不在⼀个⽬录下,会导致外部资源不可访问,演示示例如下。

@Controller
@RequestMapping("/index")
public class IndexController {
    /**
     * 请求转发
     * @return
     */
    @RequestMapping("/forward")
    public String forward(){
        return "forward:/index.html";
    }

    /**
     * 请求重定向
     * @return
     */
    @RequestMapping("/redirect")
    public String redirect(){
        return "redirect:/index.html";
    }
}

forward 和 redirect 具体区别如下:

    1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
    1. 请求重定向地址发⽣变化,请求转发地址不发⽣变化。
    1. 请求重定向与直接访问新地址效果一样,不存在原来的外部资源不能访问;请求转发服务器端转发 ,有可能造成原外部资源不能访问。

你可能感兴趣的:(JavaEE,spring,boot)