首先创建一个新页面 profile/profile.html
<!DOCTYPE HTML> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" > <head> <meta content="text/html;charset=UTF-8"/> <title>hello</title> </head> <body> <h3>profile</h3> <form th:action="@{/profile}" method="post"> name:<input type="text" name="name" /><br/> email:<input type="text" name="email" /><br/> <input type="submit" /> </form> </body> </html>
@{}语法将会为资源构建完整路径,他会将服务器上下文路径添加到他的参数上
我们还需要创建相关控制器
package masterSpringMvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ProfileController { @RequestMapping("/profile") public String displayProfile() { return "profile/profile"; } }
然后便能看到一个简单的表单
但是目前没有任何功能,这是因为还没有为他的POST URL映射任何行为
我们创建一个数据传输对象(Data Transfer Object,DTO),将他放到与控制器相同的目录中,并将其命名为ProfileForm,他的作用就是匹配web表单中的域并描述校验规则:
package masterSpringMvc.controller; import java.util.ArrayList; import java.util.List; public class ProfileForm { private String name; private String email; private List<String>tastes = new ArrayList<>(); //getters and setters public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public List<String> getTastes() { return tastes; } public void setTastes(List<String> tastes) { this.tastes = tastes; } }
这是一个常规的简单老式JAVA对象(plain old java object,POJO),不要忘记为他生成getter和setter方法,否则的话数据绑定就无法进行了
为了让Spring将表单绑定到DTO上,我们需要在Profile上添加一些元数据
<!DOCTYPE HTML> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" > <head> <meta content="text/html;charset=UTF-8"/> <title>hello</title> </head> <body> <h3>profile</h3> <form th:action="@{/profile}" method="post" th:object="${profileForm}"> name:<input type="text" id="name" th:field="${profileForm.name}"/><br/> email:<input type="text" id="email" th:field="${profileForm.email}"/><br/> <input type="submit" /> </form> </body> </html>
在这里,有两个需要注意的地方
表单上的th:object属性;
所有输入域上的th:field属性
在第一项中,会按照类型将一个对象绑定到控制器上,第二项会将实际的输入域绑定表单bean的属性上
为了让th:object能够运行起来,我们需要添加一个profileForm类型的参数到请求映射方法中:
package masterSpringMvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class ProfileController { @RequestMapping("/profile") public String displayProfile(ProfileForm profileForm) { return "profile/profile"; } @RequestMapping(value="/profile",method=RequestMethod.POST) public String saveProfile(ProfileForm profileForm) { System.out.println("save ok"+profileForm.getName()); return "redirect:/profile"; } }
我们还添加了一个POST方法的映射,当表单提交的时候,就会被调用