今天在幫公司的新手弄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"/>。這樣你的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
阿蜜果 閱讀(20456)
評論(5) 編輯 收藏 所屬分類:
Spring