1. 程式人生 > >Spring項目的配置文件們(web.xml context servlet springmvc)

Spring項目的配置文件們(web.xml context servlet springmvc)

-m 本質 發的 add set package lin req cdn

我們的spring項目目前用到的配置文件包括
1--web.xml文件,這是java的web項目的配置文件。我理解它是servlet的配置文件,也就是說,與spring無關。即使你開發的是一個純粹jsp頁面的web項目,你也必須配置這個文件。
我們的java web項目肯定寫了很多servlet代碼,這些servlet需要運行在servlet容器中,這個容器就是tomcat的重要組件。也就是,你的web項目需要運行在tomcat中,那麽你必須提供一個web.xml文件作為配置文件。
在這個文件中,通過context,也就是上下文,配置Spring。
同樣filter,和servlet同等級別的概念的這個元素,也直接配置在web.xml中,因為filter是java中的web項目中本身就有的概念,而不是spring中才導入的概念。filter的意思就是看看request,不修改也不響應,但是可以對request中的信息進行匹配,看看是真的要交給servlet還是駁回去。
技術分享圖片

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <display-name>RepositoryCheck HUB</display-name>
  <!-- dao和service層的Spring配置文件 -->
  <!-- access的配置文件是accessContext.xml; mysql的配置文件是mysqlContext.xml -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/mysqlContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
  
  <!-- web層的Spring配置文件 -->
      <servlet>
        <servlet-name>ruku</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ruku</servlet-name>
        <url-pattern>*.html</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>*.html</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <!-- 默認入口訪問文件 -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

2--applicationContext文件,我們指的是Spring容器最基礎的配置文件,名字可以隨便起,但是整個項目被發布以後,它的默認位於WEB-INFclasses目錄下。開發的過程中可以在web.xml文件中通過contextparam來配置這個文件的路徑。它是spring進行依賴註入、事務管理等基礎功能的配置文件。配置數據源啦,jdbcTemplate啦,都要依靠這個。比如你正在開發一個與web無關的數據庫增刪改查的spring項目,那麽只需要用這個配置文件就可以了。
SpringMVC並沒有在這個文件中配置,SpringMVC的配置文件是一個單獨的xml文件,該文件通過web.xml文件中的servlet元素配置,或者說SpringMVC的本質是Spring公司實現的一個servlet,我們在開發的一開始,通過web.xml文件將這個servlet導入了我們的項目,於是我們就可以使用spring MVC了。
技術分享圖片

3--[name]-servlet.xml配置文件,我指的是SpringMVC的配置文件,通常該文件位於WEB-INF目錄下,它的作用是配置Spring MVC,充當整個web項目的pipeline-value中的basevalue的角色,也就是最終的servlet。

上述內容,是我們開發的spring的web項目中用到的主要的配置文件,從上述內容我們可以看出來,和數據庫連接有關的內容,也就是數據源的配置,發生在第二個配置文件,也就是applicatioinContext.xml文件中(名字可以改),
技術分享圖片
我們來看看其中一個mysqlContext.xml文件的內容:

<?xml version="1.0" encoding="UTF-8"?>  
<!-- mysql dao和service層的Spring配置文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        classpath:/org/springframework/beans/factory/xml/spring-beans.xsd     
        http://www.springframework.org/schema/context
        classpath:/org/springframework/context/config/spring-context.xsd
        http://www.springframework.org/schema/aop
        classpath:/org/springframework/aop/config/spring-aop.xsd
        http://www.springframework.org/schema/tx
        classpath:/org/springframework/transaction/config/spring-tx.xsd">     
        
    <context:component-scan base-package="com.tsmi.mysql.dao"/>
    <context:component-scan base-package="com.tsmi.mysql.service"/>
    <context:component-scan base-package="com.tsmi.mysql.web"/>
        
    <!-- 配置mysql數據源 -->
    <bean id="dsmysql" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" 
        p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://localhost:6062/test2?useSSL=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC"
        p:username="root"
        p:password="密碼不告訴你機密" 
        p:defaultAutoCommit="true" />

    <!-- 配置事務管理器 -->
     <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        p:dataSource-ref="dsmysql" /> 

    <!-- 配置JdbcTemplate -->
    <bean id="jdbcTemplate" 
        class="org.springframework.jdbc.core.JdbcTemplate"
        p:dataSource-ref="dsmysql" />
        
</beans> 

我們的項目同時連接了mysql和access數據庫,上述配置文件時間上是mysql的配置文件部分。
我們都知道spring的配置有三種:基於xml,基於註解,基於java類。但是最常用的是第二種,基於註解的配置。
教材中也明確的說:筆者一般采用xml配置DataSource等資源Bean,在XML中利用aop,context命名空間進行相關主題的配置。但是所有項目中開發的Bean都通過基於註解的方式進行配置,也就是整個項目少量使用XML方式,大量使用基於註解方式,完全不采用java類方式。
通過我們自己開發的dao,service代碼我們也可以看出來,因為大量使用了@Autowired註解,如下面代碼示例所示

package com.tsmi.RepositoryCheck.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;

import com.tsmi.RepositoryCheck.domain.Lifnr;


@Repository
public class LifnrDao {
    
    /**
     * 聲明JdbcTemplate的一個變量
     */
    private JdbcTemplate jdbcTemplate;

    /**
     * @param 註入JdbcTemplate的變量的實例
     */
    @Autowired
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    
    final static String SELECT_ALL = "select * from 供應商評價等級";
    
    /**
     * 獲取所有
     * 供應商等級評價
     * @return
     */
    public List<Lifnr> getPernr(){
        
        final List<Lifnr> prs = new ArrayList<Lifnr>();
        
        jdbcTemplate.query(SELECT_ALL, new Object[] { }, new RowCallbackHandler() {

            public void processRow(ResultSet rs) throws SQLException {
                
                Lifnr pr = new Lifnr();
                
                pr.setSn(rs.getInt("編號"));
                pr.setsName(rs.getString("供應商名稱"));
                pr.setsLevel(rs.getString("供應商評價等級"));
                pr.setsEval(rs.getString("供應商月度評價"));
                pr.setsMonth(rs.getString("評價月份"));
                
                prs.add(pr);
                
            }
        
        });
    
        return prs;
        
    }
    

}

我們聲明變量,然後通過註解的方式,用@Autowired為變量實例化,用@Repository將類註冊到spring容器中,供其他的類實例化的時候調用。

實例化的過程其實就是Spring的IOC容器按照某種規則對容器中的bean進行自動裝配,這種裝配不是顯式的方式進行的依賴配置,是自動裝配。那麽裝配的規則是怎樣的呢?也就是,IOC容器根據什麽做判斷,誰裝配給誰呢?
這其中最重要的就是mysqlContext.xml文件中的beans和bean元素,這兩個元素都可以添加autowire屬性,用來設置“自動裝配類型”。
基於註解的配置方式中,默認采用autowire=byType這種策略進行自動裝配。(記住是默認啊,就是這個屬性壓根不用出現在你的配置文件的bean中都可以,默認)
那麽byType是什麽意思呢?
假如說,我們要實例化的bean是一個JdbcTemplate,如果容器中剛好有一個JdbcTemplate,Spring就會將這個裝配給需要被實例化的那個變量。
現在的問題是,假如我們在容器中已經有了兩個備選的JdbcTemplate等著呢,容器怎麽判斷用哪個去實例化變量呢?

容器中已經有了兩個備選的bean,怎麽選?我覺得我們首先要搞清楚一下,默認情況下spring中的bean的作用域的問題。
教材5.8節表示,spring中bean的默認作用域是singleton,singleton的含義是說,在spring IOC容器中只存在一個bean的實例,bean以單例的方式存在。spring利用AOP和LocalThread功能,對非線程安全的變量進行處理,變成了線程安全。
Spring的ApplicationContext容器啟動時,會自動實例化所有singleton的bean並緩存在容器中。

Spring項目的配置文件們(web.xml context servlet springmvc)