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。