1. 程式人生 > >SSH框架整合項目(一)

SSH框架整合項目(一)

throw all 總頁數 調試 plugin session doc dia pla

這裏整合的是struts2 + spring + hibernate框架,只是簡單的整合。

項目工程的結構如下:

技術分享圖片

下面是使用的pom文件。

  <properties>
    <!-- 統一源碼的編碼方式 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 統一各個框架版本 -->
    <struts.version>2.5.10</struts.version>
    <spring.version
>4.3.8.RELEASE</spring.version> <hibernate.version>5.1.7.Final</hibernate.version> </properties> <dependencies> <!-- Junit依賴 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <
version>4.12</version> <scope>test</scope> </dependency> <!-- Spring 核心依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</
version> </dependency> <!-- Spring web依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring整合ORM框架依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- Struts2 核心依賴 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts.version}</version> </dependency> <!-- Struts2和Spring整合依賴 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>${struts.version}</version> </dependency> <!-- Hibernate 核心依賴 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <!-- MySQL 依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.42</version> </dependency> <!-- HikariCP 依賴 --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>2.7.4</version> </dependency> <!-- AspectJ依賴 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency> <!-- SLF4J依賴 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies> </project>

第一部分,整合hibernate和spring

技術分享圖片

首先創建一個hibernate.cfg.xml配置文件,因為整合後,需要將sessionFactory交給spring來管理。所以這裏只寫了hibernate的基本配置。

<!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>
        <!-- 配置Hibernate的基本屬性 -->
        <!-- 1.數據源配置到IOC容器中 -->
        <!-- 2.關聯的.hbm.xml也在IOC容器配置SessionFactory實例 -->
        <!-- 3.配置Hibernate的基本屬性:方言,SQL顯示及格式化,生成數據表的策略以及二級緩存 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 是否顯示格式化SQL -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        
        <!-- 生成數據表的策略 -->       
        <property name="hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>

接下來創建spring的管理容器的applicationContext.xml。在這裏配置數據源,hibernate配置文件的路徑,以及實體類的映射文件路徑。

同時配置hibernate的事務管理器。

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://localhost/bookstore?useSSL=true" />
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>  

    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" lazy-init="false">
        <!-- 註入datasource,給sessionfactoryBean內setdatasource提供數據源 -->
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
        <!-- 加載實體類的映射文件位置及名稱 -->
        <property name="mappingLocations" value="classpath:com/mrlv/pojo/*.hbm.xml"></property>
    </bean> 
    
    <!-- 配置 spring 的聲明式事務 -->
    
       <!-- 1.配置habernate的事務管理器 -->
       <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
           <property name="sessionFactory" ref="sessionFactory" />
       </bean>
        
    <!-- 2.配置事務的屬性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    
    <!-- 3.配置事務的切入點,再把事務屬性和事務切入點關聯起來,這裏切入的目錄是com.mrlv.service包下的所有類及其子包下的類的所有方法 -->
    <aop:config>
        <aop:pointcut expression="execution(* com.mrlv.service..*.*(..))" id="txPointcut"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>

之後,在dao類中調用sessionFactory。這裏采用的是註解的方式。

@Repository
public class BookDaoImpl implements BookDao {
    
    @Resource
    private SessionFactory sessionFactory;
    
    //獲取和當前線程綁定的Seesion
    private Session getSession() {
        return this.sessionFactory.getCurrentSession();
    }
    
    @Override
    public BookResult findAll(BookResult result) {
        if(result == null) {
            result = new BookResult();
        }
        //分頁查詢

        StringBuilder sql = new StringBuilder("from Book b left join fetch b.booktype bt");
        
        if(result.getBname() != null && !"".equals(result.getBname().trim())) {
            sql.append(" where bname like ‘%" + result.getBname() + "%‘");
        }
        
        if(result.getTypeid() != null && 0!=result.getTypeid()) {        
            if(sql.indexOf("where") == -1) {
                sql.append(" where bt.id=" + result.getTypeid());
            } else {
                sql.append(" and bt.id=" + result.getTypeid());
            }
        }
        
        if(result.getBpriceStart() != null && 0!=result.getBpriceStart()) {        
            if(sql.indexOf("where") == -1) {
                sql.append(" where b.bprice>" + result.getBpriceStart());
            } else {
                sql.append(" and b.bprice>" + result.getBpriceStart());
            }
        }
        
        if(result.getBpriceEnd() != null && 0!=result.getBpriceEnd()) {        
            if(sql.indexOf("where") == -1) {
                sql.append(" where b.bprice<" + result.getBpriceEnd());
            } else {
                sql.append(" and b.bprice<" + result.getBpriceEnd());
            }
        }

        List<Book> books = getSession().createQuery(sql.toString())
                .setFirstResult(result.getBegin())
                .setMaxResults(result.getPageSize()).list();
        
        //查詢總頁數,註意,這裏直接使用sql會報錯,因為fetch和count(*)不能共存,所以需要刪去fetch。
        String sqlcount = sql.toString().replaceAll("fetch", "");
        Long rows = (Long) getSession().createQuery(
                "select count(*) " + sqlcount).
                uniqueResult();
        
        result.setRows(rows.intValue());
        result.setList(books);
        return result;
    }
}

如此,便完成了spring和hibernate的整合。可以先用test方法調試。

第二部分,整合struts2和spring

整合struts2和spring的要點。將action交給spring管理。

首先,配置web.xml文件。添加struts2過濾器,然後加載spring的配置文件applictionContext.xml。以及添加spring監聽器。

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!-- 添加struts2過濾器 -->
  <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>
  
  <context-param>
       <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

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

然後創建Action,註意,這裏采用註解方式@Controller,這裏的Action的創建方式需要采用多例。所以需要添加@Scope("prototype")。這樣就將Action交由spring來管理。

package com.mrlv.action;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.mrlv.pojo.Book;
import com.mrlv.pojo.BookType;
import com.mrlv.result.BookResult;
import com.mrlv.service.BookService;
import com.mrlv.service.BookTypeService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

@Controller
@Scope("prototype")
public class BookAction extends ActionSupport{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    @Resource
    private BookService bookService;
    
    @Resource
    private BookTypeService bookTypeService;
    
    private BookResult result;

    public String execute() throws Exception {
        ActionContext context = ActionContext.getContext();
        ValueStack valueStack = context.getValueStack();
        System.out.println("進入BookAction");
        result = bookService.findAll(result);
        List<BookType> types = bookTypeService.findAll();
        valueStack.set("result", result);
        valueStack.set("types", types);
        System.out.println(result);
        return SUCCESS;
    }
    public BookResult getResult() {
        return result;
    }

    public void setResult(BookResult result) {
        this.result = result;
    }
}

接下來編寫struts.xml文件。這裏的calss寫的是bookAction。是因為spring容器生產實體對象默認是首字母小寫。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <!-- 默認訪問頁面 -->
    <package name="book" extends="struts-default" namespace="/">
        <action name="list" class="bookAction">
            <result name="success">/WEB-INF/listBook.jsp</result>
        </action>
    </package>
</struts>

如此便是將ssh框架簡單整合完畢

SSH框架整合項目(一)