Java关于前后端传值的总结
1.前端向后端传值
1.url上加参数
@RequestBody
@RequestParam
@RequestHeader
@CookieValue
通过url路径就涉及到get和post请求,使用get请求时参数会使用?key=value的形式加载路径上面
get:
例如:http://localhost:8080/login?password=123&username=123
这时在后端应该使用@RequestParam ,但是@RequestParam(“name”)里面的name必须在前端与之有对应的name才行
public void login(@RequestParam String password,@RequestParam String username)
同时还有一种restful风格的路径此时应该使用@PathVariable注解
public void login(@PathVariable String password,@PathVariable String username)
http://localhost:8080/login/123/123
2.post传值:
使用post请求传值的时候一般我们可以使用body参数,但是我们使用@RequestBody 注解的时候我们应该把前端content-type的application/x-www-form-urlencoded编码内容改成application/json,否则就会报错,并且一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
而且@RequestBody 与@RequestParam()可以同时使用。RequestBody 只负责接收的是请求体里面的数据;而RequestParam只负责接收的是key-value里面的参数。
使用@RequestBody 注解的时候,对应的类需要与http的请求体和输入对应的json字符串中的key来自动装配实体类的属性。实体类对应属性相等时会调用类的set方法来赋值。
@Data
public class user{
private String username;
private String password;
}
{
"username":"xiaowang",
"password":"123456"
}
但是如果在后端方法参数前,指定了@RequestParam()的话,那么前端必须要有对应字段才行(当然可以通过设置
该注解的required属性来调节是否必须传。如果没有的话默认为null。
3.请求头和cookie,session
而@RequestHeader就是获取请求头的参数,参数用法和@RequestParam一样.
@CookieValue则是绑定cookie的数据值
假如有以下的cookie,我们可以对此测试
@ResponseBody
@RequestMapping("/cookie")
public String testCookieValue(@CookieValue("test") String cookie){
System.out.println(cookie);
return cookie;
}
获取session的方法之一:
@RequestMapping("/session")
public void testSessionValue(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("name", "iot");
System.out.println(session);
Enumeration<String> sessions = session.getAttributeNames();
System.out.println(sessions.hasMoreElements());
while (sessions.hasMoreElements()) {
String key = sessions.nextElement().toString();
Object value = session.getAttribute(key);
System.out.println(key + ":" + value);
}
}
2.后端向前端传值
1.JSON
使用一个resultVO类来创建返回给前端的数据模板
@Data
@AllArgsConstructor
@ApiModel(value = "统一返回实体类")
public class ResultVO {
@ApiModelProperty(value = "操作状态",example = "200")
private Integer status;
@ApiModelProperty(value = "操作信息",example = "200")
private String msg;
@ApiModelProperty(value = "返回数据",example = "200")
private Object data;
}
然后再用ResultPackUtil来统一对前端返回数据和状态码来重写方法以及自定义的枚举类来对前端返回状态码和数据
/**
* @author RenHaiquan
* @create 2020-10-27 9:02
* @Description:
*/
@Component
public class ResultPackUtil {
public ResultVO success(Object object) {
return new ResultVO(ResponseStatusEnum.SUCCESS.getStatus(), ResponseStatusEnum.SUCCESS.getMsg(), object);
}
public ResultVO success() {
return success(null);
}
public ResultVO success(ResponseStatusEnum resultEnum) {
return new ResultVO(resultEnum.getStatus(), resultEnum.getMsg(),null);
}
public ResultVO success(ResponseStatusEnum resultEnum, Object object) {
return new ResultVO(resultEnum.getStatus(), resultEnum.getMsg(), object);
}
public ResultVO error(Integer status, String msg, Object object) {
return new ResultVO(status, msg, object);
}
public ResultVO error(Integer status, String msg) {
return new ResultVO(status, msg, null);
}
public ResultVO error(ResponseStatusEnum resultEnum, Object object) {
return error(resultEnum.getStatus(), resultEnum.getMsg(), object);
}
public ResultVO error(ResponseStatusEnum resultEnum, String msg, Object object) {
return error(resultEnum.getStatus(), msg, object);
}
public ResultVO error(ResponseStatusEnum responseStatusEnum) {
return error(responseStatusEnum, null);
}
public ResultVO error(String msg) {
return error(ResponseStatusEnum.SERVER_ERROR.getStatus(), msg);
}
public ResultVO error() {
return error(ResponseStatusEnum.SERVER_ERROR, null);
}
}
2.使用模板,但是不是前后端分离,不推荐
常用的比如thymeleaf,jsp等。