HTTP Status 404 - Servlet action is not available(二)

今天在帮公司的新手弄SSH的一个登录程序时,出现了Servlet action is not available异常,第一反应应该是struts配置的问题,找了段时间发现配置没错,搜索了下,找了几篇好文,问题成功解决,原来是那个大头虾将 spring的配置文件中hibernate的model文件路径写错了,这种问题还真难找,我眼睛睁得圆圆的,找了N久才找到。
       共享下网上资料:
       1. http://community.csdn.net/Expert/TopicView3.asp?id=4927147
           原文如下:
           最近在做开发用STRUTS+SPRING+HIBERNATE
遇到一个很棘手的错误:Servlet action is not available

具体症状如下:
文件夹系统:
com.Athena.data.hibernate 存放HIBERNATE的工厂类
com.Athena.data.po.imp 存放持久化对象
com.Athena.data.dao.imp 存放数据访问对象
com.Athena.data.bo.imp 存放业务逻辑处理BEAN
com.Athena.service 存放功能总接口类
com.Athena.action 存放ACTION
com.Athena.form 存放FORM
com.Athena.prop 存放信息文件properties

开发工具ECLIPSE 3.1.1

由于开发中用的是MYECLIPSE4.1 所以生成数据表的影射文件的时候没有被放到指定的包中,全部被工具自动放到了缺省包中

被放到缺省包中的文件:(影射的表为user_first)

AbstractUser_First.java
User_First.java
User_FirstDAO.java
User_First.hbm.xml

此时,各个配置文件的关键代码是:

applicationContext.xml:


<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="mssqldata" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>User_First.hbm.xml</value>
</list>
</property>
</bean>
<bean id="User_FirstDAO" class="User_FirstDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>


struts-config.xml:


<action-mappings >
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy" />

</action-mappings>

在STRUTS中我写了一个登陆,包括loginForm.java , loginAction.java ,login.jsp

登陆的逻辑是:输入用户名和密码都为“HAHA”的时候 在页面上返回登陆成功字样,否则则返回登陆失败(为了测试,所以ACTION中没有涉及任何访问数据的东西,仅仅是在其中通过SPRING的注入机制,向里面注入了一个字符串,并在控制台打出)

loginAction关键源码:

private String sm;
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {

LoginForm loginForm = (LoginForm) form;
String username=loginForm.getUsername();
String userpass=loginForm.getUserpass();
if(username.equals("haha")&&(userpass.equals("haha"))){
ActionMessages meg=new ActionMessages();
meg.add("userlogout",new ActionMessage("user.logon"));
saveErrors(request,meg);
System.out.println(username+" "+userpass+" "+sm);
return mapping.findForward("logout");
}else{
ActionMessages meg=new ActionMessages();
meg.add("userlogon",new ActionMessage("user.logout"));
saveErrors(request,meg);
System.out.println(username+" "+userpass+" ");
return mapping.findForward("logout");
}

}
public String getSm() {
return sm;
}
public void setSm(String sm) {
this.sm = sm;
}

在applicationContext.xml中的注入代码:

<bean name="/login" class="com.Athena.action.LoginAction" singleton="false">
<property name="sm">
<value>dadadada</value>
</property>
</bean>

---------------------------------------------------------------------------------
以上是没有任何问题,网页运行正常,但是当我把被工具自动放到缺省包的那些文件转移到相应包之后,我修改了如下东西(以下是修改的):

applicationContext.xml:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="mssqldata" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/Athena/data/po/imp/User_First.hbm.xml</value> //在此我添加了路径
</list>
</property>
</bean>
<bean id="User_FirstDAO" class="com.Athena.data.dao.imp.User_FirstDAO">
//在此我添加了路径
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>


User_First.htm.xml 的修改:
<hibernate-mapping package="com.Athena.data.po.imp">
<class name="com.Athena.data.po.imp.User_First" table="AthenaCompany" >


被自动放到缺省包的文件的路径变更:

AbstractUser_First.java com.Athena.data.po
User_First.java com.Athena.data.po.imp
User_FirstDAO.java com.Athena.data.dao.imp
User_First.hbm.xml com.Athena.data.po.imp

------------------------------------------------------------------------------
做了以上修改后(以上各个配置文件的路径修改都是我仔细检查过的,只不过现在有点眼花了,所以如果写错了,请不用给予纠正,那可能是我打错了),再次启动网页,登陆界面正常出,一点提交,就会返回错误:Servlet action is not available

疑问:
ACTION中没有涉及任何的数据访问和业务逻辑,仅仅是简单的判断,为什么移动了几个不相关的文件就说是找不到ACTION了呢? (网络上也有很多答案,结果还是一无所获)

如果哪位大侠可以赐教,请加我的MSN:Mars.Eric@hotmail.com
在此拜托了,处理了3天了,快死了。

回复人:Eric_Mars() ( 一级(初级) ) 信誉:100 2006-8-4 17:10:50 得分: 0
?

问题解决了
解决方法:
在SPRING的配置文件中生命.HBM.XML文件的时候一定要注意:
例如路径为:com.hibernate.xxx.hbm.xml
那么声明的时候应该写成 /com/hibernate/xxx.hbm.xml

同时记得改好xxx.hbm.xml内部的路径配置


       2. Servlet action is not available 问题解决
           原文出处 http://blog.csdn.net/lijiuu/archive/2007/03/22/1538069.aspx
           文章如下:
          环境eclipse3.2+myeclipse+tomcat5.0x

       重要提示:出现这个问题的原因很多,最多见的是配置文件出错不能初始化出现Servlet action is not available提示。要解决问题需要具体问题具体分析,多看容器的logs。

       背景提示,我要做struts+spring+hibernate的配置,但是按照书上说的配置好了后,总是错误,提示Servlet action is not available后台log就提示2006-03-22 22:34:09 StandardWrapperValve[action]: Servlet action is currently unavailable。弄了很久没有弄好。后来看了很久的log才发现提示配置文件中有错误,所以把action设置为null。

在找这个错误,找了很久才发现:一个是


    
< plug-in
        
className ="org.springframework.web.struts.ContextLoaderPlugIn" >
        
< set-property  property ="contextConfigLocation"
            value
="/WEB-INF/classes/applicationContext.xml"   />
    
</ plug-in >

在struts中配置spring插件时,applicationContext.xml(spring的配置文件)位置错了,书上一般是"/WEB-INF/applicationContext.xml"   但是有的时候不是在这个下面。所以一定要自己到容器下看看具体位置。比如我的就是在web-inf/classes下。

   二是:在spring的配置文件下的插入hibernate的配置文件

     < bean  id ="SessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        
< property  name ="configLocation" >
            
< value > file:src/hibernate.cfg.xml </ value >
        
</ property >
    
</ bean >

myeclipse自动添加的是这样的,我一直没有注意,结果应该为:

     < bean  id ="SessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        
< property  name ="configLocation" >
            
< value > file:src/hibernate.cfg.xml </ value >
        
</ property >
    
</ bean >

提示:hibernate.cfg.xml文件的具体位置你要到容器下去看。

重要提示:

1、还有就是一定要在 struts配置文件中加: <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/& gt;。这样你的action才能真的委托给spring。

2、我发现我的myeclipse没有把spring.jar拷贝到lib下,以后大家出了问题可以看看。

 

     利用spring+hibernate+struts过程中,发现一个问题,在action中将一个hibernate读取出来的ArrayList存入 session:request.getSession().setAttribute("treeFromRoot", treeList.iterator());

在jsp中用标签 读取代码如下:会出现Cannot create iterator for this collection 错误,弄了一下午都没有搞定。

< logic:notEmpty  name ="treeFromRoot" >
   
< logic:iterate  type ="edu.scnu.es.struts.vo.Tree"  id ="tree"
    name
="treeFromRoot" >


   
</ logic:iterate >
  
</ logic:notEmpty >  

最后决定用JSTL试一试,代码改为:成功了。

< c:forEach   items ="${sessionScope.treeFromRoot}"   var ="treeFromRoot1" >
    ${treeFromRoot1.id };
</ c:forEach >

其中:edu.scnu.es.struts.vo.Tree是treeFromRoot这个list的成员的原形类。

posted on 2007-04-27 17:05 阿蜜果 阅读(9404) 评论(5)   编辑   收藏 所属分类: Spring

<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.blogjava.net/amigoxie/archive/2007/04/27/114141.html" dc:identifier="http://www.blogjava.net/amigoxie/archive/2007/04/27/114141.html" dc:title="Servlet action is not available异常备忘" trackback:ping="http://www.blogjava.net/amigoxie/services/trackbacks/114141.aspx" /> </rdf:RDF> -->

<script type="text/javascript"> //&lt;![CDATA[ Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1')); Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90); //]]&gt; </script>

<!-- done-->


FeedBack:
#   re: Servlet action is not available异常备忘
2007-05-12 09:22 | seraph
谢谢你我的问题解决了,是SPRING中的XML路径的问题.

还有就是一定要在struts配置文件中加: <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/& gt;。这样你的action才能真的委托给spring。
是什么意思啊 ,能说的具体点吗,我的SSH,没有加这个,我不知道该加在什么地方,我的struts配置文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" " http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<data-sources />
<form-beans >
<form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm" >
<form-property name="password" type="java.lang.String" />
<form-property name="username" type="java.lang.String" />
</form-bean>
</form-beans>

<global-exceptions />
<global-forwards>
<forward name="goOk" path="/ok.jsp" />
</global-forwards>
<action-mappings >
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
parameter="method"
path="/login"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy">
</action><!-- 被改动过 -->

</action-mappings>

<message-resources parameter="com.xingfanbin.view.struts.ApplicationResources" />

<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-parser-validate" value="true" />
<set-property property="definitions-config" value="/WEB-INF/tiles-config.xml"/>
</plug-in>
<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,/WEB-INF/serviceContext.xml,/WEB-INF/viewContext.xml" />
</plug-in>

</struts-config>   回复    更多评论
  
#   re: Servlet action is not available异常备忘
2007-07-15 16:52 | simple_tip
不 是一定要加<controller>节点,这只是一种方法之一,如果在你的struts-config.xml中配置了<Plug- In>(class是org.springframework.web.struts.ContextLoaderPlugIn)然后把 spring的配置文件设为contextConfigLocation的属性值就没有心要再加<controller>了   回复    更多评论
  
#   re: Servlet action is not available异常备忘
2007-07-17 09:04 | Rongfx
非常感谢,我的myeclipse没有把spring.jar拷贝到lib,将myeclipse安装目录下找到的spring.jar拷贝到lib中,Servlet action is not available问题解决:)   回复    更多评论
  
#   re: Servlet action is not available异常备忘
2007-07-24 10:32 | spell
恩,今天碰到了问题,自己没有解决,还是重新来过,估计中间的步骤,哪里的包被覆盖了吧!   回复    更多评论
  
#   re: Servlet action is not available异常备忘

2007-07-31 16:48 | soCrazy
学习了!我今天也碰到这样的问题了,最后发现是my eclipse默认的库文件没包含web支持,所以spring容器启动就有问题,用spring完整库就可以了,呵呵!  回复   更多评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值