c++ primer第五版 练习7.9
2014-10-28 22:15
204 查看
问题描述:使用Struts2.0.6+Sitemesh2.2.1+Freemark2.3.8的过程中,装饰Action请求的结果页面不会有问题,但是如果装饰直接访问的JSP页面会出现如下错误:
java 代码
javax.servlet.ServletException: Error applying decorator: null
解决方案:经过调试发现是FreeMarkerPageFilter的getLocale方法没有对invocation添加非空判断造成的,错误代码如下:
java 代码
protected Locale getLocale(ActionInvocation invocation, Configuration configuration) {
if (invocation.getAction() instanceof LocaleProvider) {
return ((LocaleProvider) invocation.getAction()).getLocale();
} else {
return configuration.getLocale();
}
}
改正后的代码如下:
java 代码
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装饰器对返回结果进行装饰,如果配置如下:
xml 代码
<decorator name="main" page="main.ftl">
<pattern>/WEB-INF/jsp/customer/list.jsppattern>
decorator>
则无法成功进行装饰,如果配置如下:
xml 代码
<decorator name="main" page="main.ftl">
<pattern>/*pattern>
decorator>
则可以成功进行装饰。
解决方案:经过调试发现,原来装饰器是根据请求的URI路径匹配需要装饰的页面的,而且此URI路径是相对于上下文路径的,因此针对上述需求正确的配置如下:
xml 代码
<decorator name="main" page="main.ftl">
<pattern>/customer/page.actionpattern>
decorator>
问题描述: 使用Struts2.0.6+Sitemesh2.2.3+Hibernate3.2.2,配置如下:
xml 代码
<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>
会导致如下错误
java 代码
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也不能正常工作。
解决方案:待解决
java 代码
javax.servlet.ServletException: Error applying decorator: null
解决方案:经过调试发现是FreeMarkerPageFilter的getLocale方法没有对invocation添加非空判断造成的,错误代码如下:
java 代码
protected Locale getLocale(ActionInvocation invocation, Configuration configuration) {
if (invocation.getAction() instanceof LocaleProvider) {
return ((LocaleProvider) invocation.getAction()).getLocale();
} else {
return configuration.getLocale();
}
}
改正后的代码如下:
java 代码
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装饰器对返回结果进行装饰,如果配置如下:
xml 代码
<decorator name="main" page="main.ftl">
<pattern>/WEB-INF/jsp/customer/list.jsppattern>
decorator>
则无法成功进行装饰,如果配置如下:
xml 代码
<decorator name="main" page="main.ftl">
<pattern>/*pattern>
decorator>
则可以成功进行装饰。
解决方案:经过调试发现,原来装饰器是根据请求的URI路径匹配需要装饰的页面的,而且此URI路径是相对于上下文路径的,因此针对上述需求正确的配置如下:
xml 代码
<decorator name="main" page="main.ftl">
<pattern>/customer/page.actionpattern>
decorator>
问题描述: 使用Struts2.0.6+Sitemesh2.2.3+Hibernate3.2.2,配置如下:
xml 代码
<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>
会导致如下错误
java 代码
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也不能正常工作。
解决方案:待解决
相关文章推荐
- C++ primer(第五版) 练习 7.9 个人 code
- C++ primer 第五版 中文版 练习 10.36 个人code
- C++ Primer 第五版 中文版 练习 13.14&13.15&14.16&14.17 个人code
- c++ primer第五版 练习8.4
- C++ Primer(第五版)练习6.26
- C++ Primer(第五版)练习3.31
- c++ primer 第五版 练习13.5
- C++ primer(第五版) 练习 3.36 个人code
- C++ primer(第五版) 练习 5.20 个人code
- C++ primer(第五版) 练习 7.15 个人 code
- C++ primer 第五版 中文版 练习 9.43 个人code+github上的代码
- C++ primer 第五版 中文版 练习 10.11 个人code
- C++ Primer 第五版 中文版 练习 13.26
- C++ Primer 第五版 中文版 练习 13.18 个人code
- C++ Primer(第五版)练习6.33
- C++ Primer(第五版)练习3.32
- C++ primer(第五版) 练习 3.24 个人code
- C++ primer(第五版) 练习 5.14 个人code
- C++ primer(第五版) 练习 6.21 个人 code
- C++ Primer(第五版) 6.7节练习