spring mvc如何在jsp页面和后台control之间实现集合对象的绑定?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc如何在jsp页面和后台control之间实现集合对象的绑定?相关的知识,希望对你有一定的参考价值。

User类:

Public class User
Private Integer id;
Private String username;
Private String password;
Private Set<Role> roles=new HashSet<Role>();
...
Get set
...


Role类:

Public class Role
Private Integer id;
Private String rolename;
Private Set<User> users=new HashSet<User>();
...
Get set
...


注:
用户类(User)与角色类(Role)为多对多关系

Spring+hibernate+spring mvc

其中model,dao,service层均已实现,控制器是实现了SimpleFormController的类。在控制器与视图整合时出现一些问题。具体如下:
添加新用户时,如果是不包括角色的普通用户时添加成功,加上角色时数据不能绑定。
角色是可选项,可有可无,也就是角色数量不确定。
User.roles属性是Set类型,如何在jsp页面体现? 后台controller如何获取提交上来的角色信息,并赋值给user.roles属性?这其中实现原理是什么?是否要用到自定义的类型转换?
换一种说法就是:
如何在jsp页面和后台control之间实现集合对象的绑定?

在网上也找了很多资料,还是找不到合适的。望大家不吝赐教!小弟不胜感激。
自已已经实现。方法可能有点麻烦。故且这样吧。有需要源码的朋友请Q我:63800849

我也遇到相同的问题.我是这么解决的.
在Controller中添加@InitBinder方法:
/*
* 分配资源,权限放进Role的List<Permit>
*/
@InitBinder
public void initBinder(final WebDataBinder binder)
binder.registerCustomEditor(Permit.class, new CustomEditor());

再实现CustomEditor
public class CustomEditor extends PropertyEditorSupport
public void setAsText(String text)
Permit permit = new Permit();
permit.setPermitId(Long.parseLong(text));
//you have to create a FieldValue object from the string text
//which is the one which comes from the form
//and then setting the value with setValue() method
setValue(permit);


注:registerCustomEditor方法第一个参数是集合中的类型.即你User中Set<Role>的Role.
不好的地方是,页面每次的请求都会执行@InitBinder方法.
参考技术A 其实你可以用list替换set,而且list还是有序的;
至于数据如何绑定我觉得你可以在action中用数组接收
参考技术B 换用struts MVC吧,struts 99%的项目都会用。追问

struts虽然很好,但这也不是换用它的原因。我也是从struts走过来的。谢谢你。

如何在 Spring MVC 中渲染局部视图

【中文标题】如何在 Spring MVC 中渲染局部视图【英文标题】:How to render partial view in Spring MVC 【发布时间】:2015-05-09 14:25:15 【问题描述】:

我试图在我的 jsp 视图页面中包含一个局部视图。我怎样才能做到这一点? 我想将我的“addEmployeeContacts.jsp”包含到“addEmployee.jsp”页面中。 addEmployee.jsp <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> Insert title here

Add Employee

Firstname: Lastname:

            <tr>
                <td>Date of Birth:</td>
                <td><form:input path="dob" type="date"/></td>
            </tr>
            <tr>
                <td colspan="2">
                <input type="submit" value="Add Employee">
                </td>
            </tr>
            </table>
        </form:form>
        <div>
        <jsp:include page="addEmployeeContacts.jsp">
         $employeeContacts
        </jsp:include>
        </div>
    </body>
    </html>
    </code>

并添加EmployeeContacts.jsp

    <code>
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
     <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
        <h1>Add Employee</h1>
        <form:form commandName="employeeContacts">
            <table>
            <tr>
                <td>Contact Type</td>
                <td><form:input path="contactType"/></td>
            </tr>

            <tr>
                <td>Details</td>
                <td><form:input path="contactValue"/></td>
            </tr>

            <tr>
                <td colspan="2">
                <input type="submit" value="Add Contacts">
                </td>
            </tr>
            </table>
        </form:form>
    </body>
    </html>
    </code>

addEmployeeContactController

包 com.employee.comtroller;

导入 javax.servlet.http.HttpSession;

导入 org.springframework.beans.factory.annotation.Autowired;
导入 org.springframework.stereotype.Controller;
导入 org.springframework.ui.Model;
导入 org.springframework.validation.BindingResult;
导入 org.springframework.web.bind.annotation.ModelAttribute;
导入 org.springframework.web.bind.annotation.RequestMapping;
导入 org.springframework.web.bind.annotation.RequestMethod;

导入 com.employee.model.Employee;
导入 com.employee.model.EmployeeContacts;
导入 com.employee.service.EmployeeContactsService;

@控制器
公共类 ContactsController 

    @自动连线
    私人 EmployeeContactsService 雇员联系服务;

    @RequestMapping(value="/addEmployeeContacts", method=RequestMethod.GET)
    public String addEmployeeContacts(@ModelAttribute("employeeContacts") EmployeeContacts employeeContacts,Model model)
        model.addAttribute(employeeContacts);
        返回“addEmployeeContacts”;

    

    @RequestMapping(value="/addEmployeeContacts", method=RequestMethod.POST)
    public String addEmployeeContacts(@ModelAttribute("employeeContacts") EmployeeContacts employeeContacts,HttpSession session,BindingResult 结果)

        如果(结果。hasErrors())
            System.out.println(结果);
            返回“addEmployeeContacts”;
        

        别的
            员工employee = (Employee)session.getAttribute("employee");
            employeeContacts.setEmployee(employee);
            employeeContactService.save(employeeContacts);
        

        返回“重定向:index.jsp”;
    

投掷错误

org.apache.jasper.JasperException: java.lang.IllegalStateException: Bean 名称 'employeeContacts' 的 BindingResult 和普通目标对象都不能用作请求属性

【问题讨论】:

那有什么问题呢? 显示错误:org.apache.jasper.JasperException: java.lang.IllegalStateException: Bean 名称“employeeContacts”的 BindingResult 和普通目标对象都不能用作请求属性 当您收到此错误时,地址栏中显示的 URL 是什么? 感谢您的回复localhost:8080/EmployeeManagement/addEmployee.html 只是想看看它是否有帮助 【参考方案1】:

如果由于我在您的帖子中没有看到的映射,您的 localhost:8080/EmployeeManagement/addEmployee.html 直接将您置于 addEmployee.jsp 中,那么您需要在您的 jsp 中执行以下操作。这应该向您的控制器发出请求以获取包含的视图。希望这会有所帮助。

<div>
        <jsp:include page="/addEmployeeContacts">
         $employeeContacts
        </jsp:include>
 </div>

【讨论】:

【参考方案2】:

您需要使用 .tag 作为 Main page 和部分视图作为 .jsp

例如:

像这样创建 Layout.tag

 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
 <%@tag description="Overall Page template" pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Home</title>
 </head>
 <body>
    <section class="content">
      <jsp:doBody />
    </section>
 </body>
</html>

然后像这样创建一个局部视图

<%@taglib prefix="t" tagdir="/WEB-INF/tags/"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<t:Layout>    
   <div>
       your partial view html content
   </div>
</t:Layout>

【讨论】:

以上是关于spring mvc如何在jsp页面和后台control之间实现集合对象的绑定?的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 控制器如何绑定到 JSP 页面?

如何在 Spring Boot 中与 Spring MVC 一起提供遗留的 jsp 页面?

Spring MVC 从jsp页面传值到Controller方法里

请问,java高手,spring mvc拦截器如何拦截所有的请求啊,包括html和jsp页面?

java开发中为啥我的spring mvc后台接收不到前台传来的参数?

如何使用 Spring MVC 在 JSP 中包含 js 和 CSS