2013-11-14 51 views
2

我正在使用Spring @MVC(使用MVC注释)开发项目。如何使用Spring @MVC在请求中填充多个bean

如果所有的请求参数都应该被填充到一个单独的bean中,一切似乎都很好,但是多个POJO呢?

我已经在网上搜索和所知的形式,后备对象,但我怎么能在@MVC使用它们(注释为基础的)?

另一个问题:我应该为每个表单构造一个bean吗?难道它看起来不像Strut的ActionForm?无论如何阻止创建这些对象?

有没有办法把所有的bean都放到一个Map中并且要求Spring binder来填充它们?喜欢的东西:

map.put("department", new Department()); 
map.put("person", new Person()); 

所以department.namedepartment.id绑定到部门豆和person.nameperson.sex和...填充在人豆? (所以控制器方法接受Map作为其参数)。

+0

那不是特别好支持开箱的,没有。这些字符串真的是真的运行时间,你需要使用地图,不能只创建一个bean? – Affe

+0

那么,我应该为每个请求类型创建一个bean吗? –

+0

当整个表单映射到单个对象时,固定的活页夹堆栈是最幸福的。对于我来说,不知道为什么必须为每个请求定制构造映射,而不是客观上更好:) – Affe

回答

0

如果你给Person参考Department那么它会很容易。在您的应用程序,如果一个人在一个部门工作,将是合乎逻辑的创建这样在您的Person类一个Has-A关系:

@Component 
@Scope("prototype") 
public class Person { 
    private String firstName; 

    private Department department; 

    public Department getDepartment() { 
     return department; 
    } 
    public void setDepartment(Department department) { 
     this.department = department; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
} 

您可以创建一个控制器,可从上下文得到一个Person豆和渲染视图。

@Controller 
public class TestController implements ApplicationContextAware{ 

    private ApplicationContext appContext; 

    @RequestMapping(value="/handleGet",method=RequestMethod.GET) 
    public String handleGet(ModelMap map){ 
     map.addAttribute("person", appContext.getBean("person")); 
     return "test"; 
    } 
    @RequestMapping(value="/handlePost",method=RequestMethod.POST) 
    public @ResponseBody String handlePost(@ModelAttribute("person") Person person){ 
     return person.getDepartment().getDepartmentName(); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext appContext) 
      throws BeansException { 
     this.appContext=appContext; 
    } 
} 

那么你的JSP中查看你可以写这样的事情:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="sf" 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>Test</title> 
</head> 
<body> 
    <sf:form commandName="person" action="/appname/handlePost.html" method="post"> 
     <sf:input path="firstName"/> 
     <sf:input path="department.departmentName"/> 
     <sf:button name="Submit">Submit</sf:button> 
    </sf:form> 
</body> 
</html>