上面的一篇博客已經介紹了 Spring和Hibernate之間的整合,沒看過的童鞋能夠去看看,這篇博客講解Spring+Hibernate+Struts2註解版。。。。。。。。。html
我的以爲使用註解可能更方便一點,就是在靈活性上很差把控,當方法特別多的時候,使用事務來進行管理時,就會消耗內存,從而形成浪費。若是使用AOP方式來進行管理,就能夠指定我哪些方法進行怎樣的操做,會減小內存的消耗。java
使用註解,首先你要知道你須要哪些支持(就是jar包),找不對就會出現jar包衝突的狀況,我在剛開始時常常出現這種狀況,這就須要你必定的基礎,熟悉各個框架之間須要鏈接的橋樑。今天講解的示例,使用的是如下jar包:mysql
<dependencies> <!--測試 jar包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.3</version> </dependency> <!--spring jar包 帶有一系列的jar包 例如:core ,expression,beans,context,aop--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!--spring web jar 包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!--spring-tx jar 包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!--spring-ormjar 包 整合所需jar包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!--spring-jdbcjar 包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!--aspectJ jar 包--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--commons-dncpjar 包 數據源 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <!--<dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency>--> <!--c3p0jar 包--> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!--struts2-spring-plugin jar 包 整合所需插件包 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.5.10</version> </dependency> <!--struts2 core 包 核心包--> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.10</version> </dependency> <!--使用註解action jar包--> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>2.5.10</version> </dependency> <!--hibernate jar 包--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.0.6.Final</version> </dependency> <!--jtajar 包--> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <!--mysql數據庫驅動--> <dependency> <groupId>org.wisdom-framework</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34_1</version> </dependency> <!--oraclejar 包--> <!--<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.1.0</version> </dependency>--> <!--jstl jar包--> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.1</version> </dependency> <!--mybatis jar包--> <!-- <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency>--> <!--servlet api包--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build> </project>
在這裏說明一點:有時候項目可能識別不到你編寫的xml文件和properties文件時,你就須要加上<build></build>節點裏面的內容,web
這樣編譯器就會編譯了,童鞋們要記住呦!spring
項目的總體架構:sql
使用idea的好處就是,架構特別清晰,什麼層幹什麼活,不會出現混亂的狀況,當你的架構調理不清楚時,啓動測試時就會出現各類錯誤,這裏吐槽一下:idea有時候報錯不會報到具體的錯誤,這點就很差,也在於我學的不精,基礎太差,呵呵,小小的抱怨一下。數據庫
當咱們所須要的jar包準備完畢後,就能夠開始搭建咱們的架構了。express
beans類的書寫:apache
package cn.note.beans; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; /** * Created by accp on 2017/3/31. */ @Table public class Book { @Id @GeneratedValue private Integer id; @Column private String name; @Column private String price; public Book() { } public Book(String name, String price) { this.name = name; this.price = price; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } }
dao層的書寫:主要定義方法原型,編寫SQL語句,訪問數據庫,得到數據,傳遞給biz層,進行以後的判斷設計模式
dao:
package cn.note.dao; import cn.note.beans.Book; import java.util.List; /** * Created by accp on 2017/3/31. */ public interface IBookDao { /*查詢,用做登陸*/ int select(Book book); /*查詢全部的圖書*/ List<Book> selectAll(); }
dao層的實現層impl:
package cn.note.dao.impl; import cn.note.beans.Book; import cn.note.dao.IBookDao; import org.hibernate.Criteria; import org.hibernate.SessionFactory; import org.hibernate.criterion.Restrictions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * Created by accp on 2017/3/31. */ /*標識這個是dao層*/ @Repository public class BookDaoImpl implements IBookDao { /*使用自動注入屬性*/ @Autowired private SessionFactory sessionFactory; /*標識哪些方法進行事務的管理,從而進行如何的操做*/ @Transactional public int select(Book book) { /* * 頁面上根據傳遞過來的數據進行裝配 * */ Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Book.class) .add(Restrictions.eq("name",book.getName())).add(Restrictions.eq("price", book.getPrice())); List<Book> list = criteria.list(); if (list != null) { return 1; } return 0; } /*標識哪些方法進行事務的管理,從而進行如何的操做*/ @Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED) public List<Book> selectAll() { /*獲取所有的圖書信息*/ return sessionFactory.getCurrentSession().createSQLQuery("SELECT * from book").list(); } public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } }
biz層主要是進行一些邏輯判斷時所在的層面。
biz的方法:
package cn.note.biz; import cn.note.beans.Book; import java.util.List; /** * Created by accp on 2017/3/31. */ public interface IBookBiz { int select(Book book); List<Book> selectAll(); }
方法的實現類:
package cn.note.biz.impl; import cn.note.beans.Book; import cn.note.biz.IBookBiz; import cn.note.dao.IBookDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * Created by accp on 2017/3/31. */ /*標識這是biz層*/ @Service("bookBiz") public class BookBizImpl implements IBookBiz { /*自動注入屬性*/ @Autowired private IBookDao dao; public int select(Book book) { return dao.select(book); } public List<Book> selectAll() { return dao.selectAll(); } public IBookDao getDao() { return dao; } public void setDao(IBookDao dao) { this.dao = dao; } }
當我寫到這的時候,不由想到,這個畫面我好像似曾相識,原來這就是你寫了好多遍的狀況,這些代碼已經記錄在你的手指上了,不須要你的大腦思考,你就會不知不覺的把它編寫出來,這就像是老朋友,多年未見,感情依然。。。
仍是讓咱們繼續吧,生活的腳步跟上。。。。。。。。
接下來就是action類的編寫,這個層主要是獲取從頁面上傳來的數據,進行判斷,以後該進行哪些操做,這個層面就會用到struts2框架的功能,Struts2是一個基於MVC設計模式的Web應用框架,它本質上至關於一個servlet,在MVC設計模式中,Struts2做爲控制器(Controller)來創建模型與視圖的數據交互。Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合併的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差異巨大。Struts 2以WebWork爲核心,採用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器可以與ServletAPI徹底脫離開,因此Struts 2能夠理解爲WebWork的更新產品。雖然從Struts 1到Struts 2有着太大的變化,可是相對於WebWork,Struts 2的變化很小。
LoginAction類的編寫:
package cn.note.action; import cn.note.beans.Book; import cn.note.biz.IBookBiz; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import javax.servlet.http.HttpServletRequest; import java.util.List; /** * Created by accp on 2017/3/31. */ /*標識action層 * scope:管理action生成的是多例仍是單例 * :prototype 和 singleton * Namespace:命名空間 * 默認繼承哪一個包 * */ @Controller @Scope("prototype") @Namespace("/") @ParentPackage("struts-default") public class LoginAction extends ActionSupport{ /*自動注入屬性*/ @Autowired private IBookBiz biz; @Override /*value:跟你表單提交到的action邏輯名稱對應 * className:爲action指定別名 * */ @Action(value = "login",results = {@Result(name = "success",location = "/success.jsp"), @Result(name = "input",location = "/index.jsp")},className = "loginAction") public String execute() throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); /*獲取頁面上輸入的名稱*/ String name = request.getParameter("name"); /*獲取頁面上輸入的價格*/ String price = request.getParameter("price"); Book book=new Book(name,price); int count = biz.select(book); if(count>0){ List<Book> list = biz.selectAll(); request.getSession().setAttribute("list",list); return SUCCESS; }else{ return INPUT; } } public IBookBiz getBiz() { return biz; } public void setBiz(IBookBiz biz) { this.biz = biz; } }
寫到這裏,咱們的工程就差很少完成一大半了,即將登上高峯,加把勁。。。。。
接下來開始編寫xml文件吧,把這些繁瑣的工做作完咱們才能見到彩虹,如今正在聽《陽光總在風雨後》,唱的真好。
2017年4月5日17:06:46
xml文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <!--註冊jdbc--> <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> <!--添加數據源--> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--配置sessionFactory--> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <!--方言--> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <!--打印sql--> <prop key="hibernate.show_sql">true</prop> <!--格式化sql--> <prop key="hibernate.format_sql">true</prop> <prop key="hbm2ddl.auto">update</prop> <!--獲取線程內的變量--> <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</prop> </props> </property> <!--<property name="mappingDirectoryLocations" value="classpath:cn/happy/beans"></property>--> </bean> <context:component-scan base-package="cn.note"></context:component-scan> <!--bean dao--> <!--<bean id="bookDao" class="cn.happy.dao.impl.BookDaoImpl"> <property name="factory" ref="sessionFactory"></property> </bean>--> <!--bean biz--> <!-- <bean id="bookBiz" class="cn.happy.biz.impl.BookBizImpl"> <property name="dao" ref="bookDao"/> </bean>--> <!--action--> <!--<bean id="login" class="cn.happy.action.LoginAction"> <property name="biz" ref="bookBiz"></property> </bean>--> <!--配置事務--> <!--第一步配置事務管理器--> <!--<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="selectAll" propagation="REQUIRED"/> </tx:attributes> </tx:advice>--> <!--配置事務管理器--> <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!--註解驅動--> <tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven> </beans>
jdbc.properties文件:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///y2163 jdbc.username=root jdbc.password=123456
想一想寫到這裏咱們還缺乏什麼,有沒有什麼遺漏,咱們先來理一下思路:當用戶請求頁面,填寫完數據,點擊提交,就會根據指定的action地址,action內部機制(FilterDispatcher)會作出一些判斷,去尋找相應的action,根據攜帶的一些數據,調取相應的方法去完成這個工做,完成一系列的判斷工做以後,攜帶數據返回。
下面的圖解會更清晰一點:
看到這個,我就想起我剛理解這個的那會兒,老大難問題,好了廢話很少說了,仍是迴歸正題吧,看到這裏我就想到在web.xml中也須要配置一下,由於在整合中struts2充當的是攔截器的角色,須要配置:
<!--配置filter--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
想一想還得配置讓項目認到你配置的xml文件:
<!--指定路徑--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContextnote.xml</param-value> </context-param>
在配置一道監聽器:
<!--配置監聽器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
上面咱們也說到要配置xml文件,這些作完以後,就能夠搭建咱們的頁面了
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登陸頁面</title> </head> <body> <form method="post" action="login"> 用戶名:<input name="name"/><br> 密碼:<input name="price"/><br> <input type="submit" value="提交"/><br> </form> </body> </html>
success.jsp:
<%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="c" uri="/struts-tags" %> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>成功頁面</title> </head> <body> success!!!!!!!! <s:debug></s:debug> ${list} </html>
總體的 一個項目就這樣完成了,寫下來由於沒那麼難,看你本身的掌握程度,多多聯繫,相信本身。
如今本身聽的歌:《霸王別姬》2017年4月5日17:45:49
好了,登頂。
下期再見。。。。。。