.NET C#到Java沒那么難,MVC篇


最典型的JAVA MVC就是JSP + servlet + javabean的模式。比較好的MVC,老牌的有Struts、Webwork。新興的MVC 框架有Spring MVC、Tapestry、JSF等。

在這里我們對比一下Asp.net mvc和Spring mvc,至於為什么拿Spring mvc來比,原因是它們的相似更高,便於對比學習

不了解的推薦看下面這篇文章,如果不清楚MVC的就先看下MVC的文章,這里就不啰嗦了

Struts和SpringMVC 對比

 

 

前言

.NET C#到Java沒那么難,都是面向對象的語言,而且語法還是相似的,先對比一下開發環境,再到Servlet,再到MVC,都是一樣一樣的,只是JAVA的配制項比較多而已,只要配好一個,后面都是copy,簡直so easy,而且用myeclipse可以省一些配制

Java與.NET的區別不在它們的本身,最大的區別在於他們背后的力量,相信大家都能感覺得到,我就不多說。

 

系列目錄

一、.NET C#Java沒那么難,開發環境篇

二、.NET C#到Java沒那么難,Servlet篇

三、.NET C#到Java沒那么難,MVC篇

四、.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的包

Jackson包下載

 

6.Filter過濾器和Interceptor攔截器

1).Action過濾器HandlerInterceptor 和 .NET IActionFilter

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

 

2).全局錯誤過濾器 Spring ControllerAdvice(ExceptionHandler) 和 .NET IExceptionFilter

springmvc三種全局異常處理

 

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>
View XML

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>
View XML

 

8.運行效果

上邊是Asp.net MVC,下邊是Java Spring MVC

        

9.擴展閱讀

SpringMVC 原理和入門

SpringMVC 入門和實例

SpringMVC最全實例

 

未完,待續,歡迎評論拍磚

 


免責聲明!

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



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