看着没问题啊,只要把osiv写到struts2的filter前就可以了。

解决方案 »

  1.   

    OpenSessionInViewFilter作用就是在调用你写的代码前绑定session,只要保证它早于你的struts Action执行就可以了,
    去年使用struts2,spring2,hibernate3写的小东西的配置你看下吧,顺序问题<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app>
      <display-name>corpweb</display-name>
      <filter>
        <filter-name>setcharacterencodingfilter</filter-name>
        <filter-class>com.filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>gb2312</param-value>
        </init-param>
        <init-param>
          <param-name>ignore</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>setcharacterencodingfilter</filter-name>
        <servlet-name>action</servlet-name>
      </filter-mapping>
      <listener>
        <listener-class>com.listener.OnlineStatisticListener</listener-class>
      </listener>
      <servlet>
        <servlet-name>initservlet</servlet-name>
        <servlet-class>com.init.InitServlet</servlet-class>
        <init-param>
          <param-name>configFile</param-name>
          <param-value>/WEB-INF/configfiles/configFile.xml</param-value>
        </init-param>
        <init-param>
          <param-name>proxool</param-name>
          <param-value>/WEB-INF/configfiles/proxool.xml</param-value>
        </init-param>
        <init-param>
          <param-name>hibernateCfg</param-name>
          <param-value>/WEB-INF/configfiles/hibernate.cfg.xml</param-value>
        </init-param>
        <init-param>
          <param-name>log4jConfigFile</param-name>
          <param-value>/WEB-INF/configfiles/log4j.properties</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet>
        <servlet-name>imagecaptchaservlet</servlet-name>
        <servlet-class>com.util.ImageCaptchaServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet>
        <servlet-name>codefact</servlet-name>
        <servlet-class>com.util.CodeFact</servlet-class>
      </servlet>
      <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/configfiles/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>config/infopub</param-name>
          <param-value>/WEB-INF/configfiles/struts-infopub.xml</param-value>
        </init-param>
        <init-param>
          <param-name>config/guestbook</param-name>
          <param-value>/WEB-INF/configfiles/struts-guestbook.xml</param-value>
        </init-param>
        <init-param>
          <param-name>config/employ</param-name>
          <param-value>/WEB-INF/configfiles/struts-employ.xml</param-value>
        </init-param>
        <init-param>
          <param-name>config/forum</param-name>
          <param-value>/WEB-INF/configfiles/struts-forum.xml</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>2</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
      </servlet>
      <servlet>
        <servlet-name>proxool</servlet-name>
        <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
      </servlet>
      <servlet>
        <servlet-name>Connector</servlet-name>
        <servlet-class>com.fredck.FCKeditor.connector.ConnectorServlet</servlet-class>
        <init-param>
          <param-name>baseDir</param-name>
          <param-value>/UploadFiles/</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
      </servlet>
      <servlet>
        <servlet-name>SimpleUploader</servlet-name>
        <servlet-class>com.fredck.FCKeditor.uploader.SimpleUploaderServlet</servlet-class>
        <init-param>
          <param-name>baseDir</param-name>
          <param-value>/UploadFiles/</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>enabled</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>AllowedExtensionsFile</param-name>
          <param-value/>
        </init-param>
        <init-param>
          <param-name>DeniedExtensionsFile</param-name>
          <param-value>php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi</param-value>
        </init-param>
        <init-param>
          <param-name>AllowedExtensionsImage</param-name>
          <param-value>jpg|gif|jpeg|png|bmp</param-value>
        </init-param>
        <init-param>
          <param-name>DeniedExtensionsImage</param-name>
          <param-value/>
        </init-param>
        <init-param>
          <param-name>AllowedExtensionsFlash</param-name>
          <param-value>swf|fla</param-value>
        </init-param>
        <init-param>
          <param-name>DeniedExtensionsFlash</param-name>
          <param-value/>
        </init-param>
        <load-on-startup>4</load-on-startup>
      </servlet>
      <servlet>
        <servlet-name>DownLoad</servlet-name>
        <servlet-class>com.util.DownLoad</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Connector</servlet-name>
        <url-pattern>/FCKeditor_SYJ/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>SimpleUploader</servlet-name>
        <url-pattern>/FCKeditor_SYJ/editor/filemanager/upload/simpleuploader</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>codefact</servlet-name>
        <url-pattern>/codefact</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>imagecaptchaservlet</servlet-name>
        <url-pattern>/imgCodeStr</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>proxool</servlet-name>
        <url-pattern>/Admin/viewProxool</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>initservlet</servlet-name>
        <url-pattern>/initservlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>DownLoad</servlet-name>
        <url-pattern>/forum/servlet/DownLoad</url-pattern>
      </servlet-mapping>
      <session-config>
        <session-timeout>20</session-timeout>
      </session-config>
      <taglib>
        <taglib-uri>/struts-bean.tld</taglib-uri>
        <taglib-location>/WEB-INF/tlds/struts-bean.tld</taglib-location>
      </taglib>
      <taglib>
        <taglib-uri>/struts-html.tld</taglib-uri>
        <taglib-location>/WEB-INF/tlds/struts-html.tld</taglib-location>
      </taglib>
      <taglib>
        <taglib-uri>/struts-logic.tld</taglib-uri>
        <taglib-location>/WEB-INF/tlds/struts-logic.tld</taglib-location>
      </taglib>
      <taglib>
        <taglib-uri>/struts-tiles.tld</taglib-uri>
        <taglib-location>/WEB-INF/tlds/struts-tiles.tld</taglib-location>
      </taglib>
      <taglib>
        <taglib-uri>/struts-nested.tld</taglib-uri>
        <taglib-location>/WEB-INF/tlds/struts-nested.tld</taglib-location>
      </taglib>
    <resource-ref>
        <res-ref-name>jdbc/mysql</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
      </resource-ref>
    </web-app>
      

  2.   

    对不起发错了刚才那个是前年写的小东西<?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <!-- *************************************************************************start******** -->
    <display-name>demo</display-name>
    <!-- **********************************************************************context-param*********** -->
    <!--spring配置-->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:appContext*.xml</param-value>
    </context-param>
    <!-- ***********************************************************************listener********** -->
    <!--spring配置-->
    <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
    </listener>
    <!-- **********************************************************************filter*********** -->
    <!-- 中文过滤器 -->
        <filter>
            <filter-name>Set Character Encoding</filter-name>
            <filter-class>com.syj.util.SetCharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>GBK</param-value>
            </init-param>
        </filter>
    <!-- hibernate3 OpenSessionInView 模式 -->
    <filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>
    com.syj.util.OpenSessionInViewFilter
    </filter-class>
    </filter>
    <!--struct配置 -->
    <filter>
    <filter-name>Struts2</filter-name>
    <filter-class>
    org.apache.struts2.dispatcher.FilterDispatcher
    </filter-class>
    </filter>
    <!-- **********************************************************************filter-mapping*********** -->
    <!-- 中文过滤器 -->
    <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- hibernate3 OpenSessionInView 模式 注意:一定配置struct mapping的前面-->
    <filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>*.do</url-pattern>
    </filter-mapping>
    <!--struct配置 注意:一定配置OpenSessionInView mapping的后面-->
    <filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- ************************************************************************servlet********* -->
    <!-- 负责系统初始化的启动Servlet -->
    <servlet>
    <servlet-name>initServlet</servlet-name>
    <servlet-class>com.syj.action.InitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- 配置图形码 -->
    <servlet>
    <servlet-name>codeFact</servlet-name>
    <servlet-class>com.syj.util.CodeFact</servlet-class>
    </servlet>
    <!-- jfreechart显示图表 -->
    <servlet>
    <servlet-name>DisplayChart</servlet-name>
    <servlet-class>
    org.jfree.chart.servlet.DisplayChart
    </servlet-class>
    </servlet>
    <!-- ************************************************************************servlet-mapping********* -->
    <!-- 负责系统初始化的启动Servlet -->
    <servlet-mapping>
    <servlet-name>initServlet</servlet-name>
    <url-pattern>/initServlet</url-pattern>
    </servlet-mapping>
    <!-- 配置图形码 -->
    <servlet-mapping>
    <servlet-name>codeFact</servlet-name>
    <url-pattern>/codeFact</url-pattern>
    </servlet-mapping>
    <!-- jfreechart显示图表 -->
    <servlet-mapping>
    <servlet-name>DisplayChart</servlet-name>
    <url-pattern>/servlet/DisplayChart</url-pattern>
    </servlet-mapping>
    <!-- *************************************************************************jsp-config******** -->
    <jsp-config>
    <!--syj标签库配置-->
    <taglib>
    <taglib-uri>syj.tld</taglib-uri>
    <taglib-location>/WEB-INF/syj.tld</taglib-location>
    </taglib>
    </jsp-config>
    <!-- *************************************************************************end******** -->
    </web-app>
      

  3.   

        想请问一下,这个问题与我action的开发方式有问题吗?我的开发方式如下:
        ActionSupport
           AbstracAction
              MyOwnLogicAction
       AbstracAction继承ActionSupport,里面进行相应的一些日志和权限判断处理,MyOwnLogicAction继承AbstracAction,进行我相应的业务逻辑处理。我的Service的获得,都是通过
       new ClassPathXmlApplicationContext(configName).getBean("beanName")的方式里获得的   请问这样子有影响吗????
       多谢
      

  4.   

    如果你配置文件配对了,我推测是这个原因
    spring不在一个上下文环境里面,你要保证你的应用spring上下文环境只有一个,你不应该使用ClassPathXmlApplicationContext,你应该从web上下文中取的spring上下文环境
      

  5.   

        非常感谢您的回复,这个问题已经解决了。
         另外,有几个问题想请教您一下:     1、在action中调用service的时候,如果我不在spring的配置文件中配置action这个bean,那他这个action是不是通过
    struts2的spring插件初始化的?是singleton类型的吗?
         2、所有的bean,默认的都是singleton模式的,这个对性能会有影响吗?    期待您的回复。
      

  6.   

    1.如果你不在spring配置struts的action bean那么这个bean就不被spring托管了,就是不单例,(到底是不是单例跟配置文件配置有关,托管了也可以不是单例)
    2.单例的bean性能略优于非单例的bean
      

  7.   

       对1,按照您的说法,strtus2的那个spring插件主要做什么用的呢?
      

  8.   

       另外,还有个网上经常碰到的问题,想请问下
        现在配置了这个filter后,对Update和delete等的操作,出现这个异常
        org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' er from transaction definition.   网上的解决方案是在spring的配置文件中设置事务,您能把您的配置贴出来吗,针对所有以*Service类型类的事务设置   另外,我自己在Service里面用TranscationTemplate,实现了一些编程式的事务处理。和配置文件中的事务处理有冲突吗?
       期待您的回复。