srm开发(基于ssh)(3)

联系人管理

(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)规范写法

原文地址:https://www.cnblogs.com/liaoxiaolao/p/9949974.html