您的位置:首页 > 编程语言 > Java开发

Struts集成Spring出错:Servlet action is not available 的解决

2009-05-07 22:10 453 查看
 

Servlet action is not available ,到Google上搜了一把,发现无数人正处我现在遇到的这个问题的痛苦之中,在参考了几个别人的解决方法之后仍然没能解决,在即将崩溃放弃之时,一不小心找出了问题所在,并顺利解决了,不敢偷着乐,赶紧帖出来与大家分享,希望能帮到正处深受此问题困扰的同行们一点小忙。

顺便先讲讲如何把Struts和Spring给整合到一块去,提供还不会整的兄弟们参考参考,如果你只是关心上面提到的那个问题的解决,可以略过直接看最后面应该可以解决!

      在Struts中集成Spring,把原来用户的请求由原来的Action直接处理变成请求先被Spring拦截,对Action所依赖的某些关系(如某个Action依赖某个Service)进行依赖注入后,再转到Action继续处理:

 

一、首先,先加载集成Spring的插件:就是在struts-config.xml配置文件中加入如下几行代码:


<plug-in


       className="org.springframework.web.struts.ContextLoaderPlugIn">


       <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />


</plug-in>

修改前的Action的如下:


<action attribute="LoginForm" name="LoginForm"


     input="/WEB-INF/jsps/sysadmin/login.jsp" parameter="method"


     path="/login" scope="request"


     type="com.custudio.cdman.ui.admin.struts.action.LoginAction">


</action>

 

二、对Action的修改通常有以下两种做法:

1、把type属性改为"org.springframework.web.struts.DelegatingActionProxy"

 

     Action修改完成,可转到步骤三继续完成struts,spring整合

2、

(1)type属性可以保留原样不变,也可以直接删掉如下:


<action attribute="LoginForm" name="LoginForm"


     input="/WEB-INF/jsps/sysadmin/login.jsp" parameter="method"


     path="/login" scope="request">


</action>

保留原样的原因只是方便以后查看时容易找出对应的处理请求的具体Action类

(2)接着在struts-config.xml配置文件中加入
4000
<controller>字节点:

下面是把<controller>字节点附近的代码一起帖出来,目的是为了让大家知道<controller>字节点的位置,以免不必要的麻烦


<action forward="/WEB-INF/jsps/cdmgr/cdMgr.jsp"


            path="/showCDMgrMain" />


        <action forward="/WEB-INF/jsps/datamgr/dataMgr.jsp"


            path="/showDataMgrMain" />


    </action-mappings>


    


    <controller


        processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />


        


    <message-resources


        parameter="com.custudio.cdman.ui.resource.ApplicationResources" />


    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">


        <set-property property="pathnames"


            value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />


    </plug-in>


    <plug-in


        className="org.springframework.web.struts.ContextLoaderPlugIn">


        <set-property property="contextConfigLocation"


            value="/WEB-INF/applicationContext.xml" />


    </plug-in>

 

三、到此struts-config.xml文件修改完成,接着就是如何让Spring在拦截用户的请求了,其实很简单,只要把请求对应Action注册成Spring的一个bean就可以了,仍以上面的那个Action为例,下面是applicationConfig.xml中的代码:


<!-- Service -->


    <bean id="IOperatorService"


        class="com.custudio.cdman.bussiness.sysadmin.OperatorServiceImpl"


        abstract="false" singleton="true" lazy-init="default"


        autowire="default" dependency-check="default">


        <property name="operatorDAO">


            <ref bean="OperatorDAO" />


        </property>


    </bean>


    


    <!-- Struts Action -->    


    


    <bean name="/login"


        class="com.custudio.cdman.ui.admin.struts.action.LoginAction"


        abstract="false" singleton="true" lazy-init="default"


        autowire="default" dependency-check="default">


        <property name="operatorService">


            <ref bean="IOperatorService" />


        </property>


    </bean>

注意 这个bean用的是name="/login",不能用id="..."之类的 !!!

通过上面几步就完成了对Struts和Spring的整合。

 

进入正题,解决Servlet action is not available 的问题,

其实就是一个很小的地方修改一下就OK了,当然前提是你的struts-config.xml和applicationContext.xml文件配置确认无误,还出现了上面提示的错误的话,那就恭喜你,成功离你就只有一步之遥了!!!现在只要把jsp页面的Action对应的Form表单的属性action="xxx.do?method=..."改成action="/xxx.do?method=..."就完成了,就这么简单???没错就这么简单,只要在请求路径前加个斜杠就完事!!

这个错误根源有点太离谱了,因为以前没整合Spring的时候,请求路径前面有无斜杠都运行得好好的!但还好找出来了,看到网上很多兄弟估计大多数就是这个原因,郁闷N天,我看大部分人都说的是在Struts和Spring的两个配置文件中死命找原因,但如果真的是在jsp页面出的问题,岂不南辕北辙!!

 

------------------------------------------------------

以上内容转自网友博客

 

经过自己多次实践,在多次发生Servlet action is not available错误后,基本上是用以下方法解决的

1、首先确保在加入spring功能前,struts部分能够正确运行

2、通过MyEclipse导入spring功能包后,检查spring.jar包是否也已经成功加入到构建路径中(如果没有,则再次导入相同版本的spring.jar包)

3、修改struts-config.xml和applicationConfig.xml文件(对照本文上述代码修改即可)

     特别要注意struts-config.xml

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml"/>
  </plug-in>
的value="/WEB-INF/classes/applicationContext.xml"部分,如果applicationContext.xml在Eclipse包资源管理器中在src目录下,则对应发布后的目录路径为/WEB-INF/classes下。则value="/WEB-INF/classes/applicationContext.xml"而不是value="applicationContext.xml"(和系统资源文件不同)

-------------------------------------------------------

许多异常,在页面上都会报Servlet action is not available错误,然而真正问题的原因还是需要看tomcat的详细信息

--------------------------------------------------------------------------------------------------------------------------------

为了能够清楚的看到系统启动的情况,以及一些信息,在项目中使用Log4j功能

log4j.properties文件为:(为了使tomcat能够看着干净点,我ConsoleAppender的等级设置为FATAL,具体的详细日志可以在%TOMCAT_HOME%下的log4j.log中)

 

log4j.rootLogger=INFO, A1, R

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.Threshold=FATAL
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#R 输出到文件 RollingFileAppender的扩展,可以提供一种日志的备份功能。
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=log4j.log
log4j.appender.R.Encoding=GBK
log4j.appender.R.Threshold=INFO
log4j.appender.R.DatePattern='.'yyyy-MM-dd
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm} %5p %c{1}: %L: %m%n

 

对应我的Servlet action is not available的问题,查看日志后,发现是缺少包。

 

Thread-1] ERROR org.springframework.web.struts.ContextLoaderPlugIn - Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: Error registering bean with name 'myDataSource' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Class that bean class [org.apache.commons.dbcp.BasicDataSource] depends on not found; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

 

加入commons-pool.jar包。问题解决


<action attribute="LoginForm" name="LoginForm"


     input="/WEB-INF/jsps/sysadmin/login.jsp" parameter="method"


     path="/login" scope="request"


     type="org.springframework.web.struts.DelegatingActionProxy">


</action>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息