一、拜访表【多对多关系映射】
hibernate提供do对多关系映射,两个主表中,都添加集合对象即可。hibernate提供的do对多关系映射,只需要存在2个字段。
我们希望:中间表应该有多个字段。例如:拜访时间,拜访地点,拜访人物,拜访事件。
我们在配置时,不直接使用hibernate的多对多配置,而是把中间表声明出来,声明成一个实体,我们就可以在是实体中添加多个字段。
客户拜访管理
客户拜访新增,查询,修改,删除
二、客户新增:
第一:新增前的操作:
点击【新增客户拜访】超链接的时候,联系人名称和客户名称一并出来。
查询出来客户,业务员信息放在值栈,方便后来在页面中显示。
[1.客户和联系人有关联:查询客户名称后,立即查询联系人的名称,并且显示在联系人的下拉菜单中。
2.业务员是登录的用户,登录的用户id是user.userId]
实现步骤:
- 修改超链接地址,访问action
- 准备action,查询客户和业务员信息。
- add.jsp页面遍历信息。
--客户名称一改变,立马查询联系人信息. 给客户添加一个onchange事件,
--事件处理:使用ajax访问服务器,服务器响应联系人的数据, 使用ajax响应,一般使用Json字符串
--ajax的回调函数中,把数据动态添加到 联系人下拉框.
代码[1]
三,客户查询:
代码[2]
客户分页查询:
- 分页条件+返回值 pageBean
- 当前页 和 每页显示个数
- service层做特殊处理,封装pageBean对象
- jsp页面特殊处理:比如:上一页 下一页 条件查询合并
jsp代码[3]
四,客户修改
- edit页面已经有所有的要修改的数据,只需要把数据提交到服务器就好
A.提交表单的action地址
B.在表单内部添加隐藏域,记录拜访人的id
- 服务器的action接收到数据,调用service层,调用dao层
A.获取表单的提交数据,和拜访记录的id
- 响应信息 在查询页面上显示.
五,权限控制
在每个action之前,添加一个判断,确保我们的用户是登陆状态..这是我们对 登录和注册进行放行.
可以使用过滤器,也可以使用拦截器.
--Struts2提供一个拦截器,好处是可以对指定的拦截器进行放行.
拦截器:
<interceptors>拦截器的配置
<interceptor name="声明的拦截器名称"
class="拦截器路径" />
<interceptor-stack name="basicStack">给拦截器栈命名
<interceptor-ref name="exception"/>引用拦截器
<interceptor-ref name="servletConfig"/>引用拦截器栈
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>这个才是具体使用的拦截器
jsp代码[3]
function goToPage(goPage){
//因为js代码有要去的页码 可以在js中直接判断
if(goPage<1){
alert("当前已经是第一页了 不能上一页");
return ;
}
//获得最大页数
var totalPage = '${pageBean.totalPage}';
if(goPage>totalPage){ //当前页大于 最大页数
alert("当前已经是最后一页了 不能下一页");
return ;
}
/* 查看当前页
var a = '${pageBean.pageNumber}';
alert(a);
*/
//把页码放在表单中,提交表单即有条件了
//指定条件下:点击下一页,给隐藏域赋值,提交表单。
$("#pageNumberId").val(goPage);
//提交表单 先获得表单 再提交即可
$("#customerForm").submit();
}
=========================================================================================
<TR>
<TD><SPAN id=pagelink>
<DIV style="LINE-HEIGHT: 20px; HEIGHT: 20px; TEXT-ALIGN: right">
<!-- 共[<B>10</B>]条记录,[<B>1</B>]页
[<A href="#">前一页</A>]
<B>1</B>
[<A href="#">后一页</A>] -->
共[<B>${pageBean.totalRecord}</B>]条记录,[<B>${pageBean.pageNumber}</B>]页
[<A href="javascript:void(0)" onclick="goToPage(${pageBean.pageNumber-1})">前一页</A>]
<B>
<c:forEach begin="1" end="${pageBean.totalPage}" step="1" var="num">
<a href="javascript:void(0)" onclick="goToPage(${num})" >
<font ${num==pageBean.pageNumber ?"color='red'" : ""}>${num}</font>
</a>
</c:forEach>
</B>
[<A href="javascript:void(0)" onclick="goToPage(${pageBean.pageNumber+1})">后一页</A>]
</DIV>
</SPAN></TD>
</TR>
代码[2]
/*
* 客户列表
*/
@Action("visitAction_list")
public String list() {
//离线对象--拼接条件--放入值栈
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Visit.class);
List<Visit> visitsList =visitService.findByCondition(detachedCriteria);
ActionContext.getContext().getValueStack().set("visitsList",visitsList);
return "list";
}
代码[1]
set从前台拿数据,给属性赋值,
get从服务器接收数据.反显数据 .[封装成private成员变量,同时提供get方法,可以自动放入值栈中。]
//想要接受参数,定义属性+set方法
private Long custId;
public void setCustId(Long custId) {
this.custId = custId;
}
//用户列表集合[属性驱动,返回list集合 数据:声明属性+get方法]
private List<Customer> customerList;
public List<Customer> getCustomerList() {
return customerList;
}