posts - 297,  comments - 1618,  trackbacks - 0
                今天在幫公司的新手弄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 阿蜜果 閱讀(20464) 評論(5)  編輯  收藏 所屬分類: Spring


          FeedBack:
          # re: Servlet action is not available異常備忘
          2007-05-12 09:22 | seraph
          謝謝你我的問題解決了,是SPRING中的XML路徑的問題.

          還有就是一定要在struts配置文件中加: <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>。這樣你的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完整庫就可以了,呵呵!  回復  更多評論
            
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296322
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 星子县| 鲁山县| 陇西县| 岱山县| 顺昌县| 龙川县| 梅州市| 延边| 克什克腾旗| 茌平县| 岗巴县| 江西省| 上栗县| 得荣县| 波密县| 元阳县| 自贡市| 台前县| 牡丹江市| 会宁县| 天等县| 泰和县| 广平县| 乐山市| 洛扎县| 卢湾区| 泽库县| 宿迁市| 大港区| 仁化县| 乐昌市| 和田县| 上高县| 察隅县| 扎鲁特旗| 鄄城县| 宾阳县| 南溪县| 海丰县| 红安县| 黄龙县|