??xml version="1.0" encoding="utf-8" standalone="yes"?> <filter> <filter-mapping> <filter-mapping>
发现|站老是一动不?在DAO中用 Statistics stats = HibernateUtil.getSessionFactory().getStatistics();
查看?jin)统计结?发现打开50个Session只有20个关闭了(jin).
看结构也没有什么问?我用两个ThreadLocal 存放Session 和Transaction,再用一个Filterd?各个配置表面上也是没有问?可是做测试的时候才发现关闭Session的FilterҎ(gu)是没有q行,或是有时q行,有时不运?
仔细想了(jin)?调整?jin)一下sessionclosefilter和Struts2的filter的顺序如?l于可以关闭?/p>
<filter-name>HibernateSessionCloseFiler</filter-name>
<filter-class>com.hitecin.struts2.filter.HibernateSessionClose</filter-class>
</filter>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-name>HibernateSessionCloseFiler</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
]]>
at sun.reflect.GeneratedMethodAccessor196.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:517)
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:812)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:964)
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:75)
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:131)
at com.opensymphony.xwork2.util.OgnlValueStack$ObjectAccessor.setProperty(OgnlValueStack.java:68)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1656)
at ognl.ASTProperty.setValueBody(ASTProperty.java:101)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177)
at ognl.SimpleNode.setValue(SimpleNode.java:246)
at ognl.Ognl.setValue(Ognl.java:476)
at com.opensymphony.xwork2.util.OgnlUtil.setValue(OgnlUtil.java:186)
at com.opensymphony.xwork2.util.OgnlUtil.internalSetProperty(OgnlUtil.java:360)
at com.opensymphony.xwork2.util.OgnlUtil.setProperty(OgnlUtil.java:135)
at com.opensymphony.xwork2.util.OgnlUtil.setProperty(OgnlUtil.java:116)
at org.apache.struts2.components.Bean.addParameter(Bean.java:147)
at org.apache.struts2.components.Param.end(Param.java:114)
at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:43)
at _jsp._product._productcatagorysecondlist__jsp._jspService(_productcatagorysecondlist__jsp.java:105)
at com.caucho.jsp.JavaPage.service(JavaPage.java:60)
at com.caucho.jsp.Page.pageservice(Page.java:570)
at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:179)
at com.caucho.server.webapp.DispatchFilterChain.doFilter(DispatchFilterChain.java:115)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:277)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:106)
at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:139)
at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:343)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:213)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:161)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.intercept(PrepareInterceptor.java:115)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:173)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:420)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:514)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:520)
at com.caucho.util.ThreadPool.run(ThreadPool.java:442)
at java.lang.Thread.run(Thread.java:595)
q个错误有时出现Q有时没有,又仔l看?jin)一下源码,发现'firmCode'q个属性的cd是int,把它改ؓ(f)Integer...
应该没问题(sh)(jin)Q这是Struts2中类型{换的问题
]]>
<servlet-mapping url-pattern='/struts/*' servlet-name='plugin_match'/>
<servlet-mapping url-pattern='/other/*' servlet-name='plugin_match'/>
<servlet-mapping url-pattern='*.action' servlet-name='plugin_match'/>
<servlet-mapping url-pattern='*.html' servlet-name='plugin_match'/>
<servlet-mapping url-pattern='*.do' servlet-name='plugin_match'/>
<servlet-mapping url-pattern='/dwr/*' servlet-name='plugin_match'/>
</web-app>
]]>
init();
String param = filterConfig.getInitParameter("packages");
String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
if (param != null) {
packages = param + " " + packages;
}
this.pathPrefixes = parse(packages);
}
public void init() {
if (configurationManager == null) {
configurationManager = new ConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);//用来初始化ConfigurationManager
}
init_DefaultProperties(); // org.apache.struts2.default.properties配置的provider初始?/span>
init_TraditionalXmlConfigurations(); // struts-default.xml,struts-plugin.xml,struts.xml配置的provider初始?/span>
init_LegacyStrutsProperties(); //
init_ZeroConfiguration(); //
init_CustomConfigurationProviders(); //
init_MethodConfigurationProvider();
init_FilterInitParameters() ; //
init_AliasStandardObjects() ; //
Container container = init_PreloadConfiguration();
init_CheckConfigurationReloading(container);
init_CheckWebLogicWorkaround(container);
}
2
3
4 HttpServletRequest request = (HttpServletRequest) req;
5 HttpServletResponse response = (HttpServletResponse) res;
6 ServletContext servletContext = getServletContext();
7 ………………………………
8 request = prepareDispatcherAndWrapRequest(request, response);//作些~码准备和ؓ(f)?jin)上传文件作包?br> 9 ActionMapping mapping= actionMapper.getMapping(request, getConfigurationManager()); // 把请求和配置文g挂勾
10
11
12 ……………………………………
13 serviceAction(request, response, servletContext, mapping);//创徏Action上下文,Ҏ(gu)l定的mapping装蝲ActionProxy,然后指定的ActionҎ(gu)被执行,输出q入response
14
15 ActionContextCleanUp.cleanUp(req);//
16 ………………
17 }
18
]]>
]]>
一.ajax Tag
ajax tag
Ajax Tag | 说明 |
与普通div不同的是,它可以通过ajaxh | |
使用ajax更新另外一个元素或提交form | |
使用ajax更新目标元素 | |
一个可以加入动态和?rn)?s:div> 的panel | |
使用ajax在现有数据的的基上更新另外一个元?/td> |
属?/td> | 赋D?/td> |
href | 用来发送请求的url |
listenTopics | ?x)引发目标tag重新载入内容或发生动?指定多个topics 时用逗号隔开 |
notifyTopics | tag公开的一个标?指定多个topics时用逗号隔开 |
showErrorTransportText | 讄错误信息是否昄 |
indicator | 在requestq行时显C的东东 |
关于Tag的详l说明可以看APIQ要在struts2中用ajax tag只要加上<s:head theme="ajax"/>
然后在用的ajax tag中加上theme="ajax"可以了(jin)!
W号 | getValue()要注意事?/td> | setValue()注意事项 |
e1,e2 序q算W?/td> | e1和e2都会(x)使用同一个源对象计算? 且会(x)q回e2的计?/td> | getValue使用e1 setValue使用e2 |
e1=e2 {于q算W?/td> | getValue使用e2,setValu使用e1,且e2的结果作为目标的对象 | |
e1?e2:e3 | ||
e1||e2,e1 or e2 | ||
e1|e2,e1 bor e2 | ||
e1^e2, e1 xor e2 | ||
e1&e2 ,e1 band e2 | ||
e1==e2,e1 eq e2 e1!=e2, e1 neq e2 |
||
e1<e2,e1 lt e2 e1<=e2 ,e1 lte e2 e1>e2 ,e1 gt e2 e1>=e2 ,e1 get e2 e1 in e2 e1 not in e2 |
||
e1<< e2,e1 shl e2 e1>>e2 ,e1 shr e2 e1>>> e2,e1 ushr e2 |
||
e1+e2 e1-e2 |
||
e1*e2 e1/e2 e1%e2 |
||
+e -e !e ~e e instanceof class |
||
e.method(args) e.property e1[e2] e1.{e2} e1.{?e2} 选择 e1.(e2) 子表辑ּ的计?br>e1(e2) 表达式计?/td> | ||
constant 帔R (e) 表辑ּ加入括号?br>method(args) Ҏ(gu)调用 property 属性调? [e] 通过索引得到?br>{ e,.....} 创徏List #variable 上下文中变量的引?br>@class@method (args) ?rn)态方法调?br>@ class@field ?rn)态字D调?br>new class(args) 构造器调用 new array-component-class[] {e,....} 数组创徏 #{e1:e2,...} Map创徏 #@classname@{e1:e2,....} 创徏指定Map子类型的Map :[e] Lambda表达?br> |
q些是最基础的运符 |
且一个OGNL表达式可以进行存和取两方面的操作.
1).使用OGNL的好?/strong>
机制可以更容易实现值类型的的{?
2).OGNL表达?/strong>
OGNL使用集合
使用Collection中的元素ȝ索引,?得到array中第一个元素表辑ּ为array[0]
List
例子: name in{null,"init"} q个例子 当name属性是 I或"init"q回true ,
而在q个q程中会(x)创徏List接口的一个实?具体的子cL有指?/p>
本地Arrays OGNL支持创徏Java本地数组! 且允许给定存在的list或设定数l的的大?/p>
new int[] {1,2,3} 创徏一个int 数组
new int[5] 创徏?jin)一个int数组,它的元素的gؓ(f)0
Maps 创徏Map #{"foo":"fool value","bar":"bar value"}
我们甚至可以指定一个特定的java Map Class d建Map
#@java.util.LinkedHashMap@{"foo":"foo value","bar":bar value"};
Java Collection各自有一些特D的属?/p>
Collection | Special Properties |
Collection(子类有Map List Set) | size 集合的大?br>isEmpty 如果集合为空gؓ(f)true |
List | iterator 得到此list的P代器 |
Map | keys 得到一个包涉|有键值的Set values 得到一个包括所有值的Collection |
Set | iterator 得到此Set的P代器 |
Iterator | next 得到集合中的下一个object hasNext如果集合中有下一个object则返回true |
Enumeration | next 如上 hasNext如上 nextElement 和next一L(fng)作用 hasMoreElements和hasNext一样作?/td> |
OGNL调用JavaBean 索引属?/strong>
JavaBean索引属性的格式如下
public PropertyType[] getPropertyName()
public void setPropertyName(propertyType[] anArray)
public PropertyType getPropertyName(int index);
public void setPropertyName(int index,PropertyType value)
OGNL可以很容易地通过索引存取q些属? Example
someProperty[2]
在这个例子中OGNL?x)自动找到getSomeProperty(2)或存到setSomeProperty (2,value)?
调用OGNL对象索引属?/strong>
对象索引属性格?/p>
public PropertyType getPropertyName(IndexType index)
public void setPropertyName(IndexType index,PropertyType value)
PropertyType 和IndexType 必需跟集合和getҎ(gu)中的cd盔R
调用Ҏ(gu)
OGNL调用Ҏ(gu)和Java调用Ҏ(gu)有一点区?因ؓ(f)OGNL是被解释的ƈ且必需在运行时选择正确的方?所以OGNL调用Ҏ(gu)旉?jin)提供所需要参数没有额外的cd信息,OGNL选择和提供的参数最配的Ҏ(gu),如果有两个或更多的方法符合匹?它们中的一个会(x)L的被选择(在WebWork中会(x)选择ValueStack上面的方?
特别一提的?,null可以匚w所有非基础cd,所有它通常?x)导致一个不定的方法被调用
变量的调?/strong>
OGNL有一个简单的变量配置,在这儿你可以存储中间值和重新使用q些中间?或者仅仅命名以使表辑ּ更易理解! 在OGNL中所有变量都是全局?使用变量的格式是"#variable"
OGNL把当前的object在每点的表达式值存攑֜"this"q个变量?而且"this"可以像其它变量一样??
listeners.size().(#this>100?2*this:20+#this) 如果listeners中的元素大于100?x)返回元素数量的两?否则数量加上20
可以昑ּ地给变量赋?只要在变量的后边写一个表辑ּ卛_
#var -99
Powered by ScribeFire.