springMVC接收数据
controller的参数名若与请求参数名一致,则框架会帮我们注入,也可以通过配置
@RequestParam(“请求的参数名”)注解来帮助框架找到我们需要的属性。
若我们的需要将参数注入一个对象,则我们的对象属性名称需要与请求参数相对应。
若对象中有引用的对象属性,则请求参数可以为
“引用属性名.引用属性的属性名”
例如:
User user;
user.name="eddie";
List<User> list;
list[0].name="eddie";
Map<String, User> map;
map['first'].name="eddie";
即可注入被引用的对象。
@RequestBody
仅限Post请求,以Controller以String接收以 变量名=值&变量名=值&变量名=值,这样的形式传递。
例:id=1&name=eddie&age=18
后端导入 jackson包后,使用RequestBody注解,即可把请求过来的json数据封装到一个对象中去(要求传递的变量值要与对象中的属性名的set后面字段相同)。
@PathVariable
与RestFul风格一同使用,可以通过占位符获取url中的数据。
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable("sid") String id) {
System.out.println(id);
return "success";
}
@CookieValue
获取Cookie中的值
@RequestMapping("/testCookie")
public String testCookie(@CookieValue(value = "JSESSIONID") String id) {
System.out.println(id);
return "success";
}
@ModelAttribute
- 作用:
在对应Controller方法执行前执行,用于补充前端传过来的数据不全的情况,例如只传过了一个name时,我们需要从数据库中拿到这个name对应的完整用户信息时,可以通过@ModelAttribute获取name参数,补全user对象,再传递给对应的Controller方法。- 出现在方法上:表示当前方法会在控制器方法执行前线执行。
- 出现在参数上:获取指定的数据给参数赋值。
- 有返回值写法:
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println(user);
return "success";
}
/**
* 表单提交的数据不全时,我们需要通过数据库补全User
* @param name 表单提交的数据
* @return
*/
@ModelAttribute
public User showUser(String name){
System.out.println("showUser执行了...");
//通过用户名查询数据库(模拟)
int id = 1;//查询到
ind age = 18;//查询到
User user = new User();
user.setName(name);
user.setId(id);
user.setAge(age);
return user;
}
- 无返回值写法:
通过Map存储
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("userabc") User user) {
System.out.println(user);
return "success";
}
@ModelAttribute
public void showUser(String name, Map<String, User> map){
System.out.println("showUser执行了...");
//通过用户名查询数据库(模拟)
User user = new User();
user.setName(name);
user.setId(1);
user.setAge(18);
map.put("userabc", user);
}
@SessionAttributes
- 作用:用于多次执行控制器方法间的参数共享
- 属性
- value:指定存入属性的名称
@Controller
@RequestMapping(path="/user")
@SessionAttributes(value= {"username","password","age"},types=
{String.class,Integer.class}) // 把数据存入到session域对象中
public class HelloController {
/**
* 向session中存入值
* @return
*/
@RequestMapping(path="/save")
public String save(Model model) {
System.out.println("向session域中保存数据");
model.addAttribute("username", "root");
model.addAttribute("password", "123");
model.addAttribute("age", 20);
return "success";
}
/**
* 从session中获取值
* @return
*/
@RequestMapping(path="/find")
public String find(ModelMap modelMap) {
String username = (String) modelMap.get("username");
String password = (String) modelMap.get("password");
Integer age = (Integer) modelMap.get("age");
System.out.println(username + " : "+password +" : "+age);
return "success";
}
/**
* 清除值
* @return
*/
@RequestMapping(path="/delete")
public String delete(SessionStatus status) {status.setComplete();
return "success";
}
}
springMVC自定义类型转换
springMVC帮我们把字符串自动转成了我们想要的类型,但是,在某些情况。springMVC却不能够知道我们需要把一个字符串按照什么样的格式转换,这时候我们就需要自定义类型转换器。
- 实现Converter<T, T>接口
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
//判断
if(s == null) {
throw new RuntimeException("请你传入数据");
} else {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
return df.parse(s);
} catch (ParseException e) {
throw new RuntimeException("数据类型转换出现错误");
}
}
}
}
- 配置自定义类型转换器
<!-- 配置自定义类型转换器-->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="pro.eddievim.utils.StringToDateConverter"/>
</set>
</property>
</bean>
- 注册驱动
<!-- 开启注解扫描支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
获取原生的ServletAPI
直接在Controller方法上写上HttpServletRequest,与HttpServletResponse。即可获取到原生的API。