1、 第一天 国际物流 杰信商贸 + 搭建环境1. 项目背景杰信商贸是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.公司总部位于十一个朝代的帝王之都西安,业务遍及欧美。随着公司不断发展壮大,旧的信息系统已无法满足公司的快速发展需求,妨碍公司成长,在此背景下,公司领导决定研发杰信商贸综合管理平台。杰信商贸综合管理平台分三期完成。一期完成仓储管理(包括:采购单、仓库、货物、条形码、入库、出库、退货、盘点、库存、库存上限报警、统计查询)和展会管理(包括:展会管理、出单管理),形成货物统一数字化管理。二期完成货运全流程管理,包括购销合同、出货表统计、出口报运单、HOME装箱单、装箱单、委托书、发票、财
2、务统计等。三期完成决策分析(包括:成本分析图、销售情况统计、重点客户、经营情况同期比对统计、工作绩效),为公司经营决策提供数据支持。a) 用例图2. 了解系统是所有功能模块利用visio画系统功能结构图,目的让开发人员了解都有哪些业务模块,方便分工合作,根据每个页面模块的难度,复杂,投入的人力情况来衡量每个模块多少钱。验收标准。数据库建模,业界都使用PowerDesinger 建模3. 系统架构4. 业务:生产厂家a) 功能在货物模块和附近模块,它们都有个生产厂家,讲生产厂家信息提出,成为一个单独的表.b) 需求调研需求说明书生产厂家表 FACTORY_C(_C业务后缀)序号名称代码是否主键类
3、型(长度)说明1.编号FACTORY_ID是VARCHAR2(40)UUID2.全称FULL_NAME否VARCHAR2(200)对应客户比较模糊,翻倍2到4倍3.简称FACTORY_NAME否VARCHAR2(50)4.联系人CONTACTS否VARCHAR2(30)人名20/305.电话PHONE否VARCHAR2(20)6.手机MOBILE否VARCHAR2(20)7.传真FAX否VARCHAR220)8.验货员INSPECTOR否VARCHAR2(30)9.排序号ORDER_NO否INT10.备注CNOTE否VARCHAR2(500)如果感觉它可能和关键字冲突,给它加个C前缀11.创建
4、人CREATE_BY否VARCHAR2(40)权限字段,登陆人ID12.创建部门CREATE_DEPT否VARCHAR2(40)登陆人所在部门的ID13.创建时间CREATE_TIME否TIMESTAMP 第二天 生产厂家CRUD + 购销合同1. 业务:启用,停用功能:和杰信合作生产厂家突然有一天它以次品冒充优质品,杰信不跟这个厂家进行合作。在货物中生产厂家选择框,不能选择这个不再合作的厂家。在系统中不能直接删除这个厂家,因为我们的历史数据中含有对这个生产厂家的引用。软件是采用“伪删除”方式来解决。实际是在数据库表中加入列,作为标识,标识厂家是否可以被引用。0停用1启用。新增厂家默认1,可以
5、修改某个厂家为停用。在货物中选择厂家的下拉列表,只显示为启用.2. 加“启用“停用功能,修改状态.3. 货运管理核心流程:购销合同a) 需求调研过程软件企业就会到杰信去需求调研,项目经理,他面对客户的高层中层领导,目的跟客户安排好调研日程。设计人员,带领初级程序员到具体的业务部门调研.聊天,围绕项目的目标,设计人员会自己记录谈话内容,(主干),初级程序员(所有内容)。回来整理笔记,整理需求调研报告报告中怎么体现纸质报表?初级程序员将纸质报表转化成电子的.b) 购销合同业务分析4. 需求过程杰信和生产厂家签到的合同,称为购销合同。一个购销合同中包含多个货物信息,一个货物信息包括多个附件信息.报表
6、打印时,同一个生产厂家的货物信息才能放在同一个页上,不同生产厂家的货物信息不能放在同一个页上.分析阶段,抠每个字段5. 出货表设计方案一(传统设计)合同表,货物表,附件表多次左连接,SQL极其复杂,由于附件值特殊,SQL不能直接完成,还需要代码去实现。设计方案二(冗余设计)通过冗余,都在货物表中,只需要合同表和货物表左连接即可。6. 分析过程将用户的需求(大白话)转化为开发人员看得懂的数据库表,表之间的关系,业务逻辑。给我们的开发人员看,开发人员依据设计来写代码。复杂,大型项目画类图,序列图辅助开发人员开发。在实际开发中,架构师搭建项目框架,框架的基类都有,基础工具类,统一样式表,统一的公用的
7、js,图片。公司提供一个CVS/SVN账号,配置环境,从中检出你负责的项目的代码.代码一般以项目结构.导入工程,在其上面开发新的业务模块.7. 业务需求销售人员录入合同时,它为草稿状态,这时只能销售人员自己看到.只有当销售人员检查合同无误,提交,状态变成“已上报”。这时候,其他人员才可以看到.销售的领导和船务专责才能看到。利用这个状态字段来控制对当前用户是否可见。(细粒度的权限控制-数据权限)8. 重点知识回顾货运管理核心业务流程:购销合同1.定义购销合同是杰信和生产厂家签订的合同.2.业务复杂度购销合同业务比较复杂,它是货运管理的一个流程,它包括三部分内容,合同的主信息和多个货物信息和多个附
8、件信息。合同主信息和货物是一对多,货物和附件信息是一对多。3。从业务中迁出技术亮点前期我参与了业务调研,重点负责购销合同.给客户交流后,我编写了需求说明书,然后参数购销合同的表设计。从需求说明书结合客户给的电子表格,我抽取出数据库表,利用PD进行建模。设计:1. 跟客户聊天,要引导性和他们聊天.业务基础术语,了解业务流程2. 深入内容,拿到客户手中现有某个模块表单,电子表格,填写的内容,每个内容要注意的事项。来源:手填,从其他模块来获取.抠每个字段,电子表格中每个内容。3. 详细说明书功能的细化,业务逻辑说清楚,画图辅助开发,UML(类图、序列图、状态图)数据库建模细化。目的:开发人员可以依照
9、详细设计开始开发。详细设计本意能达到开发人员无需和客户沟通,就可以在设计人员的指导下就可以直接开发出客户满意的代码。但实际中做不到。设计不到位。实际中开发往复比较多。 第三天 购销合同+货物信息+附件信息1. 业务需求:上报、取消a) 功能:上报实现销售人员确定购销合同录入完毕,检查无误后,上报给领导,领导审核无误后,提交给船运部。取消实现当船务专责未处理此相关的合同时,可以取消这个合同,重新修改合同内容,然后再次上报.如果船运专责已经开始处理报运的业务,不能取消,必须走货物增补流程。b) 设计实现:在表中增加状态字段,新增时默认状态为0草稿,当销售专责确认无误后,点击“上报状态变为1已上报。
10、当船运专责未处理报运时,销售专责点击“取消”状态变为0,草稿。状态为0时,只能销售专责自己看到,当状态为1时,他的领导和报运专责都可以看到。 第四天 购销合同查看,SQL语句的Power1. 附件业务实现随时携带主表的ID2. 购销合同查看合同下货物,货物下面附件,在购销合同中全部浏览,体现货物和附件的关系.构建对象关系3. *细粒度权限控制主菜单,左侧菜单,按钮,URL,方法,业界都称为粗粒度的权限控制。日常的小系统,基于用户,角色,权限架构足够用.在实际大型项目中,光有上面的用户角色,URL这样的控制粒度不够细致,还有数据访问权限。1) 对数据的访问列是可以自己定制的。例如:访问一个人员工
11、资信息表,这个表中含有人员的工资。2) 对数据的访问行可以受权限控制.例如:工资表中有销售部人员的工资信息,还有船运部人员的工资信息.当销售部领导登录时,他只能看到销售人员的工资信息,他不能看到船运部人员的工资信息。3) 直接浏览数据库表,工资列不能直接看到其值。对这个数据库列进行加密。上面统称为数据访问权限,这个权限加上角色用户这样这个系统才比较安全.也称为细粒度的权限控制。a) 列访问控制:单独建立表,权限分配某个角色能访问哪些列;b) 行访问控制:1) 只能看自己创建的记录,不能看到别人创建的记录Where create_by = 当前登陆人ID2) 部门领导看到,他能看到本部门人员创建
12、的记录,不能看到其他部门人员创建的记录Where create_dept = 当前登陆人部门ID and user_level 4 3) 跨部门访问权限,分管领导跨部门,跨人员再加一个配置表,分管领导可以管理的人和部门; 第七天 异构数据库支持+出口报运核心业务1. 核心业务:货运管理第二个流程,出口报运a) 定义:做国际物流,货物要运往国外之前,向海关申报.向海关申报符合国家标准的货物,和货物的体积和重量信息。除了在合同中货物的基本信息外,在报运时新增7个字段,长,宽,高,毛重,净重,出口单价,含税.分次报运一个可以可以分多次来报运,体现在运输的货物数上.例如:10000货物,第一次报运运输
13、6000,第二次报运运输4000.可以多次报运,这种情况很少。日常大多是一次报运.b) 分析设计一个出口报运单来自多个购销合同(一对多);给货物信息新增的7个字段的内容。创建一个出口报运单表c) 冗余设计将货物信息冗余到报运单下的货物信息中。一个实现读取数据快速,减小业务的复杂度,业务逻辑简单。d) 打断设计实现跳跃查询避免关联层级过多,数据量大了后,访问奇慢.打断设计。(表设计不成为文规定,表之间的关联关系不超过4层)在设计时使用一个虚线箭头来表示表之间是存在关联关系,在设计时,不是往常的外键关系。利用一个字段来存储主表和子表之间的关系。X,YWhere contract_id in (x,
14、y).经过打断设计,表之间的关系不存在,跳跃查询.无需查询合同表,直接查询合同下的货物表。(新增)经过上面的设计,后续业务变的更加简单。2. 业务,劳保报表领用周期不同鞋帽子手套毛巾军大衣洗衣粉饭盒班组110105班组2202036000个单元格哪个单元格的内容进行修改,代码只修改修改的框.给每个文本框增加一个隐藏域。12000个信息要提交。本来目的是优化,结果速度更慢。最终每行添加一个隐藏域,当这行的数据进行了修改,在文本框的失去焦点事件onBlur,动态设置这个隐藏域为1。在修改代码时根据这个值判断,只有1的时候,数据才进行修改。不是1跳过。批量新增,增加一个新增按钮,点一次调研一次add
15、Record方法,它的属性值,都为空串.批量删除,表格dhtml提供删除行操作,remove,它把行从table中删除.数据库并没有删除,删除多个框时,记录下它们的id值,拼成一个串,用逗号隔开.后台代码判断这个隐藏域提交值不为空,删除这几个数据。3. 知识回顾a) 打断设计:1.数据库设计先按照三范式,之后对一些需要优化的地方,使用反三范式设计(冗余)(以空间换设计)2。实际业务非常复杂,关联层级过多,随着系统上线运行,用户的数据随着使用的时间,线性增长。不成文规定:关联层级在设计不超过4层。打断设计,在主表中加一个字段,字段来存储两个表之间的关系.多个的时候,之间用逗号隔开。一般情况下都是
16、一次报运,就是一个合同一次报运,个别情况下多个合同一次报运,极端情况下3个合同一次报运。由于打断设计,实现“跳跃查询”。报运需要合同下的货物信息时,无需通过多个合同对象,就可以直接查询货物的信息,通过这个打断设计的字段,利用SQL的in子查询.b) 核心业务:货运管理,出口报运业务,杰信获得订单后,安排多个生产厂家生产货物,与此同时杰信准备报关的材料,除了海关要求的一些制式文档和杰信系统打印的出口商品报运单,交给海关进行审核。4. 页面控制a) 报运单新增,暗度陈仓。用户选择报运关联的多个合同,代码直接进行数据的保存。保存相关合同的id集合,合同号集合,保存冗余的货物信息,保存冗余的附件信息.
17、b) 批量修改Mrecord自定义控件,来信息补录.批量,在页面上利用DHTML动态表格技术,实现表格元素的动态增加,动态创建行,动态创建单元格,利用innerHTML动态向单元格插入文本框,带数据的。在后台准备数据,拼接成js串,将它写入一个变量中,在页面的jQuery的ready事件中,调用这个变量,形成多个js串,依次执行.动态添加到表格中.由于js运行很快,用户感觉不到添加的过程,以为直接展示.这样为用户提供一个非常方便的操作。可以批量来修改货物信息。每行利用一个隐藏域,来存放是否修改标识,这样在记录行数过多时,修改的效应也非常高。Mrecord控件它可以实现动态新增,还可以实现批量删
18、除,自动排序. 第八天 装箱、委托、发票、财务业务+合同归档货运管理包括:购销合同、出口报运、装箱、委托、发票、财务统计。1. 装箱海关批准杰信的申请,像船东申请集装箱,杰信找货代公司请他帮着订箱。杰信找拖车公司,订拖车,拖车公司到码头拉空箱。拉着空箱到生产厂家的仓库.生产厂家在杰信的验货员的监督下,先将货物装到纸箱子中,然后在将纸箱子装入集装箱。拖车拉着满箱到海关指定的码头指定的地方卸货。这几个箱子风吹雨淋.海关进行抽检.直到船来了。将集装箱放到船上。开船从装运港出发,到目的港。装箱时,产生发票号。同时产生发票日期.一个装箱单来自多个报运单(一对多)2. 发票,委托在货物装船的同时,杰信就开
19、具发票,这个发票只是一个通知单,它的内容就是告诉客户货物已经发出,请支付剩余款项.同时快递客户一个提单.客户收到发票通知后,支付剩余款项,同时当货物到达目的港后,客户拿着提单去提货。客户联系货代公司,联系拖车公司,拖车拉着满箱到客户指定的仓库,卸货.客户验货,整个货运流程完毕,杰信和客户的合同完成。3. 财务财务模块不属于货运的业务流程。它是杰信自己内部进行财务核算的模块.统计这单合同有无赚取利润.形成统计报表给领导展示。4. 一对一特殊设计一个委托来自一个发票,一个发票来自一个委托,一个财务来自一个委托.(一对一)一对一的所有表内容可以合成一张表,结构不清晰,业务不清晰。发票,委托,财务表的
20、主键就是装箱单的ID.上面三张表,它们的主键既外键.主外键一个值。举例,假定拿到ID,不论是装箱、委托、发票、财务,都可以查询它们其中任何一个数据。实现跳跃查询。财务需要货物信息和附件信息,通过打断设计,可以直接跳过发票、委托,直接找到装箱,通过装箱的打断设计字段,直接去搜索报运下的货物和附件信息。因为之前进行了冗余设计,财务所需的货物信息和附件信息,在报运中都有。查询效率提高数倍。5. 出口报运的状态0-草稿 1-已上报 2-装箱 3委托 4-发票 5-财务体现流程,客户随时想了解订单进展情况,流程的跟踪.在报运的列表页面随时了解某个合同进行到哪里。6. 数据库优化a) 数据库表设计l 由原
21、来重视节省空间,变为重视性能。利用冗余,实现性能数倍提高。l 表的优化,监测数据执行时间。分表1)分字段(纵向分表)精简完核心查询它只需要近30个字段。原来需要1分多的查询,现在只1秒多展现页面.2)数据(横向分表)一个表数据量过大。业务中有些数据不常用,将这些不常用的数据放到另外一张表中,称这个表为历史表。专门做一个历史查询的模块,提供用户还可以查询。l 表之间的关联关系不要太复杂。打断设计b) SQL优化,在做复杂关联关系,SQL优化极其重要。Select * from contract_c,contract_product_c,ext_cproduct_c,factory_cWhere
22、contract_id,contract_product_id,factory_id先找最小的结果集,只查询某个合同下的货物,只查询某个货物下的附件,只要查看这个合同c) 数据库的选型l 单个数据库优先选择Oracle,DB2 l 集群mysql,读写分离,单独读数据数据库,单独写的数据库l Web应用服务增加,可以增大访问量,同时分担数据库服务器压力.分表,购销合同历史当前的活动表,它和历史表的结构一样。主模块中的所有表,历史中都有有.例如:购销合同,合同、货物、附件都需要对应的历史表。创建domain批量新增SQL,JDBC jdbcTemple spring7. 在一个系统架构中一般访问
23、数据两种方式l hiberntate/mybatis 完成数据的持久化:新增,修改,删除,简单查询l jdbc/jdbcTemlpate/dbutil批量操作,批量新增,批量修改,级联删除,统计查询主要框架来完成日常业务,一般批量查询使用jdbc,对于这些模块,缓存就要注意使用。有时不要配置缓存。8. 购销合同归档,取消归档-合同表数据进行归档INSERT INTO contract_his_cSELECT * FROM contract_c WHERE contract_id IN (x,y)-货物的数据进行归档INSERT INTO contract_product_his_cSELECT
24、 FROM contract_product_c WHERE contract_product_id IN (SELECT contract_product_id FROM contract_product_c WHERE contract_id IN(x,y)-附件的数据进行归档INSERT INTO ext_cproduct_his_cSELECT FROM ext_cproduct_c WHERE ext_cproduct_id IN (SELECT ext_cproduct_id FROM ext_cproduct_c WHERE contract_product_id IN (SEL
25、ECT contract_product_id FROM contract_product_c WHERE contract_id IN(x,y))-删除合同DELETE FROM contract_cWHERE contract_id IN (x,y)-删除货物DELETE FROM contract_product_cWHERE contract_product_id IN (SELECT contract_product_id FROM contract_product_c WHERE contract_id IN(x,y))删除附件DELETE FROM ext_cproduct_cW
26、HERE ext_cproduct_id IN (SELECT ext_cproduct_id FROM ext_cproduct_c WHERE contract_product_id IN (SELECT contract_product_id FROM contract_product_c WHERE contract_id IN(x,y))9. 知识回顾a) 业务:货运管理,购销合同,出口报运,home装箱单(预装箱),装箱,委托,发票(通知),财务统计。b) 【面试】工作流实现有什么好处?杰信系统实现状态控制流程。浏览每步流程开始时间,操作人,结束时间,审核人突然在流程步骤中增加一步
27、工作流扩充流程时,非常方便,修改一下流程图,工作流自动记录所有操作的人和操作时间,操作意见。状态的代码配合工作流来实现.状态采用常量来定义,只有新增加的状态,才需要编码。c) 表设计委托,发票,财务它们的表的主键既外键,它们的ID值都是装箱ID。因为它们4个的关系都是一对一。关联时最近配置,需要前面业务数据时,可以实现跳跃查询。这样查询的效率高.d) 页面设计装箱新增,它需要在新增页面表现装箱和报运的关系。Div URL链接。携带的信息ID,checkbox中;no也放到checkbox,用竖杠隔开,一个checkbox传递了两个值,无需再次查询数据库,提升性能,手工解串。(大量(超过10个字
28、段)或者信息比较敏感,不推荐使用这种方法,推荐还使用通过id查找其他内容) 第九天 图形报表让微软都羡慕的报表1. Java要实现图形报表都有什么方式?l jFreeChart 纯java API,利用生成一张图片.l excel 图形报表,poi不能直接操作图形报表控件。变相解决,先做一个excel模板,插入好图表控件,然后利用poi动态设置它的数据.用户打开excel,图表直接展现。l 第三方的报表软件,可视化开发。开发效率极高。可视化布局界面,配置数据源即可。(SQL的结果集)。收费。数巨报表(10w,每年服务费1w).做一个应用程序,(C/S程序),IE上安装插件。兼容性。l amCh
29、arts FLASH,只需要构建数据xml。1) 需要swf控件,例如饼形通用2) setting。xml 不通用的3) data。xml、data。txt,xml格式更加直观,不通用的l sqlDao查询结果集的封装,通用,l 工作原理amCharts只需要一次配置,公用flash,改造index.html,访问公用的swfobject.js和公用的flash swf原来文件。样式文件访问本地的,这样可以方便修改配置颜色,坐标,显示样式等.数据data。xml文件。将从数据库中读取的数据拼接成xml节点,写入到这个文本的文件中。转向jStat.jsp统一转向对应的forward参数目录下的i
30、ndex。html.(注意:html浏览器默认都有缓存,在做index.html要去掉缓存)meta httpequiv=”ContentType content=”text/html; charset=UTF-8” /meta http-equiv=”pragma” content=no-cachemeta httpequiv=CacheControl” content=no-cache, must-revalidate”2. jFreeChart、excel、amCharts PK比较l jFreeChart 纯java api,缺点:图形非常粗糙,它实际是利用jFreeChart api
31、生成的图片,表现力差,专门的api需要记忆。a) 生产厂家销售情况-饼形图需求:生产厂家销售情况,厂家+销售SELECTf。factory_name,cp.sumnumFROM(SELECT factory_id,factory_name FROM factory_c WHERE state=1) fLEFT JOIN (SELECT factory_id,SUM(cnumber) AS sumnum FROM contract_product_cGROUP BY factory_id) cpON f.factory_id=cp。factory_idWHERE cp.sumnum IS NOT
32、 nullb) 产品销售排行-柱状图需求:产品销售情况,畅销的产品的前10名,产品+销售SELECT product_no,SUM(cnumber) AS sumnum FROM contract_product_cGROUP BY product_no ORDER BY sumnum DESCLIMIT 10c) 系统访问压力图-曲线图需求:系统访问压力图记录用户登陆系统,就记录一条统计每天登陆系统的次数SELECT SUBSTRING(login_time,1,10),COUNT(login_time) FROM login_log_pGROUP BY SUBSTRING(login_ti
33、me,1,10)统计24小时系统访问的次数当数据不够时,利用临时表凑数据SELECTt。a1,IFNULL(p。countnum,0) AS countnumFROM(SELECT a1 FROM online_t) tLEFT JOIN(SELECT SUBSTRING(login_time,12,2) AS a1,COUNT(login_time) AS countnum FROM login_log_pGROUP BY SUBSTRING(login_time,12,2) pON t。a1=p.a1总结:图形报表业界已经相当成熟,提出公用,称作报表引擎。3. 系统的监控,系统想知道系统的
34、访问瓶颈在哪里?需求系统瓶颈是指,访问最长时间,写数据操作,写磁盘文件操作。都比较耗时,用户体验不好.1) 找出系统这些操作慢的地方,2) 分析原因3) 优化,用户使用频繁模块,对其优化实现一个性能监控的程序a) 早期使用继承方式记录开始时间,记录结束时间,结束时间开始时间=耗时写到日志文件中,写到数据库中b) 拦截器配置springmvc拦截器,记录开始时间,结束时间,打日志。c) 开发步骤1) 写一个拦截器,实现一个接口HandlerInterceptor2) 实现共用的变量,安全性3) 配置springmvc拦截器配置,springmvcservlet.xmlpackage cn。itc
35、ast。jk.interceptor;import javax。servlet.http。HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org。springframework。core。NamedThreadLocal;import org。springframework.web。servlet。HandlerInterceptor;import org。springframework。web.servlet.ModelAndView;import common.Logger;/功能:实现对所有类
36、方法执行时间的监控public class TimeInterceptor implements HandlerInterceptor /引入log4j日志private static Logger log = Logger。getLogger(TimeInterceptor。class);/利用ThreadLocal绑定一个变量,完成线程安全NamedThreadLocalLong startTimeThreadLocal = new NamedThreadLocalLong(”startTimeThreadLocal);/处理类之前,执行preHandle方法Overridepublic
37、boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception long startTime = System.currentTimeMillis();/记录当前时间startTimeThreadLocal。set(startTime);/绑定变量return true;/处理类之后,执行postHandler方法Overridepublic void postHandle(HttpServletRequest request,HttpServ
38、letResponse response, Object handler,ModelAndView modelAndView) throws Exception long stopTime = System.currentTimeMillis();/记录结束时间log.info(String.format(s execute d ms.”,request.getRequestURI(), stopTime startTimeThreadLocal.get());/所有的动作完成,执行一些方法Overridepublic void afterCompletion(HttpServletReque
39、st request,HttpServletResponse response, Object handler, Exception ex)throws Exception / TODO Autogenerated method stubsprimgmvc-servlet.xml中配置mvc:interceptorsmvc:interceptor4. 项目中使用Log4ja) 导入jar包b) 配置log4j.propertieslog4j。rootLogger=DEBUG, stdout配置日志级别 OFF,FANIL,ERROR,WARN,INFO,DEBUG,TRACE,ALL 提供8个
40、级别,log4j推荐开发者使用4个级别:ERROR:错误信息,try,catch抛出异常,log。error(“”),WARN:警告信息INFO:提示DEBUG:BUG很多时候,监控过程变量,调试顺序级别,级别由低到高,高级别的信息会包含打印低级别的信息。Stout输出地点,包括:控制台,文件,数据库log4j.rootLogger=DEBUG, stdout#Consolelog4j.appender。stdout=org。apache.log4j.ConsoleAppenderlog4j。appender.stdout.layout=org。apache。log4j.PatternLayo
41、utlog4j。appender.stdout.layout.ConversionPattern=5p mnLogFilelog4j.appender.file=org.apache。log4j.FileAppenderlog4j.appender.file.File=.。/logs/jklog。loglog4j.appender。file。layout=org.apache.log4j。PatternLayoutlog4j。appender。file.layout.ConversionPattern=%dABSOLUTE 5p %c1:%L %m%nlog4j。logger.org.apac
42、he=INFOlog4j.logger。cn.itcast。jk=DEBUGc) 调用方法:public class TimeInterceptor implements HandlerInterceptor /引入log4j日志private static Logger log = Logger。getLogger(TimeInterceptor.class);类中类似System.out.println()log。info(String.format(”%s execute d ms.”,request。getRequestURI(), stopTime - startTimeThread
43、Local.get();5. POI导入直接读取文件内容,形成SQL语句,批量插入数据库.导入时,excel文档它单元格有类型.1) 类型,根据不同的类型拼接不同的sql2) 模板,自己定义一个模板,让用户将数据导入.模板要设置将所有的单元格设置为文本类型,导入的数据就都是文本。3) 没有通用性,要根据具体业务做一个这样类。4) 插入SQL语句.6. 知识回顾a) 项目统计分析核心模块软件的核心价值:举例:了解杰信有哪些现有的产品畅销,VIP客户,什么产品滞销。指导企业经营。为企业经营决策提供数据支持。在基础数据中挖掘有价值的信息。再次提炼。 数据挖掘.b) 图表报表1) 第三方报表,用户展现
44、效果最好,功能齐全,开发效果。收费2) jFreeChart 古老,api繁杂,开发效率不高,生成图片3) jReport 复杂4) excel (企业中常采用)5) javascript amCharts (收费)6) amCharts Flashc) amCharts Flash 表现力酷炫,使用最简单,1) SQL的数据源2) 动态生成data。xmld) 图形报表常见1) 饼形图2) 柱状图3) 曲线图 第十天 整合ApacheCXF实现WebService服务1. CXF apache webservice简单快捷的开发一个web service程序a) 需求:杰信系统是一个内部使用的业务系统,VPN 企业向电信申请在inter网上的内部网。客户实时了解订单情况,了解订单走到货运流程的哪一步.原先:客户给销售打电话,销售人员询问公司同事,问船务.船务回馈信息.给客户系统提供一个webservice服务,让他能实时查询订单的状态,实现上面的要求,在出口报运中提供这个web service服务。将出口报运查看发布成WebService服务,在这里客户可以随时查看出口报运单,查看订单的流程.b) 开发步骤:1) 引入apache cxf jardependencyorg.apache。cxf/groupIdartifa
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100