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 模块即可,如下图所示:
1690853059531.png
创建⼀个 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 "<h1>Hi,Spring MVC.</h1>";
 }
}

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

@ResponseBody说明

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

@RestController 返回数据

1690184195712.png

@Controller返回页面和数据

1690184389399.png

@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

1690856306184.png

⾮必传参数设置

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

@RequestMapping("/get7")
    public String get7(@RequestParam(name = "n",required = false) String name){
        return "name:"+name;
    }
@RequestBody 接收JSON对象

1690856592395.png

@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. 请求重定向与直接访问新地址效果一样,不存在原来的外部资源不能访问;请求转发服务器端转发 ,有可能造成原外部资源不能访问。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值