主頁 >  其他 > 【SaaS-Export專案】 - 03 SSM整合到每個子工程中,多模塊工程整合SSM,export_dao子工程配置資料庫訪問,service子工程配置事務管理,web子工程整合SpringMVC

【SaaS-Export專案】 - 03 SSM整合到每個子工程中,多模塊工程整合SSM,export_dao子工程配置資料庫訪問,service子工程配置事務管理,web子工程整合SpringMVC

2020-10-25 08:19:27 其他

文章目錄

    • 資料庫準備
    • 1. dao層Spring整合MyBatis進行資料庫訪問(export_dao子工程)
      • 1.1 需要spring和mybatis的整合包(前面已經匯入了)
      • 1.2 export_dao下創建屬性檔案(連接資料庫c3p0連接池)
      • 1.3 export_dao子工程下創建applicationContext-dao.xml
      • 1.4 測驗能否自動裝載,能否查詢到資料庫
    • 2. service依賴dao,測驗讀取dao的資訊,配置事務管理(export_system_service子工程)
      • 2.1 關于classpath路徑讀取的使用
      • 2.2 創建測驗類`TestCompanyService`
      • 2.3 創建Service介面及其實作類
      • 2.4 在export_system_service子工程創建spring事務管理
      • 2.5 測驗運行
      • 如果出現例外情況,參考下面幾種情況
    • 3. Spring整合SpringMVC(export_web_manager子工程)
      • 3.1 創建log4j.properties日志屬性檔案
      • 3.2 web.xml配置
      • 3.3 配置springmvc.xml
      • 3.4 創建CompanyController進行測驗
      • 3.5 創建company-list.jsp來測驗資料顯示
      • 3.5 配置tomcat服務器通過地址訪問controller
      • 3.6 SpringMVC對于日期字串向后臺提交轉Date問題
      • 3.7 配置自定義日期型別轉換器實作Converter介面
      • 3.8 在springmvc.xml中配置轉換工廠,并將轉換器放入注解驅動中,并測驗轉換情況

資料庫準備

在這里插入圖片描述
需要sql檔案的可以點擊這個:
Saas-Export資料庫sql檔案

1. dao層Spring整合MyBatis進行資料庫訪問(export_dao子工程)

1.1 需要spring和mybatis的整合包(前面已經匯入了)

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>

需要匯入c3p0的依賴檔案

        <!--c3p0資料庫連接池-->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>

1.2 export_dao下創建屬性檔案(連接資料庫c3p0連接池)

resources/properties/c3p0.properties

# key=value
#c3p0連接池屬性檔案
# 四大基本資訊
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/saas-export?useUnicode=true&characterEncoding=UTF-8&useSSL=false
c3p0.user=root
c3p0.password=861221293

# 初始化連接數  取值要在minPoolSize和maxPoolSize之間(可包含,閉區間) 默認值:3
c3p0.initialPoolSize=10
# 最大連接數 (連接池中的連接數不能超過maxPoolSize最大連接數) 默認值:15
c3p0.maxPoolSize=50
#最小連接數  默認值:3
c3p0.minPoolSize=5
#c3p0連接池中資料連接不夠時(無空閑連接可用),一次增長的個數(增長不能超過maxPoolSize最大連接個數) 默認值:3
c3p0.acquireIncrement=5
#連接的最大空閑時間,如果超過這個時間還沒有被使用,就斷開這個連接(設定為0或負數,就永遠都不會被斷開) 單位:秒  默認值 :0
c3p0.maxIdleTime=600
#從資料庫獲取新連接失敗后重復嘗試的次數,小于等于0表示無限次  默認值: 30
c3p0.acquireRetryAttempts=30
#兩次連接的中間間隔時間(重新嘗試的時間間隔)  單位:毫秒  默認值:1000
c3p0.acquireRetryDelay=1000
#連接關閉時,是否將所有未提交的操作進行事務回滾  默認值:false
c3p0.autoCommitOnClose = false
#當連接池用完時,客戶端呼叫getConnection()后等待獲取新連接的時間  單位:毫秒  默認值:0 (無限期等待)  按照設定的值,超時將拋出SQLException例外
c3p0.checkoutTimeout = 0
#每隔多少秒檢查所有連接池中的空閑連接  單位:秒   默認值:0
c3p0.idleConnectionTestPeriod=60
#配置PreparedStatement快取,設定連接池為資料源快取的PreparedStatement的總數,為0的時候不快取,同時maxStatementsPerConnection的配置無效,
# 由于PreparedStatement屬于單個Connection,所以這個數量應該根據應用中平均連接數乘以每個連接的平均PreparedStatement來計算
c3p0.maxStatements=1000


# 連接池為資料源單個Connection快取的PreparedStatement數,這個配置比maxStatements更有意義,因為它快取的服務物件是單個資料連接,如果設定的好,肯定是可以提高性能的,為0的時候不快取,
# c3p0.maxStatementsPerConnection

1.3 export_dao子工程下創建applicationContext-dao.xml

export_dao子工程交給spring來管理,創建一個對應的applicationContext-dao.xml
路徑:resources/spring/applicationContext-dao.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"

       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">

<!-- dao子工程交給Spirng來管理,創建一個對應的applicationContext-dao.xml -->

    <!-- 引入c3p0的屬性檔案(里面是連接資料庫四大資訊鍵值對),在配置中通過占位使用 -->
    <context:property-placeholder location="classpath:properties/c3p0.properties" />

    <!-- 連接資料庫的四大基本資訊-->
    <!-- 資料庫連接池c3p0 -->
    <!-- 用c3p0資料源配置連接池,里面有連接池  ComboPooledDataSource資料庫連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 連接池4大組件 -->
        <property name="driverClass" value="${c3p0.driverClass}"/>
        <property name="jdbcUrl" value="${c3p0.jdbcUrl}"/>
        <property name="user" value="${c3p0.user}"/>
        <property name="password" value="${c3p0.password}"/>

        <!--初始化連接數  取值要在minPoolSize和maxPoolSize之間(可包含,閉區間) 默認值:3 -->
        <property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
        <!-- 最大連接數 (連接池中的連接數不能超過maxPoolSize最大連接數) 默認值:15-->
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <!--最小連接數  默認值:3  -->
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <!-- c3p0連接池中資料連接不夠時(無空閑連接可用),一次增長的個數(增長不能超過maxPoolSize最大連接個數) 默認值:3 -->
        <property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>
        <!-- 連接的最大空閑時間,如果超過這個時間還沒有被使用,就斷開這個連接(設定為0或負數,就永遠都不會被斷開) 單位:秒  默認值 :0 -->
        <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>

        <!-- 從資料庫獲取新連接失敗后重復嘗試的次數,小于等于0表示無限次  默認值: 30-->
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
        <!-- 兩次連接的中間間隔時間(重新嘗試的時間間隔)  單位:毫秒  默認值:1000 -->
        <property name="acquireRetryDelay" value="${c3p0.acquireRetryDelay}"/>
        <!-- 連接關閉時,是否將所有未提交的操作進行事務回滾  默認值:false -->
        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
        <!-- 當連接池用完時,客戶端呼叫getConnection()后等待獲取新連接的時間  單位:毫秒  默認值:0
                如果值設為 0,將無限期等待,直到有空閑連接,  否則按照設定的值,超時將拋出SQLException例外
                時間設定過小時會出現連接超時,這樣會拋出SQLException例外,設定時間時需要小心,按照實際情況設定適當的值-->
        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
        <!-- 每隔多少秒檢查所有連接池中的空閑連接  單位:秒   默認值:0 -->
        <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>

        <!-- 配置PreparedStatement快取,設定連接池為資料源快取的PreparedStatement的總數
                為0的時候不快取,同時maxStatementsPerConnection的配置無效,
               由于PreparedStatement屬于單個Connection,所以這個數量應該根據應用中平均連接數乘以每個連接的平均PreparedStatement來計算-->
        <property name="maxStatements" value="${c3p0.maxStatements}"/>

    </bean>


    <!-- 獲取sqlSessionFactory-->
    <bean id="sqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--配置資料源-->
        <property name="dataSource" ref="dataSource"/>
        <!-- 給整個包下的所有檔案起別名,就是類名的首字母小寫 com.xgf.domain.Person 簡化成 person-->
        <property name="typeAliasesPackage" value="com.xgf.domain"/>
    </bean>
    <!-- 配置映射檔案掃描器  : IPersonDao.xml和IPersonDao.java-->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 掃描dao介面和映射xml編譯后的類路徑 -->
        <property name="basePackage" value="com.xgf.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

</beans>

1.4 測驗能否自動裝載,能否查詢到資料庫

jaca》》com/xgf/dao/company/ICompanyDao

@Repository
public interface ICompanyDao {
    //查詢所有的公司記錄
    //select * from ss_company
    List<Company> findAll();
}

resources》》com/xgf/dao/company/ICompanyDao.xml

<mapper namespace="com.xgf.dao.company.ICompanyDao">
    <!-- 資料庫表欄位名(列名)與類的成員變數不一致的解決辦法
        1. sql陳述句通過 as取別名,與類的成員變數一致
        2. 使用mybatis的resultMap映射實作(column表的列名,property類的屬性名映射
     -->
    <resultMap id="companyMap" type="company">
         <id column="id" property="id"/>
         <result  column="expiration_date" property="expirationDate"/>
         <result  column="license_id" property="licenseId"/>
         <result  column="company_size" property="companySize"/>
    </resultMap>
    <select id="findAll" resultMap="companyMap">
        select
            *
        from ss_company
    </select>
</mapper>

test》》com/xgf/dao/company/ICompanyDaoTest

//通過Spring自帶的junit測驗 - 兩個注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-dao.xml")
public class TestCompanyDao {
    //通過@Autowrie從spring中獲取dao的實作類物件
    @Autowired
    ICompanyDao companyDao;//自動裝載,就相當于ICompanyDao iCompanyDao = new iCompanyDao()
    @Test
    public void test01(){
        //測驗自動裝載能否實作
        System.out.println("companyDao物件:" + companyDao);

        List<Company> companyList = companyDao.findAll();
        System.out.println(companyList);
    }
}

測驗結果:(自動裝載成功,查詢資料庫成功)
在這里插入圖片描述

2. service依賴dao,測驗讀取dao的資訊,配置事務管理(export_system_service子工程)

子工程export_system_service依賴子工程export_domain

2.1 關于classpath路徑讀取的使用

@ContextConfiguration("classpath*:spring/applicationContext-*.xml")

classpath加載當前maven工程的resources目錄下的組態檔
classpath*::加載當前maven工程及其依賴工程的resources目錄下的組態檔
applicationContext-.xml*:讀取所有符合規則的檔案(比如前面的applicationContext-dao.xml檔案)

2.2 創建測驗類TestCompanyService

》test/com/xgf/service/company/TestCompanyService

//Spring的單元測驗
//@ContextConfiguration("classpath*:spring/applicationContext-*.xml")
//  加載當前maven工程及其依賴工程的resources目錄下的組態檔,讀取所有符合規則的檔案(tx和dao)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:spring/applicationContext-*.xml")
public class TestCompanyService {
    @Autowired
    ICompanyService companyService;
    @Test
    public void test01(){
        //1:撰寫了業務邏輯的測驗
        //ICompanyService  companyService = new CompanyServiceImpl();
        List<Company> list = companyService.findAll();
        System.out.println(list);
    }

}

2.3 創建Service介面及其實作類

》test/com/xgf/service/company/ICompanyService

public interface ICompanyService {
    public List<Company> findAll();
}

》test/com/xgf/service/impl/CompanyServiceImpl

@Service //注解 @Service,該類交由Spring管理創建
public class CompanyServiceImpl implements ICompanyService {
    @Autowired
    ICompanyDao companyDao;
    public List<Company> findAll() {
        //service要呼叫dao查詢資料,所以要注入
        return companyDao.findAll();
    }
}

2.4 在export_system_service子工程創建spring事務管理

》resources/spring/applicationContext-tx.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:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- Service子工程,進行事務管理,交給Spring事務管理,applicationContext-tx.xml -->
    <!-- 掃描Service實作類@Service注解 -->
    <context:component-scan base-package="com.xgf.service"/>

    <!--配置Spring框架的 宣告式事務管理(底層是AOP):三個步驟 -->
    <!--1. 配置事務管理器  DataSourceTransactionManager是spring給我們的管理事務的物件,
            這個物件要用到連接池,用完需要將連接放回連接池
            管理事務:DataSource.Connection.commit() rollback()方法-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 2. 配置事務通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!--配置事務細節特征-->
        <tx:attributes>
            <!--查詢方法,使用默認的隔離級別 及 SUPPORTS傳播行為-->
            <tx:method name="find*" isolation="DEFAULT" propagation="SUPPORTS"/>
            <tx:method name="query*" isolation="DEFAULT" propagation="SUPPORTS"/>
            <tx:method name="select*" isolation="DEFAULT" propagation="SUPPORTS"/>
            <tx:method name="get*" isolation="DEFAULT" propagation="SUPPORTS"/>
            <!--增刪改方法,使用默認的隔離級別 及 REQUIRED傳播行為-->
            <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!-- 3. 配置事務切面: 切面=通知+切入點 -->
    <aop:config>
        <!-- expression運算式的值,按照你的路徑配置
            * com.xgf.service.impl.*ServiceImpl.*(..))
                第一個* 是回傳值通配符
                然后是包的路徑,*ServiceImpl表示配置的所有滿足類名+ServiceImpl后綴的且在com.xgf.service.*.impl目錄下的
                *(..) : *表示所有方法 (..)表示匹配所有引數
        -->
        <!--配置切入點-->
        <aop:pointcut id="pt" expression="execution(* com.xgf.service.*.impl.*ServiceImpl.*(..))"/>
        <!-- 切面 = 通知+切入點  -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
    </aop:config>

</beans>

2.5 測驗運行

在這里插入圖片描述

如果出現例外情況,參考下面幾種情況

  1. 如果出現applicationContext例外

可能是加載組態檔錯誤,因為我們要加載當前service子工程的spring/applicationContext-tx.xml事務管理也要加載service所依賴的dao子工程的
spring/applicationContext-dao.xml模塊,所以用下面這種方式加載,

@ContextConfiguration("classpath*:spring/applicationContext-*.xml")
  1. 如果出現UTF-8例外,可能是父工程的pom.xml沒有配置UTF-8
    去父工程,加上這個:
	<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
  1. 如果出現自己寫的類找不到例外

需要在每個工程的pom.xml寫packaging的打包方式

<!-- 父工程 export_parent 設定packaging為pom -->
	<packaging>pom</packaging>

<!-- 非web子工程(export_domain、export_dao、export_system_service)設定packaging為jar -->
	<packaging>jar</packaging>

<!-- web子工程 export_web_manager 設定packaging為war(因為tomcat只能運行war包) -->
	<packaging>war</packaging>

3. Spring整合SpringMVC(export_web_manager子工程)

3.1 創建log4j.properties日志屬性檔案

直接創建在子工程的resources下

# 將debug等級(可修改)的日志資訊輸出到CONSOLE和LOGFILE這兩個目的地(多個按,逗號隔開)
# CONSOLE和LOGFILE定義在下面的代碼,【可以任意起名,可以有多個,不一定只是兩個】
# 等級:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
#    比如(配置OFF全部都不顯示,配置為INFO這樣只顯示INFO、WARN、ERROR的log資訊,而DEBUG資訊不會被顯示)
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# =======================================================================================
# CONSOLE配置(名稱可以自定義) - 這里配置控制臺輸出日志

# log4j.appender.CONSOLE -->  定義名為CONSOLE的輸出端是哪種型別,有五個值
# org.apache.log4j.ConsoleAppender(控制臺)
# org.apache.log4j.FileAppender(檔案)
# org.apache.log4j.DailyRollingFileAppender(每天產生一個日志檔案)
# org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)
# org.apache.log4j.WriterAppender(將日志資訊以流格式發送到任意指定的地方)
# 這里CONSOLE輸出端是控制臺
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 

# log4j.appender.CONSOLE.layout  -->  定義名為CONSOLE的輸出端的layout布局方式是哪種型別,有四個值
# org.apache.log4j.PatternLayout(可以靈活地指定布局模式)【***】
# org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.SimpleLayout(包含日志資訊的級別和資訊字串)
#org.apache.log4j.TTCCLayout(包含日志產生的時間、執行緒、類別等等資訊)
# 這里設定為PatternLayout,可以靈活指定布局的模式
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

# log4j.appender.CONSOLE.layout.ConversionPattern
# 使用PatternLayout布局需要指定列印資訊的具體格式ConversionPattern,引數:
#   %d 輸出日志時間,默認格式為ISO8601,也可以在其后指定格式,如:%d{yyyy-MM-dd HH:mm:ss,SSS},輸出類似:2020-10-16 17:02:28,968
#   %r 輸出自應用啟動到輸出該log資訊耗費的毫秒數
#   %t 輸出產生該日志事件的執行緒名(比如main、gc)
#   %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL等方式
#   %c 輸出所屬的類目,通常就是所在類的全名;
#   %m 輸出代碼中指定的訊息
#   %M 輸出列印該條日志的方法名
#   %n 輸出一個回車換行符,Windows平臺為"rn”,Unix平臺為"n”;

#   %l 輸出日志事件的發生位置,及在代碼中的行數;
#   [QC]是log資訊的開頭,可以為任意字符,一般為專案簡稱,
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-6r [%t] %-5p %30.30c - %m%n

# 輸出訊息編碼
#log4j.appender.CONSOLE.encoding=UTF-8

# =======================================================================================
# LOGFILE配置 (名稱可以自定義) 這里配置日志檔案存盤(存盤到指定路徑)

# log4j.appender.LOGFILE 用于定義名為LOGFILE的輸出端的型別為每天產生一個日志檔案,
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
# log4j.appender.LOGFILE.File 定義名為LOGFILE的輸出端的檔案名為E:\logFile\SSM\ssm.log(可以自行修改)
log4j.appender.LOGFILE.File=E:\\logFile\\saas-export\\saas-export.log

log4j.appender.LOGFILE.Append=true
# log4j.appender.LOGFILE.layout 輸出日志布局設定PatternLayout,和上面的一樣
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
# log4j.appender.LOGFILE.layout.ConversionPattern 自定義格式輸出,和上面一樣
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [t] %-5p %30.30c %x - %m%n


3.2 web.xml配置

加載spring核心組態檔applicationContext-*.xml,配置字符編碼過濾器,配置監聽器,配置前端控制器進行請求分發

<!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>

  <!--這些配置是有順序的 context-param引數,后面是filter過濾器,然后是listener監聽器,然后是servlet前端控制器 -->

  <!--1. spring監聽器: 讀取applicationContext.xml組態檔
      設定spring核心組態檔的路徑 applicationContext-tx.xml和applicationContext-dao.xml-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:spring/applicationContext-*.xml</param-value>
  </context-param>

  <!--  2. 配置字符編碼過濾器characterEncodingFilter  解決中文亂碼(統一編碼) -->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <!-- spring自帶編碼過濾器 -->
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <!-- 讀取鍵值對 key-取名 value-設定的編碼 -->
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <!-- /*攔截所有請求,都要被過濾器過濾 -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>


  <!--3. 配置Spring的監聽器,默認只加載WEB-INF目錄下的applicationContext.xml組態檔-->
  <listener>
    <!-- ContextLoaderListener監聽器的作用就是啟動Web容器時,自動裝配applicationContext的配置資訊 -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>


  <!--4. 配置前端控制器,進行接收請求轉發至controller,解決Controller的問題(web層)-->
  <servlet>
    <!-- 前端控制器取名 可以更改,但是要和下面的一樣 -->
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加載springmvc.xml組態檔-->
    <init-param>
      <!-- 整合SpringMVC,需要加載springmvc核心組態檔 -->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/springmvc.xml</param-value>
    </init-param>
    <!--數字越大優先級越低, 數字為1,啟動服務器,立即創建該servlet -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <!-- 要和上面的前端控制器命名相同 -->
    <servlet-name>DispatcherServlet</servlet-name>
    <!-- *.do 表示所有后綴為do的請求 -->
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

</web-app>


3.3 配置springmvc.xml

路徑:resources/spring/springmvc.xml,開啟注解驅動,配置過濾檔案,配置視圖決議器,掃描controller,

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       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/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <!--springmvc是web層(Controller處理請求)  UserController  @Controller -->
    <!--1.掃描Controller所在包-->
    <context:component-scan base-package="com.xgf.web"/>

    <!--2. 配置的視圖決議器物件,success  路徑/WEB-INF/pages/success.jsp -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--3. 組態檔 - 過濾靜態資源  前面的前端控制器攔截所有,靜態css、js這些也都攔截
            配置使.js .css img這些靜態檔案不被攔截,保證靜態檔案都不攔截
             用過mvc標簽進行放行,這些目錄下檔案都不攔截      -->
    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/images/" mapping="/images/**" />
    <mvc:resources location="/js/" mapping="/js/**" />
    <mvc:resources location="/fonts/" mapping="/fonts/**" />

    <!-- 4. 開啟注解驅動,開啟SpringMVC的注解的支持 @RequestMapping @RequestBody @ResponseBody這些注解需要使用 -->
    <mvc:annotation-driven/>
</beans>

3.4 創建CompanyController進行測驗

com/xgf/web/controller/company/CompanyController.java

@Controller
@RequestMapping("/company")
public class CompanyController {
    private static final Logger l = LoggerFactory.getLogger(CompanyController.class);
    @Autowired
    ICompanyService companyService;

    //list.do -> list 前端控制器攔截后綴為.do的檔案
    @RequestMapping(path="/list.do",method = RequestMethod.GET)
    public String list(Model model){
        List<Company> list = companyService.findAll();
        //列印重要資料
        l.info("list  list="+list);
        model.addAttribute("list",list);
        return "company/company-list";
    }
}

3.5 創建company-list.jsp來測驗資料顯示

WEB-INF/pages/company/company-list.jsp

@Controller
@RequestMapping("/company")
public class CompanyController {
    private static final Logger l = LoggerFactory.getLogger(CompanyController.class);
    @Autowired
    ICompanyService companyService;

    //list.do -> list 前端控制器攔截后綴為.do的檔案
    @RequestMapping(path="/list.do",method = RequestMethod.GET)
    public String list(Model model){
        List<Company> list = companyService.findAll();
        //列印重要資料
        l.info("list  list="+list);
        model.addAttribute("list",list);
        return "company/company-list";
    }
}

3.5 配置tomcat服務器通過地址訪問controller

在這里插入圖片描述

3.6 SpringMVC對于日期字串向后臺提交轉Date問題

springMVC默認不支持頁面上的日期字串(類似2020-10-14或2020/10/14之類的)到后臺的Date的轉換,(會報400錯誤)
jsp頁面設定一個接收date資料的input,

<% pageContext.setAttribute("path",request.getContextPath()); %>
<form action="${path}/testDate.do" method="get">
    請選擇日期:<input type="date" name="date">
    <br/>
    <input type="submit" value="提交"/>
</form>

后臺controller接收資料進行跳轉

	@RequestMapping(path="/testDate.do",method = RequestMethod.GET)
    //該引數接收瀏覽器提交的日期字符
    public String testDate(Date date, Model model){
        System.out.println("testDate date="+date);
        model.addAttribute("date",date);
        return "stringToDateConverter";
    }

運行結果400錯誤
在這里插入圖片描述

3.7 配置自定義日期型別轉換器實作Converter介面

export_web_manager/com/xgf/web/controller/TestStringToDateConverter

import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

 /*自定義型別引數轉換器: 將字串日期格式轉成Date型別的資料.
      Converter<S,T>  S: 代表的是源,將要轉換的資料型別  T:目標型別,將會轉成什么資料型別
 */
 //日期格式轉換器
public class DateFormatConverter implements Converter<String,Date>{
  //轉換方法
  //String source 將會傳遞過來的日期的字串
  public Date convert(String source) {
   //引數填寫為你想要轉換的資料格式
?    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
?    try {
?      Date date = sdf.parse(source);
?      return date;
?    } catch (ParseException e) {
?      e.printStackTrace();
?    }
?    return null;
  }

3.8 在springmvc.xml中配置轉換工廠,并將轉換器放入注解驅動中,并測驗轉換情況

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       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/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <!--springmvc是web層(Controller處理請求)  UserController  @Controller -->
    <!--1.掃描Controller所在包-->
    <context:component-scan base-package="com.xgf.web"/>

    <!--2. 配置的視圖決議器物件,success  路徑/WEB-INF/pages/success.jsp -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--3. 組態檔 - 過濾靜態資源  前面的前端控制器攔截所有,靜態css、js這些也都攔截
            配置使.js .css img這些靜態檔案不被攔截,保證靜態檔案都不攔截
             用過mvc標簽進行放行,這些目錄下檔案都不攔截      -->
    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/images/" mapping="/images/**" />
    <mvc:resources location="/js/" mapping="/js/**" />
    <mvc:resources location="/fonts/" mapping="/fonts/**" />

    <!-- 4. 開啟注解驅動,開啟SpringMVC的注解的支持 @RequestMapping @RequestBody @ResponseBody這些注解需要使用 -->
    <mvc:annotation-driven/>

    <!-- 5. 配置型別轉換器  -->
    <!-- 創建型別轉換器物件 -->
    <bean id="stringToDateConverter" class="com.xgf.web.converter.StringToDateConverter"/>
    <!-- 把轉換器物件放入SpringMVC轉換器工廠中 -->
    <bean id="conversionServiceFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <!-- 引入日期轉換器物件(上面創建的) -->
                <ref bean="stringToDateConverter"/>
                <!-- 或者直接將轉換器類寫到這里面 -->
                <!--<bean id="stringToDateConverter" class="com.xgf.web.converter.StringToDateConverter"/>-->
            </set>
        </property>
    </bean>

    <!--6. 把轉換器工廠放入到注解驅動,轉換器才會生效 -->
    <mvc:annotation-driven conversion-service="conversionServiceFactory" />

</beans>

注意事項【*

上述代碼中的<mvc:annotation-driven conversion-service=“conversionServiceFactory” />一定要放到springmvc的注解驅動mvc:annotation-driven/后面,不然就會報400錯誤,(你都沒有開啟注解驅動,怎么放進去呢?)

運行結果(轉換成功)
在這里插入圖片描述

SSM環境搭建成功了

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/189914.html

標籤:其他

上一篇:Java基礎(二)——面向物件和類

下一篇:java面向物件4-代碼塊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more