SpringMVC學習

1.   SpringMVC介紹

  • 1.  SpringMVC配置(掌握)
  • 2.  全註解配置方式(掌握)
  • 3. 獲取參數、傳遞屬性、上傳、下載、操做json;(掌握)
  1. SpringMVC

2.1.  簡介css

SpringMVC是一個基於MVC模式的WEB框架,它解決WEB開發中常見的問題(參數接收、文件上傳/下載、表單驗證、國際化、等等),使用很是簡單,SpringMVC做爲Spring中的一個模塊,能夠與Spring無縫集成。html

2.2.  爲何要學習SpringMVC前端

   Spring是一個輕量級的Java 開發框架,爲了解決企業應用開發的複雜性而建立。框架的主要優點之一就是其分層架構,分層架構容許使用者選擇使用哪個組件,同時爲 J2EE 應用程序開發提供集成的框架。SpringMVC以Spring框架爲核心,爲應用程序中的Web層(表現層)提出的一套優秀的解決方案。java

   目前不少公司都使用SpringMVC,90%的招聘單位要求熟悉使用SpringMVC。web

  1. Hello World入門

3.1.  入門理論面試

SpringMVC以Spring爲核心,而Spring最核心的模塊是IOC(控制反轉)/DI(依賴注入)容器ajax

因此使用SpringMVC必須先保證Spring IOC容器初始化,簡單的說就是讓你的項目擁有Spring的運行環境.spring

使用框架的第一步須要框架的官方網站下載框架相關的文件,express

而SpringMVC無需單獨下載,由於SpringMVC是做爲Spring中的一個模塊存在,因此咱們只須要下載Spring便可。apache

查看:spring/libs/目錄

beans,contenxt,core,expression,test,aop 依賴的logging

spring-webmvc-4.1.2.RELEASE.jar  SpringMVC的jar文件。

spring-web-4.1.2.RELEASE.jar      Spring對Web項目運行的支持。

3.2.  核心控制器(前端控制器)

顧名思義核心控制器用於Web層核心功能的處理以及在全部控制器執行以前,全部的WebMvc框架都採用了這種方式,在Struts2中咱們使用的是StrutsPrepareAndExecuteFilter做爲核心控制器,在SpringMVC中使用的是DispatcherServlet爲核心控制器. DispatcherServlet核心控制器會攔截匹配的請求,把攔截下來的請求,依據相應的規則分發到目標Controller來處理。

 

 

3.3.  加入相關Spring的jar包

不要使用spring.3的jar和4.x的jar文件混用,危險的很

     com.springsource.org.apache.commons.logging-1.1.1.jar

     spring-beans-4.1.2.RELEASE.jar

     spring-context-4.1.2.RELEASE.jar

     spring-core-4.1.2.RELEASE.jar

     spring-expression-4.1.2.RELEASE.jar

     spring-aop-4.1.2.RELEASE.jar

     spring orm、jdbc、tx相關jar根據項目使用自行添加;

加入相關SpringMVC相關jar包。

     spring-web-4.1.2.RELEASE.jar           spring 對web項目的支持。

     spring-webmvc-4.1.2.RELEASE.jar      SpringMVC核心包。

3.4.  配置核心控制器

Webmvc框架的心臟就是核心控制器,負責全部請求的公共功能,而後在分發給具體的控制器(咱們編寫的控制器),完成業務邏輯,響應視圖。

3.4.1.   Jar文件找

 

3.4.2.   web.xml

<servlet>

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

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

</servlet>

 

<servlet-mapping>

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

         <!-- 請求的入口,以.do結尾的請求都會通過DispatcherServlet處理 -->

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

</servlet-mapping>

3.5.  新建Controller控制器

SpringMVC中的控制器與之前咱們之前學習的action、servlet做用同樣,處理用戶請求,調用業務邏輯,返回結果視圖。

      SpringMVC中的控制器有必定規範,要麼實現接口,要麼使用POJO對象與註解配合使用。

規範要求

說明

實現Controller接口或子接口。

注意:子接口不少已通過時了。

核心方法爲handleRequest(req,resp),處理用戶請求

普通的類(經常使用的哦)

使用一個普通的類做爲咱們的控制器,每個方法就是一個處理器,這種方式須要配合註解標籤才能使用。

public class Controller1 implements Controller {

 

         @Override

         public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

                  return null;

         }

 

}

 

3.6.  添加處理請求代碼

 

handleRequest方法的兩個參數與咱們之前的servlet中service方法同樣,request和response對象,咱們可使用這個兩個對象完成一次請求的全部工做,好比你可使用request接受參數,或者使用response重定向等等,注意方法除了返回值之外還有一個返回值ModelAndView。

ModelAndView是SpringMVC控制器中特有一個對象,描述一次請求響應的 數據(Model)和 視圖(View)。

 

3.7.  視圖頁面:

 

3.8.  配置咱們的控制器

SpringMVC是基於Spring,Spring中的核心就是Ioc容器,而Ioc容器中最重要的成員就是<bean>,SpringMVC中的控制器也是一個一個<bean>。

 

 

部署項目,啓動Tomcat報錯

錯誤信息以下:

 

沒找到/WEB-INF/springmvc-servlet.xml文件,由於在啓動Tomcat服務器的時候會初始化SpringMVC中的DispatcherServlet,而這個DispatcherServlet會根據配置文件初始化Spring容器,默認配置文件路徑爲:/WEB-INF/<servlet-name>-servlet.xml

 

解決問題方式:

1.能夠把咱們的配置文件改名爲springmvc-servlet.xml,而後拷貝到WEB-INF中。

 

2.通常spring的配置文件都在放在src中或者resource文件中,咱們能夠經過如下配置告訴SpringMVC咱們的配置文件路徑。

 

 

訪問

 http://localhost/helloworld

 

 注意:若是你的配置爲<url-pattern>*.do</url-pattern>,而且<bean name="/helloworld.do">,訪問路徑爲: http://localhost/helloworld.do

  1. Controller控制器實現的3種方式

如今只用第三種,全註解

4.1.  第一種實現Controller接口:

 

 

配置

 

4.2.  第二種實現HttpRequestHandler接口:

 

 

配置

 

 

4.3.  第三種普通類和註解:建議使用(請看後面的全註解配置)

POJO(Plain Ordinary Java Object)簡單的Java對象,實際就是普通JavaBean

沒有繼承類,也沒有實現類

 

 

配置(只須要配置讓spring管理這個bean便可,無需指定路徑,由於方法上面經過@RequestMapping指定)

  1. <url-pattern> 能夠寫那些內容?

5.1.  *.do

<!-- 請求的入口,以.do結尾的請求都會通過DispatcherServlet處理 -->

5.2.  /(如今最流行的配置方式)

<!-- 以RESTful的訪問風格,來訪問當前應用,如今用的最多的 -->

<!-- 靜態資源被攔截:緣由是在tocmat的web.xml裏面有一個專門處理靜態的資源的servlet,它配置的url-pattern也是/ ,形成圖片靜態資源不能成功被訪問-->

5.2.1.   Tomcat/conf/web.xml

<servlet>

        <servlet-name>default</servlet-name>

        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 處理靜態資源,如圖片、css等

        <init-param>

            <param-name>debug</param-name>

            <param-value>0</param-value>

        </init-param>

        <init-param>

            <param-name>listings</param-name>

            <param-value>false</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>

<servlet-mapping>

        <servlet-name>default</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>

5.2.2.   靜態資源訪問

 

因爲咱們配置的攔截器規則是"/","/"就表明默認控制器,tomcat自己自帶有一個默認控制器,這個控制器用於處理靜態資源請求,若是咱們配置默認控制器,那麼tomcat的默認控制器就不生效,致使靜態資源沒法訪問。

 

解決辦法:SpringMVC開啓靜態資源控制器。

 

 

5.3.  /*

<!-- /* struts2就是這樣的,springmvc不能使用此配置,由於連jsp做爲一個控制器攔截處理 -->

  1. 全註解

SpringMVC中全部控制器,其實在spring中就是一個一個bean,spring管理bean的方法分爲兩種,第一種是xml,第二種是註解。

6.1.  SpringMVC中控制器建議使用註解方式,是官方推薦的,外面公司也是使用此方式。

 

6.2.  SpringMVC開啓註解支持

 

6.3.  spring經過註解管理bean

 

 

 

  1. SpringMVC返回JSON

7.1.  解析json的經常使用工具包

Jackson http://jackson.codehaus.org/  springmvc默認使用

JSON-lib:http://json-lib.sourceforge.net/  ajax課程學習的時候使用的

          JSONSerializer.toJSON(parents).toString()

Gson:http://code.google.com/p/google-gson/

阿里:fastjson

 

7.2.  出現406狀態異常,加入jackson json工具包

 

 

7.3.  處理有亂碼的問題(主要是提供給ie瀏覽器)

<!-- 爲了處理返回的JSON數據的編碼,默認是ISO-8859-1的,設置爲UTF-8 -->

         <bean id="mappingJacksonHttpMessageConverter"  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

             <property name="supportedMediaTypes">

                     <list>

                             <value>text/html;charset=UTF-8</value>

                    </list>

    </property>

         </bean>

7.4.  對日期格式的特殊處理(後面要用到的知識)

7.4.1.   從後臺向前臺:

默認返回的日期格式爲時間戳,而在前臺咱們但願顯示出指定規則的日期字符串。如:

默認:{"name":"小明哥","birthdate":121223223}

指望: {"name":"小明哥","birthdate":"2025-12-12"}

在日期get屬性,字段上,添加一個格式化註解

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")

7.4.2.   從前臺向後臺:(異常的狀態碼是400,相似於struts2轉換異常)

在後臺模型的setter方法上,添加註解

import org.springframework.format.annotation.DateTimeFormat;

@DateTimeFormat(pattern="yyyy-MM-dd")

7.4.3.   JsonController

@Controller

public class JsonController {

 

         @RequestMapping("/json1")

         @ResponseBody

         public String json1() throws Exception {

                  return "xxx";

         }

 

         @RequestMapping("/json2")

         @ResponseBody

         public String[] json2() throws Exception {

                  return new String[] { "A", "B", "C" };

         }

 

         @RequestMapping("/json3")

         @ResponseBody

         public User json3() throws Exception {

                  return new User("xxx", 20, new Date());

         }

 

         @RequestMapping("/json4")

         @ResponseBody

         public List<User> json4() throws Exception {

                  List<User> users = new ArrayList<User>();

                  for (int i = 1; i < 11; i++) {

                           users.add(new User("xxx" + i, 20 + i, new Date()));

                  }

                  return users;

         }

 

}

  1. 接收參數

8.1.  經常使用第1,2,4種

8.2.  spring內置請求編碼過濾器(只能接受post請求)

注意:SpringMVC框架自己沒有處理請求編碼,須要配置一個spring內置請求編碼過濾器。

 

 

若是有get請求亂碼,tomcat6.x,7.x/conf/server.xml 

<Connector port="80" protocol="HTTP/1.1" URIEncoding=」UTF-8」

               connectionTimeout="20000"

               redirectPort="8443" />

8.3.  經過控制器的執行方法參數來接收表單的參數

 

8.4.  經過模型對象來接收,作項目常常用

 

8.5.  3.經過HttpServletRequest接收(不建議使用)

 

 

8.6.  接收url中參數的請求,接收用戶請求參數值

之後你本身寫webservice,而後讓其餘人來訪問

此種方式就是RESTful訪問方式

 

  1. 傳遞數據

9.1.  經常使用第1種

9.2.  經過model對象進行數據傳遞

 

9.3.  經過ModelAndView對象傳遞

 

 

 

9.4.  經過request對象進行數據傳遞(不建議使用)

 

9.5.  經過返回值傳遞數據(更不建議使用)

 

9.6.  轉發

上面4個案例都是轉發,轉發的值都是放到request請求做用域,下一個頁面能夠取出

Url地址不會改變

 

9.7.  重定向

重定向就是發出一個全新的請求,

若是把值放到request請求,下一個頁面不能取出

若是把值放到session會話請求,下一個頁面能夠取出

Url地址會改變

 

  1. 文件上傳

10.1.         添加jar文件

因爲SpringMVC本身沒有實現文件上傳,它使用是apache.commons.fileupload

com.springsource.org.apache.commons.fileupload-1.2.0.jar

com.springsource.org.apache.commons.io-1.4.0.jar

10.2.         jsp頁面

enctype="application/x-www-form-urlencoded" post提交默認值

若是上傳文件修改enctype=」multipart/form-data」

 

10.3.         異常,須要配置上傳解析器

錯誤:提示告訴開發者你沒有配置文件上傳解析器。

 

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

         <!-- 設置上傳文件的最大尺寸爲1MB -->

         <property name="maxUploadSize">

                  <!-- spring el寫法:5MB -->

                  <value>#{1024*1024*5}</value>

         </property>

</bean>

10.4.         後臺處理

@Controller

public class UploadController {

 

         // 先發出一個get請求,顯示一個上傳頁面

         // localhost/upload get提交

         @RequestMapping(name = "upload", method = RequestMethod.GET)

         public String get() throws Exception {

                  return "upload";

         }

 

         // <form action="upload" method="post" enctype="multipart/form-data">

         // 其餘屬性<input type="text" name="name"><br />

         // 文件屬性<input type="file" name="upload"><br />

         // <input type="submit"/>

         // </form>

 

         // 上面頁面一提交,就返回下面post方法

 

         // 發出一個post請求,處理文件的上傳

         // localhost/upload post提交

         @RequestMapping(name = "upload", method = RequestMethod.POST)

         public String post(MultipartFile upload, String name, HttpServletRequest request) throws Exception {

                  System.out.println("其餘屬性name::" + name);

                  System.out.println("上傳文件的類型:" + upload.getContentType());

                  System.out.println("上傳文件名稱:" + upload.getName());

                  System.out.println("上傳文件文件名:" + upload.getOriginalFilename());

 

                  // 上傳的流

                  InputStream inputStream = upload.getInputStream();

                  // 獲取webapp路徑

                  String webapp = request.getServletContext().getRealPath("/uploads/");

                  File file = new File(webapp, upload.getOriginalFilename());

                  File parentFile = file.getParentFile();

                  if (!parentFile.exists()) {

                           // 若是upload文件夾不存在,就建立

                           parentFile.mkdirs();

                  }

                  // 拷貝到webapp一個目錄裏面

                  IOUtils.copy(inputStream, new FileOutputStream(file));

                  return "upload";

         }

 

}

 

  1. 文件下載(仍是原來servlet的方式)

@RequestMapping("download")

public void get(HttpServletRequest request, HttpServletResponse response) throws Exception {

         // 第一行:設置建議的下載文件名

         response.setHeader("Content-Disposition", "filename=employee.xlsx");

         // 第二行:設置文件名的類型

         // struts.xml:<param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param>

         response.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

         // 準備文件

         String webapp = request.getServletContext().getRealPath("/");

         File file = new File(webapp, "employee-5.xlsx");

         FileInputStream inputStream = new FileInputStream(file);

         IOUtils.copy(inputStream, response.getOutputStream());

}

 

  1. SpringMVC 執行流程

 

 

  1. SpringMVC工做流程詳細描述

控制器=處理器(Handler)

 

      1. 用戶向服務器發送請求,請求被SpringMVC前端控制DispatcherServlet捕獲;

      2. DispatcherServlet經過調用HandlerMapping(處理器映射管理對象)得到該請求對應的Handler對象(包括控制器以及Handler對象對應的攔截器)

   HandlerExecutionChain對象(包含:控制器+2個攔截器);

     

      3. DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter。(附註:若是成功得到HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)

 

       4. 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程當中,根據你的配置,Spring將幫你作一些額外的工做:

      HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息

      數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等

      數據格式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等

      數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中

      5.Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;

      6.根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;

      7. ViewResolver 結合Model和View,來渲染視圖(Model+View合成)

      8. 將渲染結果返回給客戶端。

 

  1. SpringMVC工做流程描述(簡易版本,面試)

  1. 客戶端請求提交到DispatcherServlet

  2. 由DispatcherServlet控制器查詢一個或多個HandlerMapping,找處處理請求的Controller。

  3. DispatcherServlet將請求轉發給到Controller。

  4. Controller調用業務邏輯處理後,返回ModelAndView

  5. DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖。

  6. 視圖負責將結果顯示到客戶端。

  1. SpringMVC核心對象

15.1.         HanderMapping 處理器映射管理對象

    做用:根據不一樣的請求選擇最合適的處理器(本身編寫的控制器),處理器映射管理對象能夠配置多個,誰最早匹配就執行誰。(經過訪問的url地址匹配控制器)

 

SpringMVC默認:/org/springframework/web/servlet/DispatcherServlet.properties

 

BeanNameUrlHandlerMapping   處理經過<bean name="/xxx">註冊的控制器。控制器須要實現Controller接口。

BeanNameUrlHandlerMapping

處理經過<bean name="/xxx">註冊的控制器。控制器須要實現Controller接口。

DefaultAnnotationHandlerMapping

處理經過註解@Controller(類標籤) 及@RequestMapping(方法標籤) 註冊的控制器。該處理器映射管理對象已經在Spring 3.2 版本過期,替換爲RequestMappingHandlerMapping。

15.2.         spring 中提供的內置處理器映射

15.2.1.        簡單url處理器映射(如今不用的)

         org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

(瞭解便可,如今已經基本不用了)

                  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

                <property name="mappings">

                       <value>

                                /helloworld(url 地址)=helloworldController(bean id)

                                /helloworld002=helloworldController

                       </value>

               </property>

     </bean>

   

15.3.         使用<mvc:annotation-driven/>開啓新的映射處理器。

 

上面的配置就是告訴spring

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping  採用註解方式請求處理器映射。

15.4.         HandlerAdapter 處理器適配

15.4.1.        做用:

支持多種類型的處理器,如何來執行"處理器(控制器)"; 如何執行咱們的控制器。

15.4.2.        Spring默認處理器適配:

 

    org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter 處理實現了HttpRequestHandler接口對應的控制器。

 

   org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter 處理實現了Controlle接口對應的控制器。

 

 

15.5.         使用<mvc:annotation-driven/>開啓新的處理器適配   

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter  處理經過註解方式的控制器。 3.2中已過期,替換爲org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

15.6.         ViewResolver 視圖解析器 (struts2視圖類型相似)

15.6.1.        ViewResolver 視圖解析器:

   做用:根據不一樣的視圖,響應不一樣的結果,好比普通的jsp或json.

   SpringMVC默認:

 

       InternalResourceViewResolver : 支持默認視圖,採用forward,redirect。

視圖名規則

    不寫前綴默認爲"轉發"

    視圖名字符串前綴:

            forward:/xxx.jsp 採用轉發。

            redirect:/xxx.jsp  採用重定向。

    new ModelAndView("forward:/userList");

    new ModelAndView("redirect:/user");

 

15.6.2.        註冊(替換)視圖解析器

    設置視圖路徑的先後綴,該配置可讓咱們寫視圖路徑的時候更簡單。

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

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

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

         </bean>

 

路徑簡寫:

 

 

15.6.3.        注意事項:"forward:"與"redirect:"前綴問題

 

頁面不在前綴路徑中的狀況(或者頁面路徑不是以.jsp爲後綴)

 

 

 

  1. 課程總結

16.1.         重點

  1. 所有在代碼裏面,怎樣處理json,接收參數,傳遞參數,上傳,下載

16.2.         難點

  1. 理解url-pattern的3種配置, 達到不一樣效果
  2. 常見異常
  3. No mapping found for HTTP request with URI [/controller3.do] in DispatcherServlet with name 'dispatcher'

表示在當前spring的配置裏面沒有找處處理/controller3.do的控制器,springmvc配置不對

  1. java.lang.ClassNotFoundException: org.springframework.aop.TargetSource

添加aop的jar文件

  1. HTTP Status 500 - Circular view path [param1]: would dispatch back to the current handler URL [/param1] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

註冊(替換)視圖解析器

    設置視圖路徑的先後綴,該配置可讓咱們寫視圖路徑的時候更簡單。

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

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

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

         </bean>

  1. 狀態異常

若是出現406狀態異常,jackson的jar文件沒有導入

若是出現400狀態異常,相似於struts2的類型轉換異常,

如日期格式輸入錯誤或者是英文瀏覽器

在後臺模型的setter方法上,添加註解

import org.springframework.format.annotation.DateTimeFormat;

@DateTimeFormat(pattern="yyyy-MM-dd")

如年齡字段輸入了字符串

  1. HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?

缺乏配置

  1. 課後練習
  2. 面試題
  3. Servlet何時被實例化?

Servlet是單例,針對一個tomcat在內存裏面只有一個實例

A.第一次訪問的時候

B.tomcat啓動的時候

<!-- 告訴tomcat啓動的時候就進行實例化 -->

<load-on-startup>1</load-on-startup>

  1. Spring MVC執行流程
  2. 面試題:SpringMVC與Struts2區別

目前企業中使用SpringMVC的比例已經遠遠超過Struts2,那麼二者到底有什麼區別,是不少初學者比較關注的問題,下面咱們就來對SpringMVC和Struts2進行各方面的比較:

核心控制器(前端控制器、預處理控制器):

對於使用過mvc框架的人來講這個詞應該不會陌生,核心控制器的主要用途是處理全部的請求,而後對那些特殊的請求(控制器)統一的進行處理(字符編碼、文件上傳、參數接受、異常處理等等),SpringMVC核心控制器是Servlet,而Struts2是Filter。

控制器實例:

SpringMVC會比Struts快一些(理論上)。SpringMVC是基於方法設計,而Sturts是基於對象,每次發一次請求都會實例一個action,每一個action都會被注入   屬性,而Spring更像Servlet同樣,只有一個實例,每次請求執行對應的方法便可(注意:因爲是單例實例,因此應當避免全局變量的修改,這樣會產生線程安全問題)。

管理方式:

大部分的公司的核心架構中,就會使用到spring,而SpringMVC又是spring中的一個模塊,因此spring對於SpringMVC的控制器管理更加簡單方便,並且提供了全 註解方式進行管理,各類功能的註解都比較全面,使用簡單,而struts2須要採用XML不少的配置參數來管理(雖然也能夠採用註解,可是幾乎沒有公司那樣使用)。

參數傳遞:

Struts2中自身提供多種參數接受,其實都是經過(ValueStack)進行傳遞和賦值,而SpringMVC是經過方法的參數進行接收。

學習難度:Struts有不少新的技術點,好比攔截器、值棧及OGNL表達式,學習成本較高,SpringMVC 比較簡單,不多的時間都能上手。

intercepter的實現機制:

struts有以本身的interceptor機制,SpringMVC用的是獨立的AOP方式。這樣致使struts的配置文件量仍是比SpringMVC大,雖然struts的配置能繼承,

 

因此我以爲理論使用上來說,SpringMVC使用更加簡潔,開發效率SpringMVC確實比struts2高。

 

SpringMVC是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,因此說從架構自己上spring mvc就容易實現restful url。struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,由於struts2 action的一個方法能夠對應一個url;而其類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了。

 

spring mvc的方法之間基本上獨立的,獨享request response數據,請求數據經過參數獲取,處理結果經過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間 也是獨立的,但其全部Action變量是共享的,這不會影響程序運行,卻給咱們編碼,讀程序時帶來麻煩。

json操做

SpringMVC處理ajax請求,直接經過返回數據,方法中使用註解@ResponseBody,SpringMVC自動幫咱們對象轉換爲JSON數據。

 

struts2 惟一好處:不少內置的27個插件

相關文章
相關標籤/搜索