@Param,@RequestBody、@RequestParam 、@PathVariable、 @ResponseBody总结

2 篇文章 0 订阅

前言

在开发中这几个注解经常性的忘记如何使用,几者之间的区别,今天做一下总结,方便之后的复习
以下部分内容有摘自其他文章,如有侵权,请联系作者修改

@Param注解的作用

@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,当我们的传递的参数不止一个时,我们会通过@Param注解来进行区分(是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)。),如果是一个参数时,不需要添加也可以

dao层示例:

Public User xxx(@param(“userName”) String user_name ,@param(“password”) String password);

xml映射对应示例:

    <select id=" xxx" resultMap="BaseResultMap">  
       select  *  from user_user_t   where user_name = #{userName} and user_password=#{password}  
    </select>

注意:采用#{}的方式把@Param注解括号内的参数进行引用(括号内参数对应的是形参如 userName对应的是user_name );

不使用@Param注解
如果不使用注解的话,参数只能有一个,而且该参数必须与javabean中的属性对应,如果多个参数没有加此注解那么就需要使用param1,param2索引来实现。

@RequestParam注解的作用

@RequestParam是来传递参数的,用于将请求参数区数据映射到功能处理方法的参数上。
在控制层 Controller 中,有时候写接口会带@RequestParam,有时候也可以不带。
如果带@RequestParam,它一般有三个值,Value,required,defaultValue。

public String XXX(@RequestParam(value = "Id", required = false) String Id,)

@RequestParam主要参数:

  1. Value:代表你传参的参数名称,例如 @RequestParam(value=“id”) Long userId。在这里,你 传userId是没有用的,你必须传id,因为value指定了你必须传哪个参数名。当然,你也可以省略value 不写,直接写参数名。
  2. required:默认是true,也就是说,你不显示定义required=false,那么你就必须传参
  3. defaultValue:表示默认值的意思,如果你不传参,也可以通过,因为defaultValue起到了作用。

@RequestBody注解的作用

(注意:以下@RequestBody部分内容摘自: https://blog.csdn.net/zyx1260168395/article/details/103207614.

  1. @requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。
  2. 使用@RequestBody只能发送POST请求
  3. ajax中的默认发送的参数类型及编码为:application/x-www-form-urlcoded,而使用@RequestBody时参数类型及编码为:aplication/json或者是application/xml,通过contentType属性来指定
  4. 在传递之前,对JSON对象要使用JSON.stringify(),JSON.stringify() 方法将一个 JavaScript 值(对象或者数组)转换为一个 JSON 字符串
  5. 一个请求不能同时存在多个@RequestBody

ajax代码

$.ajax({
    url: "workbench/activity/deleteActivity.do",
    contentType:"application/json;charset=utf-8",//必须指定数据类型为application
    type: "post",//请求必须是post
    dataType: "json",
    data: JSON.stringify([{id:"1",name:"ceshi1"},{id:"2",name:"ceshi2"}]),//必须使用JSON.stringify(),如果是json字符串,要用eval()方法转为json对象
    success: function (data) {
        if (data.success) {
            alert("发送成功");
        } else {
            alert("发送失败");
        }
    }
})

后台接收
后台可以根据发回来的数据,使用Map,数组,实体类(要有相应属性的set()方法),集合来接收参数

@RequestMapping("/deleteActivity")
public void deleteActivity(@RequestBody List<Map> ids) {
    activityService.deleteActivityById(ids);
    return HandleFlag.successTrue();
}

简单理解
1.当客户端的HTTP请求参数contentType设置为:application/json
2.服务端的处理接口参数使用:@RequestBody注解,就会把客户参数当成一个javaBean进行耦合字段赋值,简单的说就是,把客户的json对象转换为javaBean对象

但是如果前端是如下表单则不能直接使用**JSON.stringify($(’#signupForm’).serialize())**来传值,需要另外进行一次转换

                      <form class="form-horizontal m-t" id="signupForm">
							<div class="form-group">
								<label class="col-sm-3 control-label">姓名:</label>
								<div class="col-sm-6">
									<input id="name" name="name" class="form-control" type="text">
								</div>
							</div>

								<div class="form-group">
								<div class="col-sm-8 col-sm-offset-3">
									<button type="submit" class="btn btn-primary">提交</button>
								</div>
							</div>
						</form>

转换方式

/**
 * 表单转json
 */
$.fn.serializeObject = function() {
	var o = {};
	var a = this.serializeArray();
	$.each(a, function() {
		if (o[this.name] !== undefined) {
			if (!o[this.name].push) {
				o[this.name] = [ o[this.name] ];
			}
			o[this.name].push(this.value || '');
		} else {
			o[this.name] = this.value || '';
		}
	});
	return o;
};

然后使用**JSON.stringify($(’#signupForm’).serializeObject())**传值

@PathVariable注解的作用

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable(“xxx”) 绑定到操作方法的入参中。

加注解时

 @GetMapping("/toPass/{id}")
    public String toPass(@PathVariable("id") Long id) {
        return prefix + "/toPass";
    }

发起请求时,请求路径后面需要加上参数
在这里插入图片描述

没有加注解时

    @GetMapping("/toPass")
    public String toPass(Long id) {
        return prefix + "/toPass";
    }

发起请求时,请求路径后面不需要加上参数
在这里插入图片描述

@ResponseBody注解的作用

1.@ResponseBody,一般时存在controller层,该注解的作用是将后台查询的数据转换成json格式传值前台进行展示,包括前台传输数据时也要以json的格式传输给后台。

示例:

    @ResponseBody
	@GetMapping("/list")
	public PageUtils list(@RequestParam Map<String, Object> params){
		//查询列表数据
        Query query = new Query(params);
		List<InsuranceMsgDO> insuranceMsgList = insuranceMsgService.list(query);
		int total = insuranceMsgService.count(query);
		PageUtils pageUtils = new PageUtils(insuranceMsgList, total);
		return pageUtils;
	}

如果在Controller没有添加注解,则我们一般是跳转页面
示例:

    @GetMapping("/add")
	String add(){
	    return "add";
	}

而我们在进行spring框架开发的时候,几乎每一个方法都需要添加@ResponseBody注解,所以之后又形成了@RestController注解,它的作用就是将@Controller和@ResponseBody结合,包括了该两个注解的作用。
示例:

@RestController
@RequestMapping("/test")
public class Test {
    public String test(){
        return "hello";
    }
}

扩展:
关于POSTMAN传参不能接收的问题解决方案
问题:
post请求Map参数中有数组集合时参数不能接收问题。

解决方案:
将Map参数转化为json串传给后台进行接收。也可以后台定义一个实体类进行接收。

在requestMapping里面添加consumes = “application/json”,以json的形式传参。注解使用RequestBody,不然参数会接收不到(application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam)

使用Map接收参数时,如果是url后面跟得参数需要用**@RequestParam注解**,如果使用json传参需要使用**@RequestBody注解**
以上见解只是为个人方便日后复习,如有错误,希望各位大佬能评论提醒,感谢!

二、实验步骤 1、创建Maven项目并添加SpringMVC依赖 2、在web.xml中配置DispatcherServlet 3、创建Controller类并添加@RequestMapping注解 4、编写业务逻辑方法 5、使用@RequestParam,@RequestBody,@ResponseBody,@PathVariable注解获取请求参数或返回结果 6、启动Tomcat服务器并测试 三、实验代码 1、pom.xml文件中添加SpringMVC依赖 ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.9.RELEASE</version> </dependency> ``` 2、web.xml中配置DispatcherServlet ```xml <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 3、Controller类中添加@RequestMapping注解 ```java @Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/add", method=RequestMethod.POST) @ResponseBody public String addUser(@RequestBody User user){ System.out.println("添加用户:"+user.getName()); return "success"; } @RequestMapping(value="/{id}", method=RequestMethod.GET) @ResponseBody public User getUser(@PathVariable int id){ User user = new User(id, "张三", 20); return user; } @RequestMapping(value="/list", method=RequestMethod.GET) public ModelAndView getUserList(){ List<User> userList = new ArrayList<User>(); userList.add(new User(1, "张三", 20)); userList.add(new User(2, "李四", 22)); userList.add(new User(3, "王五", 24)); ModelAndView mav = new ModelAndView(); mav.addObject("userList", userList); mav.setViewName("userList"); return mav; } } ``` 4、编写业务逻辑方法 ```java public class User { private int id; private String name; private int age; //getter和setter方法省略 } ``` 5、使用@RequestParam,@RequestBody,@ResponseBody,@PathVariable注解获取请求参数或返回结果 ```java @Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/add", method=RequestMethod.POST) @ResponseBody public String addUser(@RequestBody User user){ System.out.println("添加用户:"+user.getName()); return "success"; } @RequestMapping(value="/{id}", method=RequestMethod.GET) @ResponseBody public User getUser(@PathVariable int id){ User user = new User(id, "张三", 20); return user; } @RequestMapping(value="/list", method=RequestMethod.GET) public ModelAndView getUserList(){ List<User> userList = new ArrayList<User>(); userList.add(new User(1, "张三", 20)); userList.add(new User(2, "李四", 22)); userList.add(new User(3, "王五", 24)); ModelAndView mav = new ModelAndView(); mav.addObject("userList", userList); mav.setViewName("userList"); return mav; } } ``` 6、启动Tomcat服务器并测试 访问http://localhost:8080/user/list,可以看到用户列表页面。 访问http://localhost:8080/user/1,可以看到id为1的用户信息。 使用Postman发送POST请求,提交用户信息到http://localhost:8080/user/add。 四、实验总结 通过本次实验,我们学习了SpringMVC的基本使用方法,包括了配置DispatcherServlet、编写Controller类、使用注解获取请求参数或返回结果等。掌握了这些基本知识后,可以更好地进行后续的开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值