未分类

spring事务错误:no matching editors or conversion strategy

错误日志:no matching editors or conversion strategy spring事务中会出现。
spring bean proxy默认代理的是接口,如果用来代理类,要在事务配置中添加以下代码声明:
<property name="proxyTargetClass" >
   <value>true</value>
</property>, 否则就会出现上面的错误。

spring 声明式事务,Propagation属性列表

这些属性在TransactionDefinition接口中定义,共有7种选项可用:
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务(还不是太明白),如果当前没有事务,就新建一个事务。

TransactionDefinition中定义的隔离(isolation)级别,有5种:
1 ISOLATION_DEFAULT 默认的隔离级别
下面几个都是 JDBC isolation levels 一一对应:
2 ISOLATION_READ_UNCOMMITTED Connection.TRANSACTION_READ_UNCOMMITTED
指示防止发生脏读的常量;不可重复读和虚读有可能发生。
3 ISOLATION_READ_COMMITTED Connection.TRANSACTION_READ_COMMITTED
指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。
4 ISOLATION_REPEATABLE_READ Connection.TRANSACTION_REPEATABLE_READ
指示防止发生脏读和不可重复读的常量;虚读有可能发生。
5 ISOLATION_SERIALIZABLE Connection.TRANSACTION_SERIALIZABLE
指示防止发生脏读、不可重复读和虚读的常量。
注:
脏读 dirty reads:当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction [...]

struts2 错误解决

错误日志:
[com.opensymphony.xwork2.interceptor.ParametersInterceptor]-[ERROR] ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression ’start’ with value ‘[Ljava.lang.String;@2a590d’
解决方法:
在action 添加相应的属性(start). 或是删除页面表单和url中的多余的参数。
这个问题并不影响运行,干嘛要报个error呢,提示个警告不就OK,不明白 。
 

eclipse设置

1.  myeclipse默认编码设置
     项目默认编码设置:Window–>Preferences–>General–>WorkSpace
     文件系统默认编码设置:Window–>Preferences–>General–>Content Types
 
2.  Eclipse 中Alt+/快捷键失效的解决办法
       Eclipse下进入Windows ->Preperences ->General ->keys(快捷键按住ctrl+shif同时双击L )
      把word completion的快捷键设置alt+/删掉或改成其他的!
      把Content Assist的快捷键由ctrl+space改成alt+/

关于Hibernate源码 org.hibernate.hql.antlr包为空的问题

Hibernate3的源码中org.hibernate.hql.antlr包是空的,代码是由Antlr产生的。
1, 配置ANtlr, 将antlr.jar设置到CLASSPATH环境变量或拷贝到jdk的lib下边。懒得写配置环境,直接拷贝到JDK的lib下方便。
2, 开始生成java 文件 到源码的grammar下看到有3个.g文件,
       首先运行>java antlr.Tool hql.g
       接着运行>java antlr.Tool hql-sql.g
       最后运行>java antlr.Tool sql-gen.g OK,
关于HSQL的源码生成完毕,拷贝到org.hibernate.hql.antlr包下即可。

struts2.0标签应用(2)–for循环的实现

 

Java代码

<s:bean name="org.apache.struts2.util.Counter" id="counter">    
  <s:param name="first" value="1" />    
  <s:param name="last" value="10" />    
  <s:iterator>    
    counter:<s:property value="current-1"/>    
  </s:iterator>    
</s:bean>    

其中first属性指定循环起始值,last指定循环终止值,其它相关属性可以查看org.apache.struts2.util.Counter类源码。在下面迭代器中输入循环的当前值,即:current-1

Counter类源码

/* 
 * $Id: Counter.java 471756 2006-11-06 15:01:43Z husted $ 
 * 
 * Licensed to the Apache Software Foundation (ASF) under one 
 * or more contributor license agreements.  See the NOTICE file 
 * distributed with this work for additional information 
 * regarding copyright ownership.  The ASF licenses this file 
 * to you under the Apache License, Version 2.0 (the 
 * "License"); you may not use this file except in compliance 
 * with the License.  You may obtain a copy of the License at 
 * 
 *  http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, 
 * software distributed under the License is distributed on an 
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 * KIND, either express or implied.  See the License for the 
 * specific language governing permissions and limitations 
 * under the License. 
 */  
package org.apache.struts2.util;  
  
import java.io.Serializable;  
  
  
/** 
 * A bean that can be used to keep track of a counter. 
 * <p/> 
 * Since it is an Iterator it can be used by the iterator tag 
 * 
 */  
public class Counter implements java.util.Iterator, Serializable {  
  
    private static final long serialVersionUID = 2796965884308060179L;  
  
    boolean wrap = false;  
  
    // Attributes —————————————————-  
    long first = 1;  
    long current = first;  
    long interval = 1;  
    long last = -1;  
  
  
    public void setAdd(long addition) {  
        current += addition;  
    }  
  
    public void setCurrent(long current) {  
        this.current = current;  
    }  
  
    public long getCurrent() {  
        return current;  
    }  
  
    public void setFirst(long first) {  
        this.first = first;  
        current = first;  
    }  
  
    public long getFirst() {  
        return first;  
    }  
  
    public void setInterval(long interval) {  
        this.interval = interval;  
    }  
  
    public long getInterval() {  
        return interval;  
    }  
  
    public void setLast(long last) {  
        this.last = last;  
    }  
  
    public long getLast() {  
        return last;  
    }  
  
    // Public ——————————————————–  
    public long getNext() {  
        long next = current;  
        current += interval;  
  
        if (wrap && (current > last)) {  
            current -= ((1 + last) - first);  
        }  
  
        return next;  
    }  
  
    public long getPrevious() {  
        current -= interval;  
  
        if (wrap && (current < first)) {  
            current += (last - first + 1);  
        }  
  
        return current;  
    }  
  
    public void setWrap(boolean wrap) {  
        this.wrap = wrap;  
    }  
  
    public boolean isWrap() {  
        return wrap;  
    }  
  
    public boolean hasNext() {  
        return ((last == -1) || wrap) ? true : (current <= last);  
    }  
  
    public Object next() {  
        return new Long(getNext());  
    }  
  
    public void remove() {  
        // Do nothing  
    }  
}  

 
 

struts2.0标签应用(1)

%{}用于计算表达式
如%{10+20}结果将输出30
如%{"a"+"b"}结果将输出"ab"
#通常强调从上下文取
如#parameters.name[0]等价于request.getParameter("name")
如#session.name等价于session.getAttribute("name")
如#request.name等价于request.getAttribute("name")
%{#}仍然用于计算表达式,只不过操作元可以是变量
如先定义一个变量
<s:set name="age" value="%{25}"/>
则%{#age}将输出25,也可以省略"#",写为%{age}
若将age加10,可这么写:
%{#age+10},将输出30.不能省略"#"。也就说变量用于计算时不能省略"#"

关于搜索提示功能的实现(一)

/**
   *
   *作者:野四abin
   * 时间:2009-3-27
   */
  搜索引擎现在越来越流行了,好多网站都有了自己的搜索引擎,但是对于类型GOOGLE的提示并不多,在我的印象中并没有太多(google,baidu.todou,youku…),而大多数都是一些比较大型的网站在使用这个功能.由于公司的搜索引擎的需求要求实现关于类型google提示功能!
如下图

   通过浏览别人做的搜索引擎提示总结出来我所面临的问题如下:
1、提示中的那些关键字是如何获得的
2、提示中的关于那些关键字的搜索数据条数如何获得的
3、关于得到这些数据的访问速度
通过上述问题我总结出来了关于这些问题的实现方案
对于第1个问题,我认为应当是用户通过搜索引擎搜索使用关键字的记录的。我是如果得到这些记录和如何存储这些记录的呢!
首先我新建一个表(关键字搜索记录表)主要是存储使用关键字搜索记录,它包括以下几个字段(ID,关键字,使用次数) 其中关键字是唯一的!我是怎样存储这些数据的呢!首先我创建一个searchkeys.txt文本文件,每个搜索使用的关键字写入文本中,每个关键字点一行,我是通过定时器来把这个数据存储到数据库当中的,通过分析这些数据如果有N个相同的关键字使用次数就为N个,我是每天0点的时候把这些数据存储在数据库中,为什么要选择0点,因为0点的时候访问量并不会太多,加入数据库中也不会影响网站的速度。同时能过分析数据中的记录生成一个名叫searchkeys.js的文件,它的格式如下:

JavaScript代码

var keyArr1=new Array();  
keyArr1[0]=["1","办公摆挂件","1000"]  
keyArr1[1]=["2","办公剪刀","1000"]  
keyArr1[2]=["3","办公沙发","1000"]  
keyArr1[3]=["4","办公饰品","1000"]  
  
function getArr1(skey){  
function funsort(x,y){//通过使用次数来排序  
return y[1] - x[1];  
}  
var j=0;  
var testArray = new Array();  
var keyArray = new Array();  
for (var i = 0; i < keyArr1.length; i++) {  
if (keyArr1[i][1].indexOf(skey)==0) {//根据字来查找  
testArray[j]= new Array(keyArr1[i][1],keyArr1[i][2]);  
j++;  
}  
}  
testArray.sort(funsort);  
for (var sk = 0; sk < testArray.length; sk++) {  
if(sk<10){//只取前10条结果  
    keyArray[sk]= new Array(testArray[sk][0],testArray[sk][1]);  
}else{  
break;  
}  
}  
return keyArray;  
}  

为什么要使用这个JS呢?减少与数据库连接,
那关键字后面的结果条数怎么得来的呢,我认为是通过对关键字的的分词,再去通过分词后的字,去索引中查找关于这些关键字的HITS的记录,这里我只得到这些个数,并通过使用memcached来存储这个使用关键字与得到的结果个数!
测试结果:
输入关键字和出现提示的时间差<0.001s

ubuntu下nagios的安装配置

nagios是一款开源的网络管理软件。能够对网络内的主机和硬件设备进行状态监控,并可以在发生故障的时候给管理人员发送手机短信或email进行报警。
nagios能实现的功能:
1. 状态监控
2. 预警处理
3. 集中,规模化管理
4. 可视化显示方式

nagios的实现方式:nagios采用分布-集中的管理模式。在nagios服务器上安装nagios主程序,
在被监控主机上安装nagios代理程序。通过nagios主程序和nagios代理程序之间的通讯,监视
主机状态。