当前位置: 首页 > 知识库问答 >
问题:

如何在Spring MVC中将复选框值传递给控制器

李胡媚
2023-03-14

我有一个包含函数列表的jsp页面。在控制器中,我从数据库中获取此列表并将其传递给jsp。

@RequestMapping(value = "/functionlist", method = RequestMethod.GET)
    public ModelAndView functionList(Model model) throws Exception {
        ModelAndView mv = new ModelAndView("functionList");
        mv.addObject("functionList", getFunctionsFromDB());
        return mv;
    }

在我的jsp页面中,我使用以下函数列表创建表

<table id="table">
    <thead>
    <tr>
        <th></th>
        <th>Name</th>
        <th>Action</th>
    </tr>
    </thead>
    <tbody>
    <c:choose>
        <c:when test="${not empty functionList}">
            <c:forEach var="function" items="${functionList}">
                <tr>
                    <td><input name="id" value="${function.id}" hidden></td>
                    <td>${function.name}</td>
                    <td>
                        <input type="checkbox" id="${function.id}" value="${function.action}"></td>
                </tr>
            </c:forEach>
        </c:when>
    </c:choose>
    </tbody>
</table>
<button type="submit" name="save">Save</button>

我还将函数id赋予复选框id。

我的功能实体如下

public class Function {

    private Integer id;
    private String name;
    private Boolean action;
...
}

我想按保存按钮并进入控制器“/函数列表/保存”我的复选框值列表。

共有3个答案

邴越彬
2023-03-14

很少的事情。首先,您应该考虑一个表单对象,它是视图和控制器之间的交换实体。表单实体将类似于以下内容:

public class Form {
private List<Function> functions;
//getters & setters
}

其次,由于您使用的是Spring MVC,因此您应该利用

<form:form  commandName="form"  action="/your/url">
<c:forEach items="${form.functions }" var="function" varStatus="status">
    <tr>
        <td><form:hidden path="functions[${status.index }].id"></td>
        <td>${function.name}</td>
        <td>
            <form:checkbox path="functions[${status.index }].action" id="${function.id}" value="${function.action}"/>
        </td>
    </tr>
</c:forEach>
</form:form>

最后控制器将是这样的

@RequestMapping(value="/your/url", method=RequestMethod.POST)
public String postForm(@ModelAttribute("form") FormForm form)
{
    //cool stuff here
}

请注意,正确的HTTP方法是POST,而不是GET。是的,我知道GET也适用,这绝对是一种不受欢迎的策略。此外,了解我如何在Form中引用函数的列表。当我必须显示数据时,我在foreach语句中使用了变量函数,当我必须绑定 object以将数据传输到控制器时,我引用了列表。最后但同样重要的是,我还没有尝试过代码。我在飞行中写了它,只是想给你一些关于如何正确操作的提示。最后一件事。由于您将表单传递给了JSP,因此您不再需要使用所使用的属性填充模型。只需用数据填充表单,并使用它在视图中显示它们即可。就像这样 ${form.stuff.you.want}

邢皓
2023-03-14

首先,您需要将name属性添加到复选框输入中。你可以在控制器上的一个数组中获得与你的名字属性相同的名字

    @RequestMapping(value = "/functionlist", method = RequestMethod.GET)
        public ModelAndView functionList(Model model,@RequestParam("checkboxname")String[] checkboxvalues) throws Exception {
        ModelAndView mv = new ModelAndView("functionList");
        mv.addObject("functionList", getFunctionsFromDB());
       return mv;
}
车明贤
2023-03-14

尝试将表单添加到jsp页面

  <form:form id="yourForm" action="/functionlist/save" method="POST" modelAttribute="functionList">

        <c:forEach items="${functionList}" varStatus="status" var="function">

            <tr>
                <td>${function.name}</td>
                <td>
                    <form:checkbox path="functionList[${status.index}].action"/>
                </td>
            </tr>
        </c:forEach>

        <input type="submit" value="submit" />
    </form:form>

在控制器中,您应该有这样的方法

  @RequestMapping(value = { "/functionlist/save" }, method = RequestMethod.POST)
    public String savePerson(@ModelAttribute("functionList")List<Function> functionList) {
        // process your list
    }

如果这不起作用,你可以尝试包装你的清单。

public class FunctionListWrapper {
    private List<Function> functionList;

    public FunctionListWrapper() {
        this.functionList = new ArrayList<Function>();
    }

    public List<Function> getFunctionList() {
        return functionList;
    }

    public void setFunctionList(List<Function> functionList) {
        this.functionList = functionList;
    }

    public void add(Function function) {
        this.functionList.add(function);
    }
}

在控制器中而不是传递列表,传递包装器

  FunctionListWrapper functionListWrapper=new FunctionListWrapper();
        functionListWrapper.setFunctionList(userService.getFunctionList());
        mv.addObject("functionListWrapper", functionListWrapper);

有关详细信息,请查看此问题:问题1和问题2

 类似资料:
  • 我想通过使用javascript或jquery或不使用javascript或jquery将thymeleaf下拉选择的值传递给spring boot控制器

  • 我在jsp/jstl中有名字和密码,我试图将名字和密码传递给控制器。 这是我的控制器课程 包裹通讯。易于理解的控制器; 这是索引。带有表单标记和c标记库的jsp 我试图将变量user(值取自name variable)从此窗体传递给控制器。 有人能帮我怎么用c标签吗。。 我已经使用过commandName=“registereduser”,其中user是类registereduser的对象。 但我

  • 两个问题。 我有User和Note类。用户可以有许多笔记。如何通过Thymeleaf显示属于用户的每个便笺的id?th:text=“${u.notes.id}”不起作用 我有一个表(见图),其中包含每个具有布尔isUserChecked值的用户的复选框,下面是删除选中用户的按钮。Thymeleaf更正显示isUserChecked值的状态。Delete按钮在手动选中checkbox时不起作用,但在

  • 问题内容: 谁能告诉我如何在JSP中将JavaScript值传递给Scriptlet? 问题答案: 您的javascript值是客户端,您的scriptlet正在服务器端运行。因此,如果您想在scriptlet中使用javascript变量,则需要提交它们。 为此,可以将它们存储在输入字段中并提交表单,或者执行ajax请求。我建议您对此进行研究。

  • 我试图将一个参数传递给我的@RESTController-Spring Boot类。 在@POSTMapping方法中,我想使用自定义Java类的方法来处理接收到的正文并返回响应。 Spring应用程序在应用程序中启动。Java语言控制器对象似乎是隐式创建的。 我已经尝试将构造函数添加到我的RESTController类中。但是我找不到用参数调用该构造函数的方法。 尽管我可以定义第二个构造函数,但

  • 我想将countrySelection值传递给controller