员工列表展示
访问index.jsp—发送/emps请求
------控制器查询所有员工----数据放在请求域中------转发到list页面展示
员工添加:
在list页面点击“员工添加”-----发送/toAddPage请求
-----控制器查询所有部门信息----数据放在请求域中-----转发到add页面展示
-----访问add.jsp-----输入员工数据-----保存------发送action="${ctp}/emp"请求 请求方式method=“POST”
------控制器收到请求,参数为实体类对象—调用employeeDao.save(employee);------重定向到查询所有员工的请求—转发到list页面展示
修改员工
页面怎么知道修改哪个员工,
因为请求域已经有完整的对象了,直接取就可以。${}
<c:forEach items="${emps}" var="emp">
<tr>
<th>${emp.id}</th>
<th>${emp.lastName}</th>
<th>${emp.email}<th>
<th>${emp.gender==0?"女":"男"}</th>
<th>${emp.department.departmentName}</th>
<th>
<a href="${ctp}/emp/${emp.id}" >Update</a></th>
<th>Delete</th>
</tr>
</c:forEach>
<h1>员工修改</h1>
<% pageContext.setAttribute("ctp",request.getContextPath());%>
<form:form action="${ctp}/emp/${employee.id}"
modelAttribute="employee" method="post">
<input type="hidden" name="_method" value="put"/>
id用隐藏域,因为请求域已经有完整的对象了,直接取就可以。
<input type="hidden" name="id" value="${employee.id}">
email:<form:input path="email"/><br/>
gender:
男:<form:radiobutton path="gender" value="1"/><br/>
女: <form:radiobutton path="gender" value="0"/><br/>
dept:
<form:select path="department.id"
items="${depts}" itemLabel="departmentName" itemValue="id">
</form:select>
<input type="submit" value="修改"/>
</form:form>
1.ModelAttribute可以提前运行在更新保存方法前面,获取到employee对象
不能用PathVariable注解获取请求的占位符id,因为第一次发的请求是(/emps) |
---|
要用@RequestParam获取请求参数中id的值 ,这个请求参数可以不带id。 |
1.获取到employee对象的id
2.调用Dao接口方法查询员工信息,返回employee对象
ModelAttribute可以把employee对象放到隐含模型中,
控制器另外一个方法从隐含模型中取出就可以了。
@RequestMapping(value="/emp/{id}",method=RequestMethod.PUT)
Employee对象不可以直接用,不能让SpringMVC创建一个新的对象,
有的字段为null
public String updateEmp(Employee employee){
System.out.println(employee);
employeeDao.save(employee);
返回列表页面;可以直接重定向到查询所有员工的请求
return"redirect:/emps";
}
@ModelAttribute
public void myModelAttribute(
@RequestParam(value="id",required=false)Integer id,Model model){
if(id!=null){
Employee employee=employeeDao.get(id);
model.addAttribute("employee", employee);
}
}
引入表单标签库
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
path
1.可以当作原生的name
2.自动回显隐含模型的某个对象的这个属性的值
value是要提交的值,name=属性,可以写级联属性
items | 指定要遍历的集合,自动遍历,遍历出的每一个元素是一个deptment对象 |
---|---|
itemLable | 属性,指定遍历出的这个的对象的哪个属性是作为option的值 |
itemValue | 属性,指定遍历出的这个的对象的哪个属性是作为提交的value值 |
<% pageContext.setAttribute("ctp",request.getContextPath());%>
<form:form action="${ctp}/emp" modelAttribute="employee" method="POST">
lastName:<form:input path="lastName"/><br/>
email:<form:input path="email"/><br/>
gender: <br/>
男:<form:radiobutton path="gender" value="1"/><br/>
女: <form:radiobutton path="gender" value="0"/><br/>
dept:
<form:select path="department.id"
items="${depts}" itemLabel="departmentName" itemValue="id">
</form:select>
<input type="submit" value="保存"/>
</form:form>
用了表单标签的页面可能会报这个错误,请求域中没有一个command类型的对象
SpringMVC认为,每一项表单数据最终都是要回显的 |
---|
path指定的是一个属性,这个属性是从隐含模型/请求域中取出的某个对象中的属性 |
请求域中必须有一个对象,拥有这个属性 |
这个对象就是请求域中的command; |
以前我们表单标签会在请求域中取出一个command对象,
把command对象中的每一个属性对应的显示出来。
让SpringMVC不要去取走command对象了,
因为放了一个modelAttribute指定的对象
request.getContextPath()
是在开发Web项目时, 经常用到的方法,是为了解决相对路径的问题,可返回站点的根路径。
比如:要生成一个文件放在服务器上的一个目录下,
可以使用request.getContextPath()+/dir,组成一个完整得目录结构!
Servlet作用域从小到大是这样排列的,
page | 只是作用于当前请求的页面 |
---|---|
request | 一次请求,根据HTTP无状态,所以可以知道每一次请求,对象是不同的。 |
session | 一次会话,比如有些网站需要登录后才能查看资源,从登录到你关闭浏览器后,这就是一次会话,session是存在服务端的。还有一种情况,有时你在一个网页上长时间没操作,再操作会让你重新登录,这也是session的问题,服务器那边设置了session失效的时间。 |
pageContext | 在整个Web应用上都是有效的,可以理解为所有的网页,因为这个对象是常常用来共享资源的,也就是用户1提交了一个资源,放到了pageContext作用域中,其它用户也可以看到这个资源。 |
引用jquery文件(静态资源)
a标签提交的话,就是页面发送get请求
form表单提交的话,就是页面可以发delete请求
点击a链接的时候,给a链接一个class,给他绑定一个单击事件。(.click())
1.点击后,a链接进入默认行为,不发生跳转。(return false;)
2.form表单的action属性变为一模一样的。attr改form表单的action属性
3.提交form表单。(.submit)
<script type="text/javascript">
$(function(){
$(".delBtn").click(function(){
$("#delectForm").attr("action",this.href).submit();
return false;
});
})
</script>
1.引入脚本script标签,src脚本地址
function(){ } 声明一个回调函数
jquery文件被前端控制器拦截了。
此时会拦截静态资源,到控制器中没有匹配路径为处理静态资源的方法。
js请求怎么交给tomcat处理?
<mvc:default-servlet-handler/>
自己映射的请求(RequestMapping),自己处理
不能处理的请求交给tomcat处理
现在静态资源可以处理,动态映射的请求就不可以处理
所以要加上
<mvc:annotation-driven></mvc:annotation-driven>