隨筆-348  評(píng)論-598  文章-0  trackbacks-0
             今天在幫公司的新手弄SSH的一個(gè)登錄程序時(shí),出現(xiàn)了Servlet action is not available異常,第一反應(yīng)應(yīng)該是struts配置的問(wèn)題,找了段時(shí)間發(fā)現(xiàn)配置沒(méi)錯(cuò),搜索了下,找了幾篇好文,問(wèn)題成功解決,原來(lái)是那個(gè)大頭蝦將spring的配置文件中hibernate的model文件路徑寫(xiě)錯(cuò)了,這種問(wèn)題還真難找,我眼睛睜得圓圓的,找了N久才找到。
                 共享下網(wǎng)上資料:
                 1. http://community.csdn.net/Expert/TopicView3.asp?id=4927147
                     原文如下:
                     最近在做開(kāi)發(fā)用STRUTS+SPRING+HIBERNATE
          遇到一個(gè)很棘手的錯(cuò)誤:Servlet action is not available

          具體癥狀如下:
          文件夾系統(tǒng):
          com.Athena.data.hibernate 存放HIBERNATE的工廠類
          com.Athena.data.po.imp 存放持久化對(duì)象
          com.Athena.data.dao.imp 存放數(shù)據(jù)訪問(wèn)對(duì)象
          com.Athena.data.bo.imp 存放業(yè)務(wù)邏輯處理BEAN
          com.Athena.service 存放功能總接口類
          com.Athena.action 存放ACTION
          com.Athena.form 存放FORM
          com.Athena.prop 存放信息文件properties

          開(kāi)發(fā)工具ECLIPSE 3.1.1

          由于開(kāi)發(fā)中用的是MYECLIPSE4.1 所以生成數(shù)據(jù)表的影射文件的時(shí)候沒(méi)有被放到指定的包中,全部被工具自動(dòng)放到了缺省包中

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

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

          此時(shí),各個(gè)配置文件的關(guān)鍵代碼是:

          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中我寫(xiě)了一個(gè)登陸,包括loginForm.java , loginAction.java ,login.jsp

          登陸的邏輯是:輸入用戶名和密碼都為“HAHA”的時(shí)候 在頁(yè)面上返回登陸成功字樣,否則則返回登陸失敗(為了測(cè)試,所以ACTION中沒(méi)有涉及任何訪問(wèn)數(shù)據(jù)的東西,僅僅是在其中通過(guò)SPRING的注入機(jī)制,向里面注入了一個(gè)字符串,并在控制臺(tái)打出)

          loginAction關(guān)鍵源碼:

          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>

          ---------------------------------------------------------------------------------
          以上是沒(méi)有任何問(wèn)題,網(wǎng)頁(yè)運(yùn)行正常,但是當(dāng)我把被工具自動(dòng)放到缺省包的那些文件轉(zhuǎn)移到相應(yīng)包之后,我修改了如下東西(以下是修改的):

          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" >


          被自動(dòng)放到缺省包的文件的路徑變更:

          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

          ------------------------------------------------------------------------------
          做了以上修改后(以上各個(gè)配置文件的路徑修改都是我仔細(xì)檢查過(guò)的,只不過(guò)現(xiàn)在有點(diǎn)眼花了,所以如果寫(xiě)錯(cuò)了,請(qǐng)不用給予糾正,那可能是我打錯(cuò)了),再次啟動(dòng)網(wǎng)頁(yè),登陸界面正常出,一點(diǎn)提交,就會(huì)返回錯(cuò)誤:Servlet action is not available

          疑問(wèn):
          ACTION中沒(méi)有涉及任何的數(shù)據(jù)訪問(wèn)和業(yè)務(wù)邏輯,僅僅是簡(jiǎn)單的判斷,為什么移動(dòng)了幾個(gè)不相關(guān)的文件就說(shuō)是找不到ACTION了呢? (網(wǎng)絡(luò)上也有很多答案,結(jié)果還是一無(wú)所獲)

          如果哪位大俠可以賜教,請(qǐng)加我的MSN:Mars.Eric@hotmail.com
          在此拜托了,處理了3天了,快死了。

           
          回復(fù)人:Eric_Mars() ( 一級(jí)(初級(jí))) 信譽(yù):100 2006-8-4 17:10:50 得分:0
          ?

          問(wèn)題解決了
          解決方法:
          在SPRING的配置文件中生命.HBM.XML文件的時(shí)候一定要注意:
          例如路徑為:com.hibernate.xxx.hbm.xml
          那么聲明的時(shí)候應(yīng)該寫(xiě)成 /com/hibernate/xxx.hbm.xml

          同時(shí)記得改好xxx.hbm.xml內(nèi)部的路徑配置

                 2. Servlet action is not available 問(wèn)題解決
                     原文出處http://blog.csdn.net/lijiuu/archive/2007/03/22/1538069.aspx
                     文章如下:
                    環(huán)境eclipse3.2+myeclipse+tomcat5.0x

                 重要提示:出現(xiàn)這個(gè)問(wèn)題的原因很多,最多見(jiàn)的是配置文件出錯(cuò)不能初始化出現(xiàn)Servlet action is not available提示。要解決問(wèn)題需要具體問(wèn)題具體分析,多看容器的logs。

                 背景提示,我要做struts+spring+hibernate的配置,但是按照書(shū)上說(shuō)的配置好了后,總是錯(cuò)誤,提示Servlet action is not available后臺(tái)log就提示2006-03-22 22:34:09 StandardWrapperValve[action]: Servlet action is currently unavailable。弄了很久沒(méi)有弄好。后來(lái)看了很久的log才發(fā)現(xiàn)提示配置文件中有錯(cuò)誤,所以把a(bǔ)ction設(shè)置為null。

          在找這個(gè)錯(cuò)誤,找了很久才發(fā)現(xiàn):一個(gè)是


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

          在struts中配置spring插件時(shí),applicationContext.xml(spring的配置文件)位置錯(cuò)了,書(shū)上一般是"/WEB-INF/applicationContext.xml"  但是有的時(shí)候不是在這個(gè)下面。所以一定要自己到容器下看看具體位置。比如我的就是在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自動(dòng)添加的是這樣的,我一直沒(méi)有注意,結(jié)果應(yīng)該為:

              <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、我發(fā)現(xiàn)我的myeclipse沒(méi)有把spring.jar拷貝到lib下,以后大家出了問(wèn)題可以看看。

               利用spring+hibernate+struts過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題,在action中將一個(gè)hibernate讀取出來(lái)的ArrayList存入session:request.getSession().setAttribute("treeFromRoot", treeList.iterator());

          在jsp中用標(biāo)簽 讀取代碼如下:會(huì)出現(xiàn)Cannot create iterator for this collection 錯(cuò)誤,弄了一下午都沒(méi)有搞定。

          <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這個(gè)list的成員的原形類。



          ---------------------------------------------------------
          專注移動(dòng)開(kāi)發(fā)

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2007-05-10 12:51 TiGERTiAN 閱讀(1027) 評(píng)論(2)  編輯  收藏 所屬分類: Java

          評(píng)論:
          # re: 今天碰到了和Amigo姐那篇備忘一樣的問(wèn)題,Servlet Action is not available,備忘下[未登錄](méi) 2007-05-21 21:29 | 小木
          謝謝咯!!  回復(fù)  更多評(píng)論
            
          # re: 今天碰到了和Amigo姐那篇備忘一樣的問(wèn)題,Servlet Action is not available,備忘下 2008-01-13 18:52 | JSP小菜鳥(niǎo)
          我在部署一個(gè)簡(jiǎn)單的Struts+Hibernate時(shí)出現(xiàn)樓主提到的問(wèn)題。開(kāi)始是SessionFactory.curretSession(),MyEclipse提示currentSession();方法不是SessionFactory里的東西,后來(lái)我改成SessionFactory.getSession,可以了,但是部署的時(shí)候就出現(xiàn)404錯(cuò)誤,哪位高手能幫一下。。。。。。。。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 河曲县| 简阳市| 四子王旗| 蒲城县| 临江市| 五家渠市| 炉霍县| 新干县| 怀来县| 嘉兴市| 博罗县| 六盘水市| 中西区| 阳曲县| 汤原县| 文登市| 威海市| 太和县| 广昌县| 洪泽县| 门源| 黄陵县| 株洲市| 林西县| 油尖旺区| 丁青县| 依安县| 庆阳市| 德兴市| 永川市| 凌源市| 固始县| 雅安市| 禄劝| 富裕县| 黑龙江省| 昌都县| 庄浪县| 华池县| 冕宁县| 冷水江市|