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

  • 相关阅读:
    Linxu指令--date,cal
    Linux指令--diff
    Linux指令--ln
    Linux指令--rcp,scp
    Linux指令--telnet
    Linux指令--traceroute,netstat,ss
    Linux指令--ping
    Linux指令--route
    Linux指令--ifconfig
    Linux指令--性能监控和优化命令相关指令
  • 原文地址:https://www.cnblogs.com/liaoxiaolao/p/9949974.html
Copyright © 2020-2023  润新知