初学SSH,模仿视频教程做一个超简单的注册功能。遇到了常见的“Servlet action is not available“错误,在网上查询了很多原因,捣鼓一天了也没弄来。头都大了。请求指点不过我好像没分。。真不是吝啬,第一次法帖。。惭愧。工具:  Myeclipse6.5+struts1.3+spring2.5+hibernate3.2SSH整合方式:struts和spring整合使用DelegatingRequestProcessor,hibernate的配置和sessionfactory都交给了spring。功能:注册页面俩输入框:用户名,密码。
      提交给LoginAction.
     在LoginAction中调用DAO实现(IUserDAOImpl)把用户存到数据库。就这么简单。出现问题:提交后出现“Servlet action is not available”,查了很多资料。配置对不对啊,包冲突啊都试了,还是出这个问题(怀疑自己也有可能没试好)。因为错误只显示“Servlet action is not available”,TOMCAT控制台和日志文件又没有其他信息。不知道怎么个找错误法最后发现一点,可能是原因所在:在applicationContext.xml中的sessionfactory bean中配置实体类映射文件时是用<property name="mappingResources">...</property>是吧。如果我不配置它,肯定是报错,但至少提交页面后请求能进入ACTION类并调用DAO实现类的方法来session.save()对象,控制台报错信息是“org.hibernate.MappingException: Unknown entity: com.temp.struts.vo.User”。如果我配置mappingResources,就只有页面显示的“Servlet action is not available”,控制台没信息。简单的考虑以为是写错了。可就那几个字,我对了好几遍没错啊。彻底晕了。
摆脱各位高手指点迷津,菜鸟感激不尽。。代码上
web.xml。
  <servlet>
      <servlet-name>context</servlet-name>
      <servlet-class>org.springframework.web.context.ContextLocationServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>WEB-INF/classes/applicationContext.xml</param-value>
  </context-param>
。struts-config.xml
<struts-config>
  <form-beans >
    <form-bean name="loginForm" type="com.temp.struts.form.LoginForm" />
  </form-beans>
  <global-exceptions />
  <global-forwards />
  <action-mappings >
        <action
           attribute="loginForm"
           input="/login.jsp"
           name="loginForm"
           path="/login"
           scope="request"
           type="com.temp.struts.action.LoginAction" >
            <forward name="success" path="/hello.jsp"></forward>
            <forward name="fail" path="/fail.jsp"></forward>
        </action>
  </action-mappings>
  <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"></controller>
  <message-resources parameter="com.temp.struts.ApplicationResources" />
   <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml"/>
 </plug-in>
</struts-config>applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="datasource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:super">
</property>
<property name="username" value="oceansoft"></property>
<property name="password" value="oceansoft"></property>
</bean>
<bean id="sessionfactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="datasource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
</props>
</property> <property name="mappingResources">
<list>
<value>com/temp/struts/vo/AdminTemp.hbm.xml</value>
<value>com/temp/struts/vo/User.hbm.xml</value>
                                </list>
</property>
         </bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionfactory"/>
</property>
</bean> <bean id="iuserdao" class="com.temp.struts.dao.IUserDAO" abstract="true"></bean>
<bean id="iuserdaoimpl" class="com.temp.struts.dao.impl.IUserDAOImpl"
  parent="iuserdao">
 <property name="hibernateTemplate">
   <ref bean="hibernateTemplate"/>
 </property>
 </bean>
    <bean name="/login" class="com.temp.struts.action.LoginAction">
    <property name="iuserdao">
    <ref bean="iuserdaoimpl"/>
    </property>
    </bean>
</beans>
请先帮我看看吧,如果需要发类文件代码我再发,不过感觉代码应该没问题。因为不配置mappingresources的话都走的通的。
谢谢了!

解决方案 »

  1.   

    在项目中加上log4j日志文件,可以找到错误的真正原因
    知道原因所在问题就好解决了
      

  2.   

    LZ绝对就是配置文件出错了,跳转action的时候,你自己查下
      

  3.   

     
    <action 
              attribute="loginForm" 
              input="/login.jsp" 
              name="loginForm" 
              path="/login" 
              scope="request" 
              type="com.temp.struts.action.LoginAction" > 
                <forward name="success" path="/hello.jsp"> </forward> 
                <forward name="fail" path="/fail.jsp"> </forward> 
            </action> 
    改为<action path="/login" type="org.springframework.web.struts.DelegatingActionProxy" name="loginForm" scope="request" parameter="method">
       <forward name="success" path="/hello.jsp"> </forward> 
       <forward name="fail" path="/fail.jsp"> </forward> 
    </action> 
    试试看,尽量看看加包有没有重复,将asm-2.24好像是这个包去掉,
      

  4.   

    一步一步来
    先讲spring和struts进行集成
    然后在吧hibernate集成过来
      

  5.   

    好主意,昨晚也想好今天用log4j查看了,回贴后马上动工。没有在一开始就配置log4j是不是很不专业呵呵
      

  6.   


    网上有很多log4j的配置信息,还可以将日志写成一个html文件
      

  7.   

    这个配置是另一种整合方式吧。是把action全权交给spring管理了。我比较死心眼,我先把我这种捣鼓通了再说。呵呵。而且我不想把action交给spring。下一步我还打算添加service把struts和spring再解开点;再把hibernate的配置文件独立出来,只让spring加载它。呵呵。整着玩。。
      

  8.   

    我不用hibernate,应用走的通,感觉struts和spring的整合没啥问题。添加上hibernate但不添加mappingResource,也能走的通(当然,只配置了但没有hibernate的方法。一加上mappingResource就连action都进不去了。楼上说配置文件错了,我对了对也没发现什么错。也许某些同志已经看出来了我就是照着智囊团的视频做的。跟它一样一样的。。还是log4j走起来先
      

  9.   


    看看你的web.xml里面struts是.do还是/形式的 ,你肯定路径提交错误了。
    承揽:网站开发,SEO优化,毕业设计,OA,ERP,空间,域名,企业级管理系统  业务范围:[.net] [java]
      

  10.   

    可能还是包冲突,去程序部署的地方看web-inf/lib文件夹中是不是有hibernate-annotations.jar这么一个包。将这个jar文件删除再试试。
      

  11.   

     在web.xml 文件配置了<param-value>WEB-INF/classes/applicationContext.xml </param-value> 
    在struts-config.xml  在去配置
      <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> 
        <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml"/> 
    </plug-in> 
    </struts-config> 是不是回出现重复加载的错误!!!!!!
      

  12.   

    配置了log4j,发现了一些问题也解决大半了。说来惭愧。我实体类User.java错了。没有id属性脑残。我通过Myeclipse的Reverse Engineering只生成了映射文件。JAVA类是自己写的。当初没多想,以为写错了肯定会报错的(这个坏习惯终于得到回报了)。系统初始化时会构建sessionfactory的实例,同时验证mappingresource里面的实体类和映射文件。实体类、映射文件、表三者都要对应好,感觉它仨出错的组合情况不同,给你报错的形式也就不同,我就遇到了不给我报错,等你操作的时候就给你个Servlet action is not available。也许是吧,猜的,有时间深入一下。
    把实体类和映射文件改好后(我映射文件中ID对应的oracle数据库序列也没配置好。。)这点算是过去。总算没有Servlet action is not available。又处理了包冲突,错误提示找不到asm的什么方法,把spring用到的asm-2.2.3.jar删了,这个也过去了。
    然后又一个问题解决不了了。。错误提示:
    ERROR (ApplicationContext.java:678) - Error loading WebappClassLoader
      delegate: false
      repositories:
        /WEB-INF/classes/
    ----------> Parent Classloader:
    org.apache.catalina.loader.StandardClassLoader@bcda2d
     org.springframework.web.context.ContextLocationServlet
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLocationServlet网上查说eclipse没有导入spring.jar包。我自己下个导进去。还是报这个错。
    请哪位再给指点指点
    文笔不行,请见谅。
      

  13.   

    楼主试试把struts-cfg-.xml中的plugIn去掉,而在web.xml加上<context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/applicationContext.xml</param-value>
      </context-param>
      <servlet>
       <servlet-name>context</servlet-name>
       <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
       <load-on-startup>1</load-on-startup>
      </servlet>这里<param-name>的路径是你工程下spring配置文件的路径
      

  14.   

    删掉确实不报错了,不过我删的是web.xml里面的servlet配置。俩东西一样?重复加载出错?可是视频上确实这么配的,系统没报错也行的通。不理解,慢慢研究吧。这个先到这里吧,感谢各位的解答!!!