问题描述:使用Struts2.0.6+Sitemesh2.2.1+Freemark2.3.8的过程中,装饰Action请求的结果页面不会有问题,但是如果装饰直接访问的JSP页面会出现如下错误:
- javax.servlet.ServletException: Error applying decorator: null
解决方案:经过调试发现是FreeMarkerPageFilter的getLocale方法没有对invocation添加非空判断造成的,错误代码如下:
- protected Locale getLocale(ActionInvocation invocation, Configuration configuration) {
- if (invocation.getAction() instanceof LocaleProvider) {
- return ((LocaleProvider) invocation.getAction()).getLocale();
- } else {
- return configuration.getLocale();
- }
- }
改正后的代码如下:
- protected Locale getLocale(ActionInvocation invocation, Configuration configuration) {
- if (invocation != null && invocation.getAction() instanceof LocaleProvider) {
- return ((LocaleProvider) invocation.getAction()).getLocale();
- } else {
- return configuration.getLocale();
- }
- }
问题描述:使用Struts2.0.6+Sitemesh2.2.3,我有一个请求/customer/page.action,其结果页面为WEB-INF/jsp/customer/list.jsp,我希望使用main装饰器对返回结果进行装饰,如果配置如下:
- <decorator name="main" page="main.ftl">
- <pattern>/WEB-INF/jsp/customer/list.jsppattern>
- decorator>
则无法成功进行装饰,如果配置如下:
- <decorator name="main" page="main.ftl">
- <pattern>/*pattern>
- decorator>
则可以成功进行装饰。
解决方案:经过调试发现,原来装饰器是根据请求的URI路径匹配需要装饰的页面的,而且此URI路径是相对于上下文路径的,因此针对上述需求正确的配置如下:
- <decorator name="main" page="main.ftl">
- <pattern>/customer/page.actionpattern>
- decorator>
问题描述: 使用Struts2.0.6+Sitemesh2.2.3+Hibernate3.2.2,配置如下:
- <filter>
- <filter-name>struts-cleanup</filter-name>
- <filter-class>
- org.apache.struts2.dispatcher.ActionContextCleanUp
- </filter-class>
- </filter>
- <!--Hibernate Open Session in View Filter-->
- <filter>
- <filter-name>hibernateFilter</filter-name>
- <filter-class>
- org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
- </filter-class>
- </filter>
- <filter>
- <filter-name>sitemesh</filter-name>
- <filter-class>
- org.apache.struts2.sitemesh.FreeMarkerPageFilter
- </filter-class>
- </filter>
- <!-- Struts filter -->
- <filter>
- <filter-name>struts</filter-name>
- <filter-class>
- org.apache.struts2.dispatcher.FilterDispatcher
- </filter-class>
- </filter>
会导致如下错误
- System Runtime Error:
- 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也不能正常工作。
解决方案:待解决