1. 程式人生 > >【SpringMVC學習04】Spring、MyBatis和SpringMVC的整合

【SpringMVC學習04】Spring、MyBatis和SpringMVC的整合

前兩篇springmvc的文章中都沒有和mybatis整合,都是使用靜態資料來模擬的,但是springmvc開發不可能不整合mybatis,另外mybatis和spring的整合我之前學習mybatis的時候有寫過一篇,但是僅僅是整合mybatis和spring,所以這篇文章我係統的總結一下spring、mybatis和springmvc三個框架的整合(後面學習到maven時,我會再寫一篇使用maven整合的文章,這篇沒有用到maven)。

1. jar包管理

  我之前有寫過一篇spring、hibernate和struts2整合的文章,在整合的時候,我個人不喜歡亂,不喜歡啪嘰一下將所有jar包往lib中一扔,因為那樣沒有條理,所以在整合SSM的時候,我還是遵循jar包分類的原則,首先看一下SSM整合都用到了哪些jar包(

點我下載):
jar包
  這裡我用的是dbcp,當然也可以用c3p0等其他連線池,歸歸類後jar包就很有條理。

2. 整合思路

  關於SSM的架構可以簡單看一下下面的草圖:
架構
  可以看出,spring在進行管理時,是很有條理的,每個層都由spring管理,然後不同的層可以呼叫其它層,Handler呼叫service,service呼叫mapper等。根據這個架構,我們來總結一下整合的思路,根據這個呼叫關係,我們可以從下往上一步步整合。

  1. 整合dao層。mybatis和spring整合,通過spring管理mapper介面。
    使用mapper的掃描器自動掃描mapper介面在spring中進行註冊。
  2. 整合service層。通過spring管理 service介面。
    使用配置方式將service介面配置在spring配置檔案中。
    實現事務控制。
  3. 整合springmvc。由於springmvc是spring的模組,不需要整合。

  現在思路清晰了,接下來就開始整合了。在整合前先看一下我整合完的工程結構:
工程結構

3. 整合dao層

  整合dao層也就是整合持久層,那麼需要spring的核心包,持久層包,mybatis包,資料庫以及連線池的包。所以將spring-persistence/spring-core/mysql-connector/mybatis/dbcp幾個資料夾中的jar包拷貝到lib中。

3.1 mybatis全域性配置檔案

  首先得寫mybatis的全域性配置檔案sqlMapConfig.xml,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- setting配置根據需要再新增 -->
    <!-- 配置別名 -->
    <typeAliases>
        <package name="ssm.po"/>
    </typeAliases>

    <!-- mapper這裡不需要配置了,因為跟spring整合後,在spring那邊會進行mapper的掃描 
        但必須遵循:mapper.xml和mapper.java必須同名且在一個目錄
    -->
</configuration>

  可以看出,整合的時候,這個全域性配置檔案已經很清爽了,基本沒啥東東了,因為資料來源啊、mapper啊啥的都交給spring去管理了。
關於db.properties和log4j.properties中的內容,我就不寫了,可以參考我之前寫的mybatis相關博文,也可以直接看我的原始碼。

3.2 配置spring配置檔案

  配置完了mybatis的全域性配置檔案後,接下來就要配置spring的配置檔案了,spring的配置檔案我將分類寫在不同的檔案中,都放在config/spring/目錄下了,這裡是對dao的整合,所以起名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:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 載入db.properties檔案中的內容 -->   
    <context:property-placeholder location="classpath:db.properties"/>

    <!-- 配置資料來源dbcp -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="5" />
    </bean>

    <!-- 配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
    </bean>

    <!-- 配置mapper掃描器 --> 
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 掃描包的路徑,如果需要掃描多個包,中間使用半形 逗號隔開-->
        <property name="basePackage" value="ssm.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

</beans>

  可以看出,整合dao層的時候主要配置一下資料來源、sqlSessionFactory和mapper掃描器,這樣的話,資料來源,sqlSessionFactory和mapper在tomcat啟動時就被spring例項化到了容器中。接下來就是準備po類及mapper了。

3.3 逆向工程生成po類及mapper

  關於如何使用mybatis的逆向工程我就不再贅述了,如果不太清楚的童鞋請看一下這篇文章:☞點我檢視
將生成的程式碼拷貝到我們自己的工程中即可,如下(那些檔案前的問號不管它,是我還沒同步到github的緣故):
po
  到這裡dao層就整合好了,下面來做個測試,整合的時候一定要步步為營,別啪啪啪整合完了再一起測試,到時候出錯再找就不太方便了。我們針對ItemsMapper介面中的SelectByPrimaryKey()方法做一個測試:

public class ItemsMapperTest {

    ApplicationContext applicationContext = null;
    @Before
    public void setUp() throws Exception {

        applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml");
    }

    @Test
    public void testSelectByPrimaryKey() {
        ItemsMapper itemsMapper = (ItemsMapper) applicationContext.getBean("itemsMapper");
        Items items = itemsMapper.selectByPrimaryKey(1);
        System.out.println(items);
    }
}

  能打印出id為1的Items物件說明沒有問題。

3.4 一個小插曲

  這裡需要注意一個問題,剛剛逆向工程生成的程式碼,我們儘量不要去改動它,為什麼呢?比如我現在改動了生成後的程式碼,後面萬一需求改變,我肯定會根據新的表關係再生成一次,然後再拷到自己的工程,這樣之前修改的東西就會被覆蓋,如果又不想被覆蓋,那就很麻煩了……要改的地方就太多了……所以我們永遠不去修改生成之後的程式碼,如果有需要,我們在生成的程式碼基礎上進行擴充套件(繼承,組合等),這樣就算程式碼重新生成,也不會影響我們的擴充套件類。
  我舉個例子:假如現在有個需求:

SELECT * FROM items WHERE items.name LIKE ‘%引數%’

  這個引數我們要通過一個Items的包裝類傳進來,Items的包裝類指的是,裡面封裝了Items的資訊,還封裝了其他資訊。因為這個包裝類除了查詢Items相關資訊外,還可能有關聯查詢,所以裡面不僅僅就只有Items本身的資訊。
  要實現這個需求,我們不能直接去改Items類,不能直接在Items類中新增東西,原因上面已經分析了,我們可以這麼做:

  1. 先寫一個Items的繼承類
  2. 在這個繼承類上進行擴充套件

  為啥要先寫一個繼承類呢?直接寫Items的擴充套件類不就行了麼?原因還是上面提到的,完以後面這個Items改了咋整?這是一點,還有就是Items的繼承類裡面,我就可以做一些新的操作了。看一下實現:

//Items的繼承類
public class ItemsCustom extends Items {

    //可以新增商品資訊的擴充套件屬性,如果不新增,其實就是Items

}
//這個就是Items的包裝類,我們從service開始,傳遞下去的都是包裝類
public class ItemsQueryVo {

    //原始的商品資訊
    private Items items;

    //為了系統 可擴充套件性,對原始生成的po進行擴充套件
    private ItemsCustom itemsCustom;

    public Items getItems() {
        return items;
    }

    public void setItems(Items items) {
        this.items = items;
    }

    public ItemsCustom getItemsCustom() {
        return itemsCustom;
    }

    public void setItemsCustom(ItemsCustom itemsCustom) {
        this.itemsCustom = itemsCustom;
    }
}

  然後我們定義itemsMapperCustom.xml對映檔案:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="ssm.mapper.ItemsMapperCustom" >
    <!-- 定義商品查詢的sql片段,就是商品查詢條件 -->
    <sql id="query_items_where">
        <!-- 使用動態sql,通過if判斷,滿足條件進行sql拼接 -->
        <!-- 查詢條件通過ItemsQueryVo包裝物件中的itemsCustom屬性來傳遞-->
        <if test="itemsCustom != null">
            <if test="itemsCustom.name != null and itemsCustom.name != ''">
                items.name LIKE '%${itemsCustom.name}%'
            </if>
        </if>
    </sql>

    <select id="findItemsList" parameterType="ssm.po.ItemsQueryVo"
            resultType="ssm.po.ItemsCustom">
        SELECT items.* FROM items
        <where>
            <include refid="query_items_where"></include>
        </where>
    </select>
</mapper>

  當然咯,對應的mapper介面要定義一下:

public interface ItemsMapperCustom {

    public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception;
}

  最後針對這個介面寫一個測試類:

public class ItemsMapperCustomTest {

    ApplicationContext applicationContext = null;
    @Before
    public void setUp() throws Exception {

        applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml");
    }


    @Test
    public void testFindItemsList() throws Exception {
        ItemsMapperCustom itemsMapper = (ItemsMapperCustom) applicationContext.getBean("itemsMapperCustom");

        ItemsQueryVo itemsQueryVo = new ItemsQueryVo();
        ItemsCustom itemsCustom = new ItemsCustom();
        itemsCustom.setName("手機");
        itemsQueryVo.setItemsCustom(itemsCustom);


        List<ItemsCustom> itemsCustomList = itemsMapper.findItemsList(itemsQueryVo);
        System.out.println(itemsCustomList);
    }

}

  可以看到,我們操作的都是Items的繼承類ItemsCustom和包裝類ItemsQueryVo,這個ItemsQueryVo將貫穿整條線,從service呼叫,到dao層。由逆向工程生成的原始的po類我們不去操作它們,除非是簡單的查詢,那麼直接查即可。

3. 整合service層

  先把jar包導了再說,整合service層需要配置事務了,所以要匯入spring-aop中所有的jar包到lib中。
  之前提到過,service是用來呼叫mapper的,mapper是用來操作資料庫的,其實上面的小插曲中的測試程式碼就有點類似service層做的事,先獲取mapper介面的代理物件,然後操作資料庫。所以在service層,我們首先要獲取mapper介面的代理物件,只不過在這裡我們通過spring注入進來,然後通過這個代理物件去操作資料庫。下面看一下整個整合的步驟:

3.1 先寫service介面

public interface ItemsService {

    public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception;

}

  可以看出,這個介面和上面那個mapper介面其實是一樣的,當然並不是說一定一樣,只不過這裡要實現的邏輯都一樣而已。

3.2 service實現類

public class ItemsServiceImpl implements ItemsService {

    @Autowired
    private ItemsMapperCustom itemsMapperCustom;

    @Override
    public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo)
            throws Exception {

        //通過itemsMapperCustom查詢資料庫
        return itemsMapperCustom.findItemsList(itemsQueryVo);
    }

}

  可以看出,實現類中是通過@Autowired注入itemsMapperCustom,這個itemsMapperCustom是上面那個插曲中定義的一個mapper。它會通過spring配的掃描器掃描到,並將物件裝到spring容器中,然後在這注入進來,然後呼叫findItemsList方法來操作資料庫。至於itemQueyVo,實際中,是將前臺傳來的資料封裝進來,然後傳進來的。這樣就打通了service與dao之間的通道了。

3.3 配置applicationContext-service.xml

  這裡是第二個spring的配置檔案了,還是在config/spring資料夾下面,主要是用來配置所有的service的,如下:

<?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:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

   <!-- 商品管理的service -->
   <bean id="itemsService" class="ssm.service.impl.ItemsServiceImpl"/>

</beans>

  當然咯,如果使用註解的話,這裡就不用配了,先用xml的方式吧。

3.4 配置applicationContext-transaction.xml

  這裡是第三個spring的配置檔案了,還是在config/spring資料夾下面,主要是用來配置spring事務管理的,如下:

<?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:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

   <!-- 事務管理器 -->
   <!-- 對mybatis操作資料事務控制,spring使用jdbc的事務控制類 -->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 資料來源dataSource在applicationContex-dao.xml中配置了 -->
        <property name="dataSource" ref="dataSource"/>
   </bean>

   <!-- 通知 -->
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
   </tx:advice>

   <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* ssm.service.impl.*.*(..))"/>
   </aop:config>

</beans>

  這樣service層就整合完了。接下來就是整合springmvc了。

4. 整合springmvc

  上面提到過,springmvc是spring的一個模組,所以不需要整合,我們只需要加入springmvc所需的包即可,將springmvc資料夾下的jar包匯入到lib中即可。關於springmvc的使用,在前面幾篇文章都寫了,這裡為了完整性,也總結一下。

4.1 配置前端控制器

  前端控制器要配置在WEB-INF/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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SpringMVC_Study</display-name>
  <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置前端控制器DispatcherServlet -->
  <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:springmvc.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>  
</web-app>

4.2 配置處理器對映器、處理器介面卡和檢視解析器

  這裡使用註解的方式配置,因為註解的方式比較簡單。配置在springmvc.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:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 一個配置節解決對映器和介面卡的配置註解配置 --> 
    <mvc:annotation-driven></mvc:annotation-driven>

    <!-- 掃描所有的Controller -->
    <context:component-scan base-package="ssm.controller"></context:component-scan>

    <!-- 配置檢視解析器 
        進行jsp解析,預設使用jstl標籤,classpath下得有jstl的包
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
</beans>

4.3 編寫Controller(即Handler)

  接下來寫一個Controller,如下:

@Controller
public class ItemsController {

    @Autowired
    private ItemsService itemsService;

    @RequestMapping("/queryItems")
    public ModelAndView queryItems() throws Exception {

        //呼叫service查詢資料庫,查詢商品列表
        //這裡傳入進去一個null表示沒有附加條件,查詢所有的。因為service中接收的是一個ItemsQueryVo物件
        List<ItemsCustom> itemsList = itemsService.findItemsList(null);

        //返回ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("itemsList", itemsList);
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

        return modelAndView;
    }
}
  • 前臺jsp頁面還是第二篇博文中寫的那個,沒有變,就不寫了。最後還有個重要的步驟就是載入spring容器。

4.4 載入spring容器

  在web.xml中新增spring容器監聽器,載入spring容器:

<!-- 載入spring容器 -->
 <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/applicationContext-*.xml</param-value>
 </context-param>
 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
  

相關推薦

SpringMVC學習04SpringMyBatisSpringMVC整合

前兩篇springmvc的文章中都沒有和mybatis整合,都是使用靜態資料來模擬的,但是springmvc開發不可能不整合mybatis,另外mybatis和spring的整合我之前學習mybatis的時候有寫過一篇,但是僅僅是整合mybatis和spring,所以這篇文

SpringMVC學習(四)——SpringMyBatisSpringMVC整合

creat .com www. dispatch cte scanner scan fault framework 本文我再來講SpringMVC和MyBatis整合開發的方法,這樣的話,Spring、MyBatis和SpringMVC三大框架的整合開發我們就學會了。這裏我

Web篇04ServletTomcatJSPweb.xml區別

很多初學者可能對這四個概念都有點傻傻分不清楚,下面就詳細講解一下這四個Web入門概念的區別: TomCat,是一個在小型專案開發和學習中,經常用到的一個小型的Web應用伺服器;它是一個Servlet/JSP容器,負責處理客戶請求,並把請求傳給servlet;然後將servlet

C++學習筆記C++中的程式結構輸入輸出以及語句(選擇迴圈結構)

1.C++程式結構 c++的每個程式單元由三部分組成: (1)預處理指令:#include 和#define (2)全域性宣告:在函式外部對資料型別、函式以及變數的宣告。它的有效範圍是從宣告開始到本程式單位結束。 (3)函式:包含函式首部和函式體,函式體中包含宣告語句和執行語句。

C++學習筆記C++的資料型別儲存以及基本運算

本文記錄了C++中的資料型別以及基本運算,這部分是典型的每次記每次忘型別,所以烙印在此,以便用時隨時查閱。 主要參考:http://www.runoob.com/cplusplus/cpp-data-types.html 1. C++中的資料型別 (1)基本型別 C++ 為程式

C++學習筆記對於C++語法新手常犯的錯誤

從python到C++,表示需要注意的習慣性細節還是蠻多的,作為一個不看就忘星人,還是決定老老實實把一個個易錯點記錄下來,也再一次加深印象。 首先看個樣例,來自譚浩強老師的《C++程式設計第3版》,第一章習題9: #include <iostream> using namespa

C++學習筆記如何使用Visual Studio2015進行C++專案建立

C++學習常用的編譯環境是Visual Studio系列和GCC系列,其中VS是Win下的編譯器,GCC有Win、Linux和UNIX版本,二者皆可以從網上下載到,GCC是最接近C++標準的,後續有嘗試的價值,作為初學者本文先從VS系列進行學習。 本文內容轉載自:https://www.cnbl

機器學習基礎KL散度交叉熵

  熵(entropy)、KL 散度(Kullback-Leibler (KL) divergence)和交叉熵(cross-entropy)在機器學習的很多地方會用到。比如在決策樹模型使用資訊增益來選擇一個最佳的劃分,使得熵下降最大;深度學習模型最後一層使用 softmax 啟用函式後,我們也常使用交叉熵來

python學習筆記列表元組字典的迭代

在python中,列表和元組的迭代是通過for....in....來完成的; >>> a=[1,2,3,4,5,6,7] >>> for index in a: ... print(index) ... 1 2 3 4 5

Nginx學習04nginx伺服器上https站點解析php

前言 雙十一的時候在阿里雲上買了一個學生機,趁著沒過期,拿來折騰一下。 基於WordPress搭建了一個個人網站,用來記錄自己的技術部落格,後來網站升級換成了https的,發現原來的http+php不能使用,遂記錄一下升級過程。 http升級為https後,怎麼修改配置檔案

opencv學習筆記1opencv縮放圖片

#include <opencv2\opencv.hpp> using namespace std; int main() { //定義原圖視窗標題 const char *windowsTitle = "原圖"; //定義縮放後窗口標題 const char *

Python學習筆記對映(Mapping)

• 通過名字來引用值得資料結構稱為對映字典(Dict)•   字典是鍵值對(key-value pair)的無序可變集合。(1)字典的操作①字典的建立• 字典中的每個元素包含兩部分:鍵和值。• 鍵和值用冒號分隔,元素間用逗號分隔,所有元素放在一對大括號中。d = {key1

Python學習筆記序列(Sequence)

3.1序列簡介•   資料結構是通過某種方式組織在一起的元素的集合。•   容器(Container)是一種Python的資料結構,基本上是包含其他物件的任意物件。序列和對映(如字典)是兩類主要的容器。集合(Set)也是容器型別。•   序列是最基本的資料結構,是通過對資料元

Android學習筆記onInterceptTouchEvent()onTouchEvent()

一、資源: 二、重點 首先要明確onInterceptTouchEvent()這個方法只針對於ViewGroup,事件傳到ViewGroup一般先觸發onInterceptTouchEvent(),View是沒有這個方法的具體傳遞的流程見資源1,很詳細,對理解很有幫助 onInterceptTouchE

SpringMVC學習筆記03 使用maven建立springMVC專案

6.建立controller@ControllerpublicclassIndexController {/**    * 主頁設定 "/"的話預設情況下就訪問    * @return    */@RequestMapping("/")public String home() {return"home"; 

機器學習筆記 Regression迴歸

一、基礎 這裡面,輸入變數x有兩個,一個是居住面積(living area),一個是房間數目(bedrooms)。 所以x 是一個二維向量。表示第i組資料中的居住面積(living area)。表示第i組資料中的房間數目。 我們假設輸入和輸出呈線性關係,那麼便有下面的公式

機器學習系列特徵值奇異值以及奇異值分解

前言:     上一次寫了關於PCA與LDA的文章,PCA的實現一般有兩種,一種是用特徵值分解去實現的,一種是用奇異值分解去實現的。在上篇文章中便是基於特徵值分解的一種解釋。特徵值和奇異值在大部分人的印象中,往往是停留在純粹的數學計算中。而且線性代數或者矩陣論裡面

python學習筆記python函式定義傳參方法說明

一、函式定義方式 函式定義用關鍵字def,其引數傳遞不用設定型別,也不用定義返回,然後在函式名稱後加上:號,這點和java很不一樣,相對來說更加簡單了;另外包含關係上用四個空格來標識,而非java的;號; 如下為一個範例,定義了一個函式用來生成任意上界的菲波那契數列: # -*- c

Docker學習總結4.Docker安裝部署

之前的總結分別介紹了Docker是什麼,以及Docker由哪些部分組成。本篇將為大家詳細介紹Docker是怎樣安裝、部署和使用的。 我們這裡在Windows機器上使用VMware來模擬在Linux的CentOS 7版本上來安裝Docker。 首先開啟虛擬機器: 記住IP地

python學習筆記列表生成式生成器

一、列表生成式 列表生成式即List Comprehensions,是Python內建的非常簡單卻強大的可以用來建立list的生成式。 列表生成式由包含一個表示式的括號組成,表示式後面跟隨一個for子句,之後可以有零或多個for或if子句。結果是一個列表,由表示