整合Struts2.1+Hibernate3.3+Spring3.0

hibernate.cfg.xml:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

 <session-factory>
  <property name="dialect">
   org.hibernate.dialect.Oracle9Dialect
  </property>
  <property name="connection.url">
   jdbc:oracle:thin:@localhost:1521:O92
  </property>
  <property name="connection.username">kk</property>
  <property name="connection.password">kkpwd</property>
  <property name="connection.driver_class">
   oracle.jdbc.driver.OracleDriver
  </property>
  <property name="myeclipse.connection.profile">
   oracleDriver
  </property>
  <property name="show_sql">true</property>
  <mapping resource="org/kaixin/pojos/Userinfo.hbm.xml" />
  <mapping resource="org/kaixin/pojos/Users.hbm.xml" />

 </session-factory>

</hibernate-configuration>

 

 

 

 

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"

xmlns:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

紅色字加粗部分是配置事務必須加上的。

 

在Spring配置文件中配置Hibernate的Session工廠和hibernateTemplate:

 

<bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="configLocation" value="classpath:hibernate.cfg.xml">
  </property>
 </bean>
 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory">
   <ref bean="sessionFactory" />
  </property>
 </bean>

給通用類Common注入hibernateTemplate:

<bean id="common" class="org.kaixin.common.Common">
  <property name="hibernateTemplate">
   <ref bean="hibernateTemplate" />
  </property>
 </bean>

給需要的包下的類中的方法添加事務:

<bean id="txManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref bean="sessionFactory"></ref>
  </property>
 </bean>

 <tx:advice id="txAdvice" transaction-manager="txManager">
  <tx:attributes>
   <tx:method name="get*" read-only="true" rollback-for="java.lang.Exception" />
   <tx:method name="load*" read-only="true" rollback-for="java.lang.Exception" />
   <tx:method name="find*" read-only="true" rollback-for="java.lang.Exception" />
   <!--
    <tx:method name="*" propagation="REQUIRED"
    rollback-for="java.lang.Exception" />
   -->
   <tx:method name="*" rollback-for="java.lang.Exception" />
  </tx:attributes>
 </tx:advice>

 <aop:config>
  <!--
   <aop:pointcut id="serviceOperation" expression="execution(*
   org.kaixin.*.*(..))" />
  -->
  <aop:pointcut id="serviceOperation" expression="execution(* org.kaixin.idao.*.*(..))" />
  <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice" />
 </aop:config>

導入其他外部文件:

  <import resource="pojo.xml" />
  <import resource="dao.xml" />
  <import resource="service.xml" />
  <import resource="action.xml" />

 

pojo.xml:

 

<bean id="users" class="org.kaixin.pojos.Users"></bean>
<bean id="userinfo" class="org.kaixin.pojos.Userinfo"></bean>

 

dao.xml:

 

<bean id="usersdaoimpl" class="org.kaixin.dao.impl.UsersDaoImpl">
    <property name="icommon">
        <ref bean="common"/>
    </property>
</bean>


<bean id="userinfodaoimpl" class="org.kaixin.dao.impl.UserinfoDaoImpl">
    <property name="icommon">
        <ref bean="common"/>
 </property>
   
</bean>

 

service.xml:


<bean id="loginserviceimpl" class="org.kaixin.service.impl.LoginServiceImpl">
    <property name="iusersdao">
        <ref bean="usersdaoimpl"/>
    </property>   
</bean>

 

action.xml:

 

<bean id="loginaction" class="org.kaixin.beans.LoginAction" scope="prototype">
 <property name="loginservice" ref="loginserviceimpl"></property>

</bean>

 <bean name="registeraction" class="org.kaixin.beans.RegisterAction"scope="prototype"></bean>

 

 

 

struts.xml:

 

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


<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
    <constant name="struts.devMode" value="false" /> 
    <include file ="struts-default.xml" />   

 <!--<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />--> 
 <constant name="struts.objectFactory" value="spring"/>
    <package name="log" extends="struts-default" namespace="/login_register">
         <default-action-ref name="login" /> 
         
        <action name="login"  class="loginaction" >    
             <result name="input">/login/login.jsp</result>
            <result name="loginSecceed">/login/loginSecceed.jsp</result>
    <result name="loginFailed">/login/loginFailed.jsp</result>
        </action> 
        
     
       
  <action name="register" class="registeraction">
            <result name="registerSecceed">/login/registerSecceed.jsp</result>
    <result name="registerFailed">/login/registerFailed.jsp</result>
     </action>
    </package>

    

</struts>

 

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"

xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
   /WEB-INF/classes/applicationContext.xml
  </param-value>
 </context-param>

 

 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>
   org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 

 

 

 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>


</web-app>

 

 

login/login.jsp頁面:

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>登錄</title>

<link rel="stylesheet" type="text/css" href="../css/overlay.css" />
  <link rel="stylesheet" type="text/css" href="../css/share.css" />
  <link rel="stylesheet" type="text/css" href="../css/login.css" />
 </head>
 <body>
  <!-- container s -->
  <div class="container">
   <!-- header s -->
   <div class="header">
    <span class="logo"></span>
   </div>
   <!-- header e -->
   <!-- bodier s-->
   <div class="bodier">
    <!-- left s -->
    <div class="left">
     <div class="l_login">
       <div class="ll_login">
      <s:form action="login" namespace="/login_register">


       <s:textfield name="users.UUsername" label="用戶名" ></s:textfield>

       <s:textfield name="users.UPassword" label="密    碼" ></s:textfield>
       <s:submit label="submit"></s:submit>

      </s:form>
      </div>
     </div>
     <div class="l_register">
      <s:a href="../login/register.jsp">註冊</s:a>
     </div>
    </div>
    <!-- left e -->
    <!-- right s -->
    <div class="right">
     right
    </div>
    <!-- right e -->
   </div>
   <!-- bodier e -->

   <!-- footer s -->
   <div class="footer">
    footer
   </div>
   <!-- footer e -->
  </div>
  <!-- container e -->
 </body>
</html>

在寫這些代碼的過程中,處理過這些問題:

 

1:剛剛架構好hibernate,測試hibernate對oracle的查詢功能,成功!可測試添加操作時,總是報一個錯:java.sql.SQLException: 不支持的特性,於是換了oracle驅動,由原先的class12.jar換成了ojdbc6.jar,才知道ojdbc14,ojdbc15,ojdbc6的區別和用處。終於不報錯了,可是又報org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [org.kaixin.pojos.Users#9]就是無法往oracle數據庫添加數據,於是自己在oracle數據庫中建立了一個序列和對應這個表的觸發器;可還是不行,於是把pojo類對應的配置文件裏面的native屬性改成了sequence,還是不行,於是又把sequence改爲了increment,數據庫的插入語句纔出來。

2:數據庫插入語句是出來了,可就是沒法往數據庫添加數據,猜想是Spring的事務配置有問題,找事務配置語句的語法錯誤,終沒找到,心裏一煩躁,真不想繼續,後來才發現,是自己配置連接點的時候寫錯了包名!改了之後馬上就好了。

3:整合好hibernate3.3+Struts2.1時,試圖提交表單實現轉發,可總是沒法找到我的命名空間下的action,看地址欄裏面,簡直一點規律都沒有,於是自己推斷是不是自己的命名空間和web-root下面的文件夾名字有出入,可我無論怎麼調,就是攔截不到action,後來才發現struts.xml配置文件裏面package標籤的namespace屬性應該跟前臺頁面中的namespace屬性一致,要加反斜槓,而且不應該是<form>而應該是<s:form namespace="/xx">,可是加了反斜槓以後,雖然沒有報錯了,可還是攔截不到action,地址欄中的信息依然摸不到規律於是自己推斷是不是攔截器有問題,改了攔截器配置.雖然之前在網上一直找不到適合於自己的答案,不論是改web.xml裏面的Struts2對filter的class屬性還是注意是否寫錯了什麼細節。後來才發現到底什麼時候用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter什麼時候用org.apache.struts2.dispatcher.FilterDispatcher。前者的版本比後者高。然後又把默認的*.action改爲了/*,也就是說把原來的

<filter>
  <filter-name>struts2</filter-name>
  <filter-class>
   org.apache.struts2.dispatcher.FilterDispatcher
  </filter-class>
 </filter>

 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>*.action</url-pattern>
 </filter-mapping>

改成了:

 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>
   org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

其中把*.action改爲/*是關鍵!

可問題還是沒有解決。

老是報錯無法實例化struts2的actionbean

於是下意識的在actionbean裏面添加了個無參數的構造方法,這下再訪問,一切OK了。

測試成功後又反覆測命名空間是否與webroot下建立文件夾有關係。後來發現,沒有直接關係,namespace是namespace,文件夾是文件夾,如果既有namespace又有文件夾的話,假如現在namespace是“login_register”,webroot下面的文件結構是這樣“webroot/login/login.jsp”則應該這樣訪問:http://localhost:8087/kaixin1/login/login.jsp,點擊提交按鈕後地址欄中的內容就成了這樣:http://localhost:8087/kaixin1/login_register/login.action

 

4:正待一切都OK,此時我需要在actionbean裏面用Spring給struts2的actionbean注入service類,可怎麼都不成功,總報actionbean中execute方法中引用service時的nullpointerexception,估計是spring沒有給struts中的service屬性初始化,於是在action.xml裏面配置了相應的bean,如:

<bean id="loginaction" class="org.kaixin.beans.LoginAction" scope="prototype">
 <property name="loginservice" ref="loginserviceimpl"></property>

</bean>

然後在struts.xml文件裏面改動了下:由原先的

<action name="login"  class="org.kaixin.beans.LoginAction" >    
             <result name="input">/login/login.jsp</result>
            <result name="loginSecceed">/login/loginSecceed.jsp</result>
    <result name="loginFailed">/login/loginFailed.jsp</result>
        </action> 

改爲了:

   
        <action name="login"  class="loginaction" >    
             <result name="input">/login/login.jsp</result>
            <result name="loginSecceed">/login/loginSecceed.jsp</result>
    <result name="loginFailed">/login/loginFailed.jsp</result>
        </action> 

這下空指針終於消除了。        

5:空指針是消除了,可是提交頁面時,

java.lang.reflect.InvocationTargetException
java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I

又出現啦。

於是刪掉了struts庫下面的anltr.jar後,運行OK!只要原因是struts2裏面的anltr與hibernate3.3裏面的anltr包相沖突了。

怎麼刪除庫下面的jar文件?

點myeclise的window--->preferences--->myEclipse--->Project Capabilities--->Struts2--->struts2 core libraries(下拉框的第二項),然後選擇anltr.jar,remove掉,close一下自己的工程,再openproject,把tomcat下面的已經發布了的該工程remove掉,重新發布一次,重啓服務器,一切OK。

 

發佈了12 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章