由于工作需要,最近将Net的MVC又重新好好的学习了一遍.学习教材是博客园里的大神的作品《ASP.NET MVC5框架揭秘》。

《ASP.NET MVC5框架揭秘》这本书,说了很多东西,但是总觉得太偏于理论,实际的例子太少。当然,框架揭秘 的确就应该是这个样子的,毕竟不是什么MVC的速成书籍。

公司以后接的活,其实不仅限于NET平台,JAVA平台也需要考虑的,所以,当前阶段Java的知识储备也是必须的。这篇文章和语言之争无关,希望不要引起大家的无谓的争论。学习SpringMVC使用的是ITEYE的大神 开涛的MVC系列教程,版本是Spring MVC2.5/3.0(最新版本是 4.1.2)

环境搭建:

VisualStudio不愧是宇宙第一IDE,NET MVC5的HelloWorld,就是傻瓜式的选选项目类型,然后按下F5就一切搞定了。

MVC5不但把后台的东西帮你准备好了,连前端的框架都替你决定了,bootstrap,Modernize,Jquery。然后你会看到package里面有一大堆东西,

ORM用的,前端用的,JSON,所有的东西都Standby了。如果哪位同学不喜欢bootstrap,想用UIKit,好吧,自己重写所有的模板吧。

自动生成的所有模板都是基于bootstrap的。然后Shard的TemplateEditor目录下面就会出现很多类似BooleanExEditor这样子的东西了。

Spring MVC

Java小白,只会用Elcapse,然后看教程,写了个HelloWorld。

国内的教程,大都将初学者的水平想得太高了,大段大段的XML配置文件加上简单的注解,就完事了。

最大的,最主要的目录结构,半句话都没有,你让我这样的小白,将一大堆xml配置文件放在什么地方好呢。最后只能yahoo.co.jp

找到一篇岛国人民的MVC入门文章,搞清楚了目录结构 http://qiita.com/siguremon/items/84c831391a6204079fd2

岛国人民写出来的入门教程,就是将学习对象当小白处理。然后教材写得是变态般的详细。目标是让欧巴和欧巴桑看了都能够编程。

[Maven和Nuget]

.NET有Nuget,Java这里有Maven,Maven的一个功能和Nuget一样,管理依赖项目。

在Maven的帮助下,Spring的MVC所需要的东西,也能够快速的准备齐全。

下面这个pom.xml里面包含了MySql的JDBC的导入

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shchuwa</groupId>
<artifactId>springmvc</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>springmvc Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<springframework.version>4.1.2.RELEASE</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
</dependencies>
<build>
<finalName>springmvc</finalName>
</build>
</project>

Spring的包,其实东西也不少JUnit,AOP,Log。。。

接管HTTP控制权

NET的MVC是通过HttpHandler在IIS管道中获得控制权的,让Route部件参与IIS管道,如果Route能匹配的话,就让MVC接手后续的所有事件。

这个过程在NETMVC的大神的书的第一章里说明得很好了。大部分人可能会觉得第一章无所谓,对于开发无关痛痒,但是,往往一些根本性的东西就在第一章里面。

Spring,其实也是差不多的思路,dispatcherServlet这个Servlet(org.springframework.web.servlet.DispatcherServlet)通过配置文件将自己作为Http的处理入口,Tomcat也好,JBoss也好,Apache也好,直接将Http请求转交给dispatcherServlet处理了。

掌握入口的感觉真心不错,能处理的处理,不能处理的,交给默认的Servlet处理

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
">
<display-name>spring-todo</display-name>
<!-- (1) -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/META-INF/spring/beans-webmvc.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <!-- (2) -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

关于路由

NET的MVC里面,有一个专门注册路由的地方,博客园都是MVC的高手,这里就不再啰嗦了。

所有的路由规则都统一放在一起管理,直接了当,一目了然。

Spring的Route规则是通过注解(NET的特性)的方式,写在Controller中的。

注意:RequestMapping就是Spring的路由

Spring在初始化的时候,会扫描指定位置下面所有的类,如果有@Controller的注解,就将其记录为Controller

然后会解析@RequestMapping,构建类似于RouteTable这样的东西。

而NET的话,约定了所有的Controller都放在指定的目录下面。都继承于Controller父类/接口。

当然,编码习惯好的Javer,也会把所有Controller放在同一个目录/Package的。

package controller;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import model.person;
// (1)
@Controller
public class HelloWorldController {
// (2)
@RequestMapping(value = "/", method = GET)
public String home(ModelMap model) {
// (3)
person.insert();
model.addAttribute("message", "Spring 3 MVC Hello World");
return "helloworld";
}
}

对于Controller的启动条件,除了GET/POST这样的检查之外,Spring的条件貌似更加丰富一些。NET的MVC是否有同样功能,我不知道。(或许可以使用拦截器)

1.可以要求请求的URL里面有某个参数(或者没有某个参数),进而可以控制参数的值是否等于某个值。

2.可以对请求类型进行控制。例如,下面是请求一个Json的例子,这里同时对Url和请求类型进行限制

@RequestMapping(value="/header/test3", headers = "Content-Type=application/json"):

数据绑定和验证

数据绑定这块,两者的处理都差不多,如果一个数据类型可以和字符进行相互转换,那么系统就会自动帮你做绑定。

如果不行的话,自己写一个类型和字符的转换类即可。

NET大神用的是 Point(int x,int y)的例子

Sping 大神用的是 PhoneNumber(int AreaCode,int Number)的例子。

一句话,内置的能转的类型,系统帮你做绑定,不能转的类型,你告诉我一个字符到类型的双向变换规则,然后注册到系统里面去,我也负责给你绑定。

Pattern pattern = Pattern.compile("^(\\d{3,4})-(\\d{7,8})$");
@Override
public void setAsText(String text) throws IllegalArgumentException {
if(text == null || !StringUtils.hasLength(text)) {
setValue(null); //如果没值,设值为null
}
Matcher matcher = pattern.matcher(text);
if(matcher.matches()) {
PhoneNumberModel phoneNumber = new PhoneNumberModel();
phoneNumber.setAreaCode(matcher.group(1));
phoneNumber.setPhoneNumber(matcher.group(2));
setValue(phoneNumber);
} else {
throw new IllegalArgumentException(String.format("类型转换失败,需要格式
[010-12345678],但格式是[%s]", text));
}
}
@Override
public String getAsText() {
PhoneNumberModel phoneNumber = ((PhoneNumberModel)getValue());
return phoneNumber == null ? "" : phoneNumber.getAreaCode() + "-" +
phoneNumber.getPhoneNumber();
}

内置的验证约束注解:

MVC.NET使用的应该是自己的东西,

Spring 使用的是Hibernate Validator,能够检查的东西都差不多吧。没有仔细研究。

题外话:NET里面的数据模型叫Model,Spring里面貌似叫做命令对象:Spring大神的原文如下

数据绑定:请求参数绑定到一个command object(命令对象,非GoF里的命令设计模式),这里的命令对象是指绑
定请求参数的任何POJO 对象;

拦截器

Spring 和Net一样都提供了拦截器来处理AOP

package org.springframework.web.servlet;
public interface HandlerInterceptor {
boolean preHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler)
throws Exception;
void postHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView)
throws Exception;
void afterCompletion(
HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex)
throws Exception;
}

前两个没有什么好说的,处理前,处理后,最后一个NET中不知道怎么处理的。作用如下:

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间
并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle
返回true的拦截器的afterCompletion。

当然,Spring的拦截器也提供了取消功能,如果取消的话,整个处理就中止了(break)。拦截器的思想都差不多的,大家实现思想也都类似。

由于Spring在学习中,可能有理解错误的地方,希望大家指正。公司现在正在招募前端工程师,有兴趣的可以发个简历。工作地点是上海。

(更多内容以后更新)

同样的MVC,不同的实现方法(Spring MVC .Net MVC)的更多相关文章

  1. MVC验证09-使用MVC的Ajax.BeginForm方法实现异步验证

    原文:MVC验证09-使用MVC的Ajax.BeginForm方法实现异步验证 MVC中,关于往后台提交的方法有: 1.Html.BeginForm():同步 2.Ajax.BeginForm():异 ...

  2. spring boot 1.x完整学习指南(含各种常见问题servlet、web.xml、maven打包,spring mvc差别及解决方法)

    spring boot 入门 关于版本的选择,spring boot 2.0开始依赖于 Spring Framework 5.1.0,而spring 5.x和之前的版本差距比较大,而且应该来说还没有广 ...

  3. tomcat 7下spring 4.x mvc集成websocket以及sockjs完全参考指南

    之所以sockjs会存在,说得不好听点,就是因为微软是个流氓,现在使用windows 7的系统仍然有近半,而windows 7默认自带的是ie 8,有些会自动更新到ie 9,但是大部分非IT用户其实都 ...

  4. 自己实现的简单MVC框架(类似Struts2+Spring)

    一.框架简介 本框架是一个类似于Struts2+Spring的框架,目的在于个人钻研和技术分享,将流行技术框架Struts2.Spring中使用到的主要技术以较为简化的方式实现出来,给大家一个更直观的 ...

  5. Spring框架和MVC原理

    Spring框架和MVC原理 目录 Spring框架 SpringMVC工作原理 参考资料 回到顶部 Spring框架 Spring当前框架有20个jar包,大致可以分为6大模块: Core Cont ...

  6. 【Spring框架】<mvc:default-servlet-handler/>的作用

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  7. tomcat 7下spring 4.x mvc集成websocket以及sockjs完全参考指南(含nginx/https支持)

    之所以sockjs会存在,说得不好听点,就是因为微软是个流氓,现在使用windows 7的系统仍然有近半,而windows 7默认自带的是ie 8,有些会自动更新到ie 9,但是大部分非IT用户其实都 ...

  8. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

  9. 2.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 个人认为,使用@ResponseBody方式来实现json数据的返回比较方便,推荐使用. 摘要 ...

随机推荐

  1. [ACM_几何] F. 3D Triangles (三维三角行相交)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/A 题目大意:给出三维空间两个三角形三个顶点,判断二者是否有公共 ...

  2. svn 忽略文件不管用

    svn 不能对已添加过版本控制的文件进行忽略.于是乎,你会发先,你怎么忽略都不起作用.于是乎,该怎么办? svn忽略已添加到版本库文件或文件夹步骤: 将要忽略的文件或文件夹剪切到非工作拷贝目录. 在父 ...

  3. Homebrew简介及安装

    Homebrew官网 http://brew.sh/index_zh-cn.html Homebrew是神马 linux系统有个让人蛋疼的通病,软件包依赖,好在当前主流的两大发行版本都自带了解决方案, ...

  4. HTML+CSS学习笔记

    1,html里的实际有6个<hn>标记,从<h1>到<h6>,字体由大到小. 2,em标签表示斜体. 3,<p>标签是换一个段落,<br>标 ...

  5. Oracle函数脚本记录

    --内置函数 --聚合函数 返回单个值 '; --count()记录条数 select sum(degree) from score t; --sum(degree)求成绩总和 select avg( ...

  6. Atitit 基于dom的游戏引擎

    Atitit 基于dom的游戏引擎 1. 添加sprite控件(cocos,createjs,dom)1 1.1.1. Cocos1 1.1.2. createjs1 1.1.3. Dom模式2 1. ...

  7. spring 学习

    一.spring框架介绍 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供 ...

  8. 使用System.Drawing.Imaging.dll进行图片的合并

    在最近开发项目的时候有时候需要进行图片的合并,即将两张图片合并成功一张图片 合并图片的代码: #region 两张图片的合并 /// <summary > /// 将Image对象转化成二 ...

  9. Android开发之登录验证

    最近在做一个小项目,项目开发中需要实现一个登录验证功能,具体的要求就是,在Android端输入用户名和密码,在服务器端验证MySQL数据库中是否有此用户,实现之前当然首要的是,如何使Android端的 ...

  10. mysql数据库移植

    在mysql数据库移植的时候,把自己电脑上mysql中data目录的一些重要文件复制到其他电脑上,先备份一下其他电脑上的mysql的data目录,然后替换! 例如我的mysql默认的数据库文件位置:  ...