最典型的JAVA MVC就是JSP + servlet + javabean的模式。比較好的MVC,老牌的有Struts、Webwork。新興的MVC 框架有Spring MVC、Tapestry、JSF等。
在這里我們對比一下Asp.net mvc和Spring mvc,至於為什么拿Spring mvc來比,原因是它們的相似更高,便於對比學習
不了解的推薦看下面這篇文章,如果不清楚MVC的就先看下MVC的文章,這里就不啰嗦了
前言
.NET C#到Java沒那么難,都是面向對象的語言,而且語法還是相似的,先對比一下開發環境,再到Servlet,再到MVC,都是一樣一樣的,只是JAVA的配制項比較多而已,只要配好一個,后面都是copy,簡直so easy,而且用myeclipse可以省一些配制
Java與.NET的區別不在它們的本身,最大的區別在於他們背后的力量,相信大家都能感覺得到,我就不多說。
系列目錄
四、.NET C#到Java沒那么難,DB篇
五、.NET C#到Java沒那么難,Nosql篇
六、.NET C#到Java沒那么難,微服務篇
七、.NET C#到Java沒那么難,大數據篇
.NET C#到Java沒那么難,MVC篇
目錄
1.項目結構比較
2.路由比較
3.Controller比較
4.View比較
5.Action參數綁定和返回
6.Filter和Interceptor
7.SpringMVC配制
8.運行效果
9.擴展閱讀
1.項目結構比較
左邊是用VS2015新建的MVC項目,右邊是通過MyEclipse2016新建的SpringMVC項目,結構基本一致
Java中的源碼都放在src目錄,jsp文件都在views目錄里,也可以放在WEB-INF目錄里

2.路由比較
NET的MVC里面,有一個專門注冊路由的地方,博客園都是MVC的高手,這里就不再啰嗦了。所有的路由規則都統一放在一起管理,直接了當,一目了然。

Java Spring的Route規則是通過注解(NET的特性)的方式,寫在Controller中的,也可以用配制文件來配制。(SpringMVC也可以把所有的路由規則寫在配制文件里統一管理,也比較清楚)
注意:RequestMapping就是Spring的路由,Spring在初始化的時候,會掃描指定位置下面所有的類,如果有@Controller的注解,就將其記錄為Controller,然后會解析@RequestMapping,構建類似於RouteTable這樣的東西。

3.Controller比較
上邊是.NET的Controller的代碼,下邊是Java的Controller的代碼,基本一致
.NET用的是約定大於配制(也可以用.NET的特性),而NET的話,約定了所有的Controller都放在指定的目錄下面(經“沖殺”同學提醒只要繼承Controller就可以了,放在哪個目錄都可以,不過建議還是按約定放在指定的位置),都繼承於Controller父類/接口。

@Controller就是Java Spring的Controller,Spring在初始化的時候,會掃描指定位置下面所有的類,如果有@Controller的注解,就將其記錄為Controller
當然,編碼習慣好的Java開發者,也會把所有Controller放在同一個目錄/Package的,例如我把Controller都放在com.rabbit.controller包。

4.View比較
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 是不是很像呢

5.Action參數綁定和返回JSON
參數綁定這塊,兩者的處理都差不多,如果一個數據類型可以和字符進行相互轉換,那么系統就會自動幫你做綁定。如果不行的話,自己寫一個類型和字符的轉換類即可。
1).如下參數username可以通過get,post傳遞過來,Action都可以正常接收,只要名字一致即可,名字不一致時可以用注解實現
2).如下參數傳Model也是可以的,只要名字一致就可以自動綁定

返回JSON這塊兩者的處理都差不多,都是自動把對象序列化后返回
1).如下使用ResponseBody注解,直接返回POJO對象即可自動序列化成JSON,這里需要引入Jackson的包

6.Filter過濾器和Interceptor攔截器
1).Action過濾器HandlerInterceptor 和 .NET IActionFilter
那什么是攔截,又為什么要攔截。對於Spring MVC來說,攔截器主要的工作對象就是用戶的請求,攔截下來之后,我們可以在攔截的各個階段進行自定義處理。常見的比如可以做權限驗證,登錄系統后,系統獲取到你的請求然后分析下你的用戶權限,是Administrator還是User還是Guest。

2).全局錯誤過濾器 Spring ControllerAdvice(ExceptionHandler) 和 .NET IExceptionFilter
7.SpringMVC配制
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>
8.運行效果
上邊是Asp.net MVC,下邊是Java Spring MVC

9.擴展閱讀
未完,待續,歡迎評論拍磚
