1. 程式人生 > >搭建SpringMVC+Spring4.3.2+Hibernate5.2.2框架

搭建SpringMVC+Spring4.3.2+Hibernate5.2.2框架

之前說過,我最終想搭建一個SpringMVC+Spring+MyBatis的框架,然後從SSH框架開始慢慢演化,這篇部落格將講解怎樣將SSH框架中的Struts部分替換為SpringMVC做請求轉發。

  • struts除了可以做請求轉發,還有頁面標籤,所以你如果只用請求轉發的話,這個框架有點多餘
  • 現在spring推出了springMVC,是專門做請求轉發用的,因為是spring自家推出的,所以和spring的協調性更好,而且在我使用中也感覺springMVC用起來更方便,輕量級

關於SSH框架的搭建可以去這篇文章檢視

在上面的基礎上把Struts換成SpringMVC,其實很簡單,為什麼這麼說呢,因為搭建SSH框架的時候,我們把Spring的所有jar包都加入到專案裡了,不知道你有沒有注意到,有這樣一個jar包

其實這個jar包就已經是對MVC的支援了,所以可以說我們上一個框架已經支援SpringMVC了,所以問題就變成了去掉Struts框架,所以很簡單。

首先可以刪掉Struts的所有jar包,主要是以下兩個,其他common開頭的jar包因為spring也在用,所以可以不刪掉。
struts2-core和struts2-spring-plugin,現在lib如下,可做參考:

然後刪掉struts.xml配置檔案

接下來我們來看怎麼讓SpringMVC生效

首先把web.xml的攔截規則改成給SpringMVC攔截,如下

<servlet>
    <servlet-name
>
springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/spring/spring-mvc.xml</param-value>
</init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

然後在web.xml中配置SpringMVC的配置檔案

<!-- 載入所有的配置檔案 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:config/spring/spring-*.xml</param-value>
  </context-param>

修改之後的web.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>json_test</display-name>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>

  <!-- 載入所有的配置檔案 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:config/spring/spring-*.xml</param-value>
  </context-param>

  <!-- 配置Spring監聽 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- 配置SpringMVC -->
  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:config/spring/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- 配置字符集 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- 配置Session -->
  <filter>
    <filter-name>openSession</filter-name>
    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>openSession</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

字符集的配置是為了讓所有請求和回覆都用統一的字符集,比較方便。

OpenSession是為了延長Session的生命週期用的,可以自行baidu一下,網上是這樣寫的。

OpenSessionInViewFilter是Spring提供的一個針對Hibernate的一個支援類,其主要意思是在發起一個頁面請求時開啟Hibernate的Session,一直保持這個Session,直到這個請求結束,具體是通過一個Filter來實現的。
 

由於Hibernate引入了Lazy Load特性,使得脫離Hibernate的Session週期的物件如果再想通過getter方法取到其關聯物件的值,Hibernate會丟擲一個LazyLoad的Exception。所以為了解決這個問題,Spring引入了這個Filter,使得Hibernate的Session的生命週期變長。

另外我們來看載入配置檔案的地方

<!-- 載入所有的配置檔案 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:config/spring/spring-*.xml</param-value>
  </context-param>

這句話的意思是載入config/spring/目錄下的所有以spring開頭的配置檔案。前面說過spring的配置其實就是在配置各種bean,在配置SSH的時候我們把所有bean都寫在了applicationContext裡面,導致這個檔案很大很複雜,這樣不利於修改配置和查詢異常。其實我們可以把不同的bean配置在不同的檔案中,然後在web.xml中告訴程式去哪裡找配置檔案,就像這裡這樣。我們可以把關於mvc的bean配置在sprng-mvc.xml中,把業務邏輯bean配置在spring-beans中,把基礎bean(比如session,datasource等)配置在spring-common.xml中。

前面一篇文章也說過,eclipse在釋出web專案的時候會把src目錄對映成classpath目錄,當然這是可以配置的。所以我們就在src目錄下建立配置檔案,如下

接下來看一下mvc的配置是怎樣的

<?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:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

    <!-- 註解掃描包 -->
    <context:component-scan base-package="com.mvc.controller" />

    <!-- 開啟註解 -->
    <mvc:annotation-driven />

    <!-- 靜態資源(js/image)的訪問 -->
    <mvc:resources location="/js/" mapping="/js/**"/>

    <!-- 定義檢視解析器 -->    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

現在主流的對SpringMVC的配置時基於註解的,至於怎麼註解,我們後面再說,這個配置檔案中前兩部分就是配置註解用的,base-package指明註解在哪些包下,你當然可以寫所有的包,讓框架都去掃描一遍,但沒必要。在SpringMVC框架中,控制轉發的類叫Controller(對應Struts中的Action),所以註解通常也都是在com.xxx.xxx.controller包中,所以這裡只掃描相應的包就可以。

mvc:resources定義靜態檔案的位置,因為我們前面在web.xml用/設定了過濾器,會攔截所有的請求,同時也會影響對靜態檔案的請求,這裡配置之後,所有/js/**的請求都會去js資料夾去找,而不會跳轉到controller控制類

ViewResolver是定義檢視解析器,做什麼用的的,簡單來說,controller控制類中某個方法返回“index”的意思其實是跳轉到index頁面,但通常這個頁面會有字首(也就是相對路徑)和字尾(副檔名),這裡這樣配置後,return “index”,就會跳轉到/index.jsp頁面。

解析完配置檔案,我們看下Controller具體怎麼寫,其實就是在Struts框架中的Action類。程式碼如下:

package com.mvc.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.mvc.manager.UserManager;
import com.mvc.pojo.User;

@Controller
public class UserController
{
    @Resource(name = "userManager") // 獲取spring配置檔案中bean的id為userManager的,並注入
    private UserManager userManager;

    @RequestMapping("/toAddUser")
    public String toAddUser()
    {
        return "/addUser";
    }

    @RequestMapping("/getAllUser")
    public void getAllUser(HttpServletResponse response)
    {
        System.out.println("getAllUser IN");
        List<User> user = userManager.getUsers();

        PrintWriter out = null;
        response.setContentType("application/json");

        try
        {
            out = response.getWriter();
            for (int i = 0; i < user.size(); i++)
            {
                out.write(user.get(i).getUserName());
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

關於註解的詳細解析,準備在專門寫一篇文章,簡單來說,就是在方法上加上[email protected]("/getAllUser")註解,對getAllUser的請求就會跳轉到這個方法進行處理,像前面提到的,如果方法返回字串,處理完之後就會做相應的跳轉,如果方法返回void,則不進行任何跳轉。

到目前為止SpringMVC就配置完了,這時你訪問http://host:port/projectName/getAllUser,就能顯示了。好,我們的第二個目標達成了,下個目標就是把Hibernate替換成Mybatis,然後就萬事大吉了。

再列一下其他檔案吧

spring-beans.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="userDao" class="com.mvc.daoImpl.UserDao">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>

    <!--使用者註冊業務邏輯類 -->
    <bean id="userManager" class="com.mvc.manager.UserManager">
        <property name="dao">
            <ref bean="userDao" />
        </property>
    </bean>
</beans>

spring-common.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:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 定義資料來源的資訊 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="jdbcUrl">
            <value>jdbc:mysql://localhost:3306/test</value>
        </property>
        <property name="user">
            <value>root</value>
        </property>
        <property name="password">
            <value>zzw</value>
        </property>
        <property name="maxPoolSize">
            <value>80</value>
        </property>
        <property name="minPoolSize">
            <value>1</value>
        </property>
        <property name="initialPoolSize">
            <value>1</value>
        </property>
        <property name="maxIdleTime">
            <value>20</value>
        </property>
    </bean>

    <!--定義Hibernate的SessionFactory -->
    <!-- SessionFactory使用的資料來源為上面的資料來源 -->
    <!-- 指定了Hibernate的對映檔案和配置資訊 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
                <value>com/mvc/pojo/User.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="show_sql">true</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
            </props>
        </property>
    </bean>

    <!-- 配置一個事務管理器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- 配置事務,使用代理的方式 -->
    <bean id="transactionProxy"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
        abstract="true">
        <property name="transactionManager" ref="transactionManager"></property>
        <property name="transactionAttributes">
            <props>
                <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
                <prop key="modify*">PROPAGATION_REQUIRED,-myException</prop>
                <prop key="del*">PROPAGATION_REQUIRED</prop>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
</beans>

整個專案的結構如下

相關推薦

搭建SpringMVC+Spring4.3.2+Hibernate5.2.2框架

之前說過,我最終想搭建一個SpringMVC+Spring+MyBatis的框架,然後從SSH框架開始慢慢演化,這篇部落格將講解怎樣將SSH框架中的Struts部分替換為SpringMVC做請求轉發。 struts除了可以做請求轉發,還有頁面標籤,所以你

spring4.3.7整合mongodb3.2.1

工具 spring mongodb 前幾天寫了個mongodb原生的工具類,參考“http://ylcodes01.blog.51cto.com/5607366/1933342”,項目裏需要做分布式,所以現在集成到spring中,今天結合spring-mongodb寫了一些常用的工具。BaseMo

spring4.3.7整合quartz2.2.3

因專案需要,在SSM中整合quartz,其中遇到了幾處很坑的地方,作為記錄,方便以後檢視。 專案背景: ​ Maven構建專案:Spring4.3.7、Shiro1.3.2、Quartz2.2.3,資料庫用的是MySQL 5.6.36

springmvc-spring4.3-hibernate5框架整合

                                          &

Step by Step 搭建SpringMVC專案[3]-配置SpringMVC環境

裝飾基礎專案 Web專案轉Maven專案       想要使用Maven管理我們的專案,就需要將我們的專案轉換一下。當然也可以直接下載jar包放到專案內。不過為了多學習一些就不要省事兒了。    右鍵專案--》Configurae--》Convert to Maven Pro

基於SpringMVC4.3.2+Spring4.3.2+MyBatis3.4.1搭建SSM框架

終於到了框架搭建的最後一步,實現我們的終極目標SpringMVC+Spring+MyBatis的SSM框架,這篇文章也是基於之前搭建的SpringMVC+Spring+Hibernate框架演變過來的,所以沒看過之前幾篇文章的同學請乘傳送帶。 在之前搭

SpringMVC3.2.4)搭建詳解

      由於這段時間公司事情不多,就趁空閒時間自學一下 SpringMVC,雖然之前用過這個框架,但是都是架構師搭完之後,我們這些程式猿在上面擴充套件功能的,實際就在昨天,我連SpringMVC框架都不會搭。      之所以寫這篇文章是因為網上的框架搭建教程參差不齊,

最新eclipse整合Struts2.3.29+Hibernate5.2.1+Spring4.3.1(三)Struts+Hibernate+spring篇

繼續,我又新建一個專案sshTest,把shDemo的程式碼都移進去(shDemo拿去幹別的事了) 1.引入spring所需jar包 這裡不僅需要spring的jar包 還需要hibernate中兩個資料來源包 另外還有一個aspectjweaver.jar包,這個包

MonkeyRunner環境搭建配置步驟(1.安裝jdk,2.安裝python,3.安裝android sdk)

img ads 系統 windows info beans android-s monk bean 前言:需要安裝jdk、python、android sdk 第一步:JDk的安裝以及配置 jdk下載地址:http://www.oracle.com/technetwork/

CentOS7.2 搭建 Jenkins2.107.3

CentOS7.2 Jenkins Jenkins 簡介Jenkins?是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於監控持續重復的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。Java 安裝 yum -y install java-1.8.0-openjdk-dev

dubbo 2.6.2 + zookeeper 3.4.13 + SpringBoot 2.0.5 搭建

程式碼地址 :https://github.com/xingxingtx/SpringBoot.git gitclone:[email protected]:xingxingtx/SpringBoot.git 程式碼大致結構如下圖:  建立工程名為:

Windows下Python環境搭建圖解(3.6.2

Windows下Python(pip)環境搭建(3.6)圖解 ----------------小白一隻,學習整理中。。。。轉載請標明,謝謝------------------------------------------- 1:下載最新的Python安裝:3.6.2

SpringMVC(5) - 控制器(3) - @RequestMapping(2) - 定義處理器方法

參考:https://docs.spring.io/spring/docs/4.3.20.RELEASE/spring-framework-reference/htmlsingle/#mvc-ann-methods   @RequestMapping處理器方法可以具有非常靈活的簽名

springmvc +uploadify 3.2.1 上傳檔案

<%@page import="com.ist.pojo.User"%> <%@page import="com.ist.constant.ConstantField"%> <%@ page language="java" contentType="tex

SSH:利用Struts2+Hibernate4+Spring4+SQLServer框架搭建一個前後端web網站(2

百度編輯器編輯文章 利用百度編輯器實現文章的編寫,實現效果如下: 可以看到利用百度編輯可以很好的實現文字的排版效果,同時還可以多圖上傳以及新增錨點和上傳視屏。 配置的一些關鍵點: 當從

基於【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ資料倉庫03 —— 安裝HAWQ 2.3.0.0

一、 HAWQ2.3.0環境準備【全部主機節點】: 1, vim /etc/sysctl.conf,編輯如下內容: kernel.shmmax= 1000000000 kernel.shmmni= 4096 kernel.shmall= 4000000000 kernel.sem= 250 512000

搭建Nexus Repository 3.6.0-02和配置apache-maven-3.5.2和本地的local Repository以及專案的pom.xml(IDEA 打包等)

本文主要目的: 為了讓Maven管理專案的所有依賴包,Release和Snapshot . 本文涉及如下三點: 1.windows 下搭建Nexus Repository 3.6.0-02(linux下思路一樣) 2.配置apache-maven-3.5.2中的settin

Hadoop-2.6.0+Zookeeper-3.4.6+Spark-1.5.0+Hbase-1.1.2+Hive-1.2.0叢集搭建

前言 本部落格目的在於跟大家分享大資料平臺搭建過程,是筆者半年的結晶。在大資料搭建過程中,希望能給大家提過一些幫助,這也是本部落格的

dubbo起步搭建Spring+SpringMVC+dubbo的開發環境(2,provider工程構建)

緊接上一期,構建provider工程 工程目錄如下圖: TestDubbo介面程式碼如下: package dp.dubbo.service; public interface TestDubbo { public String getStr(); } 介面的實現T

Spring4.3.3 WebSocket-STOMP協議整合 (2.1)-WebSocket-stomp子協議通訊小栗子

                      上一篇中說到:stomp - jsp之間的通訊,是通過stomp,socket.js/stomp.js實現的通訊。如果覺得寫jsp或者js麻煩,或者不怎麼會js,不是太懂,可以用webSocketStomp的client來測試。下面