表单处理

首先创建一个新页面 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方法的映射,当表单提交的时候,就会被调用