发布新日志

  • 管理者十句最不应该说的话

    2007-09-14 17:56:42

    1、“不关我事”:身为管理者,只要是公司的事情,事无巨细,都有一份责任。即使是完全在职责之外,态度和蔼地给予一些指引,也能表现出自己的成熟大度和礼节。工作当中很多时候都是说者无心,听者有意,对下属说一句这样的话语很容易将自己的形象彻底颠覆,对同事说一句这样的话语会激发矛盾产生误解,对上司说一句这样的话语可能意味着你该调整岗位了。

    2、“为什么你们……”:在责问别人时,想一想自己有没有什么过失,尽了多少力多少心。有时,宽容地对待别人的错误,会使人更加振作,更加进步。用一连串的“为什么”去发难于人,得到的也可能是一连串的“为什么”的答案。反过来问:为什么我没有配合好你们?你们有什么地方需要我?也许事情会解决得更快一些的。

    3、“上面怎样骂我,我就怎样骂你们”:作为管理者,起的是一个上传下达的桥梁的作用,但绝不是一个简单的传递。对上,要忠诚尽责,完成任务;对下,要想方设法,给予激励帮助支持。敢于承受来自上面的压力,担负起责任,敢于缓和下级的紧张,创造和谐的工作环境,才是一个管理者最应该做的事情。

    4、“我也没办法”:管理者的能力,从某种方面来说,是用解决问题的能力来衡量的。只会强调客观原因,不会积极的心态去调动一切可用的资源,显露出来的肯定是无可奈何和对上级以及下属的打击。要相信办法总是比困难多,相信集体的智慧是可以攻克一切堡垒的。

    5、“我说不行就不行”:以自我为中心的话语,与事实没有合理性的解释,很难服人的。凡事不能以事实为依据,不能本着商讨的态度来解决,可能会使事态更进一步的恶化。其实即使是错的意见,听听也无妨,应该是本着有则改之,无则加勉的心态来对待自己和别人。片面的做出判断,有时就是一种武断,说不行就不行,一定要有科学的分析和依据,这样才能降低判断结果错误的风险,保证判断的正确性。

    6、“你说怎样就怎样”:听起来象是气话,又象是不负责任的话。在产生一些争议时,当一些意见没有被采纳时,这样的话脱口而出,听者会认为,你的见解毫无是处,本来还有可接受的地方,会变得全盘否认,而且从此将可能不再向你征询看法和想法了。保持冷静的头脑和清晰的思维,说出所有的思想,提供参考,并不因没有被使用而太过激动,是一个管理者良好的品质和性格。

    7、“我随时可以怎样”:强权气势的话语,让人听到了就有一种很不舒服的感觉,换句话来说,你以为你是谁?你想怎样就怎样,你到底有多大的能耐?以势压人,只会贬损个人的形象,在大家心中埋下抱怨的种子,这种抱怨,一旦暴发,其弹力之大,是无可想象的。所以保持平意近人,多些尊重他人,是自己尊严的体现。

    8、“你真的很笨”:奚落、讽刺、挖苦员工的话语是在伤害员工自尊及感情,“哀莫大于心死”,表面上员工是在听你的,按你说的去做,但实际上员工只是在敷衍了事,因为他根本体会不到工作的乐趣,工作质量肯定不高。同时,因为奚落、讽刺、挖苦更多的是伤害员工的心灵,长期以往,员工的自尊被摧毁,自信被打击,智慧被扼杀,工作可能干得更不好,最后抱着“死猪不怕开水烫”的态度,对员工、对管理者、对企业的都是不利的。

    9、“不行啦,我能力有限,谁行谁来做”:如果是真正认识到自己的能力有限,能够迎头赶上,自我充电,或许可说是一种有自知之明而且有上进心的表现,也算是一大幸事。但如果是用这句话来抵触工作,来嘲笑挖苦他人,来掩饰自己内心的慌张,全无挑战工作的意识,则可以说,说这句话的管理者无形中已散失了一个管理人最基本的素养,他已不配再做管理者了。

    10、“都很好”、“蛮不错”:泛泛的表扬,既缺乏诚意又不能振奋整体、激励个体,因为人皆不喜欢廉价的、言不由衷的恭维,因此表扬的言语策略应该是及时、有代表性、有充实具体的内容,能够体现被表扬者风貌的语言。不实的表扬表现在用夸大的言辞去称赞不足为奇的小事,有用心炮制的嫌疑,该类表扬其危害在于只令被表扬者高兴,而令所有其他人反感。极力吹捧的行为,其结果往往导致民心的背离,因此人才管理中,及时且适度的赞美言辞是领导者必须掌握的一门学问。

  • 成功领导下属的4个方面

    2007-09-14 17:53:23

    很多管理者都有这样的抱怨:为什么我的下属永远不能和我步调一致?其实,没有带不好的兵,只有带不好兵的将军。遇到这种情况,管理者应该首先反省一下自己的领导方式,看看自己的问题出在哪里。下面是一个成功管理者领导下属应做的四项工作,看你有没有做到。

      1、让下属了解事情的全局

      安排工作时要讲清目的和全局,而不是只告诉他"你现在该做什么"。有些管理者认为"下属干好当前的工作就行了,没有必要了解事情的全局,因为我才是整体调度者",这种观念是错误的。如果你的下属不了解事情的全局,他只能完全按照你的表面意图不工作,不敢越雷池一步。工作中遇到的任何问题,他都要向你汇报,因为他不知道如何处理是正确的。这样长此以往,你的下属会成为你的"跟屁虫",工作能力不会有任何长进。

      让下属了解事情的全局,并且了解其他员工是如何配合的,这非常有利于工作效率的提高。了解了全局,下属就会明白这些事情的做事原则,在一些细节上就会灵活处理。久而久之,下属就会认真地去思考自己的工作,并且会将自己的一些建议和想法告诉你,你不但多了一个好参谋,他的工作劲头也会很足。

      2、命令明确

      在给下属布置工作时,还要把你的工作命令讲的明确,比如"这件工作要求什么时候完成","完成的标准是什么"等等,都要讲清楚。

      命令明确为分清职责提供了条件,当工作中出现了问题时,很容易分清是管理者的责任,还是下属的责任。这样可以防止相互推委,减少工作中的管理矛盾。另外,它为客观评价下属的工作提供了前提条件。

      3、赞扬下属

      每个人都希望得到别人的重视,每个人都希望得到别人的赞扬。
    赞扬是最廉价、最神奇的激励方式。有些管理者认为:我已经为我下属的劳动付出了工资,没有必要去做这些事情。如果你这样对待下属,你的下属也会这样对待你:公司为我支付了工资,我为公司付出了劳动,所以我没有必要关心公司的前途。如果管理者和员工形成这样的局面,就很难有愉快合作的工作气氛了。

      4、诚实和值得尊敬

      要想使下属心悦诚服地听从你的命令,你必须诚实并且值得下属尊敬。你的诚实首先表现在你要勇于承认自己的错误,承认错误不但不会降低你在下属心目中的威信,反而会增强下属对你的信赖。另外,对待下属应该实事求是,如果下属发现他受到了欺骗,则很难在恢复到原有的信任。

      你的言行必须为下属提供表率,"言必行,行必果"必须是你的做事宗旨。你要求下属做到的事情,必须自己首先做到,否则就不要有这方面的要求。受人尊敬不是一件容易做到的事情,它需要你坚持不懈地提高你的修养。
  • 如何监控Tomcat服务器

    2007-09-13 18:18:48

     

    在进行性能测试时,一般都需要对应用服务器进行监控,监控的指标包括应用服务器的JVM使用状况、可用连接数、队列长度等信息。商业的应用服务器如WebLogic、WebSphere等都提供了Console对这些指标进行监控,在性能测试时可以很容易观察这些指标的情况。

    Tomcat作为在国内得到广泛应用的J2EE服务器,在不少项目中都得到了使用。Tomcat小巧灵活、配置简单,非常适合小的WEB应用使用。但在对使用Tomcat的应用系统进行性能测试时,最头疼的问题就是不能获得应用服务器的相关性能指标数据。

    其实,从Tomcat 5.0开始,Tomcat就已经为自己提供了一个用于监控应用服务器性能指标的servelet —— status servelet。安装完Tomcat 5之后,通过访问 http://yourhost:port/manager/status 就可以获得当时的应用服务器监控数据。

    当然,为了安全起见,Tomcat 5在缺省安装时是不允许用户直接访问 http://yourhost:port/manager/status 的,访问的时候会给出一个403(forbidden)的错误信息。在Tomcat的Manual里说明了允许用户访问的方法:
    1. 转到Tomcat的安装目录下;
    2. 修改conf/tomcat-users.xml文件,在其中加入一行
         <user username="servermon" password="passwd" roles="manager"/>

    这样就可以在访问 http://yourhost:port/manager/status 时给出 servermon 的用户名与口令,查看到应用服务器的相关性能指标数据。

  • 对LR回放中highest severity level was"ERROR"的解决方法

    2007-09-13 18:09:26

    在LR中录制脚本时有如下问题:
    在录制时一切正常,而回放时提示类似如下错误:
    Action.c(41): Error -27979: Requested form not found    [MsgId: MERR-27979]
    Action.c(41): web_submit_form highest severity level was "ERROR",  0 body bytes, 0 header bytes  [MsgId: MMSG-27178]"
     这时在tree view中看不到此组件的相关URL。

     处理方法如下: 1, 打开recording options,在internet protocol下的recording中选择recording level为HTML-based scrīpt,点击HTML Advanced,选择scrīpt type为A scrīpt containing explicit.即可。 2, 选择使用URL_based scrīpt录制。

     另外,附上帮助中的这个错误代码的说明:

    Message Code 27979

    Requested form not found

    The form was not found in the page received from the server. Possible reasons: (i) The current or a previous HTML page was changed after the scrīpt was recorded. (ii) A previous request navigated to a wrong page or failed. (iii) One or more web_submit_form arguments are missing or incorrect (especially for manually coded, parameterized, or correlated functions). (iv) The server returned an unexpected page (e.g., under excessive load).

    Troubleshooting If the current or previous HTML page was changed, look for the correct properties of the form used in the text (e.g., action), and change it in the scrīpt. If your snapshots and extended log are disabled, enable them and run the scrīpt again.
    (i) To enable Snapshots: Select Tools > General Options > Correlation, and check the Save correlation information during replay box.
    (ii) To enable Extended Log: Select Run-time Settings > General: Log, and check Enable logging, Always send messages, Extended log, Data returned by server, Advanced trace. Compare the record and replay snapshots for each step in the scrīpt from the beginning, and locate the first difference. If you identify a difference in the snapshots, locate the corresponding HTTP request in both the recording log and the extended log. Compare the requests and, if they are different, have the replay issue exactly the same request. This can be done, for example, by adding web_add_header (for adding missing headers or adjusting existing ones), web_remove_auto_header (for removing extra headers), and web_add_cookie (for missing cookies). If some correlation is missing, (e.g., the recording and replay runs have different session IDs), use the correlation tool to locate and handle such cases.
  • LoadRunner本机录制http协议程序遇到的问题以及解决方法

    2007-09-13 18:07:10

    在本机录制asp.net程序petshop的时候刚开始使用了传统的http://localhost/mspetshop和http://127.0.0.1/mspetshop录制不行,于是想到了朴老上课讲的修改hosts文件的方法,一尝试果然可行。暗爽之余不敢独享。

    方法:(以下以win2000为例)

    用记事本打开host文件

    c:\winnt\system32\drivers\etc\hosts

    然后末尾添加一行

    127.0.0.1        http://www.mushroom.com/

    然后就能用http://www.mushroom.com/mspetshop录制了

  • loadruner报错:Step download timeout(120 seconds)的解决方法

    2007-09-13 18:04:35

    loadruner报错:Error -27728: Step download timeout (120 seconds) 如何解决
    语法检查通过,但是在并发执行一个查询时候报错Action.c(16): Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s),请问有啥子解决方法,我使用web_set_timeout ,好象不起作用,直接在option中设置timeout时间为600,(单位应该是秒吧)还是没有起作用,结果都还是提示(120seconds),说明还是以120秒来判断的;使用lrs_set_recv_timeout,语法检查不过,说明库函数里面没有这个函数。

    尝试步骤:
    设置超时时间到600秒,回放还是出错。

    后来我设置了runt time setting中的internet protocol-preferences中的advaced区域有一个winlnet replay instead of sockets选项,选项后再回放就成功了。

    kernzhang解释如下(这里谢谢kernzhang):

    这个问题很有意思!呵呵!首先LR是通过Microsoft WinInet DLL去录制web协议的!但是在Control运行的时候它默认通过socket去模拟请求,因为这些可以真实的模拟带宽,而采用Microsoft WinInet DLL通过这个DLL去访问网卡方式去模拟带宽,使得模拟不是很精确!而且也不支持unix的应用,但是使用这个确实有时无法处理winnet Dll的一些请求,我认为是它的一些BUG,比如说:回放时它会检查Content-Length,但是网页支持receive more data时,这时socket模拟会一直等待直到timeout!

    先说了一些优缺点,最后回到这个问题!这个问题分两个方面分析:
    第一:你要明白web_set_timeout()这个函数的适用范围!比如说一个web_submit_data()中实际涵盖了10个对Server 端的请求,这个函数是针对10个请求的总和时间的!(别犯低级错误,timeout分了connect,receive以及download三个部分:) )
    第二:就是我解释的上面的一些BUG问题!
    WinInet dll在新版本中处理请求时可以异步的,就是不再是那种连接等待然后超时模式!但是LR用的socket是同步请求!只有等到timeout才会退出!microsoft已经明确表示INTERNET_OPTION_RECEIVE_TIMEOUT 不再适用于 Microsoft Internet Explorer 5.0,显而易见,他们处理请求采取了异步处理的方式!呵呵!这下大概可以圆满解释你的问题了!呵呵

    这里,我补充如下:
    VuGen专用的基于套接字的重播是一种可伸缩以便进行负载测试的轻型引擎。使用线程时是准确的。基于套接字的引擎不支持socks代理服务器。如果在这样的环境中录制,应该使用winInet重播引擎。

  • 如何用LR监视服务器LINUX的方法

    2007-09-13 18:02:31

    一、在服务器上安装rstatd守护进程
    安装步骤:
    1. 从网上下载rstatd
    2. 将该文件放到/home/user目录下
    3. chmod 777 rpc.rstatd----改变该文件读写的权限,拥有所有权限。
    4. chmod 777 configure ---同上
    5. ./configure ---配置
    6. make ---编译
    7. make install ---安装
    8. rpc.rstatd ---启动rstatd进程

    二、在lr中配置
    从LR里面add measurement, 填写linux机器的IP,出现所有unix/linux的计数器,包括cpu的,mem的,disk,network的。介绍几个常用的:
    average load :在过去的1分钟,的平均负载
    cpu utilization: cpu的使用率
    disk traffic: disk传输率
    paging rate: 每秒从磁盘读到物理内存,或者从物理内存写到页面文件的内存页数
    Swap-in rate: 每秒交换到内存的进程数
    Swap-out rate: 每秒从内存交换出来的进程


    补充一些常见的问题及处理方法:
    1、在执行配置或安装命令过程中出现“拒绝的权限”的提示;
    答:是由于文件的权限引起的,应该给当前用户所有文件的“777”权限,即完全控制权限。

    2、安装好后从LoadRunner中看不到信息,但是没有报错;
    答:可能是返回的信息值比较小,所以在图中几乎看不到,例如:如果没有运行程序的话,CPU的使用率接近于0,所以在监视图中看不到变化。也有可能是采样的频率过大,可以在图表中设置没1秒获取一次信息,这样界面就刷新的比较及时了。

    3、监视一段时间后LoadRunner中提示有错误发生不能继续监视到信息;
    答:可能是由于CPU长时间处于高负荷状态,而导致系统自动关闭了该服务。可以在LoadRunner中重新加一次计数器,并且设置取样的时间稍长一点,就会避免这种情况。

    4、以前用LoadRunner监视都是成功的,但是再次监视不到信息;
    答:有可能是由于系统重新启动,而没有打开rstatd守护进程。可以手工重新打开一次,使用命令“rpc.rstatd”,另外可以使用“rpcinfo -p”命令来查看当前系统是否已经启动了rstatd守护进程。

  • 学会使用Linux性能分析工具

    2007-09-13 18:00:23

    Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。
      在Linux下有很多系统性能分析工具,比较常见的有top、free、ps、time、timex、uptime等。下文将介绍几个较为重要的性能分析工具vmstat、iostat和sar及其使用。

      用vmstat监视内存使用情况

      vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

      vmstat的语法如下:

      vmstat [-V] [-n] [delay [count]]

      其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看。

      用iostat监视I/O子系统情况

      iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

      iostat的语法如下:

    iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]

      其中,-c为汇报CPU的使用情况;-d为汇报磁盘的使用情况;-k表示每秒按kilobytes字节显示数据;-t为打印汇报的时间;-v表示打印出版本信息和用法;-x device指定要统计的设备名称,默认为所有的设备;interval指每次统计间隔的时间;count指按照这个时间间隔统计的次数。

      iostat一般的输出格式如下:

    Linux 2.4.18-18smp (builder.linux.com) 2003年03月07日 avg-cpu: %user %nice %sys %idle 4.81 0.01 1.03 94.15 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn dev3-0 30.31 1117.68 846.52 16104536 12197374 dev3-1 7.06 229.61 40.40 3308486 582080

      对于输出中各字段的含义,iostat的帮助中有详细的说明。

      使用sar进行综合分析

      表1 sar参数说明

      选项 功能

      -A 汇总所有的报告

      -a 报告文件读写使用情况

      -B 报告附加的缓存的使用情况

      -b 报告缓存的使用情况

      -c 报告系统调用的使用情况

      -d 报告磁盘的使用情况

      -g 报告串口的使用情况

      -h 报告关于buffer使用的统计数据

      -m 报告IPC消息队列和信号量的使用情况

      -n 报告命名cache的使用情况

      -p 报告调页活动的使用情况

      -q 报告运行队列和交换队列的平均长度

      -R 报告进程的活动情况

      -r 报告没有使用的内存页面和硬盘块

      -u 报告CPU的利用率

      -v 报告进程、i节点、文件和锁表状态

      -w 报告系统交换活动状况

      -y 报告TTY设备活动状况



      sar是System Activity Reporter(系统活动情况报告)的缩写。顾名思义,sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。

      sar的语法如下:

    sar [-option] [-o file] t [n]

      它的含义是每隔t秒取样一次,共取样n次。其中-o file表示取样结果将以二进制形式存入文件file中。

      另一种语法如下:

    sar [-option] [-s time] [-e time] [-i sec] [-f file]

      含义是表示从file文件中取出数据,如果没有指定-f file,则从标准数据文件/var/adm/sa/sadd取数据,其中dd表示当前天。另外,-s time表示起始时间;-e time表示停止时间;-i sec表示取样的时间间隔,如果不指定则表示取文件中所有的数据。对于具体的选项参见表1。

      一般它与-q和-u联合使用,以便对每个CPU的使用情况进行分析,比如运行如下命令:

    sar -q -u 5 1

      将输出如下:

    Linux 2.4.18-18smp (builder.linux.com) 2003年03月07日 09时46分16? CPU %user %nice %system %idle 09时46分21? all 0.20 0.00 0.00 99.80 09时46分16? runq-sz plist-sz ldavg-1 ldavg-5 09时46分21? 0 91 0.00 0.00 Average: CPU %user %nice %system %idle Average: all 0.20 0.00 0.00 99.80 Average: runq-sz plist-sz ldavg-1 ldavg-5 Average: 0 91 0.00 0.00

      由于sar命令太复杂,只有通过熟练使用才能了解每个选项的含义,对于sar输出中每个字段的含义运行man sar命令可以得到详细的解释。

  • Loadrunner中web_reg_save_param的使用详解(转载)

    2007-03-05 16:31:27

    【摘要】利用实际案例说明如何使用Mercury LoadRunner提取包含在 HTML 页内的动态信息并创建参数。

    【关键词】性能测试,压力测试,Mercury LoadRunner

    • 应用范围

    在使用Loadrunner进行性能测试时,经常遇到一种情况,需要通过web页面修改某事务的状态。于是需要首先读出当前的事务的状态,再进行修改,此时便可以使用到web_reg_save_param了。可以通过它先将事务的状态读出写入一个自定义的变量中,根据变量的值来决定下一步的动作。

    • 简要说明

    语法:

    int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);

    参数说明:

    • ParamName: 存放得到的动态内容的参数名称
    • list of Attributes: 其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写
      • Notfound: 当在返回信息中找不到要找的内容时应该怎么处理
      • Notfound=error: 当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。
      • Notfound=warning: 当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。
      • LB( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。
      • RB( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。
      • RelFrameID: 相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。
      • Search : 返回信息的查找范围。可以是HeadersBodyNoresourceAll(缺省)。该属性质可有可无。
      • ORD : 说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。
      • SaveOffset : 当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0
      • SaveLen :当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。
      • Convert : 可取的值有以下两种:

    HTML_TO_URL : HTML-encoded 资料转成 URL-encoded 资料格式

    HTML_TO_TEXT : HTML-encoded 资料转成纯文字资料格式

    • 实例讲解

    目的:取得页面中的商品状态,如果状态是正常态就改为注销态,否则改为正常态。

    录制脚本使用的是URL based scrīpt

    将返回的数据记录到日志

    • 直接手工访问页面,检查URL

    该页面上点击右键,选择属性

    看到URL,对照录制下的脚本中有:
    web_url("modifyOfferingStatePage.do",
    "URL={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
    282172&offeringSpecId=1&offeringSpecName=
    普通宽带(ADSL/LAN&customerName=
    {clientname}&nodeId=260000&pos1=
    定购管理&pos2=修改商品状态",

    "Resource=0",
    "RecContentType=text/html",
    "Referer={url}/web/businessAccept/order/orderMenu.do",
    "Snapshot=t23.inf",
    "Mode=HTTP",
    LAST);
    于是在这段代码前添加注册函数:
    web_reg_save_param("oldstate",
    "LB/IC=
    原有商品状态:</td>",
    "RB/IC=</td>",
    "Search=body",
    "Ord=1",
    "RelFrameId=1",
    "SaveOffset=57",
    "SaveLen=4",
    LAST);
    web_url("modifyOfferingStatePage.do",
    "URL={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
    282172&offeringSpecId=1&offeringSpecName=
    普通宽带(ADSL/LAN&customerName={clientname}&nodeId=
    260000&pos1=
    定购管理&pos2=修改商品状态",

    "Resource=0",
    "RecContentType=text/html",
    "Referer={url}/web/businessAccept/order/orderMenu.do",
    "Snapshot=t23.inf",
    "Mode=HTTP",
    LAST);
    ...............
    //
    将得到的内容存入日志用于检查
    lr_log_message("getvalue : %s",lr_eval_string ("{oldstate}"));

    if ( lr_eval_string ("{oldstate}") == "正常"){
    web_submit_data("modifyOfferingState.do",
    "Action={url}/web/businessAccept/order/modifyOfferingState.do",
    "Method=POST",
    "RecContentType=text/html",
    "Referer={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
    282172&offeringSpecId=1&offeringSpecName=
    普通宽带(ADSL/LAN&customerName=
    {clientname}&nodeId=260000&pos1=
    定购管理&pos2=修改商品状态",

    "Snapshot=t24.inf",
    "Mode=HTTP",
    ITEMDATA,
    "Name=offering.state", "Value=1", ENDITEM,
    "Name=offering.recentModifyReason", "Value=
    修改原因", ENDITEM,
    "Name=offering.customerId", "Value=281218", ENDITEM,
    "Name=offering.offeringId", "Value=282172", ENDITEM,
    "Name=offering.offeringSpecId", "Value=1", ENDITEM,
    "Name=offering.recentMender", "Value=root", ENDITEM,
    "Name=offering.recentModifyDatetime", "Value=2005-01-16", ENDITEM,
    "Name=nodeId", "Value=260000", ENDITEM,
    "Name=customerName", "Value={clientname}", ENDITEM,
    "Name=offeringSpecName", "Value=
    普通宽带(ADSL/LAN", ENDITEM,
    "Name=submit.x", "Value=33", ENDITEM,
    "Name=submit.y", "Value=13", ENDITEM,
    LAST);
    }
    Else
    {
    web_submit_data("modifyOfferingState.do",
    "Action={url}/web/businessAccept/order/modifyOfferingState.do",
    "Method=POST",
    "RecContentType=text/html",
    "Referer={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
    282172&offeringSpecId=1&offeringSpecName=
    普通宽带(ADSL/LAN&customerName=
    {clientname}&nodeId=260000&pos1=
    定购管理&pos2=修改商品状态",

    "Snapshot=t24.inf",
    "Mode=HTTP",
    ITEMDATA,
    "Name=offering.state", "Value=0", ENDITEM,
    "Name=offering.recentModifyReason", "Value=
    修改原因", ENDITEM,
    "Name=offering.customerId", "Value=281218", ENDITEM,
    "Name=offering.offeringId", "Value=282172", ENDITEM,
    "Name=offering.offeringSpecId", "Value=1", ENDITEM,
    "Name=offering.recentMender", "Value=root", ENDITEM,
    "Name=offering.recentModifyDatetime", "Value=2005-01-16", ENDITEM,
    "Name=nodeId", "Value=260000", ENDITEM,
    "Name=customerName", "Value={clientname}", ENDITEM,
    "Name=offeringSpecName", "Value=
    普通宽带(ADSL/LAN", ENDITEM,
    "Name=submit.x", "Value=33", ENDITEM,
    "Name=submit.y", "Value=13", ENDITEM,
    LAST);
    }
    从日志中截取的真实的返回内容为:
    vuser_init.c(689): <tr bgcolor="#F6F6F6">\r\n
    vuser_init.c(689): <td width="30%" height="23" align="right">\r\n
    vuser_init.c(689):
    原有商品状态:</td>\r\n
    vuser_init.c(689): <td width="70%" height="23">
    正常 </td>\r\n
    vuser_init.c(689): </tr>\r\n
    vuser_init.c(689): <tr bgcolor="#F4FBFE">\r\n
    vuser_init.c(689): <td width="30%" height="23" align="right">\r\n
    vuser_init.c(689):
    修改后的状态:</td>\r\n
    vuser_init.c(689): <td width="70%" height="23">\r\n
    vuser_init.c(689): \r\n
    vuser_init.c(689): \r\n
    vuser_init.c(689): \r\n
    vuser_init.c(689): <input type="radio" name='offering.state' value='4' checked>
    可以看到左边界是:原有商品状态:</td>
    右边界是:</td>,偏移量为:57(包括了空格),
    长度为:4(因为一个汉字长度为2),最后存入变量的值是:正常

    4.经验总结
    1)
    为了便于脚本的调试,将返回的数据都写入日志是个好办法;
    2)
    为了验证取得的数据是否是自己期望的,可以将取得的数据写入日志中进行验证,
    例:lr_log_message("getvalue : %s",lr_eval_string ("{oldstate}"));
    3)
    因为它是一个注册函数,必须在返回信息前使用,所以注册的位置必须正确,否则很可能得到类似如下错误:
    4)vuser_init.c(734): Error -27190: No match found for the requested parameter "oldstate".
    Check whether the requested boundaries exist in the response data. Also,
    if the data you want to save exceeds 1024 bytes,
    use web_set_max_html_param_len to increase the parameter size [MsgId: MERR-27190]
    5)vuser_init.c(734): Error -27187: The above "not found"
    error(s) may be explained by header and body byte counts being 0 and 0,
    respectively. [MsgId: MERR-27187]
    6)vuser_init.c(734):
    web_concurrent_end highest severity level was "ERROR" [MsgId: MMSG-27181]
    7)
    所以使用手工方法,右键页面确定在代码中哪个位置之前注册函数至关重要
    8)
    如果脚本中中文为乱码,可能是因为源文件的字符集和操作系统字符集不匹配。

  • 很高兴我的博客终于开通了!

    2007-03-05 16:18:01

    很高兴我的博客终于开通了! 希望大家常来踩踩哦!

数据统计

  • 访问量: 11706
  • 日志数: 10
  • 建立时间: 2007-03-01
  • 更新时间: 2007-09-14

RSS订阅

Open Toolbar