利用SpringMVC做一个CRUD(增删改查)符合Rest风格的;
C:Create:创建
R:Retrieve:查询
U:Update:更新
D:Delete:删除
数据库:保存数据;
本项目使用Map,List保存数据之类
员工列表展示:
访问index.jsp----直接发送/emps------控制器查询所有员工------放在请求域中-----转发到list页面展示
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 访问项目就要展示员工列表页面 -->
<jsp:forward page="/emps"></jsp:forward>
EmployeeController.java
@Controller
public class EmployeeController {
@Autowired
EmployeeDao employeeDao;
@Autowired
DepartmentDao departmentDao;
/**
* 控制器处理请求:
* 1、查询所有员工
*
* @return
*/
@RequestMapping("/emps")
public String getEmps(Model model) {
/*employeeDao.getAll()是查询所有员工。赋值给变量 all*/
Collection<Employee> all = employeeDao.getAll();
/*model.addAttribute();
往前台传数据,可以传对象,可以传List,通过el表达式 ${}可以获取到
类似于request.setAttribute("sts",sts)效果一样。*/
model.addAttribute("emps", all);
return "list";/*要写list.jsp页面了*/
}
list.jsp
<h1>员工列表</h1>
<%--表格边框和单元格设置 cellspacing单元格之间的间隔,挨着就设置为0--%>
<table border="1" cellpadding="5" cellspacing="0">
<%--表头那一行信息--%>
<tr>
<th>ID</th>
<th>lastName</th>
<th>email</th>
<th>gender</th>
<th>departmentName</th>
<th>EDIT</th>
<th>DELETE</th>
</tr>
<%--表格内信息:将emps里面的信息放进去 遍历用c标签 var指的是每一个员工--%>
<c:forEach items="${emps }" var="emp">
<%--表格内每一个员工对应的信息--%>
<%--<td>是字体比<th>小--%>
<tr>
<td>${emp.id }</td>
<td>${emp.lastName}</td>
<td>${emp.email }</td>
<td>${emp.gender==0?"女":"男" }</td>
<td>${emp.department.departmentName }</td>
<td><a href="${ctp }/emp/${emp.id }">edit</a></td>
<td><a href="${ctp }/emp/${emp.id }" class="delBtn">delete</a></td>
</tr>
</c:forEach>
</table>
效果展示
-----------------------------------------------------------------------
下面是添加员工页面
员工添加:
在list页面点击“”员工添加“”----(查询出所有的部门信息要展示在页面)----来到添加页面(add.jsp)--------输入员工数据--------点击保存(/emp )------处理器收到员工保存请求(保存员工)--------保存完成以后还是来到list页面;
list.jsp页面
<%--list页面有一个超链接,点击之后转到添加员工页面 由于部门框不是写死的,而是下拉菜单(动态),所以在来到添加页面之前,得先获取所有的部门信息
还是需要经过Controller--%>
<a href="${ctp }/toaddpage">添加员工</a>
EmployeeController.java
/**
* 去员工添加页面,去页面之前需要查出所有部门信息,进行展示的
*
* @return
*/
@RequestMapping("/toaddpage")
public String toAddPage(Model model) {
// 1、先查出所有部门--departmentDao.getDepartments()赋值在变量departments
Collection<Department> departments = departmentDao.getDepartments();
// 2、放在请求域中
model.addAttribute("depts", departments);
// 3、去添加页面--add.jsp
return "add";
}
add.jsp
<html>
<body>
<h1>员工添加</h1>
<h1>员工添加</h1>
<form:form action="">
<%--对应实体类Employee.java那里--%>
lastName:<input type="text" name="lastName"/><br/>
email:<input type="text" name="email"/><br/>
gender:<br/>
男:<input type="radio" name="gender" value="1"/><br/>
女:<input type="radio" name="gender" value="0"/><br/>
<%--如何将deptItem.id提交与实体类Employee.java产生联系,级联属性 <select name = department.id>--%>
dept:<select name = department.id>
<%--${depts}里面的depts是Controller中model.addAttribute("depts", departments);--%>
<c:forEach item="${depts}" var = "deptItem">
<%--对应实体类Department.java value="${deptItem.id}"是提交的值,我们能看到的是>${deptItem.departmentName}--%>
<option value="${deptItem.id}">${deptItem.departmentName}</option>
</c:forEach>
</select>
<input type="submit" value="提交"/>
</form:form>
</body>
</html>
效果
点击 添加员工
由于add.jsp 还可以用表单标签方法,更简便,所以两者对比一下
form:input里面的属性path就是原来html-input的name项:lastName:<input type="text" name="lastName"/> 需要写path: 1)、当做原生的name项 2)、自动回显隐含模型中某个对象对应的这个属性的值
form:select里面
items="":指定要遍历的集合 ;自动遍历;遍历出的每一个元素是一个department对象 itemLabel="属性名":指定遍历出的这个对象的哪个属性是作为option标签体的值--能在页面展示的,看到的 itemValue="属性名":指定刚才遍历出来的这个对象的哪个属性是作为要提交 的value值
<form:form action="${ctp }/emp" modelAttribute="employee" method="POST">
lastName:<form:input path="lastName"/><br/>
email:<form:input path="email"/><br/>
<%--form:radiobutton 单选按钮--%>
gender:<br/>
男:<form:radiobutton path="gender" value="1"/><br/>
女:<form:radiobutton path="gender" value="0"/><br/>
dept:
<%--下拉列表 不需要写forEach--%>
<form:select path="department.id"
items="${depts }"
itemLabel="departmentName"
itemValue="id"></form:select><br/>
<input type="submit" value="提交"/>
</form:form>
🆚对比传统的form表单提交方法
<h1>员工添加</h1>
<form:form action="">
lastName:<input type="text" name="lastName"/><br/>
email:<input type="text" name="email"/><br/>
gender:<br/>
男:<input type="radio" name="gender" value="1"/><br/>
女:<input type="radio" name="gender" value="0"/><br/>
dept:<select name = department.id>
<c:forEach item="${depts}" var = "deptItem">
<option value="${deptItem.id}">${deptItem.departmentName}</option>
</c:forEach>
</select>
<input type="submit" value="提交"/>
</form:form>
但是会报错--请求域中没有一个command类型的对象;
解决方法:来到页面之前一定要给请求域中放这个对象;
在Controller里面给请求域中放这个对象
modelAttribute="":与之前学的无关,只是同名同姓而已 1)、以前我们表单标签会从请求域中获取一个command对象;把这个对象中的每一个属性对应的显示出来 2)、改名:把command改成其它名字 可以告诉SpringMVC不要去取command的值了,我放了一个modelAttribute指定的值; 取对象用的key就用我modelAttribute指定的--在add.jsp里面modelAttribute="employee"
EmployeeController.java
@Controller
public class EmployeeController {
@Autowired
EmployeeDao employeeDao;
@Autowired
DepartmentDao departmentDao;
/**
* 控制器处理请求:
* 1、查询所有员工
*
* @return
*/
@RequestMapping("/emps")
public String getEmps(Model model) {
Collection<Employee> all = employeeDao.getAll();
model.addAttribute("emps", all);
// model.addAttribute("command", newEmployee());//改名command--改成employee
model.addAttribute("employee", newEmployee());
return "list";
}
效果也是同上面传统方法一样
下面完成
输入员工数据--------点击保存(/emp )------处理器收到员工保存请求(保存员工)--------保存完成以后还是来到list页面
项目路径--request.getContextPath()赋值给ctp--哪个请求:/emp--哪个方法类型:method="POST" 完了之后去Controller写一个员工添加的所有方法addEmp()
add.jsp
<%
pageContext.setAttribute("ctp", request.getContextPath());
%>
<form:form action="${ctp }/emp" modelAttribute="employee" method="POST">
EmployeeController.java
/**
* 保存员工
*
* @param employee
* @return
*/
@RequestMapping(value = "/emp", method = RequestMethod.POST)
public String addEmp(Employee employee) {
System.out.println("要添加的员工:" + employee);
//调用employeeDao的save()
employeeDao.save(employee);
//不返回list页面,因为还是要看/emps
// 返回列表页面;重定向到查询所有员工的请求
return "redirect:/emps";
}
效果展示
这时候就保存成功了