如果 Employee 中有另一个对象,我如何正确地将 Employee 保存在 JSP 中
How can I properly save Employee in JSP if Employee have another object in it
员工实体:
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ManyToOne(targetEntity = Department.class)
@JoinColumn(name = "department_id")
private Department department;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SALARY")
private int salary;
EmployeeDao 有两个变量路径来保存 Employee:
@Override
@Transactional(readOnly = false)
public void addEmployee(int departmentId, String firstName, String lastName, int salary) {
Department department = getDepartmentById(departmentId);
Employee employee = new Employee(department, firstName, lastName, salary);
sessionFactory.getCurrentSession().save(employee);
}
@Override
@Transactional(readOnly = false)
public void addEmployee(Employee employee) {
sessionFactory.getCurrentSession().save(employee);
}
...
主控制器:
@RequestMapping(value = "/employee/add", method = RequestMethod.GET)
public ModelAndView addPage(Model model) {
model.addAttribute("emp", new Employee());
List<Department> departments = dao.getAllDepartments();
model.addAttribute("deps", departments);
return new ModelAndView("Add");
}
@RequestMapping(value = "/employee/add", method = RequestMethod.POST)
public ModelAndView addEmployee(@ModelAttribute("emp") Employee employee) {
System.out.println(employee);
//dao.addEmployee(employee);
return new ModelAndView("redirect:/");
}
和addPage.jsp
<c:url var="saveUrl" value="/employee/add" />
<form:form modelAttribute="emp" method="POST" action="${saveUrl}" >
<p>Department : <select><c:forEach var="dep" items="${deps}">
<option name="department" value="${dep.id}"> ${dep.name}</option>
</c:forEach></select>
</p>
<p>
First Name : <input size="40px" type="text" name="firstName" />
</p>
<p>
Last Name : <input size="40px" type="text" name="lastName" />
</p>
<p>
Salary : <input type="text" name="salary" />
</p>
<input height="300px" type="submit" value="Add User" />
</form:form>
如何从 JSP 将部门设置为我的员工?
另外:我有一个 REST-POST 方法可以正常工作,但我不知道如何在 JSP.
中使用它
@RequestMapping(value = "/add/employee/{departmentId}/{firstName}/{lastName}/{salary}", method = RequestMethod.POST, headers = "Accept=application/json")
public void addEmployee(@PathVariable int departmentId,@PathVariable String firstName,@PathVariable String lastName,@PathVariable int salary) {
dao.addEmployee(departmentId, firstName, lastName, salary);
dao.calculateAvgSalaryInDepartment();
}
求助,求助
您可以直接传递 object 和相应的键并保存实体,而不是传递 child id。
即用这个
替换你的 select 标签
<select>
<c:forEach var="dep" items="${deps}">
<option name="department" value="${dep}"> ${dep.name}</option>
</c:forEach>
</select>
或
如果您只想传递 child 的主键,那么使用 @InitBinder
和 spring 验证器来识别 child。
注意: 在其余方法中,您通过按 departmentId 获取部门来添加员工,因此它工作正常并且在您的 jsp post 请求您仅使用部门 ID 而不是部门 object.
传递员工实体
员工实体:
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ManyToOne(targetEntity = Department.class)
@JoinColumn(name = "department_id")
private Department department;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SALARY")
private int salary;
EmployeeDao 有两个变量路径来保存 Employee:
@Override
@Transactional(readOnly = false)
public void addEmployee(int departmentId, String firstName, String lastName, int salary) {
Department department = getDepartmentById(departmentId);
Employee employee = new Employee(department, firstName, lastName, salary);
sessionFactory.getCurrentSession().save(employee);
}
@Override
@Transactional(readOnly = false)
public void addEmployee(Employee employee) {
sessionFactory.getCurrentSession().save(employee);
}
...
主控制器:
@RequestMapping(value = "/employee/add", method = RequestMethod.GET)
public ModelAndView addPage(Model model) {
model.addAttribute("emp", new Employee());
List<Department> departments = dao.getAllDepartments();
model.addAttribute("deps", departments);
return new ModelAndView("Add");
}
@RequestMapping(value = "/employee/add", method = RequestMethod.POST)
public ModelAndView addEmployee(@ModelAttribute("emp") Employee employee) {
System.out.println(employee);
//dao.addEmployee(employee);
return new ModelAndView("redirect:/");
}
和addPage.jsp
<c:url var="saveUrl" value="/employee/add" />
<form:form modelAttribute="emp" method="POST" action="${saveUrl}" >
<p>Department : <select><c:forEach var="dep" items="${deps}">
<option name="department" value="${dep.id}"> ${dep.name}</option>
</c:forEach></select>
</p>
<p>
First Name : <input size="40px" type="text" name="firstName" />
</p>
<p>
Last Name : <input size="40px" type="text" name="lastName" />
</p>
<p>
Salary : <input type="text" name="salary" />
</p>
<input height="300px" type="submit" value="Add User" />
</form:form>
如何从 JSP 将部门设置为我的员工?
另外:我有一个 REST-POST 方法可以正常工作,但我不知道如何在 JSP.
中使用它@RequestMapping(value = "/add/employee/{departmentId}/{firstName}/{lastName}/{salary}", method = RequestMethod.POST, headers = "Accept=application/json")
public void addEmployee(@PathVariable int departmentId,@PathVariable String firstName,@PathVariable String lastName,@PathVariable int salary) {
dao.addEmployee(departmentId, firstName, lastName, salary);
dao.calculateAvgSalaryInDepartment();
}
求助,求助
您可以直接传递 object 和相应的键并保存实体,而不是传递 child id。
即用这个
替换你的 select 标签<select>
<c:forEach var="dep" items="${deps}">
<option name="department" value="${dep}"> ${dep.name}</option>
</c:forEach>
</select>
或
如果您只想传递 child 的主键,那么使用 @InitBinder
和 spring 验证器来识别 child。
注意: 在其余方法中,您通过按 departmentId 获取部门来添加员工,因此它工作正常并且在您的 jsp post 请求您仅使用部门 ID 而不是部门 object.
传递员工实体