相信肯定有人遇到这个问题:
struts2+displaytag翻页时会出现下面的堆栈信息,虽然程序能跑起来,可是还是让人很不爽。
ognl.InappropriateExpressionException: Inappropriate OGNLexpression: (d - 1342532) - p
atognl.SimpleNode.setValueBody(SimpleNode.java:312)
atognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
atognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.Ognl.setValue(Ognl.java:737)
atcom.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:198)
atcom.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:161)
atcom.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:149)
atcom.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:276)
atcom.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:187)
atcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
atcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atorg.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atorg.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atorg.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atorg.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
atcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atorg.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atcom.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
atorg.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
atorg.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
atorg.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
atorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
atorg.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
atorg.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
atorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
atorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
atorg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
atorg.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
atorg.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
atorg.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
atorg.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
atorg.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
在网上找啊找,大体有三种方法解决:
(1) <constantname="struts.devMode" value="false"/>设成false,试过了不管用,可能有的情况会管用吧。。。
(2) Src in their ownprojects to create packages, package names can only:com.opensymphony.xwork2.interceptor
1. Create Class: ParametersInterceptor
2. Copy Struts2 in xwork-2.1.2.jar packagecom.opensymphony.xwork2.interceptor.ParametersInterceptor contentsof the file, and paste it into newly created class.
3. To find the regular expression code, by adding a minus sign:
private String acceptedParamNames = "- [[ p (Graph) s]&&[^,#:=]]*";
private Pattern acceptedPattern = Pattern.compile(acceptedParamNames);
Thus, the problem resolved.
老外的方法有点复杂(个人感觉)没有试。。。
(3)打开struts.xml:
在package之间加入以下配置:
<interceptors>
<interceptor-stackname="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n" />
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<paramname="excludeParams">dojo..*,d-..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-refname="validation">
<paramname="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-refname="workflow">
<paramname="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
这样加也可以运行:(不知道为什么也行。。。有待于进一步研究)
这样加也可以运行:(不知道为什么也行。。。有待于进一步研究)
<interceptors>
<interceptor-stackname="defaultStack">
<paramname="excludeParams">dojo..*,d-..*</param>
</interceptor-ref>
</interceptors>
其实要改的也就是这里: <paramname="excludeParams">dojo..*,d-..*</param>
原因是Struts2不允许使用包含"-"的变量名。而displaytag的分页变量是d-***-p的形式
默认的struts-default.xml是没有d-..*的http://struts.apache.org/2.0.14/docs/struts-defaultxml.html