對Spring與SpringMVC的理解


Spring


 

在我的Spring ——簡介及環境搭建跑通Hello提到關於Spring的基本結構與功能

SpringMVC

先上一張SpringMVC的流程圖

 

  Spring MVC 是一個模型 - 視圖 - 控制器(MVC)的Web框架建立在中央前端控制器servlet(DispatcherServlet),它負責發送每個請求到合適的處理程序,使用視圖來最終返回響應結果的概念。Spring MVC 是 Spring 產品組合的一部分,它享有 Spring IoC容器緊密結合Spring松耦合等特點,因此它有Spring的所有優點。他跟Struts一樣是一個控制器

  在項目中SpringMVC的配置


 

1.首先需要導入他所需要的jar包,可以上官網下載

2.需要在web.xml中配置這個

      • Dispatcherservlet

             前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,依據相應的規則分發到目標Controller來處理,是配置spring MVC的第一步。

      • InternalResourceViewResolver

            視圖名稱解析器,將ModelAndView渲染到頁面

 <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:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
 <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 此處也可以配置成 *.do 形式 過濾 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

 

  SpringMVC常用注解


 

@RestController

  負責注冊一個bean 到spring 上下文中
@RequestMapping

  注解為控制器指定可以處理哪些 URL 請求
@RequestBody

  該注解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然后把相應的數據綁定到要返回的對象上 ,再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上

@ResponseBody

   該注解用於將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換為指定格式后,寫入到Response對象的body數據區,我一般都是用於注解接口的

@ModelAttribute    

  在方法定義上使用 @ModelAttribute 注解:Spring MVC 在調用目標處理方法前,會先逐個調用在方法級上標注了@ModelAttribute 的方法

  在方法的入參前使用 @ModelAttribute 注解:可以從隱含對象中獲取隱含的模型數據中獲取對象,再將請求參數 –綁定到對象中,再傳入入參將方法入參對象添加到模型中 

@RequestParam 

  在處理方法入參處使用 @RequestParam 可以把請求參 數傳遞給請求方法

@PathVariable

  綁定 URL 占位符到入參
@ExceptionHandler

  注解到方法上,出現異常時會執行該方法
@ControllerAdvice

  使一個Contoller成為全局的異常處理類,類中用@ExceptionHandler方法注解的方法可以處理所有Controller發生的異常

Spring與Spring直接的相互關系


    關系:父子關系

    首先配置的是Spring容器的初始化加載的application文件,然后是SpringMVC的前端控制器(DispatchServlet),當配置完DispatchServlet后會在Spring容器中創建一個新的容器。其實這是兩個容器,Spring作為父容器,SpringMVC作為子容器。 

    這里需要說一些規則:兒子可以拿到父親的Bean對象,而父親不能拿到兒子的Bean,所以有時候會因為違法了這個而出現了報錯,兩者之間的順序是很重要的

    按照官方推薦根據不同的業務模塊來划分不同容器中注冊不同類型的Bean:Spring父容器負責所有其他非@Controller注解的Bean的注冊,而SpringMVC只負責@Controller注解的Bean的注冊,使得他們各負其責、明確邊界。配置方式如下

  1.在applicationContext.xml中配置:

<!-- Spring容器中注冊非@controller注解的Bean -->
<context:component-scan base-package="com.test.www"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>

  2.applicationContext-MVC.xml中配置

<!-- SpringMVC容器中只注冊帶有@controller注解的Bean -->
<context:component-scan base-package="com.test.www" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> 

可以使用一下的方法去避免一些問題的出現


 

        即上面提到的 springmvc 只掃描controller的包, spring掃描其他組件。
springmvc 配置如下: 

<context:component-scan base-package="com.xxx.**.cotroller"/> 

 springmvc只會掃描com.xxx下任意目錄或子目錄下的controller包下的類 

spring的配置如下: 

<context:component-scan base-package="com.xxx.**.service.impl,com.xxx.**.dao"/>  

         也可以用<context:include-filter/> 或 <context:exclude-filter/> 指定或排除某些類 
假設springmvc掃描如下: 

<context:component-scan base-package="com.xxx.**.service.impl,com.xxx.**.dao"/> 

  spring掃描如下: 

<context:component-scan base-package="com.xxx"/>

  那么就會重疊,springmvc會掃描service和dao,可以這樣修改springmvc的配置: 

<context:component-scan base-package="com.xxx">  
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>  
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>  
</context> 

 用 <context:exclude-filter/> 排除了@Service 和 @Repository 兩種注解標注的類,意思是告訴springmvc在掃描時,如果碰到這兩個注解標注的類直接忽略,不要創建和注入對象。

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM