您的位置:首页 > 编程语言 > C语言/C++

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也不能正常工作。

        解决方案:待解决
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: