.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的文章,这里就不啰嗦了
前言
.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>
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.扩展阅读
未完,待续,欢迎评论拍砖
.NET C#到Java没那么难,MVC篇的更多相关文章
- .NET C#转Java没那么难,开发环境篇
.NET C#转Java没那么难,都是面向对向的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都是co ...
- .NET C#到Java没那么难,Servlet篇
前言 .NET C#到Java没那么难,都是面向对向的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都 ...
- .NET C#到Java没那么难,DB篇
前言 .NET C#到Java没那么难,都是面向对象的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都 ...
- block没那么难(一):block的实现
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...
- php实现把数组排成最小的数(核心是排序)(看别人的代码其实也没那么难)(把php代码也看一下)(implode("",$numbers);)(usort)
php实现把数组排成最小的数(核心是排序)(看别人的代码其实也没那么难)(把php代码也看一下)(implode("",$numbers);)(usort) 一.总结 核心是排序 ...
- block没那么难(二):block和变量的内存管理
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...
- windows多线程没那么难
windows多线程没那么难 作者:vpoet mail:vpoet_sir@163.com 上一博文中我们引入了CreateThread()多线程编程一个简单的例子,事实上我说windows 多线程 ...
- java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeeper
声明:该框架面向企业,是大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目. 项目基础功能截图(自提供了最小部分) 平台简介 Jeesz是一个分布式的框架,提供 ...
- 第63节:Java中的Spring MVC简介笔记
前言 感谢! 承蒙关照~ Java中的Spring MVC简介笔记 MVC简介 Spring MVC 基本概念 Spring MVC 项目搭建 maven 使用Spring MVC进行开发 实现数据绑 ...
随机推荐
- chrome的断点调试
DOM节点变化时触发断点具体触发条件可分3种情况:子节点有变化.节点的属性发生变化或这个节点被删除.可以快速找到对应的事件处理函数. 条件断点 写一个表达式,表达式为 true 时才触发该断点. 在D ...
- Vulkan Tutorial 02 编写Vulkan应用程序框架原型
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 General structure 在上一节中,我们创建了一个正确配置.可运行的的V ...
- cuda学习1-初始庐山真面目
cuda作为gpu计算中的代表,拥有着超级高的计算效率,其原因是gpu实际相当与一台超级并行机组,使用过MPI做并行计算的人们可能知道,所谓的并行计算,简单讲就是用多个U(计算单元)来完成一个U的计算 ...
- 卸载XCode插件的方法
1.Finder--前往---前往文件夹--输入~/Library/Developer/Xcode/Plug-ins 2.删除要卸载的插件即可.
- [原创]CentOS下Mysql的日志回滚
一. 环境: a) Centos-6.5-x64位操作系统. b) 安装mysql.命令:yum install mysql* 二. 配置 a) ...
- java编程之泛型
java泛型实现了"参数化类型"的概念,所谓"参数化类型"是指将操作的数据类型指定为一个参数,这点在容器中用的最多,例如:List<String> ...
- 深入理解CSS3 Flexbox
一.前言 Flexbox 是一个 CSS3 的盒子模型 ( box model ),顾名思义它就是一个灵活的盒子 ( Flexible Box ),为什麽最近这个属性才红起来呢?最主要也是因为 CSS ...
- 错误处理1: D:\a1-C++\C++作业\第五次1.cpp undefined reference to `vtable for Shape'
在编译程序的时候遇到此误,在google上查,很多地方都说是因为虚基类里面的虚拟析构函数没有提供实现导致的.但是我的已经提供了实现,也不行.最后发现是其他没有提供实现的虚函数造成的.所以,在一个虚基类 ...
- 连接Oracle数据库的时候报了“Got minus one from a read call”
(转) 出现这种问题基本上就以下几种原因,可以查一下系统日志看看:1:数据库连接满了,扩大数据库连接池2:所登录的机子IP不在sqlnet.ora内,加入后重启listerner即可3:数据库负载均衡 ...
- 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)
github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...