一般在实际开发中,我们离不开与表单打交道,所以在此来说一下SpringMVC如何处理表单。
我们新建一个包,然后在下面创建两个类,User的pojo类和UserController
User:
package com.hty.userbiaodan;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
/**
* @program: springmvc
* @author: Semineces
* @create: 2020-02-09 17:10
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private String username;
private String password;
private String address;
private boolean receivePaper;
private String[] favoriteFrameworks;
private String gender;
private Integer numb;
private String province;
private String[] skills;
private String secret;
}
ps:信息比较多,因为要处理不同表单的内容。
UserController:
package com.hty.userbiaodan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @program: springmvc
* @author: Semineces
* @create: 2020-02-09 17:13
*/
@Controller
@ComponentScan
public class UserController {
@Autowired
private User user;
/**
* 服务方法user(),在ModelAndView对象中传递了一个名称为command的空User对象,因为如果在JSP文件中使用<form:form>标签
* spring框架需要一个名称为command的对象,所以当调用这个user()方法时,将返回user.jsp的视图
* 所以这个user里面的属性变量,就对应着user.jsp里面的各种属性
* @return
*/
@RequestMapping(value = "/user", method = RequestMethod.GET)
public ModelAndView user() {
return new ModelAndView("user", "command", user);
}
/**
* 服务方法addUser() 将根据URL => /addUser 上的POST请求时被调用,根据提交的信息来准备模型对象,最后从服务方法返回userlist.jsp,也就是提交了的表单
* 也就是呈现 userlist.jsp的视图
* @param user
* @param modelMap
* @return
*/
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser(@ModelAttribute("userInformation") @Validated User user, ModelMap modelMap) {
modelMap.addAttribute("username", user.getUsername());
modelMap.addAttribute("password", user.getPassword());
modelMap.addAttribute("address", user.getAddress());
modelMap.addAttribute("receivePaper", user.isReceivePaper());
modelMap.addAttribute("favoriteFrameworks" ,user.getFavoriteFrameworks());
modelMap.addAttribute("gender", user.getGender());
modelMap.addAttribute("numb", user.getNumb());
modelMap.addAttribute("province", user.getProvince());
modelMap.addAttribute("skills", user.getSkills());
modelMap.addAttribute("secret", user.getSecret());
return "userlist";
}
/**
* 给user.jsp里面的item里传${"webFrameworkList"}
* 这就是@MdelAttribute的用法
* @return
*/
@ModelAttribute("webFrameworkList")
public List<String> getWebFrameworkList() {
List<String> webFrameworkList = new ArrayList<>();
webFrameworkList.add("Spring MVC");
webFrameworkList.add("Spring Boot");
webFrameworkList.add("Struts 2");
webFrameworkList.add("看片");
return webFrameworkList;
}
@ModelAttribute("numbList")
public List<Integer> getNumb() {
List<Integer> numb = new ArrayList<>();
numb.add(1);
numb.add(11);
numb.add(1111);
numb.add(1234);
return numb;
}
@ModelAttribute("provinceList")
public Map<String, String> getProvinceList() {
Map<String, String> map = new HashMap<>();
map.put("SX", "陕西");
map.put("BJ", "北京");
map.put("SH", "上海");
map.put("GZ", "广州");
return map;
}
@ModelAttribute("skillsList")
public Map<String, String> getSkills() {
Map<String, String> map = new HashMap<>();
map.put("LOL", "LOL");
map.put("LOL1", "LOL1");
map.put("LOL2", "LOL2");
return map;
}
}
然后我们根据这两个类来设计我们的user.jsp和userlist.jsp:
user.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!--大坑,我们如果用到form,直接用是不行的,我们必须要在包里找到对应的tld文件,然后放在WEB-INF文件下才可以继续使用,否则就用不了-->
<html>
<head>
<title>SpringMVC表单输入</title>
</head>
<body>
<h2>用户信息</h2>
<form:form method="POST" action="/addUser">
<table>
<tr>
<td><form:label path="username">用户名:</form:label></td>
<td><form:input path="username" /></td>
</tr>
<tr>
<%--使用<form:input path="password" />
相当于<input id="password" name="password" type="password" value=""/>
--%>
<td><form:label path="password">密码:</form:label></td>
<td><form:password path="password" /></td>
</tr>
<tr>
<%-- 该标签相当于<textarea id="address" name="address" rows="5" cols="30">/ --%>
<td><form:label path="address">住址:</form:label></td>
<td><form:textarea path="address" rows="5" cols="30" /></td>
</tr>
<tr>
<td><form:label path="receivePaper">是否接受报纸:</form:label></td>
<td><form:checkbox path="receivePaper"/></td>
</tr>
<tr>
<td><form:label path="favoriteFrameworks">喜欢的框架:</form:label></td>
<td><form:checkboxes path="favoriteFrameworks" items="${webFrameworkList}" /></td>
</tr>
<tr>
<td><form:label path="gender">性别:</form:label></td>
<%--label标签:带有两个输入字段和相关标记的简单HTML表单,常用与性别,比较方便--%>
<%--以下的复选框将为
<input id="gender1" name="gender" type="radio" value="M" checked="checked"/><label for="gender1">男</label>
<input id="gender2" name="gender" type="radio" value="F"/><label for="gender2">女</label>
--%>
<td>
<form:radiobutton path="gender" value="male" label="男" />
<form:radiobutton path="gender" value="female" label="女" />
</td>
</tr>
<tr>
<%--这个radiobuttons 的items写法比较像上面的复选框--%>
<td><form:label path="numb">喜欢的数字:</form:label></td>
<td><form:radiobuttons path="numb" items="${numbList}" /></td>
</tr>
<tr>
<td><form:label path="province">所在省份:</form:label></td>
<%--该标签相当于
<select id="province" name="province">
<option value="NONE">请选择...</option>
<option value="SX">陕西</option>
.....
</select>
--%>
<td>
<form:select path="province" >
<form:option value="NONE" label="请选择..." />
<form:options items="${provinceList}" />
</form:select>
</td>
</tr>
<tr>
<td><form:label path="skills">技术:</form:label></td>
<%--multiple 允许在下拉列表进行多选 太sb了 要按住shift 或者 ctrl才能多选,还上面的好--%>
<td><form:select path="skills" items="${skillsList}" multiple="true" /></td>
</tr>
<tr>
<%--隐藏表单,好像没什么jb用,也不知道有什么jb用--%>
<td><form:label path="secret" /></td>
<td><form:hidden path="secret" value="1111" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交">
</td>
</tr>
</table>
</form:form>
</body>
</html>
user.jsp是用于我们来进行表单输入的,我们还需要写一个userlist.jsp来展示输入的内容:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Spring MVC表单处理</title>
</head>
<body>
<h2>提交的用户信息</h2>
<table border="1">
<tr>
<td>用户名:</td>
<td>${username}</td>
</tr>
<tr>
<td>密码:</td>
<td>${password}</td>
</tr>
<tr>
<td>住址:</td>
<td>${address}</td>
</tr>
<tr>
<td>是否接受新闻?</td>
<td>${receivePaper}</td>
</tr>
<tr>
<td>喜欢的框架</td>
<td>
<%
String[] favorite = (String[])request.getAttribute("favoriteFrameworks");
for (String framework: favorite) {
out.println(framework);
}
%>
</td>
</tr>
<tr>
<td>性别:</td>
<td>${(gender == "male" ? "男" : "女")}</td>
</tr>
<tr>
<td>喜欢的数字</td>
<td>${numb}</td>
</tr>
<tr>
<td>所在地</td>
<td>${province}</td>
</tr>
<tr>
<td>技术:</td>
<td>
<%
String[] skills = (String[]) request.getAttribute("skills");
for (String s: skills) {
out.println(s);
}
%>
</td>
</tr>
<tr>
<td>小秘密</td>
<td>${secret}</td>
</tr>
</table>
</body>
</html>
我们来运行一下,我们要请求的是前面说的user
我们输入信息:
点击提交,可以看到,我们的url后面变成了addUser,就是Controller里的第二个方法:
还有我们的表单输入的信息。
这个小秘密其实就是影藏表单提交,在user.jsp里面设置默认为1111。