SpringMVC学习(二):简单表单处理

一般在实际开发中,我们离不开与表单打交道,所以在此来说一下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。

猜你喜欢

转载自blog.csdn.net/laobanhuanghe/article/details/104281605