最典型的JAVA MVC就是JSP + servlet + javabean的模式。比較好的MVC,老牌的有Struts、Webwork。新興的MVC 框架有Spring MVC、Tapestry、JSF等。html
在這裏咱們對比一下Asp.net mvc和Spring mvc,至於爲何拿Spring mvc來比,緣由是它們的類似更高,便於對比學習前端
不瞭解的推薦看下面這篇文章,若是不清楚MVC的就先看下MVC的文章,這裏就不囉嗦了java
前言spring
.NET C#到Java沒那麼難,都是面向對象的語言,並且語法仍是類似的,先對比一下開發環境,再到Servlet,再到MVC,都是同樣同樣的,只是JAVA的配製項比較多而已,只要配好一個,後面都是copy,簡直so easy,並且用myeclipse能夠省一些配製sql
Java與.NET的區別不在它們的自己,最大的區別在於他們背後的力量,相信你們都能感受獲得,我就很少說。spring-mvc
系列目錄mvc
4、.NET C#到Java沒那麼難,DB篇
5、.NET C#到Java沒那麼難,Nosql篇
6、.NET C#到Java沒那麼難,微服務篇
7、.NET C#到Java沒那麼難,大數據篇
左邊是用VS2015新建的MVC項目,右邊是經過MyEclipse2016新建的SpringMVC項目,結構基本一致
Java中的源碼都放在src目錄,jsp文件都在views目錄裏,也能夠放在WEB-INF目錄裏
NET的MVC裏面,有一個專門註冊路由的地方,博客園都是MVC的高手,這裏就再也不囉嗦了。全部的路由規則都統一放在一塊兒管理,直接了當,一目瞭然。
Java Spring的Route規則是經過註解(NET的特性)的方式,寫在Controller中的,也能夠用配製文件來配製。(SpringMVC也能夠把全部的路由規則寫在配製文件裏統一管理,也比較清楚)
注意:RequestMapping就是Spring的路由,Spring在初始化的時候,會掃描指定位置下面全部的類,若是有@Controller的註解,就將其記錄爲Controller,而後會解析@RequestMapping,構建相似於RouteTable這樣的東西。
上邊是.NET的Controller的代碼,下邊是Java的Controller的代碼,基本一致
.NET用的是約定大於配製(也能夠用.NET的特性),而NET的話,約定了全部的Controller都放在指定的目錄下面(經「衝殺」同窗提醒只要繼承Controller就能夠了,放在哪一個目錄均可以,不過建議仍是按約定放在指定的位置),都繼承於Controller父類/接口。
@Controller就是Java Spring的Controller,Spring在初始化的時候,會掃描指定位置下面全部的類,若是有@Controller的註解,就將其記錄爲Controller
固然,編碼習慣好的Java開發者,也會把全部Controller放在同一個目錄/Package的,例如我把Controller都放在com.rabbit.controller包。
1).NET MVC的View用的是cshtml文件,用的Razor引擎表達式 ,還有aspx視圖引擎;Java的View用的是jsp文件,用的是 JSTL標籤,EL表達式
2).NET MVC的view通常就兩種,一種是使用原生的aspx寫法,一種是razor寫法,但這僅僅是寫法上的區別,仍是一套的實現。而在Spring MVC中就不一樣了,view的實現卻有不少的選擇,咱們可使用jsp,可使用velocity,也可使用更爲強大的freemarker,即使是使用jsp作爲view的實現,也能夠有不少的寫法,好比使用jstl、el或直接寫jsp等等。
3).NET MVC與Spring MVC各有所長,好比在view的layout佈局上,.NET已經很好的集成了,但Spring MVC作這個還要import或include,若是想作到更好,還須要第三方的layout jar。可是Spring MVC由於它出生就是Spring,因此與生俱來就能夠對IOC、AOP的無縫整合,.NET須要用Autofac這種第三方框架實現IOC,AOP .Net MVC已經整合進去(就是各類Filter)
看看Spring MVC的返回視圖是否是也和.NET MVC同樣同樣的呢
Spring MVC Action支持以下的返回方式:String, ModelAndView, Model, ModelMap, Map,View, void,以下我用兩種方式實現了相同的功能,第二種ModelAndView和.NET MVC的View 是否是很像呢
參數綁定這塊,二者的處理都差很少,若是一個數據類型能夠和字符進行相互轉換,那麼系統就會自動幫你作綁定。若是不行的話,本身寫一個類型和字符的轉換類便可。
1).以下參數username能夠經過get,post傳遞過來,Action均可以正常接收,只要名字一致便可,名字不一致時能夠用註解實現
2).以下參數傳Model也是能夠的,只要名字一致就能夠自動綁定
返回JSON這塊二者的處理都差很少,都是自動把對象序列化後返回
1).以下使用ResponseBody註解,直接返回POJO對象便可自動序列化成JSON,這裏須要引入Jackson的包
1).Action過濾器HandlerInterceptor 和 .NET IActionFilter
那什麼是攔截,又爲何要攔截。對於Spring MVC來講,攔截器主要的工做對象就是用戶的請求,攔截下來以後,咱們能夠在攔截的各個階段進行自定義處理。常見的好比能夠作權限驗證,登陸系統後,系統獲取到你的請求而後分析下你的用戶權限,是Administrator仍是User仍是Guest。
2).全局錯誤過濾器 Spring ControllerAdvice(ExceptionHandler) 和 .NET IExceptionFilter
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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>SSM001</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--spring mvc前端控制器--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置Spring mvc下的配置文件的位置和名稱 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- 啓用註解 --> <!--<context:annotation-config></context:annotation-config>--> <!-- scan the package and the sub package --> <!-- 配置自動掃描的包 --> <context:component-scan base-package="com.rabbit.controller"/> <!-- don't handle the static resource --> <!-- 不解析靜態文件 --> <mvc:default-servlet-handler /> <!-- if you use annotation you must configure following setting --> <!-- 註解驅動 --> <mvc:annotation-driven conversion-service="conversionService"/> <!-- 建立convertion-Service ,並注入DateConvert --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.rabbit.convert.DateConvert" /> </list> </property> </bean> <!-- configure the InternalResourceViewResolver --> <!-- 配置視圖解析器 如何把handler 方法返回值解析爲實際的物理視圖 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前綴 --> <property name="prefix" value="/views/" /> <!-- 後綴 --> <property name="suffix" value=".jsp" /> </bean> </beans>
上邊是Asp.net MVC,下邊是Java Spring MVC
未完,待續,歡迎評論拍磚