准备工作
- 创建Account类
public class Account implements Serializable {
private String name;
private String password;
private Date birthday;
private Double money;
private User user;
private List<User> list;
private Map<String, User> map;
public List<User> getList() {
return list;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public void setList(List<User> list) {
this.list = list;
}
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", birthday=" + birthday +
", money=" + money +
", user=" + user +
", list=" + list +
", map=" + map +
'}';
}
}
- 创建User类
public class User implements Serializable {
private String userName;
private Integer age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", age=" + age +
'}';
}
}
- 编写控制器类
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println(account);
return "success";
}
}
编写param.jsp
<body>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="name"/><br/>
密码:<input type="password" name="password"/><br/>
生日:<input type="text" name="birthday"/><br/>
金额:<input type="text" name="money"/><br/>
用户名:<input type="text" name="user.userName"/><br/>
年龄:<input type="text" name="user.age"/><br/>
用户名:<input type="text" name="list[0].userName"/><br/>
年龄:<input type="text" name="list[0].age"/><br/>
用户名:<input type="text" name="map['one'].userName"/><br/>
年龄:<input type="text" name="map['one'].age"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
- 注意
- 日期类型的默认数据格式是:yyyy/MM/dd
- 中文乱码问题,在web.xml中配置编码过滤器
<!--配置解决中文乱码的过滤器--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
自定义数据转换器
- 编写数据转换器类
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
if (source.length() == 0)
throw new RuntimeException("请传入数据");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return dateFormat.parse(source);
} catch (Exception e) {
throw new RuntimeException("数据类型出错");
}
}
}
- 在springmvc.xml中开启类型转换器
<!--开启类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.whut.untils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--开启springMVC框架注解支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
常用注解
-
RequestParam
- 作用: 把请求中指定名称的参数给控制器中的形参赋值。
- 属性:
- value:请求参数中的名称。
- required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
<a href="annotation/testRequestParam?name=张三">testRequestParam</a>
@Controller @RequestMapping("/annotation") public class AnnotationController { @RequestMapping("/testRequestParam") public String testRequestParam(@RequestParam(name = "name") String username){ System.out.println(username); return "success"; } }
-
ModelAttribute
- 作用: 该注解是SpringMVC4.3版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。 出现在参数上,获取指定的数据给参数赋值。
- 属性: value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。
- 应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
- 例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为null,此时就可以使用此注解解决问题。
- 示例
<a href="annotation/testModelAttribute?userName=testModelAttribute">testModelAttribute</a>
@RequestMapping("/testModelAttribute") public String testModelAttribute(User user){ System.out.println("执行了控制器方法"+user.getUserName()); return "success"; } @ModelAttribute public void showModel(User user){ System.out.println("执行了showModel方法"+user.getUserName()); }
输出结果
- 基于Map的应用场景示例
-
ModelAttribute修饰方法带返回值
- jsp中创建表单
<form action="annotation/updateUser" method="post"> 用户名称:<input type="text" name="userName" ><br/> <input type="submit" value="保存"> </form> </form>
- 控制器中方法
@RequestMapping("/updateUser") public String testUpdateUser(User user){ System.out.println("控制器中处理请求方法:修改用户"+user); return "success"; } @ModelAttribute public User showModel(String userName){ //模拟数据库查询 User user = findUserByUserName(userName); System.out.println("执行了showModel方法"+user); return user; } public User findUserByUserName(String userName){ //模拟数据库查询 User user = new User(); user.setUserName(userName); user.setAge(18); return user; }
- 运行结果
- jsp中创建表单
-
ModelAttribute修饰方法不带返回值
- 控制器中方法
@RequestMapping("/updateUser") public String testUpdateUser(@ModelAttribute("user01")User user) { System.out.println("控制器中处理请求的方法:修改用户:"+user); return "success"; } @ModelAttribute public void showModel(String userName, Map<String,User> map) { //模拟去数据库查询 User user = findUserByUserName(userName); System.out.println("执行了showModel方法"+user); map.put("user01",user); } public User findUserByUserName(String userName){ //模拟数据库查询 User user = new User(); user.setUserName(userName); user.setAge(18); return user; }
- 输出结果
- 控制器中方法
-
-
SessionAttribute
- 作用: 用于多次执行控制器方法间的参数共享。
- 属性:
- value:用于指定存入的属性名称
- type:用于指定存入的数据类型。
- 使用示例
jsp
<a href="session/testPut">存入SessionAttribute</a> <hr/> <a href="session/testGet">取出SessionAttribute</a> <hr/> <a href="session/testClean">清除SessionAttribute</a>
控制器类
@Controller @RequestMapping("/session") @SessionAttributes(value = {"userName"}, types = {Integer.class}) public class SessionController { @RequestMapping("/testPut") public String testPut(Model model) { model.addAttribute("userName","柯莱特"); model.addAttribute("age", 20); System.out.println("存入"); return "success"; } @RequestMapping("/testGet") public String testGet(ModelMap model){ System.out.println("取出:"+model); return "success"; } @RequestMapping("/testClean") public String complete(SessionStatus sessionStatus){ sessionStatus.setComplete(); System.out.println("清除"); return "success"; } }
输出结果