JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

一、SpringMVC 请求与响应

1、@RequestMapping 注解

  • @RequestMapping 注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。
  • 如果加载在方法上就是具体访问路径,如果加载在类上就是访问的前缀。
  • springmvc 定义url路径是不允许重复。

eg:

package com.qizekj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author chenqun
 * @date 2023/3/18 19:12
 */
@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * /add UserController.add  OrderController.add?
     * 如果我们将@RequestMapping注解加在我们的类上面 是访问该接口前缀
     * 如果加在方法上就是我们具体的访问路径
     * /user/add
     * @return
     */

    @RequestMapping("/add")
    @ResponseBody
    public String add() {
        return "user add ok";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String delete() {
        return "user delete ok";
    }

    @RequestMapping("/select")
    @ResponseBody
    public String select() {
        return "user select ok";
    }
}
package com.qizekj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author chenqun
 * @date 2023/3/18 19:13
 */
@Controller
@RequestMapping("/order")
public class OrderController {

    @RequestMapping("/add")
    @ResponseBody
    public String add() {
        return "order add ok";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String delete() {
        return "order delete ok";
    }

    @RequestMapping("/select")
    @ResponseBody
    public String select() {
        return "order select ok";
    }
}

2、接收Get/Post请求参数

  • 和Controller层方法的形参同名,那么可以直接通过参数名接收值。
  • 创建controller

eg:

package com.qizekj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author chenqun
 * @date 2023/3/18 19:26
 */
@Controller
public class MemberController {
    /**
     * RequestMapping 默认的情况下 RequestMapping支持所有请求方式 例如 get、post 、delete
     * method = RequestMethod.POST 设定该接口支持的类型 post
     *
     * @return
     */
    @RequestMapping(value = "/addMember", method = RequestMethod.POST)
    @ResponseBody
    public String addMemberPost(Integer id, String name) {
        System.out.println("id:" + id);
        System.out.println("name:" + name);
        return "post---ok";
    }

    /**
     * addMember
     * <p>
     * RequestMapping 默认的情况下 RequestMapping支持所有请求方式 例如 get、post 、delete
     * method = RequestMethod.POST 设定该接口支持的类型 post
     *
     * @return
     */
    @RequestMapping(value = "/addMember", method = RequestMethod.GET)
    @ResponseBody
    public String addMemberGet(Integer id, String name) {
        System.out.println("id:" + id);
        System.out.println("name:" + name);
        return "get---ok";
    }
}
  • 运行项目后用postman访问:
    在这里插入图片描述
    在这里插入图片描述
    后台打印:
    在这里插入图片描述

3、springmvc 5种接受参数类型

3.1、普通参数

  1. url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数;
  2. 如果发生url地址传参,地址参数名与形参变量名不同,使用@RequestParam绑定参数关系;

参数:
required:是否为必传参数;
defaultValue:参数默认值。

//springmvc5种接受参数类型
//1.1、普通参数
@RequestMapping("/demo01")
@ResponseBody
public String demo01(String name, Integer age) {
    return "name:" + name + ",age:" + age;
}

//1.2、普通参数2
/**
 * 当访问时的传递参数名称name与方法形参名称qizekjName不一致时,可以用@RequestParam注解进项绑定
 * 1.@RequestParam("name")地址栏 传递参数名称name 方法形参名称qizekjName
 * 2.required:是否必须传递该参数,默认是为true,也就是需要传递该参数;required = false,不需要必须传递该参数
 */
@RequestMapping("/demo02")
@ResponseBody
public String demo02(@RequestParam(name = "name", required = false) String qizekjName,
                     @RequestParam(name = "age", required = false) Integer qizekjAge) {
    return "name:" + qizekjName + ",age:" + qizekjAge;
}

3.2、对象参数/嵌套对象参数

  • 请求参数名与形参对象属性名相同,定义对象类型形参即可接收参数。
  • 嵌套对象参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套对象属性参数。
/**
 * 2、接收对象类型参数
 * 地址栏中传递的参数名称与对象中成员属性名称保持一致即可
 * @param qizekjUser
 * @return
 */
@RequestMapping("/demo03")
@ResponseBody
public String demo03(QizekjUserEntity qizekjUser) throws UnsupportedEncodingException {
    return "name:" + qizekjUser.getUserName() + ",age:" + qizekjUser.getAge() + ",addres:" +
            qizekjUser.getQizekjUserInfo().getAddres();
}
package com.qizekj.entity;

/**
 * @author chenqun
 * @date 2023/3/18 19:37
 */
public class QizekjUserEntity {
    /**
     * ?userName=qizekj&age=4
     */
    private String userName;
    private Integer age;
    /**
     * ?qizekjUserInfo.addres=AnHuiHeFei
     */
    private QizekjUserInfoEntity qizekjUserInfo;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public QizekjUserInfoEntity getQizekjUserInfo() {
        return qizekjUserInfo;
    }

    public void setQizekjUserInfo(QizekjUserInfoEntity qizekjUserInfo) {
        this.qizekjUserInfo = qizekjUserInfo;
    }
}
package com.qizekj.entity;

/**
 * @author chenqun
 * @date 2023/3/18 19:39
 */
public class QizekjUserInfoEntity {
    private String addres;

    public String getAddres() {
        return addres;
    }

    public void setAddres(String addres) {
        this.addres = addres;
    }
}

3.3、数组参数

请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数。

http://localhost:8081/demo04?arrays=qizekj&arrays=chenqun

/**
 * 3、接收数组类型参数
 * demo04?arrays=qizekj&arrays=chenqun
 * 请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数
 * @param arrays
 * @return
 */
@RequestMapping("/demo04")
@ResponseBody
public String demo04(String[] arrays) {
    return Arrays.toString(arrays);
}

3.4、集合参数

请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系。

http://localhost:85/demo05?arrays=1&arrays=2

@RequestParam :同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据

eg:

/**
 * 4、接收集合普通类型参数
 * 请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数
 * @param arrays
 * @return
 */
@RequestMapping("/demo05")
@ResponseBody
public String demo05(@RequestParam List<String> arrays) {
    return Arrays.toString(arrays.toArray());
}

二、SpringMVC 接收json数据

1、开启接收json数据

package com.qizekj.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

/**
 * @author chenqun
 * @date 2023/3/18 13:07
 */
@Configuration
@ComponentScan("com.qizekj.controller")
@EnableWebMvc
public class SpringMVCConfig {
    /**
     * 1.@Configuration  定义SpringMVCConfig.xml配置文件
     * 2.需要将我们的控制类注入到ioc容器 @ComponentScan("com.qizekj.springmvc")
     * @ComponentScan("com.qizekj.springmvc")将该包下所有的类 注入到IOC容器种
     * 3.在springmvc原理 所有请求过来先达到DispatcherServlet 分发具体控制类 方法执行
     */
}

2、添加maven依赖

<!--@RequestBody 接收json数据-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>

3、以实体类方式接收

  • 接收参数加上@RequestBody QizekjUserEntity qizekjUserEntity 标记,接收json数据
  • 自动根据json数据反序列化成对象qizekjUserEntity 。
/**
     * 5、接收json数据(以实体类方式)
     * {
     * "userName":"qizhekj",
     * "age":/4
     * }
     * @return
     */
    @RequestMapping("/demo06")
    @ResponseBody
    public String demo06(@RequestBody QizekjUserEntity qizekjUserEntity) {
        return qizekjUserEntity.toString();
    }

使用postman访问接口:

在这里插入图片描述

{
    "userName":"qizekj",
    "age":4,
    "qizekjUserInfo":{
        "addres":"HeFei"
    }
}

4、以Map方式接收

  • json数据,key为Map的key,value为Map的value。
  • 注意json数据的value与Map集合的value类型需保持一致,否则报错。
/**
 * 6、接收json数据(以Map方式接收)
 * @param paramMap
 * @return
 */
@RequestMapping("/demo07")
@ResponseBody
public String demo07(@RequestBody Map<String, Object> paramMap) {
    return paramMap.toString();
}

用postman访问:
在这里插入图片描述

5、以List方式接收

/**
 * 7、接收json数据(以List集合方式接收),以json数组的形式传递数据
 * @param list
 * @return
 */
@RequestMapping("/demo8")
@ResponseBody
public String demo8(@RequestBody List<String> list) {
    return list.toArray().toString();
}

/**
 * 8、接收json数据(以List集合方式接收),以json对象的形式传递数据
 * @param list
 * @return
 */
@RequestMapping("/demo9")
@ResponseBody
public String demo9(@RequestBody List<QizekjUserEntity> list) {
    return list.toArray().toString();
}
  • 以json数组的形式传递数据
[
    "qizekj",
    "4"
]

在这里插入图片描述

  • 以json对象的形式传递数据
[
    {
        "userName": "qizekj",
        "age": "4"
    },
        {
        "userName": "chenqun",
        "age": "32"
    }
]

在这里插入图片描述

三、SpringMVC 响应json数据

  1. 在接口上加上@ResponseBody注解,是表示根据该方法返回值,返回对应json数据。底层是根据返回值,序列化成json数据。
  2. @RestController注解,是标记该控制类所有接口都是返回json数据。
    eg:
@RestController
public class QizekjRestController {}

@Controller
@ResponseBody

四、使用HttpServletRequest 获取参数

springmvc底层基于Servlet实现的。

获取httprequest/response三种方式:

  1. public String qizekj(HttpServletRequest request,HttpServletResponse response)
  2. HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
  3. @Autowired

eg:

 /**
     * 获取到我们的 HttpServletRequest httpServletRequest
     *
     * @param id
     * @param name
     * @param httpServletRequest
     * @return
     */
    @RequestMapping(value = "/httprequestDemo01", method = RequestMethod.GET)
    @ResponseBody
    public String httprequestDemo01(Integer id, String name, HttpServletRequest httpServletRequest) {
        System.out.println("id:" + id);
        System.out.println("name:" + name);
        String reqId = httpServletRequest.getParameter("id");
        String reqName = httpServletRequest.getParameter("name");
        System.out.println("reqId:" + reqId);
        System.out.println("reqName:" + reqName);
        /**
         * 2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
         */
        // 从ThreadLocal获取HttpServletRequest  springmvc 底层基于Servlet 提前缓存好了ttpServletRequest
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        return "ok---get";
    }


    /**
     * 获取到我们的 HttpServletRequest httpServletRequest
     *
     * @param id
     * @param name
     * @return
     */
    @RequestMapping(value = "/httprequestDemo02", method = RequestMethod.GET)
    @ResponseBody
    public String httprequestDemo02(Integer id, String name) {
        System.out.println("id:" + id);
        System.out.println("name:" + name);
        /**
         * 2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
         */
        // 从ThreadLocal获取HttpServletRequest  springmvc 底层基于Servlet 提前缓存好了ttpServletRequest
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String reqId = request.getParameter("id");
        String reqName = request.getParameter("name");
        System.out.println("reqId:" + reqId);
        System.out.println("reqName:" + reqName);
        return "ok---get";
    }

五、springmvc restful简单介绍

1、什么是restful

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

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

传统方式操作资源:通过不同的参数来实现不同的效果,post 和 get。
http://127.0.0.1/qizekj/getUser?id=1 查询,GET,查询用户id为1信息
http://127.0.0.1/qizekj/saveUser 新增,POST
http://127.0.0.1/qizekj/updateUser 更新,POST
http://127.0.0.1/qizekj/deleteUser?id=1 删除,GET ,删除用户id为1信息
(查询、删除)一般用GET,写操作(新增、修改)一般用POST

使用RESTful操作资源:可以通过不同的请求方式来实现不同的效果。
例如:请求地址一样,但是实现的效果不一样。例如
发送请求GET执行查询、 发送POST 执行新增、发送PUT执行更新、发送DELETE 执行删除
http://127.0.0.1/user/1 查询,GET
http://127.0.0.1/user 新增数据,POST
http://127.0.0.1/user 更新,PUT
http://127.0.0.1/user/1 删除,DELETE

根据发送不同的类型(GET 、POST 、PUT、DELETE等),判断访问不同的接口。

2、restful案例演示

在@RequestMapping的value中使用URI template({变量名}),然后在@RequestMapping注解方法的需要绑定的参数前,使用@PathVariable指定变量名(如果变量名和参数名一致也可以不指定),从而将URL中的值绑定到参数上。

@RequestMapping组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

package com.qizekj.controller;

import com.qizekj.entity.QizekjUserEntity;
import org.springframework.web.bind.annotation.*;

/**
 * @author chenqun
 * @date 2023/3/18 22:13
 */
@RestController
public class QizekjRestfulController {
    //Restful api 请求地址都是一样 根据不同请求方法判断
    /**
     * 1、提供根据id查询接口 ---请求方法类型为get,指定请求类型为get
     * /user/{id}  /user/1
     */
//  @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    @GetMapping(value = "/user/{id}")
    public QizekjUserEntity getUser(@PathVariable("id") Integer id) {
        System.out.println("[getUser] id:" + id);
        return new QizekjUserEntity("qizekj" + id, 22);
    }

    /**
     *2、根据id删除数据 发送请求类型 delete
     * @param id
     * @return
     */
//  @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
    @DeleteMapping(value = "/user/{id}")
    public String deleteUser(@PathVariable("id") Integer id) {
        System.out.println("[deleteUser] id:" + id);
        return "ok:id" + id;
    }

    /**
     * 3、新增添加数据 Post类型 传递 json数据
     * @return
     */
//  @RequestMapping(value = "/user", method = RequestMethod.POST)
    @PostMapping(value = "/user")
    public String addUser(@RequestBody QizekjUserEntity qizekjUserEntity) {
        System.out.println("[addUser] qizekjUserEntity:" + qizekjUserEntity);
        return "ok";
    }

    /**
     * 4、修改数据 put类型 传递 json数据
     * @return
     */
//  @RequestMapping(value = "/user", method = {RequestMethod.PUT})
    @PutMapping(value = "/user")
    public String updateUser(@RequestBody QizekjUserEntity qizekjUserEntity) {
        System.out.println("[updateUser] qizekjUserEntity:" + qizekjUserEntity);
        return "ok";
    }
    /**
     *  @RequestMapping 没有指定请求方法 则 包含所有请求类型 get、put、post等 指定请求方法类型 method = RequestMethod.PUT
     */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaWeb是一个非常广泛的领域,包含了很多知识点。以下是一些JavaWeb的全部知识点: 1. Java语言基础 JavaWeb开发的基础包括Java语言基础、HTML、CSS、JavaScript等前端技术,以及数据库基础和SQL语言的使用等。 2. Servlet和JSP Servlet是JavaWeb中的核心技术之一,它是一种运行在服务器端的小程序,能够接收来自客户端的请求,并产生响应。而JSP则是一种动态网页技术,它可以将Java代码嵌入HTML中,使得网页的内容可以动态生成。 3. MVC架构 MVC是一种设计模式,它将应用程序分为三个部分:模型、视图和控制器。在JavaWeb开发中,常用的MVC框架有Struts、Spring MVC等。 4. 数据库操作 JavaWeb应用程序通常需要与数据库进行交互,常用的数据库有MySQL、Oracle等。在JavaWeb开发中,常用的数据库操作框架有JDBC、Hibernate等。 5. Web应用程序的部署 Java Web应用程序通常需要部署在Web服务器上才能访问。常用的Web服务器有Tomcat、Jetty、GlassFish等。 6. Spring框架 Spring框架是JavaWeb应用程序开发中非常流行的框架之一,它提供了很多有用的功能,如依赖注入、AOP等。 7. Web Service Web Service是一种基于Web的应用程序开发方式,它使用SOAP协议和WSDL文档描述服务,并使用HTTP协议进行通信。在JavaWeb开发中,常用的Web Service框架有Apache Axis2、CXF等。 8. RESTful Web Service RESTful Web Service是一种基于REST原则的Web Service,它使用HTTP协议进行通信,并使用JSON或XML格式进行数据传输。在JavaWeb开发中,常用的RESTful Web Service框架有Jersey、Spring MVC等。 9. Spring Boot Spring Boot是Spring框架的一种快速开发框架,它通过自动配置和约定优于配置的方式,简化了Java Web应用程序的开发。 10. DevOps DevOps是一种将开发和运维结合起来的开发模式,它通过自动化和标准化的方式,提高了软件开发和运维的效率。在JavaWeb开发中,常用的DevOps工具有Jenkins、Docker等。 以上是JavaWeb的全部知识点,如果你需要更加详细的了解,可以针对性地学习相关的知识。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吟诗作对歌一曲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值