Struts 2.0 问题解决记录

问题描述:使用Struts2.0.6+Sitemesh2.2.1+Freemark2.3.8的过程中,装饰Action请求的结果页面不会有问题,但是如果装饰直接访问的JSP页面会出现如下错误:

java 代码 
  1. javax.servlet.ServletException: Error applying decorator: null  

         解决方案:经过调试发现是FreeMarkerPageFilter的getLocale方法没有对invocation添加非空判断造成的,错误代码如下:

java 代码 
  1.   protected Locale getLocale(ActionInvocation invocation, Configuration configuration) {   
  2.         if (invocation.getAction() instanceof LocaleProvider) {   
  3.             return ((LocaleProvider) invocation.getAction()).getLocale();   
  4.         } else {   
  5.             return configuration.getLocale();   
  6.         }   
  7. }  

 改正后的代码如下:

java 代码 
  1. protected Locale getLocale(ActionInvocation invocation, Configuration configuration) {   
  2.     if (invocation != null && invocation.getAction() instanceof LocaleProvider) {   
  3.         return ((LocaleProvider) invocation.getAction()).getLocale();   
  4.     } else {   
  5.         return configuration.getLocale();   
  6.     }   
  7. }   

 

         问题描述:使用Struts2.0.6+Sitemesh2.2.3,我有一个请求/customer/page.action,其结果页面为WEB-INF/jsp/customer/list.jsp,我希望使用main装饰器对返回结果进行装饰,如果配置如下:

xml 代码 
  1. <decorator name="main" page="main.ftl">  
  2.  <pattern>/WEB-INF/jsp/customer/list.jsppattern>  
  3. decorator>  

 则无法成功进行装饰,如果配置如下:

xml 代码 
  1. <decorator name="main" page="main.ftl">  
  2.  <pattern>/*pattern>  
  3. decorator>  

则可以成功进行装饰。

        解决方案:经过调试发现,原来装饰器是根据请求的URI路径匹配需要装饰的页面的,而且此URI路径是相对于上下文路径的,因此针对上述需求正确的配置如下:

xml 代码 
  1. <decorator name="main" page="main.ftl">  
  2.  <pattern>/customer/page.actionpattern>  
  3. decorator>  

         问题描述: 使用Struts2.0.6+Sitemesh2.2.3+Hibernate3.2.2,配置如下:

xml 代码
  1. <filter>  
  2.   <filter-name>struts-cleanup</filter-name>  
  3.   <filter-class>  
  4.    org.apache.struts2.dispatcher.ActionContextCleanUp   
  5.   </filter-class>  
  6.  </filter>  
  7.  <!--Hibernate Open Session in View Filter-->  
  8.  <filter>  
  9.   <filter-name>hibernateFilter</filter-name>  
  10.   <filter-class>  
  11.    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter   
  12.   </filter-class>  
  13.  </filter>  
  14.  <filter>  
  15.   <filter-name>sitemesh</filter-name>  
  16.   <filter-class>  
  17.    org.apache.struts2.sitemesh.FreeMarkerPageFilter   
  18.   </filter-class>  
  19.  </filter>  
  20.  <!-- Struts filter -->  
  21.  <filter>  
  22.   <filter-name>struts</filter-name>  
  23.   <filter-class>  
  24.    org.apache.struts2.dispatcher.FilterDispatcher   
  25.   </filter-class>  
  26.  </filter>  

 会导致如下错误

java 代码
  1. System Runtime Error:    
  2. Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.  

如果去除对OpenSessionInViewFilter的配置则CRUD正常。
如果去除FreeMarkerPageFilter和ActionContextCleanUp过滤器,仅保留OpenSessionInViewFilter,CRUD也不能正常工作。

        解决方案:待解决

你可能感兴趣的:(apache,spring,jsp,Hibernate,struts)