栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC(二)——请求

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC(二)——请求

springMVC请求 一、RequestMapping注解 RequestMapping介绍

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

RequestMapping注解可以作用在方法和类上

    1. 作用在类上:第一级的访问目录
    1. 作用在方法上:第二级的访问目录
    1. 细节:路径可以不编写 / ,表示应用的根目录开始

只要路径不重复,一级二级目录就可以按需添加

package com.qcby.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")//一级目录
public class UserController {
    @RequestMapping("/study")//二级目录
    public String study(){
        System.out.println("study");
        //返回suc.html的界面
        return "suc";
    }
}
RequestMapping的属性
  • path 指定请求路径的url
  • value value属性和path属性是一样的
  • mthod 指定该方法的请求方式
@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {
    
   @RequestMapping(path = "/save",method = {RequestMethod.GET})
    public String save(){
        System.out.println("保存角色...");
        //返回suc.html的界面
        return "suc";
    }

    @RequestMapping(value = "/delete")
    public String delete(){
        System.out.println("删除角色...");
        //返回suc.html的界面
        return "suc";
    }
}

RequestMapping的请求参数绑定

(1). 绑定机制

  1. 表单提交的数据都是k=v格式的 username=haha&password=123
  2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的

方法一:通过方法形参来直接绑定前端传入的参数

  • 把前端表单提交的请求参数,直接和控制器中方法的形参进行绑定
  • 要求:提交表单的name和函数的参数的名称是相同的

方法二:通过实体类属性封装前端传入的数据

  • 把前端表单提交的请求参数,和实体类的属性进行绑定
  • 控制器的方法的参数是实体类
  • 实体类的属性要和表单的name一致

方法三:在控制器内写servlet来操作前端的参数

(2). 支持的数据类型

    1. 基本数据类型和字符串类型
    1. 实体类型(JavaBean)
    1. 集合数据类型(List、map集合等)

基本数据类型和字符串类型

  1. 提交表单的name和参数的名称是相同的

  2. 区分大小写

实体类型(JavaBean)

  1. 提交表单的name和JavaBean中的属性名称需要一致

  2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

给集合属性数据封装

  1. JSP页面编写方式:list[0].属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eA1yT7vy-1654949086953)(https://nyw-1300782054.cos.ap-nanjing.myqcloud.com/img/image-20220607154927164.png)]

举例:

前端界面



    
    入门程序


入门入门程序
通过提交形参绑定前端参数
通过实体类的属性绑定前端参数

1.通过方法形参来绑定前端传入的参数

package com.qcby.controller;

import com.qcby.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/user")//一级目录
public class UserController {
  //以下为参数绑定
    //1.通过函数形参直接绑定参数来进行请求,这里的形参和前台提交的参数要保持一致,否则无法识别
    @RequestMapping(path ="/bindPara",method= {RequestMethod.GET})
    public String bind(String name,String password){
        System.out.println(name);
        System.out.println(password);
        return "suc";
    }

    //2.把前台的参数封装成一个实体类的属性,推荐使用
    @RequestMapping(path ="/bindClass",method= {RequestMethod.GET})
    public String bind(User user){
        System.out.println(user.toString());
        return "suc";
    }
}

2.通过实体类属性封装前端传入的数据

建议使用,这样可以使用别的实体类的属性,以及方便和dao层(Mybatis)做数据交互

User类

package com.qcby.model;
public class User {
    private String name;
    private String password;
    private Account account;
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + ''' +
                ", password='" + password + ''' +
                ", account=" + account +
                '}';
    }
    public Account getAccount() {
        return account;
    }
    public void setAccount(Account account) {
        this.account = account;
    }
    public String getname() {
        return name;
    }
    public void setname(String name) {
        this.name = name;
    }
    public String getpassword() {
        return password;
    }
    public void setpassword(String password) {
        this.password = password;
    }
}

Account类

package com.qcby.model;
public class Account {
    public Double getMoney() {
        return money;
    }
    public void setMoney(Double money) {
        this.money = money;
    }
    private Double money;
    @Override
    public String toString() {
        return "Account{" +
                "money='" + money + ''' +
                '}';
    }
}

Controller层方法

package com.qcby.controller;

import com.qcby.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/user")//一级目录
public class UserController {
    //2.把前台的参数封装成一个实体类的属性,推荐使用
    @RequestMapping(path ="/bindClass",method= {RequestMethod.GET})
    public String bind(User user){
        System.out.println(user.toString());
        return "suc";
    }
}

3.通过Servlet操作前端传入的数据

Controller中虽然承担servlet的作用,当也可以在控制器中使用servlet,只需要导入对应的包就好

package com.qcby.controller;

import com.qcby.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
@RequestMapping("/user")//一级目录
public class UserController {
    //使用servlet
    //第一必须导入servlet对应的jar包
    @RequestMapping("/myServlet")
    public String  myServlet(HttpServletRequest request, HttpServletResponse response){
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        System.out.println(name +" "+ age);
        return "suc";
    }
}
不常用的注解

1.RequestParam注解

  1. 作用:把请求中的指定名称的参数传递给控制器中的形参赋值

  2. 属性

    1. value:请求参数中的名称
    1. required:请求参数中是否必须提供此参数,默认值是true。true:表示这个值必须提供,false:表示这个值可以不提供
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/dept")
public class DeptController {
    @RequestMapping("/save")
    public String save(@RequestParam(value = "username",required = false) String name){
        System.out.println(name);
        return "suc";
    }
}

2. RequestBody注解

  1. 作用:用于获取请求体的内容(注意:get方法不可以,请求体就是post方式提交的数据集合)

  2. 属性

    1. required:是否必须有请求体,默认值是true。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/dept")
public class DeptController {
    @RequestMapping("/save")
    public String save(@RequestParam(value = "username",required = false) String name){
        System.out.println(name);
        return "suc";
    }

    @RequestMapping("/save2")
    public String save2(@RequestBody String body){
        System.out.println(body);
        return "suc";
    }
}

RestFul风格

1.概念

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

传统的地址
http://baidu.com/key = value
RestFul风格的地址
http://baidu.com/value

2.功能

资源:互联网所有的事物都可以被抽象为资源

资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。

分别对应 添加、 删除、修改、查询。

**传统方式操作资源:**通过不同的参数来实现不同的效果!方法单一,post 和 get

http://127.0.0.1/item/queryItem.action?id=1 查询,GET

http://127.0.0.1/item/saveItem.action 新增,POST

http://127.0.0.1/item/updateItem.action 更新,POST

http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST

**使用RestFul操作资源:**可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

http://127.0.0.1/item/1 查询,GET

http://127.0.0.1/item 新增,POST

http://127.0.0.1/item 更新,PUT

http://127.0.0.1/item/1 删除,DELETE

相比于传统方式使用链接来访问请求,Resful可以通过使用通过不同的请求方式来达到不同的效果

3.基本使用

①:传统的方式

controller

@Controller()
@RequestMapping("/rest")
public class RestFulController {

    @RequestMapping("/test.do")
    public String test(int a, int b, Model model){
        int rust = a + b;
        model.addAttribute("msg","结果="+rust);
        // 配置了视图解析器后,写法
        return "suc";
    }
}

访问的url

http://localhost:8080/SpringMVC/rest/test.do?a=1&b=1

②:RestFul风格

controller

//映射访问路径
@RequestMapping("/commit.do/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model model){
    String result = p1+p2;//p2是字符串会自动拼接
    //Spring MVC会自动实例化一个Model对象用于向视图中传值
    model.addAttribute("msg", "结果:"+result);
    //返回视图位置
    return "suc";
}

访问的url

http://localhost:8080/SpringMVC/rest/commit.do/1/1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0rG9i3S-1654949086961)(https://nyw-1300782054.cos.ap-nanjing.myqcloud.com/img/image-20220607165126034.png)]

4.使用method属性指定请求类型

用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

我们来测试一下:

//映射访问路径,必须是POST请求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
public String index2(Model model){
    model.addAttribute("msg", "hello!");
    return "test";
}

我们使用浏览器地址栏进行访问默认是Get请求,会报错405:如果将POST修改为GET则正常了

Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。

所有的地址栏请求默认都会是 HTTP GET 类型的。

方法级别的注解变体有如下几个:

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

上面的注解都是组合注解的简写

@GetMapping 是一个组合注解,平时使用的会比较多!
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
@PostMapping是一个组合注解
它所扮演的是 @RequestMapping(method =RequestMethod.POST) 的一个快捷方式。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/966853.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号