后台接收前端传递的参数
以表单参数的传递、接收为例
1、使用普通类型接收
<!-- 表单 -->
用户名:<input name="username" type="text" /><br />
密码:<input name="password" type="password" /><br />
年龄:<input name="age" type="number" /><br />
// controller使用普通类型接收,同名赋值
public String xxx(String username, String password, int age){
}
// 如果变量名不一致,用@RequestParam("xxx")绑定
public String xxx(String username, @RequestParam("password") String pwd, int age){
}
2、使用pojo类接收
// pojo类
@Setter
@Getter
public class User {
private String username;
private String password;
private int age;
}
//controller使用pojo类接收。如果没有传递某些成员变量,为该类型的默认值
public String xxx(User user){
}
<!-- 表单字段的name使用pojo的成员变量 -->
用户名:<input name="username" type="text" /><br />
密码:<input name="password" type="password" /><br />
年龄:<input name="age" type="number" /><br />
3、使用扩展类接收
// 扩展类
@Setter
@Getter
public class UserExt {
private User user;
//... //其它成员
}
// controller使用扩展类接收
public String xxx(UserExt userExt){
}
<!-- 表单字段的name使用扩展类的成员变量。注意:是扩展类的成员变量,不是controller中的扩展类形参 -->
用户名:<input name="user.username" type="text" /><br />
密码:<input name="user.password" type="password" /><br />
年龄:<input name="user.age" type="number" /><br />
4、其它
-
单选框用String接收,复选框用String[ ]接收,复选框的name使用数组名
-
日期使用Date接收,表单使用type=“date”。如果不进行相关计算,也可使用String接收。表单也可使用type=“text”,但使用text日期格式只能是 年/月/日 ,需要严格校验格式。
-
批量操作,用数组或List接收。比如视图以表格形式列出了多个商品的信息,管理员在页面上修改了多个商品的信息,提交修改时可以使用Goods[ ]或List来传递数据。注意:如果数组、List的元素是自定义的类,比如Goods、User,后台不能直接使用数组、List接收,需要包装一下数组、List
// 使用包装类包装数组|List
@Setter
@Getter
public class GoodsArrayVO {
private Goods[] goodsArray;
// private List<Goods> goodsList;
}
// controller使用数组|List的包装类来接收
public String xxx(GoodsArrayVO goodsArrayVO){
Goods[] goodsArray = goodsArrayVO.getGoodsArray();
//.....
}
<!-- 和普通扩展类一样,表单字段使用扩展类的成员变量 -->
Goods1:<br />
<input type="hidden" name="id" value="001" />
商品名称:<input name="goodsArray[0].name" type="text"><br />
商品价格:<input name="goodsArray[0].price" type="number"><br /><br />
Goods2:<br />
<input type="hidden" name="id" value="002" />
商品名称:<input name="GoodsArray[1].name" type="text"><br />
商品价格:<input name="goodsArray[1].price" type="number"><br /><br />
controller向视图传递数据
// 方式一 使用Model作为形参,返回视图名,会自动传递Model,不用返回Model
public String xxx(Model model){
model.addAttribute("username", "chy");
return "index";
}
// 方式二 使用ModelAndView,需返回ModelAndView
public ModelAndView xxx(){
ModelAndView mav = new ModelAndView("index"); //指定视图名
mav.addObject("username", "chy1"); //传递数据
return mav;
}
传递的数据,key是String,value可以是任何类型
controller的返回值类型
- string 视图名
- ModelAndView
- 如果使用@ResponseBody,返回值可以是任何类型,会自动转换为json对象、json数组返回给浏览器
url映射
@GetMapping("/api/v1/xxx") //只处理get方式的请求
@PostMappping("/api/v1/xxx") //只处理post方式的请求
@RequestMapping("/api/v1/xxx") //可处理所有请求方式
// 可指定要处理的请求方式、映射路径,都是数组{ }
@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST}, path = {"/api/v1/xxx1","/api/v1/xxx2"})
// 只有1个值时,可以缺省{ }
@RequestMapping(method = RequestMethod.GET, path = "/api/v1/xxx1")
// 只配置path时,可以缺省属性名,默认就是path
@RequestMapping({"/api/v1/xxx1","/api/v1/xxx2"})
restful风格
@GetMapping("/user/{id}")
public String findUser(@PathVariable int id){ //@PathVariable修饰变量
}
@GetMapping("/user/{user_id}")
public String findUser(@PathVariable("user_id") int userId){ //名称不一致时,要指定绑定哪个{}
}
@GetMapping("/product/{type}/{id}")
public String findProduct(@PathVariable String type,@PathVariable int id) { //有多个时,1个@PathVariable修饰1个变量
}
常用的请求方式
请求方式 | 应用 | 说明 | 对应CRUD |
---|---|---|---|
GET | 获取资源 | 安全、幂等 | R(Retrieve 读取) |
POST | 创建资源 | 非安全、非幂等 | C |
PUT | 更新资源 | 非安全、幂等 | U |
DELETE | 删除资源 | 非安全、幂等 | D |
其实post、put都可以创建、更新资源
- post主要用于创建资源,如果资源已存在会覆盖,即更新;
- put主要用于更新资源,如果资源不存在会先创建,比如根据id更新用户信息,如过指定id的用户不存在,会先创建该id的记录(其它字段使用默认值),再更新