联系人管理
(1)客户和联系人一对多配置(重点)
(2)新增联系人
-新增功能实现
-Struts2实现文件上传
(3)联系人列表
-no session问题
(4)客户和联系人级联删除
联系人管理模块
1 客户和联系人关系
(1)客户和联系人是一对多关系
(2)客户:百度、新浪、阿里巴巴
联系人:百度里面有很多员工
新增联系人页面
//1 到新增联系人页面的方法 public String toAddPage(){ //1.1查询所有客户,把所有客户List集合传递到页面中显示(放到域对象) //调用客户service里的方法 List<Customer> listCustomer = customerService.findAll(); ServletActionContext.getRequest().setAttribute("listCustomer",listCustomer); return "toAddPage"; }
添加联系人的方法
//2 添加数据到数据库的方法 public String addLinkMan(){ /** * 可以封装联系人基本信息 * 但是有cid是客户id值不能直接封装的 * 把cid封装LinkMan实体类里面customer对象里面 * */ //原始方式实现 String scid = ServletActionContext.getRequest().getParameter("cid"); int cid = Integer.parseInt(scid); //创建customer对象 Customer c = new Customer(); c.setCid(cid); linkMan.setCustomer(c); return "addLinkMan"; }
添加联系人还可以这样做
<!-- 把域对象所有客户的list显示到下拉列表中 --> <select name="customer.cid"> <c:forEach var="customer" items="${listCustomer }"> <option value="${customer.cid }">${customer.custName }</option> </c:forEach> </select>
name=customer.cid这样做也是可以的,就可以不用写上面的代码了,它的底层是用上面的代码实现的。
Struts实现文件上传
1 之前web阶段实现上传,使用组件FileUpload,使用 struts2实现文件上传,struts2对之前的FileUpload进行封装
2 如何对上传进行封装
(1)struts2里面使用拦截器对上传进行封装
(2)使用struts2框架方便实现文件上传
3 使用文件上传功能时,form表单要修改enctype属性
<FORM id=form1 name=form1 action="${pageContext.request.contextPath }/linkman_addLinkMan.action" method=post enctype="multipart/form-data">
* 还有一个变量,上传文件的mime类型
* 服务器只认扩展名所对应的mime类型
实现文件上传代码
//1 上传文件 //变量的名称需要和表单里面文件上传项的name值一样 private File upload; //2 上传文件名称 表单里面文件上传项的name值FileName private String uploadFileName; //生成get和set方法 public File getUpload() { return upload; } public void setUpload(File upload) { this.upload = upload; } public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } //2 添加数据到数据库的方法 public String addLinkMan() throws IOException{ //判断是否需要上传文件 if(upload != null){ //写上传代码 //在服务器文件夹里面创建文件 File serverFile = new File("F:/ssh_uploadfile"+"/"+uploadFileName); //把上传文件复制到服务器文件里面 FileUtils.copyFile(upload, serverFile); }
4 问题
如果上传文件超过2M,就会出现异常
页面中出现提示
没有input结果定义
(1)使用struts2做文件上传文件大小默认有限制的,默认2M
(2)可以设置上传文件大小
-struts2里面有常量,在struts.xml中进行常量配置,默认常量位置如下图所示:
文件中设置文件上传大小具体位置如下。
struts常量
struts.multipart.maxSize
在struts.xml中修改该值
<!-- 设置上传文件大小 --> <constant name="struts.multipart.maxSize" value="209715200"></constant>
(3)页面中input处理(上传文件大小可能会超过200M)
-input是struts2里面错误处理机制,如果上传文件超过设置的大小之后,自动返回结果,结果名称是input
-解决:配置input结果,到错误页面。
在响应的action配置如下所示:
<!-- 配置input结果 --> <result name="input">/jsp/error.jsp</result>
联系人列表功能
1 查询所有的联系人,显示每个联系人所属的客户名称
<td>${linkman.customer.custName }</td>
no session问题
在web.xml中配置如下所示:
<filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2 修改数据
<input type="hidden" name="linkid" value="${linkman.linkid }"/>
利用隐藏项把联系人id传过来。
这是对联系人进行修改。
对客户进行修改时,联系人相应的客户也叫进行修改。如果没有修改,那么联系人的客户会为空。
客户和联系人级联删除
双向维护外键
1 hibernate外键双向维护
(1)在客户和联系人这两端都需要维护外键
(2)解决方式:让其中的一方放弃关系维护(让一的那一方放弃)
<!-- 表示客户所有联系人 --> <set name="setLinkMan" inverse="true">
inverse默认值是false。
这样做了修改之后,客户修改之后,联系人客户也会进行修改。
2 删除客户后,联系人也删除
hibernate默认会将联系人的外键设为null,然后将再删除客户。
Hibernate: update t_linkman set clid=null where clid=? Hibernate: delete from t_customer where cid=?
把联系人外键设置为null。
要实现级联删除,只要添加属性cascade="delete"即可。
<!-- 表示客户所有联系人 --> <set name="setLinkMan" cascade="delete">
进行修改之后,可以实现级联删除。
如果只有inverse="true"就会放弃关系维护,删除数据不会设置为null,会报错。
第一个,如果inverse属性值false,表示不放弃
1 删除客户之后,把客户所有的联系人也删除
把联系人外键设置null,删除客户。
第二个 如果inverse属性值true,删除客户时候,出现异常
(0)如果把inverse属性设置为true之后,不能直接删除有关数据,做级联删除,否则
报错如下所示:
(1)在根据客户删除联系人,在客户的映射文件中配置,cascade值delete.
(2)规范写法