- springmvc中请求参数的耦合
- POJO类
- 日期类型转换
- List参数的解耦
- map类型参数
- restful风格的参数
这里所说的是请求时的参数耦合
在javaweb我们常常用request对象来获得请求中的参数
如果request获得的参数名称不匹配,那么获得的参数就为null
比如下面的代码---->>
package com.gavin.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
public class testController {
@RequestMapping("/tolog.do")
public String toLogin(HttpServletRequest request, HttpServletResponse resp) {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 连接数据库查询
System.out.println(username + "--" + password);
return "success";
}
}
假如请求时参数不匹配,即我们的请求参数只能是username和password
这时候如果改变就会得不到想要的参数;
所以需要一种方式来实现低耦合,不用request对象获得参数并能获得请求时的参数
@RequestMapping("/tologg.do")
public String toLogin(String username, String password) {
// 连接数据库查询
System.out.println(username + "--" + password);
return "success";
}
这里也是要求请求时的参数要和方法中的参数名一致,如果不一致---->>
那怎么实现解耦合?
我们可以指定请求时的参数别名
@RequestMapping("/tologgg.do")
public String toLog(@RequestParam("name") String username,@RequestParam("pwd") String password) {
// 连接数据库查询
System.out.println(username + "--" + password);
return "success";
}
使用这种方式还可以自动实现类型的转换
有时候接收前端的参数太多像这样
后端接收
这时候就要将参数封装为一个类来实现
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TPerson {
String name;
Integer age;
String gender;
String[] hobby;
String birth;
}
这样如果参数发生了变化,我们需要修改TPerson类中的属性而不是方法
springmvc底层是通过getset方法来实现参数的解析—即反射的方式,所以类中必须要有无参构造方法;
这里会涉及到一个问题就是对于一些基本类型的转换是可以的,如果是日期类型的,那会提示转换失败
其实原因很简单,关于日期的转换格式不知道,所以,无法进行解析
那如果放在实体类中
我们看到既然注解放在参数上时时可以识别日期,那同样我们将注解放到TPerson类中的属性上
除了上述的注解转换方式,spring还提供了转换接口
import lombok.SneakyThrows; import org.springframework.core.convert.converter.Converter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class StringToDate implements Converter{ SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd"); @SneakyThrows//偷偷默默的抛出异常的注解 @Override public Date convert(String source) { Date date = dateFormat.parse(source); return date; } }
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TPerson {
String name;
Integer age;
String gender;
String[] hobby;
// @DateTimeFormat(pattern = "yyyy-MM-dd")
Date birth;
@Override
public String toString() {
return "TPerson{" +
"name='" + name + ''' +
", age=" + age +
", gender='" + gender + ''' +
", hobby=" + Arrays.toString(hobby) +
", birth='" + birth + ''' +
'}';
}
}
请求后-----
害,没有配置转换类,
在配置文件中配置转换类
先看一下要使用的接口
再次请求后得到结果,
可以看到明明通过一个注解的方式解决,却要费尽心思用一个转换类加配置
类解决,显然不是一个方便的方式;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
后端—>
package com.gavin.pojo;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TUser implements Serializable {
private Integer userId;
private String userName;
private String loginName;
private String password;
private Integer roleId;
private String tel;
private Date registerTime;
private String status;
private TRole tRole;
private static final long serialVersionUID = 1L;
private List fruitList;
}
@RequestMapping("/dodo.do")
public String dododo(TUser tUser){
System.out.println(tUser.getFruitList());
return "success";
}
map类型参数这里相当于遍历集合中的元素,按照下标的形式进行装配
跟list一样,
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
后端
@RequestMapping("/dodo.do")
public String dododo(TUser tUser){
System.out.println(tUser.getFruitCount());
return "success";
}
只要满足键值对关系就可以了
restful风格的参数说到这个restful风格,说起来也和常见,比如
链接一下baidu.com
这个就是一种restful风格的解析
在springmvc中怎么用着种风格呢?
我记得之前在某一篇帖子种写了这种方式,今天在此回顾一下,简单说一下大致原理



