搭建ssh框架相關配置文件總結java
第一步 導入jar包mysql
第二步 搭建struts2環境web
(1)建立action(繼承actionnsuport),建立struts.xml配置文件,配置actionspring
public class UserAction extends ActionSupport{}
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="User_test" extends="struts-default" namespace="/"> <action name="user_*" class="com.my.action.UserAction" method="{1}"> </action> </package> </struts>
(2)配置struts2的過濾器,在web.xml中sql
<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>
第三步 搭建hibernate環境數據庫
(1)建立實體類,Userapache
public class User { private Integer uid; private String username; private String password; private String email; private String code; private Boolean state; //再生成set/get方法 }
1 實體類裏面屬性私有的tomcat
2 私有屬性使用公開的set和get方法操做服務器
3 要求實體類有屬性做爲惟一值(通常使用id值)session
4 實體類屬性建議不使用基本數據類型,使用基本數據類型對應的包裝類 (1)八個基本數據類型對應的包裝類 - int – Integer - char—Character、 - 其餘的都是首字母大寫 好比 double – Double (2)好比 表示學生的分數,假如 int score; - 好比學生得了0分 ,int score = 0; - 若是表示學生沒有參加考試,int score = 0;不能準確表示學生是否參加考試 l 解決:使用包裝類能夠了, Integer score = 0,表示學生得了0分, l 表示學生沒有參加考試,Integer score = null; |
(2)配置實體類和數據庫表映射關係,User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.my.entity.User" table="t_user"> <id name="uid" column="uid"> <generator class="native"></generator> </id> <property name="username" column="username"></property> <property name="password" column="password"></property> <property name="email" column="email"></property> <property name="code" column="code"></property> <property name="state" column="state"></property> </class> </hibernate-mapping>
(3)建立hibernate核心配置文件,hibernate.cfg.xml
- 引入映射配置文件
(配置文件須要引入約束)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 這裏沒有配置數據庫,以後建立spring的時候配置 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <mapping resource="com/my/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
第四步 搭建spring環境
(1)建立spring核心配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"<!-- IOC相關 --> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<!-- IOC相關 --> xmlns:p="http://www.springframework.org/schema/p"<!-- P名稱空間 --> xmlns:context="http://www.springframework.org/schema/context"<!-- IOC註解相關 --> xmlns:aop="http://www.springframework.org/schema/aop"<!-- 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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> </beans>
(2)讓spring配置文件在服務器啓動時候加載,在web.xml中
- 配置監聽器
- 指定spring配置文件位置
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:bean.xml</param-value> </context-param> ...... <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
第五步 struts2和spring整合
(1)把action在spring配置(action多實例的)
(2)在struts.xml中action標籤class屬性裏面寫 bean的id值
bean.xml <bean id="userAction" class="com.my.action.UserAction" scope="prototype"> </bean>
struts.xml <action name="user_*" class="userAction" method="{1}">
第六步 spring和hibernate整合
(1)把hibernate核心配置文件中數據庫配置,在spring裏面配置
(2)把hibernate的sessionFactory在spring配置
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///my"></property> <property name="user" value="root"></property> <property name="password" value="123"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocations" value="classpath:hibernate.cfg.xml"></property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
第七步 完成互相注入關係(在dao裏面使用hibernateTemplate)
(1)在dao注入hibernateTemplate對象
(2)在hibernateTemplate對象中注入sessionFactory
public class UserAction extends ActionSupport{ private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } }
@Transactional public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } } /** 問題:若是在service類上面沒有添加註解,出現異常 問題:只讀模式下(FlushMode.NEVER/MANUAL)寫操做不被容許:把你的Session改爲FlushMode.COMMIT/AUTO或者清除事務定義中的readOnly標記。 錯誤緣由: OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode 設爲FlushMode.NEVER。 而後把該sessionFactory綁定到TransactionSynchronizationManager,使request的整個過程都使用同一個session,在請求事後再接除該sessionFactory的綁定, 最後closeSessionIfNecessary根據該session是否已和transaction綁定來決定是否關閉session。 在這個過程當中,若HibernateTemplate 發現自當前session有不是readOnly的transaction,就會獲取到FlushMode.AUTO Session,使方法擁有寫權限。 也便是,若是有不是readOnly的transaction就能夠由Flush.NEVER轉爲Flush.AUTO,擁有insert,update,delete操做權限,若是沒有transaction,而且沒有另外人爲地設flush model的話,則doFilter的整個過程都是Flush.NEVER。 因此受transaction(聲明式的事務)保護的方法有寫權限,沒受保護的則沒有。 */
public interface UserDao {}
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {}
<bean id="userAction" class="com.my.action.UserAction" scope="prototype"> <property name="userService" ref="userService"></property> </bean> <bean id="userService" class="com.my.service.UserService"> <property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="com.my.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 這一部分能夠另外建立一個xml文件(好比user.xml),再引入bean.xml中的約束, 最後在bean.xml中引入這個文件<import resource="classpath:user.xml"/> 適合多人開發。 -->
最後結構圖:
測試:啓動服務器(我試過tomcat和resin),若是沒有報錯,而且數據庫中存在數據表,則說明成功。
注意:數據庫必須有,表能夠沒有;log4j.properties是一個能夠顯示詳細日誌信息的配置文件。
補:
在web.xml中在配置以下,緣由是防止"no session"問題
<filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>