1. 程式人生 > >SpringMVC 01

SpringMVC 01

  1. Spring入門

Springmvc是什麼

Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來,如下圖:

Springmvc處理流程

如下圖所示:

    1. 入門程式

需求:使用瀏覽器顯示商品列表

      1. 建立web工程

springMVC是表現層框架,需要搭建web工程開發。

如下圖建立動態web工程:

輸入工程名,選擇配置Tomcat(如果已有,則直接使用),如下圖:

配置Tomcat,如下圖:

 

選擇準備好的Tomcat,這裡用的是Tomcat7,如下圖:

選擇成功,點選Finish,如下圖:

選擇剛剛設定成功的Tomcat,如下圖:

如下圖選擇web的版本是2.5,可以自動生成web.xml配置檔案,

建立效果如下圖:

 

匯入jar包

複製jar到lib目錄,工程直接載入jar包,如下圖:

 

 

加入配置檔案

建立config資原始檔夾,存放配置檔案,如下圖:

 

 

 

建立springmvc.xml

建立SpringMVC的核心配置檔案

SpringMVC本身就是Spring的子專案,對Spring相容性很好,不需要做很多配置。

這裡只配置一個Controller掃描就可以了,讓Spring對頁面控制層Controller進行管理。

建立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:p="http://www.springframework.org/schema/p"

    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-4.0.xsd

        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!-- 配置controller掃描包 -->

    <context:component-scan base-package="cn.itcast.springmvc.controller" />

</beans>

 

配置檔案需要的約束檔案,位置如下圖:

建立包cn.itcast.springmvc.controller

效果如下圖:

 

 

 

配置前端控制器

配置SpringMVC的前端控制器DispatcherServlet

在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_2_5.xsd"

    id="WebApp_ID" version="2.5">

    <display-name>springmvc-first</display-name>

    <welcome-file-list>

       <welcome-file>index.html</welcome-file>

       <welcome-file>index.htm</welcome-file>

       <welcome-file>index.jsp</welcome-file>

       <welcome-file>default.html</welcome-file>

        <welcome-file>default.htm</welcome-file>

       <welcome-file>default.jsp</welcome-file>

    </welcome-file-list>

 

    <!-- 配置SpringMVC前端控制器 -->

    <servlet>

       <servlet-name>springmvc-first</servlet-name>

       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

       <!-- 指定SpringMVC配置檔案 -->

       <!-- SpringMVC的配置檔案的預設路徑是/WEB-INF/${servlet-name}-servlet.xml -->

       <init-param>

           <param-name>contextConfigLocation</param-name>

           <param-value>classpath:springmvc.xml</param-value>

       </init-param>

    </servlet>

 

    <servlet-mapping>

       <servlet-name>springmvc-first</servlet-name>

       <!-- 設定所有以action結尾的請求進入SpringMVC -->

       <url-pattern>*.action</url-pattern>

    </servlet-mapping>

</web-app>

 

加入jsp頁面

 

 

 

實現顯示商品列表頁

建立pojo

分析頁面,檢視頁面需要的資料,如下圖:

建立商品pojo

public class Item {

    // 商品id

    private int id;

    // 商品名稱

    private String name;

    // 商品價格

    private double price;

    // 商品建立時間

    private Date createtime;

    // 商品描述

    private String detail;

 

建立帶引數的構造器

set/get。。。

}

 

 

 

建立ItemController

ItemController是一個普通的java類,不需要實現任何介面。

需要在類上新增@Controller註解,把Controller交由Spring管理

在方法上面新增@RequestMapping註解,裡面指定請求的url。其中“.action”可以加也可以不加。

@Controller

public class ItemController {

    // @RequestMapping:裡面放的是請求的url,和使用者請求的url進行匹配

    // action可以寫也可以不寫

    @RequestMapping("/itemList.action")

    public ModelAndView queryItemList() {

       // 建立頁面需要顯示的商品資料

       List<Item> list = new ArrayList<>();

       list.add(new Item(1, "1華為 榮耀8", 2399, new Date(), "質量好!1"));

       list.add(new Item(2, "2華為 榮耀8", 2399, new Date(), "質量好!2"));

       list.add(new Item(3, "3華為 榮耀8", 2399, new Date(), "質量好!3"));

       list.add(new Item(4, "4華為 榮耀8", 2399, new Date(), "質量好!4"));

       list.add(new Item(5, "5華為 榮耀8", 2399, new Date(), "質量好!5"));

       list.add(new Item(6, "6華為 榮耀8", 2399, new Date(), "質量好!6"));

 

       // 建立ModelAndView,用來存放資料和檢視

       ModelAndView modelAndView = new ModelAndView();

       // 設定資料到模型中

       modelAndView.addObject("list", list);

       // 設定檢視jsp,需要設定檢視的實體地址

       modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");

 

       return modelAndView;

    }

}

 

啟動專案測試

啟動專案,瀏覽器訪問地址

http://127.0.0.1:8080/springmvc-first/itemList.action

效果如下圖:

 

 

為什麼可以用呢?我們需要分析一下springMVC的架構圖。

Springmvc架構

框架結構

框架結構如下圖:

 

架構流程

  1. 使用者傳送請求至前端控制器DispatcherServlet
  2. DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
  3. 處理器對映器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
  4. DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器
  5. 執行處理器(Controller,也叫後端控制器)。
  6. Controller執行完成返回ModelAndView
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
  8. DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器
  9. ViewReslover解析後返回具體View
  10. DispatcherServlet對View進行渲染檢視(即將模型資料填充至檢視中)。
  11. DispatcherServlet響應使用者
    1. 元件說明

以下元件通常使用框架提供實現:

  1. DispatcherServlet:前端控制器

使用者請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它呼叫其它元件處理使用者的請求,dispatcherServlet的存在降低了元件之間的耦合性。

  1. HandlerMapping:處理器對映器

HandlerMapping負責根據使用者請求url找到Handler即處理器,springmvc提供了不同的對映器實現不同的對映方式,例如:配置檔案方式,實現介面方式,註解方式等。

  1. Handler:處理器

Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的使用者請求進行處理。

由於Handler涉及到具體的使用者業務請求,所以一般情況需要程式設計師根據業務需求開發Handler。

 

  1. HandlAdapter:處理器介面卡

通過HandlerAdapter對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理器進行執行。

下圖是許多不同的介面卡,最終都可以使用usb介面連線

 

  1. ViewResolver:檢視解析器

View Resolver負責將處理結果生成View檢視,View Resolver首先根據邏輯檢視名解析成物理檢視名即具體的頁面地址,再生成View檢視物件,最後對View進行渲染將處理結果通過頁面展示給使用者。

  1. View:檢視

springmvc框架提供了很多的View檢視型別的支援,包括:jstlView、freemarkerView、pdfView等。我們最常用的檢視就是jsp。

一般情況下需要通過頁面標籤或頁面模版技術將模型資料通過頁面展示給使用者,需要由程式設計師根據業務需求開發具體的頁面。

 

說明:在springmvc的各個元件中,處理器對映器、處理器介面卡、檢視解析器稱為springmvc的三大元件。

需要使用者開發的元件有handlerview

 

    1. 預設載入的元件

我們沒有做任何配置,就可以使用這些元件

因為框架已經預設載入這些元件了,配置檔案位置如下圖:

# Default implementation classes for DispatcherServlet's strategy interfaces.

# Used as fallback when no matching beans are found in the DispatcherServlet context.

# Not meant to be customized by application developers.

 

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

 

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

 

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\

    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

 

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\

    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\

    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

 

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\

    org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\

    org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

 

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

 

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

 

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

 

    1. 元件掃描器

使用元件掃描器省去在spring容器配置每個Controller類的繁瑣。

使用<context:component-scan>自動掃描標記@Controller的控制器類,

在springmvc.xml配置檔案中配置如下:

<!-- 配置controller掃描包,多個包之間用,分隔 -->

<context:component-scan base-package="cn.itcast.springmvc.controller" />

 

    1. 註解對映器和介面卡
      1. 配置處理器對映器

       註解式處理器對映器,對類中標記了@ResquestMapping的方法進行對映。根據@ResquestMapping定義的url匹配@ResquestMapping標記的方法,匹配成功返回HandlerMethod物件給前端控制器。

HandlerMethod物件中封裝url對應的方法Method。

 

從spring3.1版本開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用RequestMappingHandlerMapping完成註解式處理器對映。

 

在springmvc.xml配置檔案中配置如下:

<!-- 配置處理器對映器 -->

<bean

    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

 

註解描述:

@RequestMapping定義請求url到處理器功能方法的對映

 

      1. 配置處理器介面卡

註解式處理器介面卡,對標記@ResquestMapping的方法進行適配。

 

從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成註解式處理器適配。

 

在springmvc.xml配置檔案中配置如下:

<!-- 配置處理器介面卡 -->

<bean

    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

 

 

      1. 註解驅動

直接配置處理器對映器和處理器介面卡比較麻煩,可以使用註解驅動來載入。

SpringMVC使用<mvc:annotation-driven>自動載入RequestMappingHandlerMapping和RequestMappingHandlerAdapter

可以在springmvc.xml配置檔案中使用<mvc:annotation-driven>替代註解處理器和介面卡的配置。

<!-- 註解驅動 -->

<mvc:annotation-driven />

 

    1. 檢視解析器

檢視解析器使用SpringMVC框架預設的InternalResourceViewResolver,這個檢視解析器支援JSP檢視解析

在springmvc.xml配置檔案中配置如下:

    <!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" ->

       "/WEB-INF/jsp/test.jsp" -->

    <!-- 配置檢視解析器 -->

    <bean

       class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <!-- 配置邏輯檢視的字首 -->

       <property name="prefix" value="/WEB-INF/jsp/" />

       <!-- 配置邏輯檢視的字尾 -->

       <property name="suffix" value=".jsp" />

    </bean>

邏輯檢視名需要在controller中返回ModelAndView指定,比如邏輯檢視名為ItemList,則最終返回的jsp檢視地址:

“WEB-INF/jsp/itemList.jsp”

 

最終jsp實體地址:字首+邏輯檢視名+字尾

      1. 修改ItemController

修改ItemController中設定檢視的程式碼

// @RequestMapping:裡面放的是請求的url,和使用者請求的url進行匹配

// action可以寫也可以不寫

@RequestMapping("/itemList.action")

public ModelAndView queryItemList() {

    // 建立頁面需要顯示的商品資料

    List<Item> list = new ArrayList<>();

    list.add(new Item(1, "1華為 榮耀8", 2399, new Date(), "質量好!1"));

    list.add(new Item(2, "2華為 榮耀8", 2399, new Date(), "質量好!2"));

    list.add(new Item(3, "3華為 榮耀8", 2399, new Date(), "質量好!3"));

    list.add(new Item(4, "4華為 榮耀8", 2399, new Date(), "質量好!4"));

    list.add(new Item(5, "5華為 榮耀8", 2399, new Date(), "質量好!5"));

    list.add(new Item(6, "6華為 榮耀8", 2399, new Date(), "質量好!6"));

 

    // 建立ModelAndView,用來存放資料和檢視

    ModelAndView modelAndView = new ModelAndView();

    // 設定資料到模型中

    modelAndView.addObject("itemList", list);

    // 設定檢視jsp,需要設定檢視的實體地址

    // modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");

    // 配置好檢視解析器字首和字尾,這裡只需要設定邏輯檢視就可以了。

    // 檢視解析器根據字首+邏輯檢視名+字尾拼接出來物理路徑

    modelAndView.setViewName("itemList");

 

    return modelAndView;

}

 

      1. 效果

效果和之前一樣,如下圖:

  1. 整合mybatis

       為了更好的學習 springmvc和mybatis整合開發的方法,需要將springmvc和mybatis進行整合。

 

整合目標:控制層採用springmvc、持久層使用mybatis實現。

    1. 建立資料庫表

sql指令碼建立資料庫表springmvc,匯入到資料庫中,如下圖:

    1. 需要的jar包
  1. spring(包括springmvc)
  2. mybatis
  3. mybatis-spring整合包
  4. 資料庫驅動
  5. 第三方連線池。

 

jar包位置如下圖:

 

    1. 整合思路

Dao層:

  1. SqlMapConfig.xml,空檔案即可,但是需要檔案頭。
  2. applicationContext-dao.xml
    1. 資料庫連線池
    2. SqlSessionFactory物件,需要spring和mybatis整合包下的。
    3. 配置mapper檔案掃描器。

Service層:

  1. applicationContext-service.xml包掃描器,掃描@service註解的類。
  2. applicationContext-trans.xml配置事務。

Controller層:

  1. Springmvc.xml
    1. 包掃描器,掃描@Controller註解的類。
    2. 配置註解驅動
    3. 配置檢視解析器

Web.xml檔案:

  1. 配置spring
  2. 配置前端控制器。
    1. 建立工程

建立動態web工程springmvc-web加入jar包複製jar包到/WEB-INF/lib中工程自動載入jar包

 

 

加入配置檔案

建立資原始檔夾config

在其下建立mybatis和spring資料夾,用來存放配置檔案,如下圖:

 

 

sqlMapConfig.xml

使用逆向工程來生成Mapper相關程式碼,不需要配置別名。

在config/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>

</configuration>

 

 

applicationContext-dao.xml

配置資料來源、配置SqlSessionFactory、mapper掃描器。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"

    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

    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-4.0.xsd

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

 

    <!-- 載入配置檔案 -->

    <context:property-placeholder location="classpath:db.properties" />

 

    <!-- 資料庫連線池 -->

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

       <!-- 載入mybatis的全域性配置檔案 -->

       <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />

    </bean>

 

    <!-- 配置Mapper掃描 -->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

       <!-- 配置Mapper掃描包 -->

       <property name="basePackage" value="cn.itcast.ssm.mapper" />

    </bean>

 

</beans>

 

db.properties

配置資料庫相關資訊

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/springmvc?characterEncoding=utf-8

jdbc.username=root

jdbc.password=root

 

 

applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"

    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

    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-4.0.xsd

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

 

    <!-- 配置service掃描 -->

    <context:component-scan base-package="cn.itcast.ssm.service" />

 

</beans>

 

 

applicationContext-trans.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"

    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

    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-4.0.xsd

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

 

    <!-- 事務管理器 -->

    <bean id="transactionManager"

       class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

       <!-- 資料來源 -->

       <property name="dataSource" ref="dataSource" />

    </bean>

 

    <!-- 通知 -->

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

       <tx:attributes>

           <!-- 傳播行為 -->

           <tx:method name="save*" propagation="REQUIRED" />

           <tx:method name="insert*" propagation="REQUIRED" />

           <tx:method name="delete*" propagation="REQUIRED" />

           <tx:method name="update*" propagation="REQUIRED" />

           <tx:method name="find*" propagation="SUPPORTS" read-only="true" />

           <tx:method name="get*" propagation="SUPPORTS" read-only="true" />

           <tx:method name="query*" propagation="SUPPORTS" read-only="true" />

       </tx:attributes>

    </tx:advice>

 

    <!-- 切面 -->

    <aop:config>

       <aop:advisor advice-ref="txAdvice"

           pointcut="execution(* cn.itcast.ssm.service.*.*(..))" />

    </aop:config>

 

</beans>

 

 

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:p="http://www.springframework.org/schema/p"

    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-4.0.xsd

        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

 

    <!-- 配置controller掃描包 -->

    <context:component-scan base-package="cn.itcast.ssm.controller" />

 

    <!-- 註解驅動 -->

    <mvc:annotation-driven />

 

    <!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" ->

       "/WEB-INF/jsp/test.jsp" -->

    <!-- 配置檢視解析器 -->

    <bean