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 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。
不可重复的读 non-repeatable reads:当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件。举例来说:Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。
虚读 phantom read:如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。
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循环的实现
- <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
- /*
- * $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的文件,它的格式如下:
- 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
Formatter格式化输出—— java古怪代码(4)
- import java.util.Formatter;
- public class FormatterTester {
- public static void main(String[] args) {
- StringBuilder sb = new StringBuilder();
- float balance = 223.33522f;
- String str = "String values";
- Formatter formatter = new Formatter(sb);
- formatter.format("格式化输出balance的值(float):$%.2f "
- +"字符串值:%s",balance,str);
- System.out.println(sb.toString());
- System.out.printf("格式化输出balance的值(float):$%.2f "
- +"字符串值:%s",balance,str);
- }
- }
- 格式化输出balance的值(float):$223.34 字符串值:String values
- 格式化输出balance的值(float):$223.34 字符串值:String values
语法类似C语言中的printf,习惯用C语法的可以试试这个。
静态import —— java古怪代码(3)
- import static java.lang.System.out;
- import static java.util.Arrays.sort;
- public class ImportTester {
- public static void main(String[] args) {
- //等同于System.out.println("abc");
- out.println("abc");
- int[] i = {2,1,3};
- for(int a : i )
- out.print(a+" ");
- sort(i);
- for(int a : i )
- out.print(a+" ");
- }
- }
静态import 可以应用在静态method和静态变量上。
