1 QQ?br />
2006-2-27 21:31:59 org.apache.coyote.http11.Http11Protocol init
严重: Error initializing endpoint
java.net.SocketException: Permission denied: listen failed
at java.net.PlainSocketImpl.socketListen(Native Method)
at java.net.PlainSocketImpl.listen(PlainSocketImpl.java:343)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at java.net.ServerSocket.<init>(ServerSocket.java:141)
at
org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49)
AQ?br /> 要改一下端口,在TOMCAT_HOME\conf\server.xml ?080Ҏ其他的?br /> 启动之前Q先?netstat -a 查一?port 是不
是已l被使用了。有可能被ORACLE或者打开的EclipseE序占用?br /> OracleOraHome92TNSListenerLISTENER1
2 QQ?br />
JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV
A: 原因lib中缺standard.jar和servlet-api.jar两个文gQ将两个文g加入用户库中?/p>
3 错误Q?br />
java.lang.NullPointerException
原因Q?发现 dao 实例?manage 实例{需要注入的东西没有被注?
解决Q这个时候,你应该查看日志文Ӟ默认是应用服务器?log 文gQ比?Tomcat 是 [Tomcat 安装目录 ]/logs Q你会发现提CZQ?
可能是:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml
org.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml
……………………….
Caused by: java.io.FileNotFoundException: src\hibernate.cfg.xml
可能是:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found
org.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found
然后你就知道原因是因为配|文件的解析Z错误Q这个通过 Web 面是看不出来的?
更多的是持久化媄文件出的错误;D了没有被解析Q当然你需要的功能无法用了?
4 错误Q?br />
StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage
或者:
type Status report
message Servlet action is not available
description The requested resource (Servlet action is not available) is not available.
原因Q??3
5 错误Q?br />
StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei
界面错误具体描述Q?br />
org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei
原因与解冻I
<Ҏ一>你的“html:”开头的标签没有攑֜一?lt;html:form>?br />
<Ҏ?gt;重新启动你的应用服务器,自动没有这个问题了
6 错误Q?br />
Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
原因与解冻I
因ؓHibernate ToolsQ或者Eclipse本n的Database ExplorerQ生?.hbn.xml工具中包含有catalog="***"Q?表示数据库名Uͼq样的属?该属性删除就可以?/p>
7 错误Q?br />
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)
原因与解冻I
Ҏ1 删除Set方的cascade
Ҏ2 解决兌关系后,再删?br />
Ҏ3 在many-to-one方增加cascade 但g能是none
最后一招:
查一下hashCode equals是否使用了id作ؓ唯一标示的选项了;我用uuid.hex时是没有问题的;但是用了nativeQ就不行了,怎么办?删除啊!
q个错误可以参见我的blog文章Q?br />
http://www.tkk7.com/crazycy/archive/2006/06/24/54939.html
8 错误Q?br />
exception javax.servlet.ServletException: BeanUtils.populat
root cause
java.lang.IllegalArgumentException:Cannot invoke ***Form.set*** - argument type mismatch
原因
q个问题很奇怪的_为啥说奇怪呢Q?br />
先说问题的原因:问题发生如下两种情况Q?br />
Form中是Datecd
上传文g?br />
Z么说奇怪呢Q主要针对Form是日期型的来说的Q因为我做过N多系lForm中都是用java.util.DateQ界面?lt;html:text property=”date”/>;都是没有问题的。所以第一ơ遇到这个错误时Q捣鼓了一个下午?br />
解决Q?br />
W一个问题:你把Date换成StringQ在Action中进行{换;当然转换要借助于SimpleDateFormateҎ?br />
W二个问题:记得在form中增加enctype="multipart/form-data" 呵呵
9 问题Q?br />
今天用Tomcat5.5.12Q发现原来很好用的系l不能用了,反复试发现面中不能包?taglibQ否则会出现以下提示Q?br />
HTTP Status 500 -type Exception report
Message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD "META-INF/tlds/struts-bean.tld" from JAR file "file:*****/WEB-INF/lib/struts.jar":
原因Q?br />
更新了工E用的lib文g夹下的jarQ发布时也发布了servlet.jar和jsp-api.jar?br />
解决Q?br />
把jsp-api.jar删除p册个问题了?/p>
10 问题QTomcat5.0.20中差错可以通过[Tomcat安装目录]/logs下的localhost_log.2006-07-14.txtcM的文件看具体的错误日志,但是?.5中就找不C
原因与解冻I
我把[Tomcat安装目录]/bin下的tomcat5w.exe的logging标签捣鼓了一会,然后重v有了?br />
原因具体说不准,用非安装版也有这个问题?/p>
最l解x案:
http://tomcat.apache.org/tomcat-5.5-doc/logging.html
11 错误Qjavax.servlet.ServletException: Cannot find bean page in any scope
原因 1Q检查程序,有可能是jsp中式到的bean在程序中没有q行刎ͼ所以不存在?/p>
12 错误QNo action instance for path /MenuManage could be created
原因Qsturts配置问题Q找不到Form对应的bean。检查jsp文g和struts-config.xml文g?/p>
13 错误Qorg.hibernate.hql.ast.QuerySyntaxException: address is not mapped. [from address]
原因Q检查对应bean中数据库名是否和hibernate定义的相同,注意大小写?/p>
14 错误Qorg.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter in class: com.xxx.perrsistence.Test, setter method of property: id
原因Q对应bean中setҎ数据cd和hibernate配置文g中定义的cd是否一?/p>
1.Rete 法 Q?/span>
Rete 在拉丁语中是 ”net?/span> Q有|络的意思?/span> RETE 法可以分ؓ两部分:规则~译Q?/span> rule compilation Q和q行时执行( runtime execution Q?/span>
~译法描述了规则如何在 Production Memory 中生一个有效的辨别|络。用一个非技术性的词来_一个L别网l就是用来过滤数据。方法是通过数据在网l中的传播来qo数据。在端节点会有很多匹配的数据。当我们着|络向下赎ͼ匚w的数据将会越来越。在|络的最底部是终端节点( terminal nodes Q。在 Dr Forgy ?/span> 1982 q的论文中,他描qC 4 U基本节点: root , 1-input, 2-input and terminal ?/span>
根节Ҏ所有的对象q入|络的入口。然后,从根节点立即q入?/span> ObjectTypeNode ?/span> ObjectTypeNode 的作用是使引擎只做它需要做的事情。例如,我们有两个对象集Q?/span> Account ?/span> Order 。如果规则引擎需要对每个对象都进行一个周期的评估Q那会浪费很多的旉。ؓ了提高效率,引擎只让匹?/span> object type 的对象通过到达节点。通过q种ҎQ如果一个应?/span> assert 一个新?/span> account Q它不会?/span> Order 对象传递到节点中。很多现?/span> RETE 实现都有专门?/span> ObjectTypeNode 。在一些情况下Q?/span> ObjectTypeNode 被用散列法进一步优化?/span>
1-input 节点通常被称?/span> AlphaNode ?/span> AlphaNodes 被用来评估字面条Ӟ literal conditions Q。虽Ӟ 1982 q的论文只提C相等条gQ指的字面上相等Q,很多 RETE 实现支持其他的操作。例如, Account.name = = “Mark? 是一个字面条件。当一条规则对于一U?/span> object type 有多条的字面条gQ这些字面条件将被链接在一赗这是说Q如果一个应?/span> assert 一?/span> account 对象Q在它能到达下一?/span> AlphaNode 之前Q它必须先满第一个字面条件。在 Dr. Forgy 的论文中Q他?/span> IntraElement conditions 来表q。上一D|到的 ObjectTypeNode 是一U特D的 AlphaNode ?/span>
2-input 节点通常被称?/span> BetaNode ?/span> BetaNodes 被用来对 2 个对象进行对比。这两个对象可以是同U类型,也可以是不同cd。一?/span> BetaNode 的左边输入通常?/span> a list of objects 。右边输入是 a single object 。在一些情况下Q一个规则引擎可能实C?/span> BetaNodes 来处?/span> existential conditions ( ‘与’条?/span> ) ?/span> negated conditional element Q‘非’条Ӟ。很多现代的 RETE 实现通过 hash ?/span> b-tree indexes 来优?/span> BetaNodes ?/span>
Terminal nodes 被用来表明一条规则已l匹配了它的所有条Ӟ conditions Q。在一些情况下Q一条带有“或”条件的规则可以有超q一个的 terminal node 。从一?/span> RETE |络的观Ҏ看,一条带有“或”条件的规则实际上只?/span> 2 个拥有很多共享节点的节点?/span>
RETE 法的第二个部分是运行时Q?/span> runtime Q。当一个应?/span> assert 一个对象,引擎数据传递到 root node 。从那里Q它q入 ObjectTypeNode q沿着|络向下传播。当数据匚w一个节点的条gQ节点就它记录到相应的内存中。这样做的原因有以下几点Q主要的原因是可以带来更快的性能。虽然记住完全或部分匚w的对象需要内存,它提供了速度和可伸羃性的特点。当一条规则的所有条仉满Q这是完全匚w。而只有部分条件满I是部分匚w。(我觉得引擎在每个节点都有其对应的内存来储存满节点条g的对象,q就造成了如果一个对象是完全匚wQ那q个对象׃在每个节点的对应内存中都存有其映象。)
<!--[if !supportEmptyParas]-->
2.Leaps
法Q?/span>
Production systems ?/span> Leaps 法使用了一U?/span> lazy ”方法来评估条gQ?/span> conditions Q。一U?/span> Leaps 法的修改版本的实现Q作?/span> Drools v3 的一部分Q尝试结?/span> Leaps ?/span> RETE Ҏ的最好的特点来处?/span> Working Memory 中的 facts ?/span>
古典?/span> Leaps Ҏ所有的 asserted ?/span> facts Q按照其?/span> asserted ?/span> Working Memory 中的序Q?/span> FIFO Q,攑֜d栈中。它一个个的检?/span> facts Q通过q代匚w data type ?/span> facts 集合来找出每一个相兌则的匚w。当一个匹配的数据被发现时Q系l记住此时的q代位置以备待会的lP代,q且Ȁ发规则结果( consequence Q。当l果Q?/span> consequence Q执行完成以后,pȝ׃l箋处理处于d栈顶部的 fact 。如此反复?/span>
<!--[if !supportEmptyParas]-->
3.RuleBase:
一?/span> RuleBase 包含了多个将被用的规则包( packages of rules Q。当规则改变Ӟ一?/span> rulebase 被产生q且~存Q直到规则再ơ变化?/span>
一?/span> rulebase instance 是线E安全的Q所有你可以在你的应用中Q让一?/span> rulebase instance 在多个线E中׃n。对于一?/span> rulebase 的最通常的操作是产生一个新?/span> WorkingMemory ?/span>
q个 rulebase 保持着到它所产生?/span> WorkingMemoryd 的弱引用Q所以在长时间运行的 WorkingMemory 中,如果 rules 发生改变Q这?/span> WorkingMemory 可以即的根据最新的 rules q行更新Q而不必重?/span> WorkingMemory ?/span>
4.WorkingMemory:
WorkingMemory 基本上就是已l蝲入所有的 rules Qƈ且准备启动的 rule engine 。它保持了所有被 asserted q?/span> WorkingMemory 的数据的引用Q直到取消( retracted Q。ƈ且它是与你的pȝq行交互的地斏V?/span> WorkingMemory 是有状态对象。它们的生命周期可长可短。如果从一个短生命周期的角度来同一个引擎进行交互,意味着你可以?/span> RuleBase 对象来ؓ每个 session 产生一个新?/span> WorkingMemory Q然后在l束 session ?/span> discard q个 WorkingMemory Q生一?/span> WorkingMemory 是一个廉L操作Q。另一UŞ式,是在一个相当长的时间中Q例如一?/span> conversation Q,保持一?/span> WorkingMemory Qƈ且对于新?/span> facts 保持持箋的更新?/span>
Facts 是从你的应用中,?/span> assert q?/span> WorkingMemory 中的对象Q?/span> beans Q?/span> Facts 是规则可以访问的L?/span> java 对象。规则引擎中?/span> facts q不是?/span> clone ?/span> facts Q它只是持有C的应用中数据的引用?/span>
“Assertion?/span> 是将 facts 告诉 WorkingMemory 的动作,例如 WorkingMemory.assertObject (yourObject) 。当?/span> assert 一?/span> fact 。它被查是否匹配规则。当你完?/span> assert facts 之后Q你q要调用?/span> fireAllRules() ”方法来启动匚w?/span>
Q?/span>
WorkingMemory.assertObject(yourObjcet)
只是q行
assertion
的一U?/span>
regular
ҎQ还存在有一U称?/span>
logical assertion
的动作)?/span>
基本上就?/span> assert 的逆操作。当?/span> retract 一?/span> fact Q?/span> WorkingMemory 不再跟t那?/span> fact 。Q何依赖那?/span> fact ?/span> rules 不被激zR注意:完全有可能存在某条规则是依赖于一?/span> fact 的“不存在”( non existence Q。在q种情况下, retract 一?/span> fact 导致一条规则被ȀzR?/span>
规则引擎必须知道什么时候一?/span> fact 被改变了Q因Z赖此 fact ?/span> rule 会因此而被再次Ȁ发。当你修改一?/span> fact 的时候,告诉了规则引擎它的状态已l改变了?/span>
Globals 是一个能够被传进规则引擎的命名的对象。大多数q些对象被用来作为静态信息或服务。这些服务被用在一条规则的 RHS Q或者可能是从规则引擎返回对象的一U方法?/span>
如果你的 fact 对象?/span> java bean Q你可以为它们实C?/span> property change listener Q然后把它高数规则引擎。这意味着Q当一?/span> fact 改变Ӟ规则引擎会自动知道Qƈq行响应的动作?/span> Proxy libraries 会帮助实现q一切?/span>
Z RETE 法的规则引擎是有状态的规则引擎。有状态带来的好处是改变能够被通知和篏?/span> facts Q?/span> accumulating facts Q?/span>
管如此Q在很多情况下,所有提供给规则引擎的的 facts 都是最新的Q紧接着规则被激zR在q种情况下仅仅需要一U无状态的模式?/span>
JSR-94 API 指定了有状态和无状态的模式Q但是在 native API 中的{h物仅仅是创徏一个新?/span> WorkingMemory 实例Q然后当 session l束时删除它?/span>
<!--[if !supportEmptyParas]-->
5. Agenda:
Agenda ?/span> RETE 的一个特炏V它是内存中的一个区域,在规则和匚w?/span> facts 被激发之前,它们被保存在q里Q称为?/span> activations ”?/span>
引擎工作在一个?/span> 2 阶段”模式下Q?/span>
<!--[if !supportLists]--> 1Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> <!--[endif]--> WorkingMemory actions Q?/span>assert新的factsQ修改存在的facts?/span>retract facts都是WorkingMemory actions。这些动作从一条规则的RHS或是java code中被触发?/span>
<!--[if !supportLists]--> 2Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"> <!--[endif]--> Agenda evaluationQ?/span>rule actions在这里被Ȁ发)?/span>
注意Q这个过E是一个轮发生的q程Q一条规则的Ȁ发可能引?/span> WorkingMemory actions 的发生。当 WorkingMemory actions 发生Ӟ应该没有规则正在被激发?/span>
fireAllRules() Ҏ引v Agenda evaluation Q最l?/span> activations ”激发。这个过E一直重复直?/span> Agenda 被清I,此时控制权就回到应用E序中?/span>
当有多条 rules ?/span> agenda 中,需要解军_H。当Ȁ发一条规则时Q会?/span> WorkingMemory 产生副作用。规则引擎需要知道规则要以什么顺序来Ȁ发(例如Q激?/span> rule A 可能会引?/span> rule B 被从 agenda 中移除。)
Drools 采取的冲H解决策略有 4 U,按照优先U排列如下: Salience Q?/span> FIFO Q先q先出)Q?/span> Total Recency ?/span> Load order ?/span>
优先U最高,也是最易懂的策略是?/span> Salience ”,即优先Q?/span> user 可以为某?/span> rule 指定一个高一点的优先U(通过附给它一个比较大的数字)。高 Salience ?/span> rule 会被优先激发?/span>
优先U最低的{略?/span> Load order Q就是按?/span> rule 被声明的序?/span>
Agenda Groups 是划?/span> Agenda ?/span> rules Q其实是?/span> activations ”)的一U方法。在L一个时刻,只有一?/span> group 拥有?/span> focus ”,q意味着只有在那?/span> group 中的 activations for rules 才是有效的?/span>
Filter ?/span> filter 接口的可选实玎ͼ用来允许或禁止一?/span> activation 能够被激发?/span>
Rules
一条规则是对商业知识的~码。一条规则有 attributes Q一?/span> Left Hand Side Q?/span> LHS Q和一?/span> Right Hand Side Q?/span> RHS Q?/span> Drools 允许下列几种 attributes Q?/span> salience Q?/span> agenda-group Q?/span> no-loop Q?/span> auto-focus Q?/span> duration Q?/font> activation-group ?/span>
规则可以通过 package 关键字同一个命名空_ namespace Q相兌Q其他的规则引擎可能U此则集Q?/span> Rule Set Q。一?/span> package 声明?/span> imports Q?/span> global 变量Q?/span> functions ?/span> rules ?/span>
Ҏ的数据和被修改的数据q行规则的匹配称为模式匹配( Pattern Matching Q。进行匹配的引擎UCؓ推理机( Inference Engine Q。被讉K的规则称?/span> ProductionMemory Q被推理行匹配的数据UCؓ WorkingMemory ?/span> Agenda 理被匹配规则的执行。推理机所采用的模式匹配算法有下列几种Q?/span> Linear Q?/span> RETE Q?/span> Treat Q?/span> Leaps ?/span>
Drools 采用?/span> RETE ?/span> Leaps 的实现?/span> Drools ?/span> RETE 实现被称?/span> ReteOO Q表C?/span> Drools ?/span> Rete 法q行了加强和优化的实现?/span>
一条规则的 LHS ?/span> Conditional Element 和域U束Q?/span> Field Constraints Q。下面的例子昄了对一?/span> Cheese Fact 使用了字面域U束Q?/span> Literal Field Constraint Q?/span>
上面的这个例子类gQ?/span>
规则引擎实现了数据同逻辑的完全解耦。规则ƈ不能被直接调用,因ؓ它们不是Ҏ或函敎ͼ规则的激发是?/span> WorkingMemory 中数据变化的响应。结果( Consequence Q即 RHS Q作?/span> LHS events 完全匚w?/span> Listener ?/span>
?/span> rules 被加?/span> Productioin Memory 后, rules 被规则引擎用 RETE 法分解成一个图Q?/span>
?/span> Facts ?/span> assert q入 WorkingMemory 中后Q规则引擎找到匹配的 ObjectTypeNode Q然后将?/span> Fact 传播C一个节炏V?/span> ObjectTypeNode 拥有一块内存来保存所有匹配的 facts 。在我们的例子中Q下一个节Ҏ一个域U束Q?/span> Field Constraint Q, type = = “cheddar?/span> 。如果某?/span> Cheese 对象的类型不是?/span> cheddar ”,q个 fact 不会被传播到网l的下一个节炏V如果是?/span> cheddar ”类型,它将被记录到 AlphaNode 的内存中Qƈ传播到网l的下一个节炏V?/span> AlphaNode 是古?/span> RETE 术语Q它是一个单输入 / 单输出的节点。最后通过 AlphaNode ?/span> fact 被传播到 Terminal Node ?/span> Terminal Node 是最l节点,到此我们说这条规则被完全匚wQƈ准备Ȁ发?/span>
当一条规则被完全匚wQ它q没有立刻被Ȁ发(?/span> RETE 中是q样Q但?/span> Leaps 中它会立刻被Ȁ发)。这条规则和与其匚w?/span> facts 激z被攑օ Agenda Q由 Agenda 来负责安排激?/span> Activations Q指的是 rule + the matched facts Q?/span>
下面的图很清楚的说明?/span> Drools 规则引擎的执行过E:
数据?/span> assert q?/span> WorkingMemory 后,?/span> RuleBase 中的 rule q行匚wQ确切的说应该是 rule ?/span> LHS Q,如果匚w成功q条 rule q同和它匚w的数据(此时叫?/span> Activation Q一赯攑օ Agenda Q等?/span> Agenda 来负责安排激?/span> Activation Q其实就是执?/span> rule ?/span> RHS Q,上图中的菱Ş部分是?/span> Agenda 中来执行的, Agenda ׃Ҏ冲突解决{略来安?/span> Activation 的执行顺序?/span>