2.2 目标方法。通过@RequestMapping("/emps")来确定处理什么请求。在目标方法中
将数据库查到的数据放入map中,然后springMVC会将其放入request域对象中。
视图解析器,会通过解析返回值,转发到指定的目标页面。
@Controller
public class EmployeeHandler {
@Autowired
private EmployeeDao employeeDao;
@RequestMapping("/emps")
public String list(Map map) {
map.put("employees", employeeDao.getAll());
return "list";
}
}
3.RESTful 添加操作
3.1 需求:显示添加页面。然后点击提交按钮,显示全部员工信息页面,完成添加操作。
注意:①两个页面的URL都是emp。但是请求方式不同
②添加页面的department初始化时是有数据的,这就意味着在到达该添加页面的时候,必须经过
handler的方法去查找出数据,然后回显到该页面。(也就是说,初始化的时候该页面的下拉列表
必须有值)。
3.2 GET请求获取添加员工的页面信息
<a href="emp">Add New Employee</a>
3.3 Handler处理请求,目标方法。页面需要回显departments的值,因此在初始化的时候,需要放入request中。
同时,因为SpringMVC的表单的需求在request放入一个表单对应的bean对象。
/**
*@RequestMapping确定该目标方法处理哪个请求,之所以用两个限定条件,
* 是因为会存在URL相同的情况。
*/
@RequestMapping(value="/emp",method=RequestMethod.GET)
public String input(Map<String,Object> map){
map.put("departments", departmentDao.getDepartments());
map.put("employee",new Employee());
return "input";
}
3.4 添加页面
<!--
可以通过 modelAttribute 属性指定绑定的模型属性,若没有指定该属性,则默认从 request 域对象中读取
command 的表单 bean,如果该属性值也不存在,则会发生错误。
(也就是说,SpringMVC无论是不是第一次加载该页面,都需要进行页面的回显,这就需要在request域
对象中必须存在一个对应表单字段的bean对象,如果没有指定的话,会默认的去读取command 的表单 bean
如果也没有,则报错,这就要求,在请求该页面的时候,需要在request域对象中放入一个bean)
-->
<form:form action="emp" method="POST" modelAttribute="employee">
LastName: <form:input path="lastName"/>
<br>
Emali: <form:input path="email"/>
<br>
<%
Map<String,String> genders = new HashMap();
genders.put("1","Male");
genders.put("0","Female");
request.setAttribute("genders", genders);
%>
<!-- 此时不用再去写itemLabele和itemValue,会自定解析 -->
Gender: <form:radiobuttons path="gender" items="${genders}" />
<br>
<!-- 直接从域对象中获取,因为在get这个页面时,departments已经放入到 域对象中-->
Department: <form:select path="department.id" items="${departments}"
itemLabel="departmentName" itemValue="id"></form:select>
<br>
<input type="submit" value="Submit">
</form:form>
3.5 发送POST请求,执行添加操作。目标方法执行重定向操作,到最初的全部员工显示页面。
@RequestMapping(value="/emp",method=RequestMethod.POST)
public String save(Employee employee){
employeeDao.save(employee);
return "redirect:/emps";
}
4. 删除操作
4.2 发送删除请求。
<td><a class="delete" href="emp/${emp.id}">Delete</a></td>
但是需要注意,需求要求通过DELETE的方式删除,这样就需要把普通的超链接的GET请求方式,先转化
为POST请求,在把POST请求转化为DELETE请求。如下点击超链接,触发click事件,取消原来的GET请求,
代替为通过form发送POST请求,其中涉及到静态资源的获取。
<!-- 想要使用restful发送delete请求,必须发送的是post,配置的HiddenHttpMethodFilter
在可以把post请求转化为delete或put请求,但是一般的超链接都是get请求,就需要用到js-->
<td><a class="delete" href="emp/${emp.id}">Delete</a></td>
<form action="" method="post">
<input type="hidden" name="_method" value="DELETE">
</form>
<script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(function() {
$(".delete").click(function() {
var href = $(this).attr("href");
$("form").attr("action", href).submit();
return false;
}
);
})
</script>
4.3 调用目标方法,注意@RequestMapping中是DELETE请求。通过@PathVariable注解获取URL中的占位符。
删除后,重定向到目标页面。
@RequestMapping(value="/emp/{id}",method=RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id){
employeeDao.delete(id);
return "redirect:/emps";
}