2008年11月20日

由于某客户有安全性要求,可以接收HTTP请求的服务器,不能连接DB服务器,这样我们基于非分布式构架系统在部署上碰到了困难,好在客户使用weblogic,通过别人的支持,知道一种办法可以通过weblogic.servlet.proxy.HttpClusterServlet来实现我们的要求,这个东东本来是作Cluster用的,放到我们的应用中,作HTTP-server代理也不错!

<servlet>

     <servlet-name>HttpClusterServlet</servlet-name>

       <servlet-class>

         weblogic.servlet.proxy.HttpClusterServlet

       </servlet-class>

     <init-param>

       <param-name>WebLogicCluster</param-name>

       <param-value>

          ip1.ip2.ip3.ip4:port

       </param-value>

     </init-param>

   </servlet>

2008年07月18日
针对页面,通过设置过期时间 <meta http-equiv="expires" content="Thu,31 Dec 2020 23:59:59 GMT">,使页面仅在浏览器刷新时才从服务器读取。

 针对图片,每次从服务器上取的是背景图片,在网上查询到,有人讲这是IE6的bug,背景图片不读缓存,都是从服务器取。有人给出了解决办法:jsp中加入以下代码得以解决:
<script type="text/javascript">    
         try {     
                  document.execCommand("BackgroundImageCache", false, true);     
               } catch(err) {
               }    
</script>

同事 塔长城 提供,并验证

2008年07月11日

在我们使用 jdk 的 LinkedHashMap 时,发生了

protected boolean removeEldestEntry(java.util.Map.Entry eldest) {
        
            System.out.println(this.containsKey(eldest.getKey())); //此处返回false

             if (size() > maxSize){
                          return true;
             }
            
 }

不能移除多于的缓存实例的问题,

百般调试无效,改用 org.apache.commons.collections.map.LRUMap 后问题解决.

2008年06月09日

最近忙的利害,也懒了,好久没有更新,写个小文补补课.

应对需求的变化才是OO方法最好的用武之地,如果没有需求的变化那么OO方法的优势就很难体现了,对于

很多程序员使用C++,java,C#等等 很多支持OO方法的语言环境编程时都不能(貌似也不必)熟练地使用OO

方法.所以我觉得有必要把一些更具体的场景写出来,说明典型的OO设计.
例如:使用Decorator而不是参数.
具体场景如下:
    已有一个接口,包含一个方法 execute(),由于需求变化,该接口的实现有些需要加入一种能力

–需要异步执行,有两种典型的处理方法:
    1.将execute()加入一个参数:签名将被改为 execute(boolean asynchronous)
    2.新写一个 AsynDecorator 的新接口实现,实现execute()方法的异步调用.
显然,第二中方法是典型的OO方法.

名称 Decorator
意图 动态地给一个对象添加一些额外的职责。就增加功能来说,D e c o r a t o r 模式相比生成子

类更为灵活。
适用性 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
处理那些可以撤消的职责。
当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产

生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于

生成子类。 

2008年03月07日

Informix下的分页做法

SELECT  SKIP 10 FIRST 10 *  FROM  a1330_1 WHERE  dbank_id = ‘651080000′ order by row_num;

SKIP n :跳过N

FIRST n :获取前n条记录

SKIP 10 FIRST 10 :跳过前10条获取接下来的10

Informix子查询

SELECT  first 10 *

FROM  TABLE(MULTISET

(SELECT  FIRST  20 *  FROM  a1330_1

where  dbank_id = ‘651080000′ order by row_num )) a

order by row_num desc

 

TABLE(MULTISET(……)) a : 创建视图,别名为a

2008年01月09日

使用
org.springframework.orm.ibatis.SqlMapClientFactoryBean
的配置文件类似这样:
<sqlMapConfig>

    <settings cacheModelsEnabled="true" enhancementEnabled="true"
        lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32"
        maxSessions="10" maxTransactions="5" useStatementNamespaces="true" />

    <!–sqlMap resource="includes:mapping*.xml" /–>
    <sqlMap resource="mapping-table_meta.xml" />
    <sqlMap resource="mapping-task.xml" />
    <sqlMap resource="mapping-table_status.xml" />
    <sqlMap resource="mapping-auth_menu_info.xml" />
    <sqlMap resource="mapping-auth_user_group.xml" />
    <sqlMap resource="mapping-auth_bank_group.xml" />
    <sqlMap resource="mapping-auth_curr_group.xml" />
    <sqlMap resource="mapping-auth_table_group.xml" />
    <sqlMap resource="mapping-auth_oper_group.xml" />
    <sqlMap resource="mapping-auth_menu_subject.xml" />
    <sqlMap resource="mapping-auth_admin_subject.xml" />
    <sqlMap resource="mapping-auth_user_menu.xml" />
    <sqlMap resource="mapping-auth_user_data.xml" />
    <sqlMap resource="mapping-message_info.xml" />

</sqlMapConfig>

IncludesSqlMapClientFactoryBean: 通过重写 afterPropertiesSet() 实现了简化配置文件的目的.
现在的配置文件像这样:
<sqlMapConfig>

    <settings cacheModelsEnabled="true" enhancementEnabled="true"
        lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32"
        maxSessions="10" maxTransactions="5" useStatementNamespaces="true" />

    <sqlMap resource="includes:mapping*.xml" />
<sqlMapConfig>

import org.apache.log4j.Logger;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.orm.ibatis.SqlMapClientFactoryBean;

import com.ibatis.sqlmap.engine.builder.xml.SqlMapClasspathEntityResolver;

public class IncludesSqlMapClientFactoryBean extends SqlMapClientFactoryBean {
   
    /** Logger for this class */
    private static final Logger log = Logger
            .getLogger(IncludesSqlMapClientFactoryBean.class);
   
    public static String INCLUDES_PREFIX = "includes:";

    private Resource configLocation;

    public void setConfigLocation(Resource configLocation) {
        super.setConfigLocation(configLocation);
        this.configLocation = configLocation;
    }

    public void afterPropertiesSet() throws Exception {
        Document source = buildDocument(configLocation.getInputStream());
        Document target = generateSqlMapConfig(source);
        setConfigLocation(toResources(target));

        //System.out.println(format(out.toByteArray()));
        super.afterPropertiesSet();
    }

    private Resource toResources(Document target)
            throws UnsupportedEncodingException, IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        XMLWriter writer = new XMLWriter(out);
        writer.write(target);

        Resource resource = new ByteArrayResource(out.toByteArray());
        return resource;
    }

    private Document generateSqlMapConfig(Document source)
            throws IOException {
        Document target = (Document) source.clone();
        Element targetRoot = (Element) target.node(0);
        targetRoot.clearContent();
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Element sourceRoot = (Element) source.node(0);
        for (Iterator iter = sourceRoot.nodeIterator(); iter.hasNext();) {
            Node node = (Node) iter.next();
            if(node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) node;
                if("sqlMap".equals(element.getName())) {
                    String resourcePath = element.attributeValue("resource");
                    if(resourcePath == null) {
                        continue;
                    }
                    if(resourcePath.startsWith(INCLUDES_PREFIX)) {
                        String pattern = ResourceLoader.CLASSPATH_URL_PREFIX + resourcePath.substring(INCLUDES_PREFIX.length());
                        Resource[] resources = resolver.getResources(pattern);
                        for (int i = 0; i < resources.length; i++) {
                            Resource resource = resources[i];

                            Element sqlmap = targetRoot.addElement("sqlMap");
                           
                            log.info(">>> iBatis includes sqlMap: " + resource.getURL().toString());
                           
                            sqlmap.addAttribute("url", resource.getURL().toString());
                        }
                        continue;
                    }
                }
            }
            targetRoot.add((Node) node.clone());
        }
        return target;
    }

    private Document buildDocument(InputStream in) throws DocumentException, IOException {
        SAXReader reader = new SAXReader();
        reader.setEntityResolver(new SqlMapClasspathEntityResolver());
        return reader.read(in);
    }

    protected String format(byte[] data) throws Exception {
        Document document = buildDocument(new ByteArrayInputStream(data));
        StringWriter formatWriter = new StringWriter();
        XMLWriter writer = new XMLWriter(formatWriter, new OutputFormat("  ", true));
        writer.write(document);
        return formatWriter.toString();
    }
}

2008年01月08日

1、设置锁级别—-可选
   alter table t_test lock mode (ROW)
2、重新建索引
   解决了U,D,S等语句的异常
3、改变锁的模式
   SET LOCK MODE TO  NOT WAIT
   或
   SETLOCK MODE  TO WAIT 30
4、将事务隔离级别设为 TRANSACTION_READ_UNCOMMITTED

2008年01月02日

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import javax.xml.namespace.QName;

import org.apache.axis.encoding.XMLType;

public class testsoap {

//keytool -import -keystore c:\\test.keystore -file world2_ca.cer

  public static void main(String[] args) {

    try{

   

   System.setProperty("javax.net.ssl.trustStore","c:\\test.keystore"); // 这个就是我们用keytool生成的keystore文件的路径

   String[] ret=null;

   mdencode md=new mdencode();

   Service service = new Service();

   Call call = (Call) service.createCall();

   call.setTargetEndpointAddress(new java.net.URL("https://esales.world2.com.cn/services/UseCardManage"));

   call.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE);

   call.setProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_SOAP_ACTION, "NameSoap");

   call.addParameter("businessId", XMLType.SOAP_INT, javax.xml.rpc.ParameterMode.IN);

   call.addParameter("playerAccount", XMLType.SOAP_STRING, javax.xml.rpc.ParameterMode.IN);

   call.addParameter("cardType", XMLType.SOAP_INT, javax.xml.rpc.ParameterMode.IN);

   call.addParameter("number", XMLType.SOAP_INT, javax.xml.rpc.ParameterMode.IN);

   call.addParameter("zoneId", XMLType.SOAP_INT, javax.xml.rpc.ParameterMode.IN);

   call.addParameter("tranSeq", XMLType.SOAP_INT, javax.xml.rpc.ParameterMode.IN);

   call.addParameter("md5Info", XMLType.SOAP_STRING, javax.xml.rpc.ParameterMode.IN);

   call.addParameter("time", XMLType.SOAP_LONG, javax.xml.rpc.ParameterMode.IN);

   call.setOperationName("useCard");

   call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_ARRAY);

   String md5info=md.testDigest("10008&luanru&1&4&2&3&1&FKINSVBY137NKCV");

 

   ret = (String[]) call.invoke(new Object[]{new Integer(10008),"luanru",new Integer(1),new Integer(4),new Integer(2),new Integer(3),md5info,new Integer(1)});

   System.out.println("————-ret="+ret[0]+ret[1]);

 

    }catch(Exception e)

    {  System.err.println(e.toString());

 

    }

 

  }

}

===========================================================================================

keytool -import -keystore c:\\test.keystore -file world2_ca.cer  (蓝字是我们要生成的keystore文件的路径,红字部分是我们从浏览器导出的证书文件路径)

2007年11月11日

最近的项目是使用beashell作公式解释器,碰到java精度问题,郁闷, a+b==c, 两个double值a,b相加明明应该等于c,但beanshell就是返回fasle,在java中一试,也一样,如果自己写程序,还可以用BigDecimal解决但在beanshell包中,怎么解决呀,没办法看看源码吧.还好!beanshell的核心计算逻辑写的很清晰,只要改写他的 bsn/Primitive.java 的  static Object doubleBinaryOperation(Double D1, Double D2, int kind) 代码即可! OK问题终于解决了.

2007年09月07日

发生的异常 ::0 formal unbound in pointcut
配置如下:
    <aop:config>
        <aop:aspect ref="operationCounter">
            <aop:pointcut id="systemManagerPointCut"
                expression="execution(* nt.facade.*.*(..))" />
            <aop:around method="count"
                pointcut-ref="systemManagerPointCut" />
        </aop:aspect>
    </aop:config>
    <bean id="operationCounter"
        class="nt.facade.aspect.OperationCounter">
    </bean>

错误的原因是在配置  advisor 时 使用的 method="count"
   public Object count(ProceedingJoinPoint call,int count)
 与pointcut的被aop的方法
    public Login login()
  签名不匹配,从而造成该问题

将count改为
    public Object count(ProceedingJoinPoint call)
这个问题就解决了,都是Copy代码惹得祸!