相关推荐: 学习xpath的天堂!! javascript基础知识大集锦(1) Javascript正则表达式笔记 Lucene CSV import 先后顺序 Lucene:为文本文件创建索引 neo4j︱neo4j批量导入neo4j-import (五) Lucene从入门到进阶(6.6.0版本) Lucene 分词 统计分词次数
推荐群组: solr交流圈
更多相关推荐
搜索引擎 Lucene
curl "http://localhost:8080/solr/update/csv?stream.file=../solr/docs/books.csv&stream.contentType=text/plain;charset=utf-8&commit=true&fieldnames=id,manu,cat&header=true& f.cat.map=AAA:BBB & keepEmpty=true & f.cat.split=true&f.cat.separator=%20 "
请求顺序如下:
keepEmpty=true f.cat.split=true&f.cat.separator=%20 f.cat.map=AAA:BBB
e.g.
CVS:
cat
___ AAA ___ _ 代表空格 AAA前后都有三个空格 Result XML: BBB 相关推荐: 开放源代码的全文检索引擎Lucene(转载) Lucene学习笔记【2013-04-10更新】 搜索篇:lucene简单实例<二> LuceneInAction(第2版)_中文版 Lucene基本使用和代码实现 Lucene学习教程——Lucene介绍 Lucene 开源项目Lucene的架构详细解析----用软件构架分析的方法 推荐群组: lucene爱好者 更多相关推荐 Lucene 编程综合 理解Lucene系统结构的另一个方式是去探讨其中数据流的走向,并以此摸清楚Lucene系统内部的调用时序。在此基础上,我们能够更加深入的理解Lucene的系统结构组织,以方便以后在Lucene系统上的开发工作。这部分的分析,是深入Lucene系统的钥匙,也是进行重写的基础。 我们来看看在Lucene系统中的主要的数据流以及它们之间的关系图 上图很好的表明了Lucene在内部的数据流组织情况,并且沿着数据流的方向我们也可以对与Lucene内部的执行时序有一个清楚的了解。 现在将图中的涉及到的流的类型与各个逻辑对应系统的相关部分的关系说明一下。 图中共存在4种数据流,分别是文本流、token流、字节流与查询语句对象流。文本流表示了对于索引目标和交互控制的抽象,即用文本流表示了将要索引的文件,用文本流向用户输出信息;在实际的实现中,Lucene中的文本流采用了UCS-2作为编码,以达到适应多种语言文字的处理的目的。 Token流是Lucene内部所使用的概念,是对传统文字中的词的概念的抽象,也是Lucene在建立索引时直接处理的最小单位;简单的讲Token就是一个词和所在域值的组合,后面在叙述文件格式时也将继续涉及到token,这里不详细展开。 字节流则是对文件抽象的直接操作的体现,通过固定长度的字节(Lucene定义为8比特位长,后面文件格式将详细叙述)流的处理,将文件操作解脱出来,也做到了与平台文件系统的无关性。 查询语句对象流则是仅仅在查询语句解析时用到的概念,它对查询语句抽象,通过类的继承结构反映查询语句的结构,将之传送到查找逻辑来进行查找的操作。 图中的涉及到了多种逻辑,基本上直接对应于系统某一模块,但是也有跨模块调用的问题发生,这是因为Lucene的重用程度非常好,因此很多实现直接调用了以前的工作成果,这在某种程度上其实是加强了模块耦合性,但是也是为了避免系统的过于庞大和不必要的重复设计的一种折衷体现。 词法分析逻辑对应于org.apache.lucene.analysis部分。 查询语句语法分析逻辑对应于org.apache.lucene.queryParser部分,并且调用了org.apache.lucene.analysis的代码。查询结束之后向评分排序逻辑输出token流,继而由评分排序逻辑处理之后给出文本流的结果,这一部分的实现也包含在了org.apache.lucene.search中。 索引构建逻辑对应于org.apache.lucene.index部分。 索引查找逻辑则主要是org.apache.lucene.search,但是也大量的使用了org.apache.lucene.index部分的代码和接口定义。存储抽象对应于org.apache.lucene.store。 没有提到的模块则是做为系统公共基础设施存在。 Lucene 数据流分析 http://www.ossez.com/forum.php?mod=viewthread&tid=11988&fromuid=426 相关推荐: lucene ssh框架项目实例:Lucene中文分词、分页查询 Lucene中文分词、分页查询、高亮显示 Lucene入门,小例子,笔记 一个Lucene3.0.3 高亮显示实例 全文检索 使用最新lucene3.0.3+最新盘古分词 pangu2.4 .net 实例 lucene3.0 Lucene实现索引和查询 Apache Lucene 3.x推荐教程 推荐群组: lucene爱好者 更多相关推荐 搜索引擎 Lucene 一个没有索引,直接使用高亮显示的实例:使用的时候请注意lucene与highlighter的版本。本实例使用的是: lucene3.0.3 lucene-highlighter-3.0.3 package com.hpjianhua.lucene; import java.io.StringReader; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Query; import org.apache.lucene.search.Scorer; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.util.Version; import org.wltea.analyzer.lucene.IKAnalyzer; /** * * @author hpjianhua * @version 1.0 * */ public class HighlighterTester { public static void main(String[] args) throws Exception { String text = "flower:A man can fail many times, but he isn't a failure until he begins to blame somebody else.flower wirter"; QueryParser parser = new QueryParser(Version.LUCENE_30, "field", new StandardAnalyzer(Version.LUCENE_30)); Query query = parser.parse("flower"); SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("",""); Highlighter highlight = new Highlighter(formatter, new QueryScorer(query)); TokenStream tokens = new IKAnalyzer().tokenStream("field", new StringReader(text)); System.out.println(highlight.getBestFragment(tokens, text)); } } output: flower:A man can fail many times, but he isn't a failure until he begins to blame somebody jar包见下面: 相关推荐: Lucene简单入门示例 lucene3.0学习笔记2-(再学Lucene的简单例子) lucene为什么查不出结果 LuceneInAction(第2版)_中文版 Lucene 字符编码问题 字符编码及空白汉字占位符 lucene高亮显示 Lucene的基础知识 推荐群组: lucene爱好者 更多相关推荐 Java综合 Lucene 现在如果一个txt文件中包含了ANSI编码的文本文件和Unicode编码的文本文件,如下图这种:
当用Lucene来建索引搜索时,这个文档中的内容是搜索不到的。 需要搜索的文本在附件中提供。 创建索引的源代码: import java.io.File; import java.io.FileReader; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class IndexFiles { // 主要代码 索引docDir文件夹下文档,索引文件在INDEX_DIR文件夹中 @SuppressWarnings("deprecation") public static void main(String[] args) { File indexDir = new File("e:\\Lucene\\index"); File docDir = new File("e:\\Lucene\\content"); try { // 索引器 IndexWriter standardWriter = new IndexWriter(FSDirectory .open(indexDir), new StandardAnalyzer( Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED); // 不建立复合式索引文件,默认的情况下是复合式的索引文件 standardWriter.setUseCompoundFile(false); String[] files = docDir.list(); for (String fileStr : files) { File file = new File(docDir, fileStr); if (!file.isDirectory()) { Document doc = new Document(); // 文件名称,可查询,不分词 String fileName = file.getName().substring(0, file.getName().indexOf(".")); System.out.println("fileName:"+fileName); doc.add(new Field("name", fileName, Field.Store.YES, Field.Index.NOT_ANALYZED)); // 文件路径,可查询,不分词 String filePath = file.getPath(); doc.add(new Field("path", filePath, Field.Store.YES, Field.Index.NOT_ANALYZED)); // 文件内容,需要检索 doc.add(new Field("content", new FileReader(file))); standardWriter.addDocument(doc); } } standardWriter.optimize(); // 关闭索引器 standardWriter.close(); } catch (IOException e) { System.out.println(" caught a " + e.getClass() + "\n with message: " + e.getMessage()); } } } 搜索的源代码: import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.Searcher; import org.apache.lucene.search.TopScoreDocCollector; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; /** * 检索索引 */ public class SearchFiles { /** Simple command-line based search demo. */ @SuppressWarnings("deprecation") public static void main(String[] args) throws Exception { String index = "E:\\Lucene\\index"; String field = "content"; String queries = null; boolean raw = false; // 要显示条数 int hitsPerPage = 10; // searching, so read-only=true IndexReader reader = IndexReader.open( FSDirectory.open(new File(index)), true); // only Searcher searcher = new IndexSearcher(reader); Analyzer standardAnalyzer = new StandardAnalyzer(Version.LUCENE_CURRENT); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field, standardAnalyzer); while (true) { if (queries == null) // prompt the user System.out.println("Enter query: "); String line = in.readLine(); if (line == null || line.length() == -1) break; line = line.trim(); if (line.length() == 0) break; Query query = parser.parse(line); System.out.println("Searching for: " + query.toString(field)); doPagingSearch(in, searcher, query, hitsPerPage, raw, queries == null); } reader.close(); } public static void doPagingSearch(BufferedReader in, Searcher searcher, Query query, int hitsPerPage, boolean raw, boolean interactive) throws IOException { TopScoreDocCollector collector = TopScoreDocCollector.create( hitsPerPage, false); searcher.search(query, collector); ScoreDoc[] hits = collector.topDocs().scoreDocs; int end, numTotalHits = collector.getTotalHits(); System.out.println(numTotalHits + " total matching documents"); int start = 0; end = Math.min(hits.length, start + hitsPerPage); for (int i = start; i < end; i++) { Document doc = searcher.doc(hits[i].doc); String path = doc.get("path"); if (path != null) { System.out.println((i + 1) + ". " + path); } else { System.out .println((i + 1) + ". " + "No path for this document"); } } } } imjl 写道 提升标题的权重,,lucene的代码看setboost solr的更简单,直接在url中修改
谢谢你的回复. 现在的需要是这样,全部在标题命中关键字是需要排名靠前,同时这批全部命中标题的记录会再按记录的发布时间来去倒序排序的,所以需要使用全部命中标题的记录得到的score的值是一样的,所以如果简直的设置标题的setBoost的权重是不能保证全部命中关键字的记录的score都相等.所以也不会符合以上的需求了... 相关推荐: JE评论字终级版,JE评论框通用版插件,支持Firefox Chrome Opera IE10。beta新版放出,支持菊花文和边框文。 读文章《离职交接没事做, 弄个JE评论彩色字... 》有感,改进版,随机颜色和大小 离职交接没事做, 弄个JE评论彩色字... 用于Lucene的各中文分词比较 Lucene/Solr开发经验 某Java大佬在地表最强Java企业(阿里)面试总结 【遇见CUDA】要更快,请提高数据传输效率! 推荐群组: 电脑DIY 更多相关推荐 Lucene JavaEye solr['səulə] solr发音同 solar ['səulə]----馊了; lucene['lu:si:n] lucene的发音来源是Doug Cutting的妻子的 名字中的中间名.读做 ['lu:si:n] 备案! 相关推荐: 搜索篇:lucene的简单实例<一> 用lucene 搜索时出现Parser错误,望解!! lucene3.0学习笔记2-(再学Lucene的简单例子) Lucene 的特殊字符 处理 Lucene中的特殊字符 Lucene 特殊字符的问题 lucene中特殊字符的转译问题 JAVA基于Lucene实现建立索引以及检索 推荐群组: lucene爱好者 更多相关推荐 Java综合 Lucene 这是个郁闷的问题,今天遇到了,但在lucene中查询的关键字保护有特殊字符,譬如--,会出现如下异常: org.apache.lucene.queryParser.ParseException: Cannot parse '': Encountered " " at line 1, column 0. Was expecting one of: ... "+" ... "-" ... "(" ... "*" ... ... ... ... ... "[" ... "{" ... ... 解决方法: 使用 QueryParser的静态方法escape(string s),进行自动转义特殊字符后再进行关键字的查询 lucene的特殊字符保护了以下的字符: + - && || ! ( ) { } [ ] ^ " ~ * ? : 这个算法很不错,可以略作修改后,进行分布式的翻页查询,更深入的说,是一种mapreduce的实现基础 相关推荐: 基于最小堆(小根堆)的topn算法 Java最小堆实现 HashMap深度分析 基于lucene的搜索引擎总结 Lucene搜索引擎-搜索 Lucene系列之全局搜索引擎入门教程 使用Lucene开发简单的站内新闻搜索引擎(索引的搜索) 搜索引擎---Lucene 推荐群组: Pipboy 更多相关推荐 搜索引擎 Lucene 本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/723963 本博客已迁移到本人独立博客: http://www.yun5u.com/ 欢迎加入Heritrix群(QQ): 109148319 , 10447185 , Lucene/Solr群(QQ) : 118972724 通过Lucene搜索返回的是评分(Score)前N的结果,默认是前100.这里我将这段算法复制下来,具体请看注释,同时这段算法不依赖Lucene任何组件,可以直接运行。 /** * 在一对数中找出前N个大的数,采用二叉堆 * 模仿Lucene中的获得评分前N的DocumentID * * @author Administrator * */ public class LuceneFindTopN { private int[] heap; //存储数据 private int size; //已存数据个数,也代表指针位置 private int maxSize; //取前maxSize大的数 private int minElement; //数据中最小的元素 public LuceneFindTopN(int maxSize) { super(); this.maxSize = maxSize; heap=new int[maxSize+1]; size=0; minElement=0; } /** * 插入数据 * @param element * @return */ public boolean insert(int element){ if(size0&&element>top()){ //大于最小的元素才进入,并调整数据顺序 heap[1]=element; //替换头部元素(也就是最小的元素)为当前元素(因为当前元素比头部元素大) adjustTop(); //调整头部元素 return true; }else{ return false; } } /** * 存入数据 * @param element */ public void put(int element){ size++; heap[size]=element; upheap(); } /** * 返回top * @return */ public int top(){ if(size>0){ return heap[1]; }else{ return 0; } } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public final void upheap(){ int i=size; int node=heap[i]; int j=i>>>1; //父节点位置 while(j>0&&node>>1; //迭代父节点的父节点,以此类推 } heap[i]=node; //要插入的数据放入合适位置 } /** * 排放数据,从最小的元素开始排放,会删除该元素 * @return */ public int pop(){ if(size>0){ int result=heap[1]; //第一个元素作为结果返回,因为第一个元素最小 heap[1]=heap[size]; //第一个元素置为最大的元素 heap[size]=-1; //最大的元素清空 size--; //指针前移 downHeap(); return result; }else{ return -1; } } public final void adjustTop(){ downHeap(); } public void downHeap(){ int i = 1; int node = heap[i]; // 第一个元素,也就是刚插入的元素 int j = i << 1; // 第二个元素 int k = j + 1; // 第三个元素 if (k <= size && heap[k] 相关推荐: Lucene搜索数据库信息,一对多的数据如何存储(新手) 倒底该怎么写DAO的单元测试? 自己实现了一个较实用的Pojo(实体)基类 Lucene全文检索框架+Solr+ElasticSearch搜索引擎(Java高级必备.ES) Lucene3.0结果排序原理+操作+示例 lucene搜索结果排序问题 LuceneInAction(第2版)_中文版 推荐群组: 中文分词 更多相关推荐 企业应用 Lucene 这里先说明一下应用场景:对用户进行lucene搜索,而希望得到的结果排序有要求,具体如下: 现在假如有下面几条数据: 名字 年龄 地址 个人介绍 备注 user1 李四 19 江南大道 路过 与张三是同学 user2 张三 20 江南大道 张三的介绍 abc user3 王五 42 三三大道 abc 与李四是同事 user4 赵六 33 江南大道 张三峰是牛人呀 赵 上面几个用户信息全部生成索引,现在通过lucene搜索“张三”(在所有的字段中搜索) 会搜索出 user1(备注中出现张三),user2(名字是张三),user4(个人介绍中出现张三), 现在希望结果是user2,user4,user1这样的排序,也就是说得到的结果要求 名字包含“张三" 个人介绍包含”张三“ 备注包含”张三“ 而不是随便的从上到下user1,user2,user4 也就是说得到的结果集中希望名字匹配优先,然后是个人介绍,然后是备注,依照这样的顺序进行排序下来, 在这里来问一下各位大侠们,有没有什么好办法 ? 排序是和查询的query无关的。就你的例子,其实只是个select * from xx in (...)操作。 shijiyu 写道 如果输入了,则调用上面第1种或第4种方法(第三种方法虽然也包含filter条件,但是返回类型为void,肯定不行) 第三种方法也是可行的 自己好好看看 呵呵 不用看了,想起来了,对的,这个能用,呵呵,谢谢指正~~~ 相关推荐: Lucene入门实例。 开源全文搜索引擎框架JBOX-beta版发布 Lucene学习笔记【2013-04-10更新】 Lucene全文检索框架+Solr搜索引擎(2018版.Java) SSM整合进阶项目实战-个人博客系统 Lucene+Nutch搜索引擎开发(PDF电子书完整版) Lucene搜索引擎-搜索 【读书笔记】Lucene+nutch搜索引擎开发 推荐群组: lucene爱好者 更多相关推荐 Lucene 编程综合 有一个小小较完整的实例,详见说明.txt 见附件,解压密码: http://deepfuture.javaeye.com/ 相关推荐: 介绍一个PDF的生成方案 JA检测字符串编码并转换 MySQL全文检索中Like索引的实现 【判断字符串】【OO面向对象】Java判断字符串中的大写字母,小写字母,其它字母。 java字符串之判断java标识符 Java中的字符串(二)——检查特定字符串出现的次数 java字符串应用之18位身份证格式验证 java字符串应用之表达式解析器 推荐群组: lucene爱好者 更多相关推荐 OO 关于在Java中判断一个字符是否是中文,看到过一些方法,在这里抛砖引玉,提出来大家讨论下。1、转化为unicode,利用中文字符转化后双字节中首个字节不为0,而英文字符首字节为0.但是这样的话,可能会有别的国家字符也是双字符且首字符非0. 2、正则表达式判断。一到龥 3、 public boolean isChinesrChar(char ch) { int v = (int) ch; if(v>=19968 && v <= 171941) { return true; } else { return false; } } 4、 public boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { return true; } return false; } 仅为抛砖引玉,期待更多更好的意见和想法 相关推荐: 线程池示例代码,请大家多指教 『出错』DBCP的疑惑 Common Pool对象池的中断策略和ThreadPoolExecutor中断策略 玩转Linux:常用命令实例指南 一篇关于apache commons类库的详解 YOLOv4目标检测实战:训练自己的数据集 推荐群组: 高级语言虚拟机 更多相关推荐 OO 代码是前段时间看的(Commons Pool还是很容易理解的),昨天有时间就整理了下···原文见博客吧~ 对象池(对Apache Commons部分源码分析) 1,commons pool中的StatckObjectPool 和 ReferenceObjectPool等 本身设计的确实不允许"脏"对象的外围的activate(), passivate()充当了"清理"工作.. 2,如果pool的_maxSleeping阀值设置不当的话,在多线程APP下确实会导致堵塞...上限阀值和下限阀值很重要吧... 3,另外commons提供了一个ReferenceObjectPool,这种的好处在于内存不足时,GC无条件回收pool中的空闲对象,.这样资源可适当得到利用..不过pool中总要有一定量的闲对象,不可能每次都new吧。 4,commons中,是borrow()时,如果pool中没有空闲obj的时候,就创建新的obj,当然这个新对象是无状态的,所以建立在pool存储也需要建立在"无状态对象"的基本之上... 什么时候不要池化? 采用对象池化的本意,是要通过减少对象生成的次数,减少花在对象初始化上面的开销,然而池化处理本身也要付出代价,因此,并非任何情况下都适合采用对象池化。 Dr. Cliff Click在JavaOne 2003上发表的《Performance Myths Exposed》中测试表明: 1#类似Point这样的轻量级对象,进行池化处理后,性能反而下降. 2#类似Point这样的轻量级对象,进行池化处理后,性能反而下降. 3#类似JPanel\Connection这样的重量级对象,进行池化处理后,性能有所上升,可以考虑池化。 Commons的几个功能方面: 1,pool的每个进出object都进行类型检查 2,提供了一个线程安全的版本. 3,对当前active object和sleeping object的控制 4,对object的获取和释放的时间控制 5,容错处理 设计结构: 1,PoolableObjectFactory用于管理被池化的对象的产生、激活、挂起、校验和销毁; 2,ObjectPool用于管理要被池化的对象的借出和归还,并通知PoolableObjectFactory完成相应的工作; 设计重点: 1,池用某个容器存储对象(如Stack,List等)。 2,池中的每个对象是“干净”对象,或者说每一个从池中读取的对象都是一样初始化的对象(可取个别名为“裸对象”)。 3,对象<-->裸对象 由外围的Factory来处理。 4,接口方式为:ObjectPool <-- BaseObjectPool <--StackObjectPool 接口设计代码(对原设计有做简化): 清单: 以下是CommonsPool的接口,也就是最抽象的一层; 1、ObjectPool.java(pool的基本接口) 2、PoolableObjectFactory.java(Factory的基本接口) #######################ObjectPool.java############### package pools.inter; import java.util.NoSuchElementException; import pools.impl.pool.BaseObjectPool; /** * A pooling interface. * * * @author Rodney Waldhoff * @author Sandy McArthur * @since Pool 1.0 */ public interface ObjectPool { // 从池中拿裸对象 Object borrowObject() throws Exception, NoSuchElementException, IllegalStateException; // 返回给池 void returnObject(Object obj) throws Exception; // 销毁对象,需要Factory(因为设计Factory就是负责对象处理等) void invalidateObject(Object obj) throws Exception; // 利用Factory创建一个新对象 void addObject() throws Exception, IllegalStateException, UnsupportedOperationException; // 获得池中对象个数 int getNumIdle() throws UnsupportedOperationException; // 获取池外活动的对象个数 int getNumActive() throws UnsupportedOperationException; // 清空池中对象,就是把所有对象丢给Factory来销毁 void clear() throws Exception, UnsupportedOperationException; // 关闭池,但不销毁对象 void close() throws Exception; void setFactory(PoolableObjectFactory factory) throws IllegalStateException, UnsupportedOperationException; } #######################PoolableObjectFactory.java############### public interface PoolableObjectFactory { Object makeObject() throws Exception; void destroyObject(Object obj) throws Exception; boolean validateObject(Object obj); void activateObject(Object obj) throws Exception; void passivateObject(Object obj) throws Exception; } 实现设计: 清单: 1\BaseObjectPool.java 2\SoftReferenceObjectPool.java 3\StackObjectPool.java 以下是一个抽象类而已,关联的是上面的那个接口,注释同上 ######################BaseObjectPool.java################# public abstract class BaseObjectPool implements ObjectPool { public abstract Object borrowObject() throws Exception; public abstract void returnObject(Object obj) throws Exception; public abstract void invalidateObject(Object obj) throws Exception; public int getNumIdle() throws UnsupportedOperationException { return -1; } public int getNumActive() throws UnsupportedOperationException { return -1; } public void clear() throws Exception, UnsupportedOperationException { throw new UnsupportedOperationException(); } public void addObject() throws Exception, UnsupportedOperationException { throw new UnsupportedOperationException(); } public void close() throws Exception { closed = true; } public void setFactory(PoolableObjectFactory factory) throws IllegalStateException, UnsupportedOperationException { throw new UnsupportedOperationException(); } protected final boolean isClosed() { return closed; } protected final void assertOpen() throws IllegalStateException { if (isClosed()) { throw new IllegalStateException("Pool not open"); } } /** Whether or not the pool is closed */ private volatile boolean closed = false; } ######################SoftReferenceObjectPool.java############# 一个弱引用对象池的实现类,这个对象池的特点是内存不足时,GC无条件回收池中的对象. public class SoftReferenceObjectPool extends BaseObjectPool implements ObjectPool { public static int DEFAULT_INIT_SLEEPING_CAPACITY; public static int DEFAULT_MAX_SLEEPING; public SoftReferenceObjectPool() { _pool = new ArrayList(); // 能看出来,池中的对象是用List数据结构来存储的 _factory = null; } public SoftReferenceObjectPool(PoolableObjectFactory factory) { _pool = new ArrayList(); _factory = factory; } public SoftReferenceObjectPool(PoolableObjectFactory _factory2, int sleeping, int capacity) { // TODO Auto-generated constructor stub } public synchronized Object borrowObject() throws Exception { assertOpen(); Object obj = null; boolean newlyCreated = false; while(null == obj) { if(_pool.isEmpty()) { if(null == _factory) { throw new NoSuchElementException(); } else { newlyCreated = true; obj = _factory.makeObject(); } } else { SoftReference ref = (SoftReference)(_pool.remove(_pool.size() - 1)); obj = ref.get(); ref.clear(); // prevent this ref from being enqueued with refQueue. } if (null != _factory && null != obj) { try { _factory.activateObject(obj); if (!_factory.validateObject(obj)) { throw new Exception("ValidateObject failed"); } } catch (Throwable t) { try { _factory.destroyObject(obj); } catch (Throwable t2) { // swallowed } finally { obj = null; } if (newlyCreated) { throw new NoSuchElementException( "Could not create a validated object, cause: " + t.getMessage()); } } } } _numActive++; return obj; } public synchronized void returnObject(Object obj) throws Exception { boolean success = !isClosed(); if (_factory != null) { if(!_factory.validateObject(obj)) { success = false; } else { try { _factory.passivateObject(obj); } catch(Exception e) { success = false; } } } boolean shouldDestroy = !success; _numActive--; if(success) { _pool.add(new SoftReference(obj, refQueue)); } notifyAll(); // _numActive has changed if (shouldDestroy && _factory != null) { try { _factory.destroyObject(obj); } catch(Exception e) { // ignored } } } public synchronized void invalidateObject(Object obj) throws Exception { _numActive--; if (_factory != null) { _factory.destroyObject(obj); } notifyAll(); // _numActive has changed } /** * Create an object, and place it into the pool. * addObject() is useful for "pre-loading" a pool with idle objects. */ public synchronized void addObject() throws Exception { assertOpen(); if (_factory == null) { throw new IllegalStateException("Cannot add objects without a factory."); } Object obj = _factory.makeObject(); boolean success = true; if(!_factory.validateObject(obj)) { success = false; } else { _factory.passivateObject(obj); } boolean shouldDestroy = !success; if(success) { _pool.add(new SoftReference(obj, refQueue)); notifyAll(); // _numActive has changed } if(shouldDestroy) { try { _factory.destroyObject(obj); } catch(Exception e) { // ignored } } } /** Returns an approximation not less than the of the number of idle instances in the pool. */ public synchronized int getNumIdle() { pruneClearedReferences(); return _pool.size(); } public synchronized int getNumActive() { return _numActive; } /** * Clears any objects sitting idle in the pool. */ public synchronized void clear() { if(null != _factory) { Iterator iter = _pool.iterator(); while(iter.hasNext()) { try { Object obj = ((SoftReference)iter.next()).get(); if(null != obj) { _factory.destroyObject(obj); } } catch(Exception e) { // ignore error, keep destroying the rest } } } _pool.clear(); pruneClearedReferences(); } public void close() throws Exception { super.close(); clear(); } public synchronized void setFactory(PoolableObjectFactory factory) throws IllegalStateException { assertOpen(); if(0 < getNumActive()) { throw new IllegalStateException("Objects are already active"); } else { clear(); _factory = factory; } } private void pruneClearedReferences() { Reference ref; while ((ref = refQueue.poll()) != null) { try { _pool.remove(ref); } catch (UnsupportedOperationException uoe) { // ignored } } } /** My pool. */ private List _pool = null; /** My {@link PoolableObjectFactory}. */ private PoolableObjectFactory _factory = null; private final ReferenceQueue refQueue = new ReferenceQueue(); /** Number of active objects. */ private int _numActive = 0; } ########################StackObjectPool.java############# 以下是一个Stack容器的对象池 public class StackObjectPool extends BaseObjectPool implements ObjectPool { public StackObjectPool() { this((PoolableObjectFactory)null,DEFAULT_MAX_SLEEPING,DEFAULT_INIT_SLEEPING_CAPACITY); } public StackObjectPool(int maxIdle) { this((PoolableObjectFactory)null,maxIdle,DEFAULT_INIT_SLEEPING_CAPACITY); } public StackObjectPool(int maxIdle, int initIdleCapacity) { this((PoolableObjectFactory)null,maxIdle,initIdleCapacity); } public StackObjectPool(PoolableObjectFactory factory) { this(factory,DEFAULT_MAX_SLEEPING,DEFAULT_INIT_SLEEPING_CAPACITY); } public StackObjectPool(PoolableObjectFactory factory, int maxIdle) { this(factory,maxIdle,DEFAULT_INIT_SLEEPING_CAPACITY); } public StackObjectPool(PoolableObjectFactory factory, int maxIdle, int initIdleCapacity) { _factory = factory; _maxSleeping = (maxIdle < 0 ? DEFAULT_MAX_SLEEPING : maxIdle); int initcapacity = (initIdleCapacity < 1 ? DEFAULT_INIT_SLEEPING_CAPACITY : initIdleCapacity); _pool = new Stack(); _pool.ensureCapacity( initcapacity > _maxSleeping ? _maxSleeping : initcapacity); } public synchronized Object borrowObject() throws Exception { assertOpen(); Object obj = null; boolean newlyCreated = false; while (null == obj) { if (!_pool.empty()) { obj = _pool.pop(); } else { if(null == _factory) { throw new NoSuchElementException(); } else { obj = _factory.makeObject(); newlyCreated = true; if (obj == null) { throw new NoSuchElementException("PoolableObjectFactory.makeObject() returned null."); } } } if (null != _factory && null != obj) { try { _factory.activateObject(obj); if (!_factory.validateObject(obj)) { throw new Exception("ValidateObject failed"); } } catch (Throwable t) { try { _factory.destroyObject(obj); } catch (Throwable t2) { // swallowed } finally { obj = null; } if (newlyCreated) { throw new NoSuchElementException( "Could not create a validated object, cause: " + t.getMessage()); } } } } _numActive++; return obj; } public synchronized void returnObject(Object obj) throws Exception { boolean success = !isClosed(); if(null != _factory) { if(!_factory.validateObject(obj)) { success = false; } else { try { _factory.passivateObject(obj); } catch(Exception e) { success = false; } } } boolean shouldDestroy = !success; _numActive--; if (success) { Object toBeDestroyed = null; if(_pool.size() >= _maxSleeping) { shouldDestroy = true; toBeDestroyed = _pool.remove(0); // remove the stalest object } _pool.push(obj); obj = toBeDestroyed; // swap returned obj with the stalest one so it can be destroyed } notifyAll(); // _numActive has changed if(shouldDestroy) { // by constructor, shouldDestroy is false when _factory is null try { _factory.destroyObject(obj); } catch(Exception e) { // ignored } } } public synchronized void invalidateObject(Object obj) throws Exception { _numActive--; if (null != _factory) { _factory.destroyObject(obj); } notifyAll(); // _numActive has changed } public synchronized int getNumIdle() { return _pool.size(); } public synchronized int getNumActive() { return _numActive; } /** * Clears any objects sitting idle in the pool. */ public synchronized void clear() { if(null != _factory) { Iterator it = _pool.iterator(); while(it.hasNext()) { try { _factory.destroyObject(it.next()); } catch(Exception e) { // ignore error, keep destroying the rest } } } _pool.clear(); } public void close() throws Exception { super.close(); clear(); } public synchronized void addObject() throws Exception { assertOpen(); if (_factory == null) { throw new IllegalStateException("Cannot add objects without a factory."); } Object obj = _factory.makeObject(); boolean success = true; if(!_factory.validateObject(obj)) { success = false; } else { _factory.passivateObject(obj); } boolean shouldDestroy = !success; if (success) { Object toBeDestroyed = null; if(_pool.size() >= _maxSleeping) { shouldDestroy = true; toBeDestroyed = _pool.remove(0); // remove the stalest object } _pool.push(obj); obj = toBeDestroyed; // swap returned obj with the stalest one so it can be destroyed } notifyAll(); // _numIdle has changed if(shouldDestroy) { // by constructor, shouldDestroy is false when _factory is null try { _factory.destroyObject(obj); } catch(Exception e) { // ignored } } } public synchronized void setFactory(PoolableObjectFactory factory) throws IllegalStateException { assertOpen(); if(0 < getNumActive()) { throw new IllegalStateException("Objects are already active"); } else { clear(); _factory = factory; } } /** The default cap on the number of "sleeping" instances in the pool. */ public static final int DEFAULT_MAX_SLEEPING = 8; public static final int DEFAULT_INIT_SLEEPING_CAPACITY = 4; /** My pool. */ protected Stack _pool = null; /** My {@link PoolableObjectFactory}. */ protected PoolableObjectFactory _factory = null; /** The cap on the number of "sleeping" instances in the pool. */ protected int _maxSleeping = DEFAULT_MAX_SLEEPING; /** Number of object borrowed but not yet returned to the pool. */ protected int _numActive = 0; } 工厂实现代码: 清单: 1、BasePoolableObjectFactory.java 2\SoftReferencePoolFactory.java 3\StackObjectPoolFactory.java #############################BasePoolableObjectFactory.java########## public abstract class BasePoolableObjectFactory implements PoolableObjectFactory { public abstract Object makeObject() throws Exception; /** No-op. */ public void destroyObject(Object obj) throws Exception { } /** * This implementation always returns true. * @return true */ public boolean validateObject(Object obj) { return true; } /** No-op. */ public void activateObject(Object obj) throws Exception { } /** No-op. */ public void passivateObject(Object obj) throws Exception { } } #########################SoftReferencePoolFactory.java########### public class SoftReferencePoolFactory implements PoolableObjectFactory { /** * Create a new StackObjectPoolFactory. * * @see StackObjectPool#StackObjectPool() */ public SoftReferencePoolFactory() { this((PoolableObjectFactory)null,StackObjectPool.DEFAULT_MAX_SLEEPING,StackObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY); } /** * Create a new StackObjectPoolFactory. * * @param maxIdle cap on the number of "sleeping" instances in the pool. * @see StackObjectPool#StackObjectPool(int) */ public SoftReferencePoolFactory(int maxIdle) { this((PoolableObjectFactory)null,maxIdle,StackObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY); } /** * Create a new StackObjectPoolFactory. * * @param maxIdle cap on the number of "sleeping" instances in the pool. * @param initIdleCapacity - initial size of the pool (this specifies the size of the container, it does not cause the pool to be pre-populated.) * @see StackObjectPool#StackObjectPool(int, int) */ public SoftReferencePoolFactory(int maxIdle, int initIdleCapacity) { this((PoolableObjectFactory)null,maxIdle,initIdleCapacity); } /** * Create a new StackObjectPoolFactory. * * @param factory the PoolableObjectFactory used by created pools. * @see StackObjectPool#StackObjectPool(PoolableObjectFactory) */ public SoftReferencePoolFactory(PoolableObjectFactory factory) { this(factory,StackObjectPool.DEFAULT_MAX_SLEEPING,StackObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY); } /** * Create a new StackObjectPoolFactory. * * @param factory the PoolableObjectFactory used by created pools. * @param maxIdle cap on the number of "sleeping" instances in the pool. */ public SoftReferencePoolFactory(PoolableObjectFactory factory, int maxIdle) { this(factory,maxIdle,SoftReferenceObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY); } /** * Create a new StackObjectPoolFactory. * * @param factory the PoolableObjectFactory used by created pools. * @param maxIdle cap on the number of "sleeping" instances in the pool. * @param initIdleCapacity - initial size of the pool (this specifies the size of the container, it does not cause the pool to be pre-populated.) */ public SoftReferencePoolFactory(PoolableObjectFactory factory, int maxIdle, int initIdleCapacity) { _factory = factory; _maxSleeping = maxIdle; _initCapacity = initIdleCapacity; } public ObjectPool createPool() { return new SoftReferenceObjectPool(_factory,_maxSleeping,_initCapacity); } protected PoolableObjectFactory _factory = null; protected int _maxSleeping = SoftReferenceObjectPool.DEFAULT_MAX_SLEEPING; protected int _initCapacity = SoftReferenceObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY; public void activateObject(Object obj) throws Exception { // TODO Auto-generated method stub } public void destroyObject(Object obj) throws Exception { // TODO Auto-generated method stub } public Object makeObject() throws Exception { // TODO Auto-generated method stub return null; } public void passivateObject(Object obj) throws Exception { // TODO Auto-generated method stub } public boolean validateObject(Object obj) { // TODO Auto-generated method stub return false; } } 附加实例: 另一人写的简单objectpool package com.thoughtworks.xstream.core.util; /** * A simple pool implementation. * * @author Jörg Schaible * @author Joe Walnes */ public class Pool { public interface Factory { public Object newInstance(); } private final int initialPoolSize; private final int maxPoolSize; private final Factory factory; private transient Object[] pool; private transient int nextAvailable; private transient Object mutex = new Object(); public Pool(int initialPoolSize, int maxPoolSize, Factory factory) { this.initialPoolSize = initialPoolSize; this.maxPoolSize = maxPoolSize; this.factory = factory; } public Object fetchFromPool() { Object result; synchronized (mutex) { if (pool == null) { pool = new Object[maxPoolSize]; for (nextAvailable = initialPoolSize; nextAvailable > 0; ) { putInPool(factory.newInstance()); } } while (nextAvailable == maxPoolSize) { try { mutex.wait(); } catch (InterruptedException e) { throw new RuntimeException("Interrupted whilst waiting " + "for a free item in the pool : " + e.getMessage()); } } result = pool[nextAvailable++]; if (result == null) { result = factory.newInstance(); putInPool(result); ++nextAvailable; } } return result; } protected void putInPool(Object object) { synchronized (mutex) { pool[--nextAvailable] = object; mutex.notify(); } } private Object readResolve() { mutex = new Object(); return this; } } 无明 写道 这得要database支持。本来是用rest模式调用自己的controller,由controller去发送sql,这么干就变成直接把database变成controller了。这可是走回把业务逻辑在database端实现的老路啊。 将需要的sql put 到指定资源即可. database并没有变成controller 仅仅是单纯的数据库 执行sql返回结果. 在rest中没有controller 只有资源和向资源发出的请求. 我好象听说mysql也在开发rest api. 本来想放弃rest 结果发现了这个, 这样rest几乎可以完成99.99%的应用了 dlee 写道 HTTP认证的实现方法在《Ajax模式与最佳实践》的第5章:置换模式中有详细的介绍。 我一再提到这本书,并不是为了多卖几本书增加我本人的收入。而是因为这本书实际上就是目前国内已出版的关于REST架构设计最为详尽深入的专著。这本书同时对于深入理解HTTP的能力也非常有帮助,强烈建议你买一本来阅读。 这本书的勘误在: http://blog.csdn.net/bvbook/archive/2007/04/30/1593604.aspx 现在外边旅行带书会增加重量不方便. 要是有电子图书下载就好了 相关推荐: 业务流程编排器学习笔记 (2) —— 调用JAVA服务 大型企业信息化中的BPM和SOA实战 BPEL为啥没多少人关注呢? 微服务与微服务架构的主要思想和原则 值得关注的开源软件推荐 【学习笔记】Java 开发手册(嵩山版) XML系列——(一)基础知识 EveryDay笔记 推荐群组: 系统架构与架构应用 更多相关推荐 SOA 业务流程编排器的基本环境: l 开发环境:WID(集成开发工具) l 运行环境:WPS(业务流程应用服务器) 概念 WSDL :使用 XML 语言描述 WS 的接口。 SCA 规范:由一组能提供 WS 的组件组成的应用模块,每个组件都由 WSDL 描述,该模块封装在 J2EE 的企业应用中。 业务流程:使用 BPEL 规范(关于流程有很多规范,但是 For WS 的目前只有 BPEL ,也是符合 SCA 的规范,即可以自主暴露为一个服务组件)。 BPEL :符合 SCA 的一类组件,按照一定的顺序执行的一系列的活动。 BPEL 要素:活动元素、控制线、变量(贯穿在整个 BPEL 中)、伙伴连接(调用其他 SCA 组件)、相关集(高级部分讲解)。 介绍 用户输入一个名字,返回“ Hello World ”。 架构 一个独立的流程。 流程 三个活动: l Receive :流程的起点,接收外部的消息; l Snippet :一段 Java 代码; l Reply :流程的终点,返回结果。 一个变量:保存消息。 开发(使用 WID ) 1. 创建一个 Module 项目( Module 项目即是一个 SCA 模块, WID 会自动创建相关的 EAR 、 EJB 和 WEB 项目),项目名称: HelloWorld 。 2. 创建一个业务流程文件(没有创建 WSDL , WID 会提供一个输入、输出都是字符串的缺省 WSDL ,实际开发中需要事先创建 WSDL ,如果参数是自定义的对象,也需要事先创建),流程名 HelloWorldProcess ,文件夹 bpc/sample ,使用缺省的命名空间。 3. 在流程中拖拽一个 Snippet 活动,在属性视图的详细卡中,切换到 Java ,输入如下代码: System.out.println("Hello, " + Input1); // Input1 是流程中的全局变量,在所有活动中都可以使用; Input1 = "Hello World!"; // 4. 打开装配图,将创建的业务流程拖入到装配图中。 5. 将 WID 自动生成的 EAR 项目 HelloWorldApp 部署到 WPS 中。 运行(使用 WPS ) 1. 打开浏览器,输入 http://localhost:9080/bpc/ ,打开业务流程资源管理器。 2. 在流程模版中,选中 HelloWorldProcess ,并启动实例。 3. 在输入框,输入 Tom ,并提交。 4. 查看页面输出: Hello World! 5. 查看控制台输出: Hello, Tom 相关推荐: JavaSE6.0 Web Service学习笔记 请讨论一下Web Service开发的两种模式:wsdl first vs. java first CODE first or WSDL frist CodeFirst Or ContractFirst 初步理解一下:SOA, SOAP, Web Service, WSDL等 Contract-First, the key of Service-Oriented 推荐群组: WebServices 更多相关推荐 SOA 如果要构建一个Web Services,CXF提供了两种构建方式一个是Code First,另一个WSDL First。那什么是Code First,什么又是WSDL First呢? 大家知道,如果我们要将一个服务发布一个WebService,我们需要定义这个服务所支持的方法,以及调用这些方法所提供的参数并将其转化成为WSDL,供其它的客户端调用。Code First是第一代的WebService开发工具所提供的构建WebService的一种方式。以Java为例,我们可以通过Interface定义一组Web服务所提供的方法,Code First就是通过获取这个Interface的信息构建出Web Services 所需要的信息,并在这些信息的基础上生成WSDL。 而WSDL First就是通过WSDL文件,生成相关的Aritifacts,例如有相关的接口以及实现的代码框架等,这CORBA开发一样,先使用IDL描述我们的CORBA服务,通过IDL2XXX生成相关的接口和实现框架(屏蔽了网络传输中Marshal和Unmarshal的操作)。 这两种构建Web Services各有特点,适合在不同的场景。 接触过WSDL的朋友应该都有这样的感觉,WSDL虽然是用XML来进行描述的,但是如果让你在不借助任何工具的情况下写一个正确的WSDL,或者是改正一个错误的WSDL是很难的。Code First可以说是为我们提供了一个不错的选择。 但是Web Services的Best Practies并不推荐Code First这一Web Services的构建方式。原因是什么呢? 这是因为我们在使用Code First构建方式时很少考虑到Web Services之间的交互是以文档方式进行(这样可以大大提高Web Services的互交互性),如果是使用Code First来构建WSDL信息,在描述描述交互信息的XML Schema都是以我们的Code中定义的类型信息来生成的,这样就可能会暴露一些比较细粒度的信息。同时大家知道不同的语言(C++,Java, C#,PHP)对XML Schema映射是各不相同的,如果我们Code中定义的类型很特殊,就可能产生出一个不能互操作的现象。 所以Best Practies建议你在创建Web Services从交互的消息Schema入手,构建一个中间层来提供一个比较粗粒度的描述,这样可以比较好的解决Web Services的互交互问题。 相关推荐: CXF 2.0.1 发布 CXF 2.0.2 发布了 CXF 2.0 发布了 Ogre 2.0 doc (slides) - Updated 1st dec 2012 Eclipse STP(SOA Tools Platform)安装 java中最常用jar包的用途 常用jar包用途 推荐群组: webservice讨论组 更多相关推荐 SOA 经过4个月的努力,CXF 2.0 RC发布了, 我们会在后续的几个月中推出2.0正式版。 大家可以 在此下载 . 下面是Mail List中的公告。 The Apache CXF team is proud to announce the availability of the 2.0-incubator-RC release! Release notes and download information can be found here: Apache CXF is a Java open source service development framework. This release contains the following features: * JAX-WS frontend - Apache CXF uses/implements the JAX-WS API's but makes no representation that this release is JAX-WS compliant. * Java2WSDL and WSDL2Java tools and Maven plugin * SOAP 1.1 & 1.2, XML and RESTful HTTP bindings * JAXB 2.0 Databinding support * WSDL 1.1 support * WS-Addressing, WS-ReliableMessaging, WS-Security, and WS-Policy support * MTOM attachment support * HTTP, Servlet, JMS and Local Transports * Simple POJO service frontend * Javascript frontend * JBI Service Engine. CXF services can be deployed into any JBI compliant container (ServiceMix or OpenESB) * JCA 1.0 support, J2EE application can integrate with legacy application through JCA 1.0 support in CXF * Spring Support * JSON support with Jettison * Many other bug fixes and feature enhancements For more information see: * Website: http://incubator.apache.org/cxf/ * Release Notes: http://incubator.apache.org/cxf/apache-cxf-20-rc-incubating-release-notes.html * Mailing lists: http://incubator.apache.org/cxf/mailing-lists.html If you have feedback, questions or would like to get involved in the CXF project please join the mailing lists and let us know your thoughts. The Apache Incubator CXF Team "我们都在面向接口编程, 我们的程序不依赖于哪个具体实现。 我们的程序架构就是面向服务的(SOA)。"programming to interface != SOA 相关推荐: Axis2/C 基础入门 这套系统的框架该如何选择? 使用Axis2快速开发web服务 Web service框架 论SOA架构的几种主要开发方式 SpringBoot2.x系列教程78--Web Service详细讲解 WebService编程(1:Axis;2:Axis2/XFire;3:CXF;4:jdk6) 推荐群组: WebServices 更多相关推荐 SOA 我也明白web services是基于标准的只要对方发送SOAP,你接收并且解析就ok了 但是axis2框架里边,生产服务器端代码有一种使用AXIOM的方式,服务器端接收的是OMElement对象,返回的也是OMElement对象,那我的客户端,非要发送这个对象和解析这个对象才行? 那还存在web services的跨语言和平台嘛? 最近开始搞这个东西,遇到这个一直不解 如果项目中客户端是C++或者。net写成的,服务器端是axis2使用AXIOM方法生产的,要如何? 希望高手们解惑! 相关推荐: 关于基于XFire的webservice实现和调用的疑惑 [提问]在spring怎样配置多个cfg.xml? 在bo和dao之间传什么好? AJAX为何一定要用XML? SOA系列文章(一)Web服务中使用SOA方案 SOA系列文章之(三):在Web服务中使用SOA方案 WebService与SOA的实现 SOA (面向服务的体系结构) 推荐群组: D语言 更多相关推荐 SOA 参数是以xml的形式传递的,知道xml schema,能否通过一定的方法,获得具体的xml nodes,谢谢 相关推荐: 手把手教你用axis创建自己的webservice(五) 手把手教你用axis创建自己的webservice(三) 手把手教你用axis创建自己的webservice(一) Axis创建自己的WebService--Step by Step (转)手把手教你用axis创建自己的webservice 手把手教你用axis创建自己的webservice(一) Axis2(WebService)经典教程 推荐群组: JBPM @net 更多相关推荐 SOA 除了最后两个发布文件以外最重要的有两个文件,即 MobileBossSoapBindingImpl.java 和 MobileBossServiceLocator.java MobileBossSoapBindingImpl 代码如下: java 代码 1. java 代码 /** 2. * MobileBossSoapBindingImpl.java 3. * 4. * This file was auto-generated from WSDL 5. * by the Apache Axis 1.3 Oct 05, 2005 (05:23:37 EDT) WSDL2Java emitter. 6. */ 7. 8. package com.yy.ws; 9. 10. public class MobileBossSoapBindingImpl implements com.yy.ws.MobileBoss{ 11. public com.yy.ws.ServerResponse charge(com.yy.ws.ClientRequest in0) throws java.rmi.RemoteException { 12. return null ; 13. } 14. 15. } 我们需要在这个 webservice 中实现自己的业务方法!我们加入如下业务代码: java 代码 1. /** 2. * MobileBossSoapBindingImpl.java 3. * 4. * This file was auto-generated from WSDL 5. * by the Apache Axis 1.3 Oct 05, 2005 (05:23:37 EDT) WSDL2Java emitter. 6. */ 7. 8. package com.yy.ws; 9. 10. public class MobileBossSoapBindingImpl implements com.yy.ws.MobileBoss { 11. 12. /* 13. * 14. * implements the service methods 15. */ 16. public com.yy.ws.ServerResponse charge(com.yy.ws.ClientRequest req) 17. throws java.rmi.RemoteException { 18. String bizInfo = req.getPhoneNumber() + "/" + req.getOpType() + "/" 19. + req.getAmount(); 20. System.out.println(bizInfo); 21. System.out.println(req.getPhoneNumber() + "is charged successfully!" ); 22. ServerResponse res = new ServerResponse(); 23. res.setMessage(bizInfo); // save service informations. 24. res.setResultCode( 8888 ); // save result code. 25. return res; 26. } 27. 28. } 相关推荐: 关于 Web Service 的一些理解 如何接收SOAP消息 从银行WebService报文接口系统中,学习敏捷设计 基于Apache CXF构建SOA应用—任钢 SOA、WebService、UDDI、WSDL、SOAP、MSMQ概念.docx C#实现SOAP调用WebService C++的soap通信类 初步理解一下:SOA, SOAP, Web Service, WSDL等 推荐群组: Runtime 更多相关推荐 SOA 开发了一个web service,想查看client 与 service之间的具体传输的soap信息,包括头信息,希望大家指教啊! 相关推荐: 手把手教你用axis创建自己的webservice(五) 手把手教你用axis创建自己的webservice(三) 在axis中通过wsdd文件发布和卸载webservice WebService实例&调用本质&权限控制 WebService与SOA的实现 WebService的 http/soap调用 完整过程 SOA SOAP WebService 跨系统调用接口方案----WebService 推荐群组: D语言 更多相关推荐 SOA 最近在学WebService,可是当中碰到了问题,不是很明白,断点跟踪也不知道为什么环境是:axis1.4,jdk1.5,tomcat5.0 调用端的代码: ClientRequest req = new ClientRequest(); req.setUserName(form.getUserName()); req.setPassworld(form.getPassworld()); LoginService sl = new LoginServiceLocator(); Login mb = sl.getLogin();// default port ServerResponse resp = mb.validLogin(req); if (resp.getMessage() != null && resp.getMessage().size() != 0) { path = "success"; Vector result = resp.getMessage(); request.setAttribute("message",((java.util.Date)result.get(0)));//就是这里出错,我在WebService中设置的是util里的Date,但这里却报CLASS转换异常,我断点进去看了下,却是GregorianCalendar这个类型,请各位帮忙看看 } else { path = "error"; } SoapBindingImpl的代码: public com.cj.webservice.ServerResponse validLogin(com.cj.webservice.ClientRequest cr) throws java.rmi.RemoteException { ServerResponse sr = new ServerResponse(); Vector v = new Vector(); try{ if(cr.getUserName().equals("chenjun") && cr.getPassworld().equals("12345")) { v.add(new java.util.Date()); //这里设的是util的Date } sr.setMessage(v); }catch(Exception e){ e.printStackTrace(); } return sr; } 相关推荐: 用Axis创建的Webservice的集成与发布(下) 实战WebService II: SOAP篇(基于php) CXF WebService视频教程,自己录的(更新第7集 异步调用 2009.1.15)。 使用 PHP 开发基于 Web 服务的应用程序 从 PHP 脚本中访问企业应用程序 使用 PHP 5 SOAP 扩展访问 WebSphere Web 服务 21天通关Python(仅视频课) 学习MySQL这一篇就够了 推荐群组: phper 更多相关推荐 SOA java如何调用php用NuSOAP写的WebService,感觉跟axis的jws提供的webservice接口不一样。如localhost/test.php 这种方式 或者是localhost/test.php?WSDL 这种方式 有谁用过吗?指点一下~~ 相关推荐: XFire 最新生火指南(上) XFire令WebService如此简单 关于XFire来做Web Service, 传入Service接口方法中的Collection类的值丢失的问题 dubbo 用户指南 CXF笔记 计算机科学精彩帖子收集--JAVA和分布式专栏 DUBBO使用指南 DUBBO用户指南(笔记) 推荐群组: Spring之旅 更多相关推荐 SOA 请问如果用xfire,在service类的接口方法中,如果有传入参数或传出参数是自定义类型的, 那么相应的aegis文件应该怎么写?我在官网上查到,如果要有自定义类型的对象传到stub的接口方法中, 需要另外写一个ClassName.aegis.xml文件,放在这个自定义VO类的同一个包下的, 见: http://xfire.codehaus.org/Aegis+Binding , 不过介绍得不清楚, 连个完整的例子也没给出. 请问有谁做过的, 请给出个例子来参考一下.这个问题困扰了我两个星期了.谢谢大家. |