淘宝商城(天猫)高级技术专家.3年研发+3年性能测试调优/系统测试+4年团队管理与测试架构、研发系统实践. 新舞台新气象, 深化测试基础架构及研发架构,希望能在某个技术领域成为真正的技术大牛。欢迎荐才http://bbs.51testing.com/viewthread.php?tid=120496&extra=&page=1 .邮件: jianzhao.liangjz@alibaba-inc.com,MSN:liangjianzhao@163.com.微博:http://t.sina.com.cn/1674816524

发布新日志

  • P-unit0.15 应用

    2009-01-02 13:22:43

     

     

    参考:http://zhanghuangzhu.blogspot.com/search/label/p-unit

    http://blog.csdn.net/zhanghuangzhu/

     

    https://sourceforge.net/projects/p-unit 下载.

    Samples 文件编译 runner.runVMs 失败,不再支持runVMs.

    加入libsjar以及p-unit-0.15.319.jar, p-unit-0.15.319-extension.jar

    从执行结果看,p-unitjunitperf 是不同的。P-unit 有内存消耗图片。

    Junitperf并发执行控制粒度控制更加细致。

     

    ParamTestClass.java内容:

     

    package samples;

    import org.punit.reporter.chart.OverviewReporter;

    import org.punit.reporter.chart.image.ImageRender;

    import org.punit.reporter.chart.pdf.PDFRender;

    import org.punit.reporter.stream.file.FileLogger;

    import org.punit.runner.*;

    import org.punit.type.*;

    import org.punit.watcher.MemoryWatcher;

     

    public class ParamTestClass implements Parameterized {

     

        public static void main(String[] args) {

           ConcurrentRunner runner = new ConcurrentRunner();

           //加入内存消耗监控

           runner.methodRunner().addWatcher(new MemoryWatcher());

     

           runner.addEventListener(new FileLogger());

           runner.addEventListener(new OverviewReporter(new ImageRender()));

           runner.addEventListener(new OverviewReporter(new PDFRender()));

           //利用多核特性

           runner.setExecutorPool(new ExecutorPoolImpl(2));

     

           runner.run(ParamTestClass.class);

        }

     

        public Parameter[] parameters() {

           return new Parameter[] { new ParameterImpl(2), new ParameterImpl(10),

                  new ParameterImpl(30) };

        }

     

        public void testA(ParameterImpl param) {

           System.out.println("testA count = " + param.count()); //$NON-NLS-1$

           SampleUtil.doSomething(param.count());

        }

     

       

        public void setUpAfterWatchers(Parameter param) throws Exception {

     

        }

     

        public void setUpBeforeWatchers(Parameter param) throws Exception {

     

        }

     

        public void tearDownAfterWatchers(Parameter param) throws Exception {

     

        }

     

        public void tearDownBeforeWatchers(Parameter param) throws Exception {

     

        }

     

        static class ParameterImpl implements Parameter {

           private int _count;

     

           ParameterImpl(int count) {

               _count = count;

           }

     

           public int count() {

               return _count;

           }

     

           public String toString() {

               return String.valueOf(_count);

           }

        }

    }

     

     

    SampleUtil.java内容

    package samples;

     

    import java.util.*;

     

    import org.punit.util.*;

     

    public class SampleUtil {

                 

           private static Random _random = new Random();

          

           public static void consumeMemory(int length) {

                  byte[] data = new byte[length];

                  for(int i = 0, j = 0; i < data.length; ++i) {

                         ++j;

                  }

           }

          

           public static void consumeTime(int time) {

                  ThreadUtil.sleepIgnoreInterruption(time);

           }

          

           public static void doSomething() {

                  consumeTime(Math.abs(_random.nextInt()) % 500);

                  consumeMemory(Math.abs(_random.nextInt()) % 100000);

           }

           public static void doSomething(int count) {

                  for(int i=0;i<count;i++)

                  {

                  consumeTime(Math.abs(_random.nextInt()) % 500);

                  consumeMemory(Math.abs(_random.nextInt()) % 100000);

                  }

           }

          

    }

     

    控制台执行时间,与内存消耗值。

    testA(30) - [9741.979497ms,504864.0bytes]

    total: 3, failures:0 (GREEN) - 16922.606365ms

     

    执行目录下result 下生成pdf,txt,png格式的文件结果

     

  • Apache MINA2异步连接框架编译,运行

    2008-12-27 19:10:00

    http://mina.apache.org/mina-v20-quick-start-guide.html

    样例代码有错误。IoAcceptor IdleStatus 路径有问题

     

    import java.io.IOException;

    import java.net.InetSocketAddress;

    import java.nio.charset.Charset;

     

    import org.apache.mina.core.service.IoAcceptor;

    import org.apache.mina.core.session.IdleStatus;

     

    import org.apache.mina.filter.codec.ProtocolCodecFilter;

    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

    import org.apache.mina.filter.logging.LoggingFilter;

    import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

     

    public class MinaTimeServer {

        private static final int PORT = 9123;

     

        public static void main(String[] args) throws IOException {

           IoAcceptor acceptor = new NioSocketAcceptor();

     

           acceptor.getFilterChain().addLast("logger", new LoggingFilter());

           acceptor.getFilterChain().addLast(

                  "codec",

                  new ProtocolCodecFilter(new TextLineCodecFactory(Charset

                         .forName("UTF-8"))));

     

           acceptor.setHandler(new TimeServerHandler());

           acceptor.getSessionConfig().setReadBufferSize(2048);

           acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

           acceptor.bind(new InetSocketAddress(PORT));

        }

    }

     

     

     

    D:\eclipse-SDK-3.3.2-win32\project\mina-2.0.0-M4\src\mina-example>javac   -cp %cla

    sspath%;D:\eclipse-SDK-3.3.2-win32\project\mina-2.0.0-M4\dist\mina-core-2.0.0-M4

    .jar  MinaTimeServer.java

     

    运行时候,也费了很大周折,必须把log 实现类也加载。看来文档未经测试:)

    编译的时候需要把log4j.jar 以及slf4j 2个包放好。

     

    D:\eclipse-SDK-3.3.2-win32\project\mina-2.0.0-M4\src\mina-example>java  -cp %cla

    sspath%;D:\eclipse-SDK-3.3.2-win32\project\mina-2.0.0-M4\dist\mina-core-2.0.0-M4

    .jar;D:\eclipse-SDK-3.3.2-win32\project\mina-2.0.0-M4\lib\slf4j-api-1.5.6.jar;D:

    \eclipse-SDK-3.3.2-win32\project\mina-2.0.0-M4\lib\slf4j-log4j12-1.5.6.jar;D:\ec

    lipse-SDK-3.3.2-win32\project\mina-2.0.0-M4\lib\log4j.jar    MinaTimeServer

  • 阿里巴巴集团部分技术BLOG

    2008-12-07 17:28:49

      阿里人才济济,越来越多的技术专家在infoq上露面,也有很多的BLOG 生根发芽:)

    数据库与数据仓库

    http://rdc.taobao.com/blog/dw/

    http://rdc.taobao.com/blog/dba/

     http://www.dbanotes.net

    http://blue-prince.spaces.live.com/

    http://WWW.ALIDBA.NET/

    http://www.orawh.com/

    (biti_rainy)  http://space.itpub.net/3505/

     http://www.hellodba.net/

    http://www.jianzhaoyang.com/

     

    http://xujt82.spaces.live.com/

    http://www.ningoo.net/

    http://hutuworm.blogspot.com/

    前端研发

    http://ued.taobao.com/blog/

    http://www.aliued.cn/

    http://ued.alipay.com/

    http://www.alisoftued.com/

    http://ued.koubei.com/

    JAVA研发

    http://rdc.taobao.com/blog/arch/

    http://www.blogjava.net/BlueDavy/archive/2008/11.html


     http://blog.csdn.net/yzhz/category/24108.aspx

    http://blog.csdn.net/cenwenchu79

                  http://www.blogjava.net/cenwenchu/

    http://davyyew.blogbus.com

     http://www.esbzone.net/

     http://amoeba.meidusa.com/wordpress/?p=14

    http://www.alinotes.cn/

    http://www.blogkid.cn/

    安全

    http://blog.csdn.net/kj021320

    http://blog.ph4nt0m.org/

    Linux C

    QA

     http://fafeng.blogbus.com/

    http://rdc.taobao.com/blog/qa/

    http://nmtcolin.itpub.net/category/5135/31300

  • 开源的质量控制工具 Sonar

    2008-11-23 17:14:55

    http://sonar.codehaus.org/documentation/

    http://www.javaread.com/article/show/195

     

    安装指南:http://docs.codehaus.org/display/SONAR/Installation+guide

    http://docs.codehaus.org/display/SONAR/Frequently+Asked+Questions

     

    下载

    http://sonar.codehaus.org/downloads/

     

    sonar 整合代码覆盖率/规则检查等数据WEB图形化展现。

    预先条件

    window xp 上环境变量PATH已经加入D:\apache-maven-2.0.9\bin

    D:\apache-maven-2.0.9\my-webapp>java -version

    java version "1.5.0_14"

    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03)

    Java HotSpot(TM) Client VM (build 1.5.0_14-b03, mixed mode)

    D:\apache-maven-2.0.9\my-webapp>mvn -v

    Maven version: 2.0.9

    Java version: 1.5.0_14

    OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"

     

    安装

    安装在,D:\sonar-1.4.3\conf

    InstallNTService.bat 安装服务

    StartNTService.bat启动服务

    IEhttp://127.0.0.1:9000/ 初步测试。

     

    缺省用户名密码:admin/admin

    WEB 页面上创建DB 创建后可以看到D:\sonar-1.4.3\conf\ sonar.properties

    sonar.jdbc.url:                            jdbc:derby://localhost:1527/sonar;create=true

    sonar.jdbc.driverClassName:                org.apache.derby.jdbc.ClientDriver

     

    IE展现图如下:

     

     

    配置与maven2的关联

    $MAVEN_HOME/conf (如D:\apache-maven-2.0.9\conf)或者 ~/.m2 下的settings.xml 文件加入下面内容

     

    <profile>

                <id>sonar</id>

                <activation>

                    <activeByDefault>true</activeByDefault>

                </activation>

                <properties>

                                    

                     <sonar.jdbc.url>

                      jdbc:derby://localhost:1527/sonar

                    </sonar.jdbc.url>

                    <sonar.jdbc.driver>org.apache.derby.jdbc.ClientDriver</sonar.jdbc.driver>

                    <sonar.jdbc.username>sonar</sonar.jdbc.username>

                    <sonar.jdbc.password>sonar</sonar.jdbc.password>              

                    <sonar.host.url>http://127.0.0.1:9000/</sonar.host.url>

                   

                </properties>

            </profile>

     

    配置一个maven2 工程pom.xml

     

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

      <modelVersion>4.0.0</modelVersion>

      <groupId>com.mycompany.app</groupId>

      <artifactId>my-webapp</artifactId>

      <packaging>jar</packaging>

      <version>1.0-SNAPSHOT</version>

      <name>my-webapp</name>

      <url>http://maven.apache.org</url>

      <dependencies>

        <dependency>

          <groupId>junit</groupId>

          <artifactId>junit</artifactId>

          <version>3.8.1</version>

          <scope>test</scope>

        </dependency>

      </dependencies>

    </project>

     

     

    编译发布

     

     

    D:\apache-maven-2.0.9\my-webapp>mvn org.codehaus.sonar:sonar-maven-plugin:1.4.3:sonar -Dsonar.skipInstall=true

     

     

    重新刷新IE数据,漂亮的数据图表展现在面前。

  • JAVA持续集成解决方案

    2008-11-21 00:10:08

     敏捷方法倡导java持续集成,并输送很多有用的工具。当前比较流行的持续集成服务工具有


    1) apache continuum
    2) CruiseControl
     
       配套做持续集成的工具包有
       1) JUnit 单元测试
       2) JUnitPerft或者eclipse tptp 做单元性能测试
       3) 数据库DDL初始化语句
       4) EasyMock 等模拟工具
       5) PMD,checkStyle,FindBug分析工具
       6)httpUnit HTTP接口测试
       7) purify/Jprofile 动态分析
       8) EMMA/Clover度量代码覆盖率
       9) JAVANCSS度量代码复杂度
       10) JDepend 度量耦合度
       10) 构建工具ant,
       11) 部署脚本
       12)分布式分发框架staf/stax
      
       如上工具通过与持续集成工具粘合,将产生强大威力。
      
       当前阿里巴巴平台架构师采用continuum+maven+mylyn+trac,淘宝采用cruisecontrol做接口测试。
      

  • 改写jQuery实现固定表头,滚动内容

    2008-10-26 00:57:04

    参考 http://blog.csdn.net/hu_zhenghui/archive/2007/12/02/1911733.aspx

     

     

    原来事件处理采用:

     

    <scrīpt src="scrīpts/jQuery.js"></scrīpt>

      <scrīpt>

          $(document).ready(function () {

           

              $("#tableContainer").scroll(function () {

                 // $("#divx").get(0).scrollLeft = this.scrollLeft;

                  $("#divy").get(0).scrollTop = this.scrollTop;

              });

             

             

          });

      </scrīpt>

     

    例子采用3个表,存在列宽/行高同步的问题。

     

    偶改写了事件,特别注意标红色的style 要素overflow

     

     

           <div id="tableContainer" style="width:1000px; height:600px; overflow:scroll">

    <table border="1" cellpadding="0" cellspacing="0" width="100%" class="scrollTable"  id="scrollTable" >

    <thead>

           <tr>

           <th>

                         <div> 标题</div>

    </th>

    <tr>

    </thead>

    <tbody id="tbSCMProject" class="tbSCMProject">

    </tbody> 

     

     

    <td valign="top"  >

                                       <div id="divy" style="width:300px; height:600px; overflow:hidden">  

    <table id="table_y" border="3">

                                                       

                        <tr><div style="height:51.5px">内容       </div>

                                </tr>

                                                                                                                                         </table>          

     

    </div>

     

     

    <scrīpt   language="javascrīpt">  

     

     var divScrollHander= function()

    {

                                       var thisContainer = document.getElementById('tableContainer');

                                       var ōbjdivy =    document.getElementById('divy');

                                       if (!thisContainer || !objdivy)

                                       {

                                                           

                                                      return;

                                       }    

                                      

                                       objdivy.scrollTop=thisContainer.scrollTop;

        }

       

       

      tableContainer.attachEvent('onscroll',divScrollHander);

       

    </scrīpt>

     

    </body>

     

     

    由于采用2个表,如何让2个表的行高度一致,不至于适配?下面的图看到,需要2个表的同一行移动需要同步。

     

     

     

  • Spring+ quartz 在jboss内实现定时任务

    2008-10-19 14:28:49

    参考

     

    http://www.cnblogs.com/phinecos/archive/2008/09/03/1282747.html

    http://www.blogjava.net/hwpok/archive/2008/08/19/223124.html

    http://www.cnblogs.com/phinecos/archive/2008/09/03/1283376.html

     

     

    com\ali\schedule\ quartz.xml内容

     

    <?xml version="1.0" encoding="UTF-8" ?>

    <beans xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

        <bean name="dataImportjobDetail"

            class="org.springframework.scheduling.quartz.JobDetailBean">

            <property name="jobClass"

                value="com.ali.schedule.DailyDataImportJob" />

            <property name="jobDataAsMap">

                <map>

                    <entry key="dataImportService" value-ref="dataImportService" />

                </map>

            </property>

            <property name="applicationContextJobDataKey"

                value="applicationContext" />

        </bean>

     

        <bean id="dataImportService" class="com.ali.schedule.ProjDataImportService" />

       

      

        <bean id="dataImportTrigger"

            class="org.springframework.scheduling.quartz.CronTriggerBean">

            <property name="jobDetail" ref="dataImportjobDetail" />

            <property name="cronExpression" value="*/5  * * * * ?" />

        </bean>

       

        <bean id="scheduler"

            class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

            <property name="triggers">

                <list>

                    <ref bean="dataImportTrigger" />

                </list>

            </property>

            <property name="schedulerContextAsMap">

                <map>

                    <entry key="timeout" value="30" />

                </map>

            </property>

            <property name="quartzProperties">

                <props>

                    <prop key="org.quartz.threadPool.class">

                        org.quartz.simpl.SimpleThreadPool

                    </prop>

                    <prop key="org.quartz.threadPool.threadCount">10</prop>

                </props>

            </property>

        </bean>

    </beans>

     

     

    值得注意的是:

    <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  -->
        
    <bean id="scheduler"   lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            
    <property name="triggers">
                
    <list>
                  
    </list>
            
    </property>
        
    </bean>
    </beans>

     

    调度程序:

     

    package com.ali.schedule;

    import org.quartz.JobExecutionContext;

    import org.quartz.JobExecutionException;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import org.springframework.scheduling.quartz.QuartzJobBean;

    public class DailyDataImportJob extends QuartzJobBean {

        public DailyDataImportJob()

        {

          

        }

        protected void executeInternal(JobExecutionContext jobcontext) throws JobExecutionException

        {

           service.importData();

        }

        private ProjDataImportService service;

        public void setDataImportService(ProjDataImportService service)

        {

           this.service=service;

        }

        public static void main(String[] args){

           //这里用于测试

           String configPath = "com/ali/schedule/quartz.xml";

           ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);

           ctx.getBean("scheduler");

        }

     

    }

     

     

    真正执行任务程序:

    package com.ali.schedule;

     

    import org.springframework.context.ApplicationContext;

     

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import org.springframework.context.support.FileSystemXmlApplicationContext;

     

    import com.ali.IIbatisDAOImpl;

     

    public class ProjDataImportService {

        public void importData() {

     

    //当前路径下

          

           String[] locations = {"com/ali/db/database.xml"};

     

       

        ApplicationContext context = //new FileSystemXmlApplicationContext(locations);

           new  ClassPathXmlApplicationContext(locations);

     

          

               IIbatisDAOImpl DAO = (IIbatisDAOImpl) context.getBean("IIbatisDAOImpl");

     

           DAO.importHisProjData();

     

        }

     

        public static void main(String[] args) {

     

            ProjDataImportService service = new ProjDataImportService();

           service.importData();

        }

     

    }

     

     

    依赖库:

    需要加入spring.jar  quartz.jar    log4j-1.2.14.jar   commons-collections.jar   jta.jar   commons-logging.jar这几个包

     

    如上都是在控制台应用下执行。由于spring工程、ibatis工程读取xml文件路径与JBOSS/TOMCAT web应用路径都不一样。控制台测试成功后,需要更改如上javaXML 路径依赖。

     

    WEB环境下使用调度程序,则需要在web.xml加载quartz.xml配置文件。

     

           <context-param>

                  <param-name>contextConfigLocation</param-name>

                  <param-value>

                         /WEB-INF/database.xml

                         /WEB-INF/applicationContext.xml

                         /WEB-INF/quartz.xml

                  </param-value>

           </context-param>

     

  • 子html 页面刷新父页面并关闭

    2008-10-15 23:19:25

    Child.html 关闭刷新父页面并关闭

     

     

    if (window.opener && !window.opener.closed) {

                                      

                                              var site=document.getElementById("hidden_currSite").value;

                                             

                                              var publishdate=document.getElementById("publishdate").value;

                                             

                                              var str_url="project.do?site="+site +"&publishdate="+publishdate;

                                                                                        window.opener.location.href=str_url;          

                                              //window.opener.location.reload();                         

             }

     

    window.close();

     

     

    html页面:

     

    window.open("child.htm ?projectid="+projectid+"&site="+site);

     

    同时为了保证取到更新的数据,应该禁止cache

    <Html>

    <head>

           <meta http-equiv="pragma" content="no-cache">

     <meta http-equiv="cache-control" content="no-cache, must-revalidate"> 

        <meta http-equiv="expires" content="0">

    </head>

     

     

    有朋友可能对不用window.opener.location.reload(); 存疑。

     

    当父页面之前是http post 请求,用window.opener.location.reload(); 会导致再次Post,这个可能不是我们期望的结果。

  • javascript 在Firefox 3.0与IE6 脚本下不同表现以及解决方法

    2008-10-09 23:24:10

    1.1       getElementById 区别

    <select name="month">  

    <option>Jan</option>  

    <opton>Feb</option>  

    </select>  

    <select name="month">

    <option>Jan</option>

    <opton>Feb</option>

    </select>

     

    IE中:

    document.getElementById("month") 正确

    document.getElementsByName("month") 正确

     

    Firefox:

    document.getElementById("month") 错误(必须加属性Id)

    document.getElementsByName("month") 正确 

     

    故通用方法编写标准html语法,然后用 document.getElementById.

     

    1.2       FireFox 不支持vbscrīpt

     

     

    1.3       Firefox 定位form

     

    Form 定义   <form name="userlist" id="userlist"  method="post" action="userlist.do">

     

    仅仅IE支持直接访问:

     

    userlist.pageSize.value="20";

            userlist.submit();

     

     

    通用函数

           function goto(p) {

            document.forms["userlist"].page.value=p;

            document.forms["userlist"].pageSize.value="20";

            document.forms["userlist"].submit();

    }

     

     

     

    1.4       事件函数

     

    仅仅 IE支持 document.onclick(){ 这种方式书写。

     

      function document.onclick(){

         with(window.event.srcElement){

        if (tagName != "INPUT" && getAttribute("Author") != "tiannet")

        tiannetHideControl();

         }

       }

    FireFox上提示: missing ( before formal parameters,javascrīpt error

     

     

    1.5       Console关键字

      <scrīpt   type='text/javascrīpt'>  

       

      var   http_request=null;

      alert(console); 

      var   console=null;  

     

    </scrīpt>

     

    firefoxconsole为一个对象

    setting a property that has only a getter

     

     

     

     

    IE 表现为未定义

     

     

    1.6       事件处理

     

    http://www.phpchina.com/12834/viewspace_29308.html

    http://www.javaeye.com/topic/47917

     

     

    如:

     

    function getEvent(){     //同时兼容ieff的写法

            if(document.all)    return window.event;        

            func=getEvent.caller;            

            while(func!=null){    

                var arg0=func.arguments[0];

                if(arg0){

                    if((arg0.constructor==Event || arg0.constructor ==MouseEvent)

                        || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){    

                        return arg0;

                    }

                }

                func=func.caller;

            }

            return null;

    }

     

     

        //任意点击时关闭该控件

       document.onclick=function(){  

         var ōbjevent= getEvent();   //window.event ;//getEvent();

        

        

          if( typeof(objevent.srcElement) == "undefined")

          {

                with(objevent.target)

                {

                             if (tagName != "INPUT" && getAttribute("Author") != "tiannet")

                             {

                                                  tiannetHideControl();

                             }

                }

              }

              else

         {   

               with(objevent.srcElement)

                {

                             if (tagName != "INPUT" && getAttribute("Author") != "tiannet")

                             {

                                                  tiannetHideControl();

                             }

                }      

         }

       }

     

     

     

    1.7       Document.all

    IE 特有:

    document.all.selTianMonth

     

    通用

    document.getElementById('selTianMonth')

     

    1.8       innerText

    http://www.cnlei.org/blog/article.asp?id=425

     

    Firefox下的DOM对象增加innerText属性:

    <scrīpt type="text/javascrīpt">

    var lBrowser = {};

    lBrowser.agt = navigator.userAgent.toLowerCase();

    lBrowser.isW3C = document.getElementById ? true:false;

    lBrowser.isIE = ((lBrowser.agt.indexOf("msie") != -1) && (lBrowser.agt.indexOf("opera") == -1) && (lBrowser.agt.indexOf("omniweb") == -1));

    lBrowser.isNS6 = lBrowser.isW3C && (navigator.appName=="Netscape") ;

    lBrowser.isOpera = lBrowser.agt.indexOf("opera") != -1;

    lBrowser.isGecko = lBrowser.agt.indexOf("gecko") != -1;

    lBrowser.ieTrueBody =function (){

      return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;

    };

    //Firefox下的DOM对象增加innerText属性

    if(lBrowser.isNS6){ //firefox innerText define

      HTMLElement.prototype.__defineGetter__( "innerText",

      function(){

      return this.textContent;

      }

      );

      HTMLElement.prototype.__defineSetter__( "innerText",

      function(sText){

      this.textContent=sText;

      }

      );

    }

    alert(lBrowser.isNS6);

    </scrīpt>

     

    1.9       eval

    创建过程:

     

       for (var i=0;i<5;i++) {

        document.write (' <tr align=center id="trTiannetDay' + i + '" >');

        for (var j=0;j<7;j++){

         document.write('<td align="center" id="tdTiannetDay' + n + '" '+

        'onClick="tiannetDay=this.innerText;tiannetSetValue(true);" '

          +' style="' + s_tiannet_day + '">&nbsp;</td>');

         n ++;

        }

        document.write (' </tr>');

       }

     

     

    IE特有:

      for (var i = 0; i < 35; i++){

     eval("document.all.tdTiannetDay"+i);

          

     

    通用:

         var ōbjname="tdTiannetDay"+ i;

         var da =  eval( document.getElementById(objname)); 

     

           if (typeof(da) == undefined)

               {

                       alert("document.getElementById(tdTiannetDay"+i+"is null");

               }

               else

               {

                   alert(da.tagName);

                      //alert(typeof(da.constructor));

               }

     

    查找到一个区别:http://kongjian.baidu.com/freezesoul/blog/item/f6b7e5cd275752510eb34548.html

     

    javascrīptdom对象和普通对象可以通过判断tagName属性来区别,但是这不是非常好的办法,因为你很难禁止他人在普通对象中定义tagName属性。另外一个比较好的方法是dom对象的constructor属性一般为undefined(同时,显然地,instanceof Object将返回false,这是它们区别其他对象的一个明显特征

     

     

    1.10   execscrīpt

    如: window.execscrīpt("c = Asc(c)", "vbscrīpt");

    仅仅IE支持

     

  • Spring Velocity macro应用与调试

    2008-09-26 22:24:00

    默认情况下,velocity macro文件修改没有被应用服务器检测,必须重启才能生效。

     

     

    Spring  web.xml contextConfigLocation配置包含属性文件mvc-config.xml

     

    <servlet>

    <servlet-name>dispatcherServlet</servlet-name>     

    <servlet-class>  org.springframework.web.servlet.DispatcherServlet        </servlet-class>      

    <init-param>          

    <param-name>contextConfigLocation</param-name>         

    <param-value>

    /WEB-INF/mvc-config.xml

    /WEB-INF/alert-config.xml

    </param-value>   

    </init-param>  

    <load-on-startup>1</load-on-startup>  

     </servlet>

     

     

    mvc-config.xml 部分内容如下:

     

                  <bean id="velocityConfigurer"                           class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">

                  <property name="resourceLoaderPath">

                  <value>WEB-INF/velocity/</value>  

                  </property>

                  <property name="velocityProperties">

                         <props>

                         <prop key="input.encoding">gb2312</prop>

                         <prop key="output.encoding">gb2312</prop>

                         <prop key="contentType">text/html;charset=gb2312</prop>

                         <prop key="file.resource.loader.cache">false</prop>

                         <prop key="file.resource.loader.modificationCheckInterval">1</prop>

                         <prop key="velocimacro.library.autoreload">true</prop>

                         <prop key="velocimacro.library">templates.vm</prop>

                         <prop key="runtime.log.logsystem.class">org.apache.velocity.runtime.log.SimpleLog4JLogSystem</prop>

                         <prop key="runtime.log">com.ali</prop>

                         <prop key="runtime.log.error.stacktrace">true</prop>

                         <prop key="runtime.log.warn.stacktrace">true</prop>

                         <prop key="runtime.log.info.stacktrace">false</prop>

                         <prop key="runtime.log.invalid.reference">true</prop>

                  </props>

                  </property>

     

           </bean>

          

             <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">

               <property name="suffix"><value>.vm</value></property>

                         <property name="exposeSpringMacroHelpers"><value>true</value></property>

                         <property name="exposeRequestAttributes"><value>true</value></property>

                         <property name="exposeSessionAttributes"><value>true</value></property>

                         <property name="contentType" value="text/html;charset=gb2312" />

                         <property name="dateToolAttribute">

          <value>dateTool</value>

               </property>

            </bean>

     

     

     

    Velocity 文件包括库文件templates.vm都放在WEB-INF/velocity/

    确保velocity文件被修改都立即重新扫描,关键的参数:

    <prop key="file.resource.loader.cache">false</prop>

                         <prop key="file.resource.loader.modificationCheckInterval">1</prop>

                         <prop key="velocimacro.library.autoreload">true</prop>

     

     

    index.vm上通过:

    #parse("templates.vm") 引入velocity 模版。

  • Spring+mysql+velocity 中文问题解决方法

    2008-09-23 13:11:20

    碰到中文问题主要有几类:

    1)      confluencemysql数据库导出的 UTF-8数据

    2)      http get/post 请求中汉字

    3)      ajax xmlhttprequest传递的汉字

    4)      mysql 环境设置

    5)      spring /velocity /jboss环境的中文配置

     

    成功的文件配置关键内容如下:

    1.1       spring2应用Web.xml 配置

     

    <filter>

                  <filter-name>encodingFilter</filter-name>

                  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

                  <init-param>

                         <param-name>encoding</param-name>

                         <param-value>GB2312</param-value>

                  </init-param>

                 

                  <init-param>

                <param-name>forceEncoding</param-name>

                <param-value>true</param-value>

        </init-param>

     

           </filter>

     

     

    1.2       Ibatis  sqlmap-config.xml

     

    <?xml version="1.0"  encoding="UTF-8" ?>

     

     

    1.3       ibatis jdbc配置:

    jdbc.driverClassName=com.mysql.jdbc.Driver

    jdbc.url=jdbc:mysql://127.0.0.1:3306/scmproj?useUnicode=true&characterEncoding=UTF-8

     

     

     

     

    1.4       spring mvc:

     

           <bean id="velocityConfigurer"                           class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">

                  <property name="resourceLoaderPath">

                  <value>WEB-INF/velocity/</value>  

                  </property>

                  <property name="velocityProperties">

                         <props>

                         <prop key="input.encoding">GB2312</prop>

                         <prop key="output.encoding">GB2312</prop>

                         <prop key="contentType">text/html;charset=GB2312</prop>

                         <prop key="file.resource.loader.cache">false</prop>

                         <prop key="file.resource.loader.modificationCheckInterval">1</prop>

                         <prop key="velocimacro.library.autoreload">true</prop>

                         <prop key="velocimacro.library">templates.vm</prop>

                         <prop key="runtime.log.logsystem.class">org.apache.velocity.runtime.log.SimpleLog4JLogSystem</prop>

                         <prop key="runtime.log">com.ali</prop>

                         <prop key="runtime.log.error.stacktrace">true</prop>

                         <prop key="runtime.log.warn.stacktrace">true</prop>

                         <prop key="runtime.log.info.stacktrace">false</prop>

                         <prop key="runtime.log.invalid.reference">true</prop>                        

                  </props>

                  </property>

     

           </bean>

          

             <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">

               <property name="suffix"><value>.vm</value></property>

                         <property name="exposeSpringMacroHelpers"><value>true</value></property>

                         <property name="exposeRequestAttributes"><value>true</value></property>

                         <property name="exposeSessionAttributes"><value>true</value></property>

                         <property name="contentType" value="text/html;charset=UTF-8" />

                         <property name="dateToolAttribute">

          <value>dateTool</value>

               </property>

            </bean>

          

     

    由于页面上文字是汉字,但数据库为utf-8VelocityViewResolvercontentType必须为UTF-8 ,否则部分复杂汉字无法正常显示。如璟。

     

     

    1.5       Mysql5.0创建数据库:

    create database scmproj DEFAULT CHARACTER SET utf8;

     

    1.6       mysql 的配置文件my.ini

    [mysql]

     

    default-character-set=gb2312

    [mysqld]

    default-character-set=utf8

     

    1.7       velocity页面

     

     

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <%@page pageEncoding="gb2312"%>

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>

    <meta http-equiv="Content-Type" content="text/html;charset=gb2312" />

     

     

    1.8       velocity 表单提交前编码

     

    <scrīpt language="vbscrīpt">

     

    Function GetByteCode(ch)  

     

        code = Asc(ch)          ' -20001

     

        GetByteCode = Hex(code) ' "B1DF"

     

    End Function

     

    </scrīpt>

     

     

    <scrīpt language="javascrīpt">

     

    String.prototype.urlEncode = function() {

     

        var r = "";

     

        for (var i = 0; i < this.length; i++) {

     

            var code = "" + GetByteCode(this.charAt(i));

     

            if (code.length > 2) {

     

                var b1 = code.substr(0, code.length - 2);

     

                var b2 = code.substr(code.length - 2);

     

                if (i == 0) {

     

                    //alert("" + code + ", " + b1 + ", " + code.length + ", " + b2);

     

                }

     

                r += "%" + b1 + "%" + b2;

     

            } else {

     

                r += "%" + code;

            }

        }

        return r;

    }

     

    </scrīpt>

     

     

    Function checkform()

    {

     

    var ōldvalue= document.formtips.content.value;

                  if(oldvalue=="")

                  {

                         alert("请设置值");

                         return false;

                  }

                  var urlEncodeResult=oldvalue.urlEncode();

                 

                  document.formtips.content.value=urlEncodeResult;   

    }

     

    1.9       接收form表单的服务器端JAVA代码

     

    protected ModelAndView onSubmit(HttpServletRequest request,

                         HttpServletResponse response, Object command, BindException errors)

                         throws Exception {

     

                  try {

                         SCMTips tips = (SCMTips) command;

                        

                         if (logger.isInfoEnabled()) {

                                logger.info("before decode content:" + tips.getContent());

                                logger.info("requestEncode="+ request.getCharacterEncoding());

                         }

     

                         String decoderesult = java.net.URLDecoder.decode(tips.getContent(),

                                       "gb2312");

     

                         if (logger.isInfoEnabled()) {

                                logger.info("decode result:" + decoderesult);

                         }

     

    1.10  AJAX 发送端

     

    function  makeHttpReq()

      {

          var new_httpreq = null;

          if (window.XMLHttpRequest) {

                    new_httpreq = new XMLHttpRequest();

                    if (new_httpreq.overrideMimeType){

                     new_httpreq.overrideMimeType('text/xml');

                    }

                   } else if (window.ActiveXObject) {

                    try{

                     new_httpreq = new ActiveXObject("Msxml2.XMLHTTP");

                    } catch (e) {

                     try {

                      new_httpreq = new ActiveXObject("Microsoft.XMLHTTP");

                     } catch (e) {

                     }

                    }

                   }

                  return  new_httpreq;

      }

     

     

         if (httpReq)  {  
              httpReq.onreadystatechange  =  function(){
                if(httpReq.readyState == 4)
                {
                 //var console=document.getElementById('console'); 
                 //alert(httpReq.responseText);
                 //console.innerHtml = httpReq.responseText;
                 }
           };
              
              httpReq.open("GET",   url,   true);  
              httpReq.setRequestHeader("If-Modified-Since","0");
              httpReq.send(null);  
          }    
      

    从上面可以看到httqreq没有指定编码格式。默认就是ISO-8859-1。

    2.11 接收ajax处理的服务器端代码
    public ModelAndView handleRequestInternal(HttpServletRequest request,
       HttpServletResponse response) throws Exception {

      if (request.getMethod().equals("GET")) {
       String encodeProj = request.getParameter("projectname");
       if (logger.isInfoEnabled()) {
        logger.info("before decode:" + encodeProj);
       }
       //客户端经过编码后的汉字   
       String projectname= new String( encodeProj.getBytes( "8859_1" ) , "gb2312" );
       if (logger.isInfoEnabled()) {
        logger.info("after decode:" + projectname);
       }


    2.12 JBOSS4.2配置
    D:\jboss-4.2.2.GA\server\default\deploy\jboss-web.deployer \Server.xml 里面
        -->
        <Connector port="8080" address="${jboss.bind.address}"   
             maxThreads="250" maxHttpHeaderSize="8192"
             emptySessionPath="true" protocol="HTTP/1.1"
             enableLookups="false" redirectPort="8443" acceptCount="100"
             connectionTimeout="20000" disableUploadTimeout="true"  />

    没有修改URIEncoding

     

     

  • HTTP GET请求传输汉字给SPRING MVC的处理

    2008-09-15 12:52:20

    HTTP GET请求在提交数据给服务器方面和POST有很多差异。比如传输字节数大小,编码要求等。

    HTTP GET请求要求对汉字进行URL 编码。

     

    IE客户端javascrīpt/vbscrīpt代码。

        

     

    <scrīpt language="vbscrīpt">

    Function GetByteCode(ch)   

        code = Asc(ch)          ' -20001

        GetByteCode = Hex(code) ' "B1DF"

    End Function

    </scrīpt>


    <scrīpt language="javascrīpt">

    String.prototype.urlEncode = function() {

        var r = "";

        for (var i = 0; i < this.length; i++) {

            var code = "" + GetByteCode(this.charAt(i));

            if (code.length > 2) {

                var b1 = code.substr(0, code.length - 2);

                var b2 = code.substr(code.length - 2);

                if (i == 0) {

                    //alert("" + code + ", " + b1 + ", " + code.length + ", " + b2);

                }

                r += "%" + b1 + "%" + b2;

            } else {

                r += "%" + code;
            }
        }
        return r;
    }

    </scrīpt>

     

     

     

    调用上述函数编码

    Var  projectname=”项目1”;

    var urlEncoded=projectname.urlEncode();

     var url="insertCheckList.do?projectname="+urlEncoded;

    接下来就是用AJAX  httprequest发送给JBOSS/TOMCAT。

     

     

     

    服务器端SPRING 接收到字符串解码:

     

    public ModelAndView handleRequestInternal(HttpServletRequest request,

               HttpServletResponse response) throws Exception {

     

    String encodeProj = request.getParameter("projectname");

          

               //客户端经过编码后的汉字

              

               String projectname= new String( encodeProj.getBytes( "8859_1" ) , "gb2312" );

               System.out.println(projectname);      

     

    }

  • 实现JBOSS reload class文件

    2008-09-11 17:33:47

    以下操作在D:\jboss-4.2.2.GA\bin测试通过。

     

    怎样做到让JBOSS服务器检测到.class变化而重新加载相应的应用?

    这样不必没更改一个文件即重启JBOSS,然后是漫长的等待。 这个就是效率J

     

    测试发现修改一个应用的web.xml文件可以让jboss检测到应用变更从而重新reload web应用。

    更改web.xml后提示

     

    21:45:01,718 INFO  [TomcatDeployer] undeploy, ctxPath=/spring, warUrl=.../deploy

    /spring.war/

    21:45:01,718 INFO  [[/spring]] Destroying Spring FrameworkServlet 'dispatcherSer

    vlet'

    21:45:01,734 INFO  [XmlWebApplicationContext] Closing org.springframework.web.co

    ntext.support.XmlWebApplicationContext@12f68b8: display name [WebApplicationCont

    ext for namespace 'dispatcherServlet-servlet']; startup date [Mon Sep 08 21:38:5

    9 CST 2008]; parent: org.springframework.web.context.support.XmlWebApplicationCo

    ntext@12cc66f

     

     

    更加彻底的办法是:修改D:\jboss-4.2.2.GA\server\default\deploy\jboss-web.deployer\context.xml

    内容如:

    <Context cookies="true" reloadable="true"  crossContext="true">

     

    重启后即可以达到修改.class文件而重新reload应用的效果。

     

    Jboss起动日志:

    2008-09-08 21:55:14,515 INFO  [org.apache.catalina.core.StandardContext] Reloading this Context has started

    2008-09-08 21:55:14,515 INFO  [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/spring]] Destroying Spring FrameworkServlet 'dispatcherServlet'

    2008-09-08 21:55:14,531 INFO  [org.springframework.web.context.support.XmlWebApplicationContext] Closing org.springframework.web.context.support.XmlWebApplicationContext@a50395: display name [WebApplicationContext for namespace 'dispatcherServlet-servlet']; startup date [Mon Sep 08 21:53:13 CST 2008]; parent:

  • spring+ibatis+velocity+ajax开发WEB应用小结

    2008-09-06 23:09:10

    这二周闭关开发内部配置管理员用的发布需求流程工具。

    主要的技术为:java spring+ ibatis+ velocity+ ajax/javascrīpt/css+mysql。

    IDE: eclipse。

    以下简要描述各个技术点应用状况。

    (1) java spring: spring很好整合了当下成熟的框架,最突出的概念有2点: IOC 和 AOP。
    spring支持ibatis,hibernate等 O/R MAP工具。支持 JSP/Velocity/struct等V层展现。
    另外,有jpetstore经典的例子、台湾林信良的spring2技术手册引导入门。

    可以运行在JBOSS/TOMCAT上,且其轻量。第一个念头就是用它实现。

    偶高频率应用SimpleFormController完成http请求以及响应。

    比较不爽的是,一堆的XML 配置文件。

    2) 数据方面有同步 confluence数据的需求、导入EXCEL数据需求,且数据量不大。故用单机版的MYSQL足够了。

    本次采用gb2312编码保存数据、页面信息。

    3)  O/R映射方面采用ibatis。 ibatis比hibernate轻量,又能自由操作SQL。

    ibatis 在被JBOSS/TOMCAT运行时加载 sql-map文件,如果SQL和数据库、配置文件有错误,将导致deploy失败。

    数据库如何设计得更合理,适应未来应用增加、环境增加是我考虑最多的点。

    4)  界面展现采用velocity。 这个是偶最不熟悉的。

    感觉最麻烦是它的调试。貌似语言能力偏弱,一些复杂类型的读写有困难。 复杂运算都在SPRING内计算。

    后来直接在spring ModelAndView方法,将简单对象或者List、数组保存为 session 在页面间传递。如
    request.getSession().setAttribute("currUsername", user.getUsername());

    5) ajax/javascrīpt/css应用在2个场景:

     第一个是表格的动态增加, 采用ajax定期更新部分页面信息达到提醒功能,一些常用控件(如日期选取),客户端输入验证等
     
     第二个就是界面美化。 基本功能完成后,看到页面太简陋了。偶从http://www.okajax.com/a/200806/062322552008.html 找了一些特效嵌入。

  • spring + velocity实现分页程序2

    2008-09-01 18:02:58

    接续

    package com.ali;

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;

    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.springframework.context.ApplicationContext;
    import org.springframework.validation.BindException;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.SimpleFormController;

    import com.ali.db.User;
    import com.ali.util.PageUtil;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class UserListController extends SimpleFormController {
     private IIbatisDAO currDAO;
     private String  m_pagesize;
     public UserListController() {
      setCommandClass(UserListForm.class);
     }

     public ModelAndView handleRequestInternal(HttpServletRequest request,
       HttpServletResponse response) throws Exception {
      
      if ( request.getMethod().equals("GET"))
      {
       //处理 http get请求
       System.out.println("do Get!!");
       
       UserListForm form = new UserListForm();
       form.setPage("1");
       form.setPageSize(getPageSize());
       System.out.println("handleRequestInternal");
       return onSubmit(request, response, form, null);
      }
      else
      {
       //return onSubmit(request, response, null, null);
       System.out.println("do Post!!");
       return super.handleRequestInternal(request, response);
      }
      
     }

     protected ModelAndView onSubmit(HttpServletRequest request,
       HttpServletResponse response, Object command, BindException errors)
       throws Exception {
      //处理http post请求
      UserListForm form = (UserListForm) command;
      System.out.println("user list:" + form);

      List list = this.getDAO().findUsers();
      ArrayList arrList = new ArrayList();
      for (Iterator i = list.iterator(); i.hasNext();) {
       User user = (User) i.next();
       System.out.println(user);
       arrList.add(user);
      }

      PageUtil util = new PageUtil(arrList, form.getPageSize(), form
        .getPage());
      System.out.println("list.size=" + arrList.size());
      request.setAttribute("userlist", util.getArrayList());

      request.setAttribute("pager", util);

      return new ModelAndView(this.getSuccessView());
     }

     public void setDAO(IIbatisDAO dao) {
      currDAO = dao;
     }

     public IIbatisDAO getDAO() {
      return currDAO;
     }
     public String getPageSize()
     {
      return m_pagesize;
     }
     
     public void setPageSize(String pagesize)
     {
      m_pagesize = pagesize;
     }
    }

    具体的velocity内容

     <BODY >
     
        <form name="userlist" method="post" action="/spring/userlist.do">
             <input type="hidden" name="page" >
             <input type="hidden" name="pageSize"  value=2>    
        </form>
     
     <table width="772"  border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
       <tr>
         <td>     
           <table width="750"  border="0" align="center" cellpadding="5" cellspacing="1">
             <tr align="center">
               <td background="images/q_12.gif"><span class="ff">用户名</span></td>
               <td background="images/q_12.gif" class="ff">站点</td>
               <td background="images/q_12.gif"><span class="ff">邮箱</span></td>
             </tr>
     #foreach($user in $userlist)
     #set($color="E9F4FF")
     #if($velocityCount%2==0)
     #set($color="FFFFFF")
     #end
             <tr align="center" bgcolor="$color">
                       <td class="ii">$user.getUsername()</td>         
                             <td>$user.getSite()</td>
                 <td class="style28">$user.getEmail()</td>
             
                     </tr>
     #end       
           </table>
     #set($pageFirst=1)
     
     #if ($pager)
     #set($pageEnd=$pager.getPageCount())
     #set($pagePrevious=$pager.getPreviousPage())
     #set($pageNext = $pager.getNextPage())
     #else
     #set($pageEnd=1)
     #set($pagePrevious=1)
     #set($pageNext =1)
     #end
     <scrīpt>
     
     function goto(p) {
             userlist.page.value=p;
             userlist.pageSize.value=2;
              userlist.submit();
     }
     </scrīpt>
     <table width="100%" border="0">
       <tr>
       <td width="98%" height="43" align="right">
        #if ($pager)
        总 $pager.rowCount 条
        第 $pager.currentPage/$pager.pageCount 页
        #else
        总 0 条
        第 0 页
        #end
        <a href="#$pageFirst" ōnclick="goto($pageFirst)">首页</a>
        <a href="#$pagePrevious" ōnclick="goto($pagePrevious)">上一页</a>
        <a href="#$pageNext" ōnclick="goto($pageNext)">下一页</a>
        <a href="#$pageEnd" ōnclick="goto($pageEnd)">末页</a>
       </td>
       </tr>
     </table>
         </td>
       </tr>
     </table>
     
     </BODY>
     

  • spring + velocity实现分页程序

    2008-09-01 17:52:25

    这段时间用 Spring + ibatis开发一个内部用的管理工具。麻雀随小,但五脏俱全。由于没有用公司的webx框架,重复发明轮子了,也碰到了一些问题。

     

    比如spring+ibatis 分页程序:) .

     

    偶参考网络上的一个实现。实现没有依赖数据库特性。如mysql limit。经过测试成功。

     

    具体的实现PageUtil

     package com.ali.util;

    import java.util.ArrayList;
    import com.ali.db.User;

    public class PageUtil {
     private int currentPage = 0;// 当前页

     private int rowCount = 0;// 总行数

     private int pageSize = 0;// 页大小

     private int pageCount = 0;// 总页数

     private int beginPosition = 0;// 页起始

     private int endPosition = 0;// 页终止

     private boolean hasNextPage = false;// 是否有下一页

     private boolean hasPreviousPage = false;// 是否上一页

     private ArrayList arrayList = new ArrayList();// 记录集

     /**
      * 初始化变量
      *
      * @param rowCount
      * @param pageSize
      * @param currentPage
      */
     public PageUtil(ArrayList arrayList, String pageSize, String currentPage) {
      this.arrayList = arrayList;
      this.rowCount = arrayList.size();

      this.pageSize = Integer.parseInt(pageSize);

      this.getPageCount();
      if (currentPage == null || currentPage.equals("")) {
       this.currentPage = 1;
      } else {
       try {
        this.currentPage = Integer.parseInt(currentPage);
       } catch (NumberFormatException nfe) {
        this.currentPage = 1;
       }
      }
      this.getCurrentPage();
      this.getBeginPosition();
      this.getEndPosition();
     }

     /**
      * 获取总行数
      *
      * @return rowCount
      */
     public int getRowCount() {
      return rowCount;
     }

     public int getPageSize() {
      return pageSize;
     }

     public int getCurrentPage() {
      if (currentPage >= pageCount) {
       currentPage = pageCount;
      } else if (currentPage <= 1) {
       currentPage = 1;
      }
      return currentPage;
     }

     public int getPageCount() {
      // 计算出总页数
      pageCount = (rowCount + pageSize - 1) / pageSize;
      return pageCount;
     }

     public int getBeginPosition() {
      // 计算出页起始
      beginPosition = (currentPage - 1) * pageSize + 1;
      return beginPosition;
     }

     public int getEndPosition() {
      // 计算出页终止
      if (currentPage >= pageCount) {
       endPosition = rowCount;
      } else {
       endPosition = currentPage * pageSize;
      }
      return endPosition;
     }

     public boolean isHasNextPage() {
      // 计算出是否有下一页
      if (currentPage >= pageCount) {
       hasNextPage = false;
      } else {
       hasNextPage = true;
      }
      return hasNextPage;
     }

     public boolean isHasPreviousPage() {
      // 计算出是否有上一页
      if (currentPage <= 1) {
       hasPreviousPage = false;
      } else {
       hasPreviousPage = true;
      }
      return hasPreviousPage;
     }

     public int getFirstPage() {
      return 1;
     }

     public int getPreviousPage() {
      if (this.isHasPreviousPage()) {
       return currentPage - 1;
      }
      return currentPage;
     }

     public int getNextPage() {
      if (this.isHasNextPage()) {
       return currentPage + 1;
      } else {
       return currentPage;
      }
     }

     public int getLastPage() {
      return pageCount;
     }

     /**
      * 获取页数据
      *
      * @return ArrayList
      */
     public ArrayList getArrayList() {

      ArrayList list = new ArrayList();
      for (int i = beginPosition; i <= endPosition; i++) {
       list.add(arrayList.get(i - 1));
      }
      return list;

     }
    }

  • 实际项目中C++如何调用java应用

    2008-05-18 01:14:39

     

    http://bbs.51testing.com/viewthread.php?tid=115018&extra=page%3D1&frombbs=1

    问题的关键在 jni.h的函数实现,如 jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

  • 借助jclasslib与javassist修改java class字节码

    2008-04-05 19:53:40

    http://bbs.51testing.com/thread-110784-1-1.html

        有时候,我们在没有java源程序的情况下,想改变.CLASS文件的部分内容输出或者改变跳转流,怎么办呢?
      介绍2个java hacker的工具javassist 以及jclasslib。

     

  • IBM RPM项目管理系统性能测试脚本

    2008-02-20 23:08:35

    IBM RPM系统是WEB之上包装的非文本方式传输数据的系统。

     

    为了开展性能测试,如何构造有效的网络包成为第一个坎。用YATT 嗅探器截获之前的通信包,保存为req.log。

     

     然后借用JAVA 里面HttpURLConnection 发送、接收数据,经测试通过。

     

     

    import java.io.*;

    import java.net.HttpURLConnection;

    import java.util.Map;

    import java.net.URL;

    import java.util.zip.Deflater;

    import java.util.zip.Inflater;

     

    public class RpmSender {

          public static void main(String[] args) {

                 try {

     

                        String log_dir = "D:\\rpm\\record2\\";

                        int  bufferlen =20480;

                         URL url = new                  URL("http://rpm.alibaba-inc.com:9080/webapp/IBMRPM/PMOServlet.wss");

                        //URL url = new URL("http://10.0.32.123:8081/IBMRPM/PMOServlet.wss");

                        OutputStream ōut = null;

                        InputStream is = null;

                        HttpURLConnection httpConnection = null;

                        for (int i = 1; i <= 16; i++) {

                               httpConnection = (HttpURLConnection) url

                                             .openConnection();

     

                               httpConnection.setRequestProperty("Content-Type",

                                             "application/octet-stream");

                               httpConnection.setRequestProperty("Accept", "text/html, */*");

                               httpConnection.setRequestProperty("Pragma", "no-cache");

                               httpConnection.setRequestProperty("Keep-Alive", "Y");

                               httpConnection.setRequestProperty("Accept-Encoding",

                                             "deflate, identity");

                               httpConnection.setRequestProperty("Zip", "D");

                               httpConnection.setRequestProperty("User-Agent", "IBMRPM");

                               httpConnection.setRequestProperty("Method", "POST");

     

                               httpConnection.setDoInput(true);

                               httpConnection.setDoOutput(true);

     

                               out = new BufferedOutputStream(httpConnection.getOutputStream());

     

                               String reqfile = i + "_req.log";

                               String resultfile = "result_" + i + "_reponse.log";

                               FileInputStream fstream = new FileInputStream(log_dir + reqfile);

                               String charset = "UTF-8"; //GBK,ISO-8859-1,GB2312,UTF-8

                               byte[] ōutput = new byte[bufferlen];

                               int readbyte = fstream.read(output);

                               System.out.println(readbyte);

                               //httpConnection.setRequestProperty("Content-Length",new

                               // Integer(readbyte).toString() );

     

                               out.write(output, 0, readbyte);

                               out.flush();

     

                               byte[] buffer = new byte[bufferlen * 3];

                               byte[] tmp = new byte[bufferlen];

                               int length;

                               int total_len = 0;

     

                               is = httpConnection.getInputStream();

                               while ((length = is.read(tmp)) > -1) {

                                      System.arraycopy(tmp, 0, buffer, total_len, length);

                                      total_len += length;

                               }

                               System.out.println(total_len);

                               Inflater decompresser = new Inflater();

     

                               decompresser.setInput(buffer, 0, total_len);

                               byte[] result = new byte[4096];

     

                               int resultLength = decompresser.inflate(result);

                               decompresser.end();

                               FileOutputStream fout = new FileOutputStream(log_dir

                                             + resultfile);

                               fout.write(result, 0, resultLength);

                               fout.close();

                               // Decode the bytes into a String

                               // String ōutputString = new String(result);

                               String ōutputString = new String(result, 0, resultLength,

                                             charset); //"UTF-8");

                               System.out.println(outputString);

                               out.close();

                               is.close();

                               httpConnection.disconnect();

                        }

                       

     

                 } catch (Exception e) {

                        e.printStackTrace();

                 }

     

          }

    }

     

  • HAT -- The Java Heap Analysis Tool

    2008-02-20 22:58:38

    HAT是有力的JAVA分析工具。具体

    参考文档  https://hat.dev.java.net/doc/README.html

     

     

    在jvm option加入参数先作thread dump,再用hat 分析结果

     

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/work/intl-myalibaba/deploy/heap.dump

     

    启动服务

    java -Xms2048m -Xmx2048m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m -XX:MaxPermSize=64m -jar ./hat.jar heap.hprof

     

    ie浏览器察看

    http://localhost:7002/

     

     

422/3<123>
Open Toolbar