关于这种问题的几种可能性总结下:
1. 对应的属性没有加get set 方法
2. 提交表单中有更多的name属性而对应的action 或者model里面没有这个方法(这里重要就包括一个图片button 往往让人们难以发现)如下面表示:
<input type="image" name="Submit" value="提交" onclick="return checkpwd();" src=/blog_article/"images/a_tj.gif>
错误信息: target is null for setProperty(null, "x", [Ljava.lang.String;@b0c40e)
3. 在没有spring帮助注入的前况下我们action里面的model 一定要手动new 出来并且在model里面添加空的构造方法
4. Action里面的model 实例对象名字和我们表单中的名字不一致的时候
5. 也是遇到的错误就是间我们的类名很长的时候比喻:
pivate ABdefghjijklijejfjdkeifj aBefghjijklijejfjdkeifj 这时如果我们用myeclipse自动添加get set方法的时候就会发现它的getaB(); 而我们实际上是要的getAB();这样的写法 所以注半天就是注不进去
对于一些错误信息 把dev.Mode 开发模式 改成false 就会去掉这些错误信息
1、 从http://code.google.com/p/tesseract-ocr/downloads/list下载tesseract-ocr-3.02-vs2008、tesseract-ocr-3.02.chi_sim.tar、tesseract-ocr-3.02.02.tar、tesseract-ocr-3.02.02-doc-html.tar、leptonica-1.68-win32-lib-include-dirs相关文件;
2、 将所有文件存放在E:\OCR\tesseract_ocr3.02文件夹下并解压缩;
3、 打开tesseract-ocr-3.02-vs2008文件夹下的tesseract.sln工程;
4、 将tesseract-ocr-3.02.02文件夹下的对应文件如api、ccmain等复制到E:\OCR\tesseract_ocr3.02\tesseract-ocr-3.02-vs2008\tesseract-ocr文件夹下,把leptonica-1.68-win32-lib-include-dirs文件夹下的include文件夹复制到E:\OCR\tesseract_ocr3.02\tesseract-ocr-3.02-vs2008文件夹下,将tesseract_ocr3.02\tesseract-ocr-3.02.02\tesseract-ocr\vs2008\port文件夹下的文件复制到E:\OCR\tesseract_ocr3.02\tesseract-ocr-3.02-vs2008\tesseract-ocr\vs2008\port文件夹下,将leptonica-1.68-win32-lib-include-dirs文件夹下lib文件夹复制到tesseract_ocr3.02\tesseract-ocr-3.02-vs2008文件夹下;
5、 将ccmain文件夹下的equationdetect.cpp文件中的static const STRING kCharsToEx[] = {"'", "`","\"", "\\", ",", ".", "〈", "〉", "《", "》", "」", "「", ""};修改成static const STRING kCharsToEx[] = {"'", "`","\"", "\\", ",",".","<", ">", "<<",">>", ""};(注:不改动编译时始终出错,其它方法暂未发现,3.01版本中没有此文件,编译3.01不用对源文件作任何修改)
6、 重新编译整个Solution;
7、 创建一个控制台空工程,配置环境仿照tesseract工程,并在执行文件夹下创建一个tessdata文件夹,里面存放chi_sim.traineddata数据文件,示例代码如下:
#include "allheaders.h" #include "baseapi.h" #include "basedir.h" #include "strngs.h" #include "tesseractmain.h" #include "tprintf.h" int main(int argc, char **argv) { tesseract::TessBaseAPI api; STRING tessdata_dir; truncate_path(argv[0], &tessdata_dir); int rc = api.Init(tessdata_dir.string(), NULL); if (rc) { fprintf(stderr, ("Could not initialize tesseract.\n")); exit(1); } api.End(); // Make the order of args a bit more forgiving than it used to be. const char* lang = "chi_sim";//eng const char* image = "E:\\OCR\\tesseract_ocr3.02\\tesseract-ocr-3.02-vs2008\\tesseract-ocr\\vs2008\\Debug\\ABC.tif";//NULL; const char* output = "E:\\OCR\\tesseract_ocr3.02\\tesseract-ocr-3.02-vs2008\\tesseract-ocr\\vs2008\\Debug\\xxxxx";//NULL; tesseract::PageSegMode pagesegmode = tesseract::PSM_AUTO; int arg = 1; api.SetOutputName(output); rc = api.Init(tessdata_dir.string(), lang, tesseract::OEM_DEFAULT, &(argv[arg]), argc - arg, NULL, NULL, false); if (rc) { fprintf(stderr, ("Could not initialize tesseract.\n")); exit(1); } if (api.GetPageSegMode() == tesseract::PSM_SINGLE_BLOCK) { api.SetPageSegMode(pagesegmode); } tprintf("Tesseract Open Source OCR Engine v%s with Leptonica\n", tesseract::TessBaseAPI::Version()); FILE* fin = fopen(image, "rb"); if (fin == NULL) { fprintf(stderr, ("Cannot open input file: %s\n"), image); exit(2); } fclose(fin); PIX *pixs; if ((pixs = pixRead(image)) == NULL) { fprintf(stderr, ("Unsupported image type.\n")); exit(3); } pixDestroy(&pixs); STRING text_out; if (!api.ProcessPages(image, NULL, 0, &text_out)) { fprintf(stderr, ("Error during processing.\n")); } bool output_hocr = false; api.GetBoolVariable("tessedit_create_hocr", &output_hocr); bool output_box = false; api.GetBoolVariable("tessedit_create_boxfile", &output_box); STRING outfile = output; outfile += output_hocr ? ".html" : output_box ? ".box" : ".txt"; FILE* fout = fopen(outfile.string(), "wb"); if (fout == NULL) { fprintf(stderr, ("Cannot create output file %s\n"), outfile.string()); exit(1); } fwrite(text_out.string(), 1, text_out.length(), fout); fclose(fout); return 0; // Normal exit }
以上代码编译运行成功,直接输入整幅图像进行字符识别,效果一般。
4.1嵌入式数据库一SQLite
嵌入式数据库SQLite与、Berkeley DB各有千秋。在功能方面,SQLite略逊色于Berkeley DB。但SQLite也有Berkeley DB所不具有的优点:首先,SQLite支持大多数的SQL92标准语
句。并且支持索引、事务、触发和一系列的用户API以及驱动。其次,SQLite支持事务,具有事务的ACID特性,即原子性、一致性、独立性和持久性,在很多功能单元添加了有效的
验证算法,就有较好的数据保护功能,一般不会造成数据的丢失或损坏。再者,相对于Berkeley DB的双重授权方式(或者采用GPL授权方式来公开所开发的源代码或者购买商业授权
),SQLite的授权方式对于商业软件来说非常友好,采用公众授权(Public Domain)的方式,即使作为商用也没有丝毫的限制。而且,在SQLite中使用了经过优化的lemon算法,
lemon算法的引入不仅使得查询时对系统内存的占用量大大减少,同时也添加了非末端析构的功能,即当发生未预期到的SQL语法错误,引发程序异常时,不会导致内存渗漏,可见
,它非常适合那些存储器资源受限制的系统。从体系结构上看,SQLite主要可以分为八个子系统。标记处理器(Tokenizer)的作用是当执行一个包含sQL语句的字符串时,接口程序
要把这个字符串传递给Tokenizer。Tokenizer把原有字符串分成一个个标示符,并把这些标示符传递给剖析器。Tokenizer是在C文件夹tokenize.c中用手编译的。分析器(Parser)
是由L,omollLALR(1)parser generator产生的。SQLite使用自带的代码生成器(code generator)来来快速、高效的生成可执行代码。当分析器(Parser)解析完所有的语句,并把它
们都转换称为SQL语句之后,代码生成器(code generator)负责产生虚拟的机器代码。这些代码与SQL语句所起的作用相同。在生成虚拟代码的过程中,代码生成器中存在的大量.c
文件,如attach.c,auth.c,build.c,select.c,insert.c,delete.c,where.c,expr.c,pragnmc,trigger.c,vaguum.c,以及update.C等【2刀,它们扮演着各
种角色,发挥着重要的作用。首先where.C负责处理SQL语句中WHERE子句的代码的生成。delete.g负责处理SQL语句DELETE子旬的代码的生成。insert.c负责处理SQL语句中
INSERT子句的代码的生成。select.c负责处理SQL语句中SELECT子句的代码的生成。还有一些其它的虚拟代码是由build.c生成的。虚拟机器fvirh】almahine)负责运行由代码生
成器产生的一系列的虚拟代码,它本身是被包含在一个单独的文件vdbe.c中的,主要用来执行一个抽象的为操作数据库而设计的计算引擎。在虚拟机器有一个用来存储中间数据的
存储栈。虚拟机器有它自己的头文件,即vdbe.h以及vdbeInt.h,vdbe.h将虚拟机器与其它的SQLite类库相连瞄¨,vdbeInt.h则对虚拟机器的结构进行了明确定义。左下侧的
Backend中的B—tre系统采用经过优化的B.tree结构,可以有效降低对磁盘查找时的系统开销。SQL使用B.tree文件对数据库进行磁盘维护。在文件B.tree.c中有对索引结构的
详细绍。数据库中的每个表格和目录都是用单独的B.tree结构进行存储,所有的B.t都以文件的形式存储在数据库中【引。Baekend中间层是pager-.页面缓冲子系统,它作用于
操作系统抽象层之上。