SpringMVC中的@Controller和@RequestMapping到底什么鬼?

1.1 @Controller是什么
首先看个例子:
@Controller
@RequestMapping("/blog")
public class BlogController {
@RequestMapping("/index")
public ModelAndView index(HttpServletRequest request){
ModelAndView mav = new ModelAndView("/index");
String ctx = request.getContextPath();
System.out.println(ctx);
mav.addObject("ctx", ctx);
return mav;
}
}
@Controller表示在tomcat启动的时候,把这个类作为一个控制器加载到Spring的Bean工厂,如果不加,就是一个普通的类,和Spring没有半毛钱关系。
以下是两个常见的配置:
<!-- 开启注解模式驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 扫包 -->
<context:component-scan base-package=*"com.blogMgr.*"*></context:component-scan>
其中,base-package表示会扫描com.blogMgr目录下所有的包,一旦发现有个类上面加了类似于@Controller的注解,在容器启动的时候系统就会把它加载到Spring的Bean工厂,并且对其实例化。
这也是为什么,我们只是写了Controller,但是从来没有在一个地方new这个Controller的原因,因为在Web容器启动的时候,这个Controller已经被Spring加载到自己的Bean工厂里面去了。
这也就是所谓的Spring扫包机制。@Controller就是一个注解,当tomcat启动,我们会看到一些JAVA类挥舞着印有@Controller的旗子大喊:" Hey,SpringMVC,I'm here,please take me to your bean factory!"
1.2 @RequestMapping是什么
在Controller中,总是会看到RequestMapping这个注解,看起来像是路径的跳转,以下列举了一个方便我们记忆的比喻。
比如,有一天,我发现一部电影挺好看的,就在D盘建了一个文件夹,叫“电影”。里面放了两部电影,各自用一个文件夹来存放。

在上图中,我们可以看它的路径是“D:\电影”,该路径下又有一个文件夹【疯狂动物城 2016】,里面是这样的

那么,该文件的具体路径就是“D:\电影\疯狂动物城 2016”,现在我要访问这个资源,除了双击之外,是不是只需要在地址栏里面输入:“D:\电影\疯狂动物城 2016\疯狂动物城 2016.mp4”也可以呢?

是的,当然可以。

成功了,我们通过url的方式得到了我们想要的资源文件!
现在我们把这个文件复制一份,拷贝到相同路径下

如果我尝试将第一个MP4文件的名字也改为“疯狂动物城 2016.mp4”,则会弹出提示如下

可见,在同一个路径下,不能有两个重名的文件。
同理,如果我在同一个Controller里面设置两个相同的RequestMapping

编译是可以通过的,但是当我启动tomcat后,
我通过url “http://localhost:8088/BlogMgr/blog/index”来访问,就会报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'blogController' bean method
Ambiguous mapping found表示有一个路径模棱两可,也就是路径重名了,系统无法进行映射,所以报错了。这个和无法在同一个文件夹下面创建两个同名文件,是一个道理。
那么,如果我一定要再创建一个“疯狂动物城 2016.mp4”的文件该怎么办呢


然后,我把这个文件放在另一个文件夹里面就可以了。
同理,我也可以另外建一个Controller,Controller类上面的RequestMapping叫“/blog2”,再在里面写一个一模一样的RequestMapping就肯定没有问题了。
小结
一个web项目本身就是一个系统,和操作系统一样,可以把项目当做一个系统,一个应用程序。人为什么要使用电脑,因为电脑可以
1.给我们想要的资源(比如.avi)
2.帮我们做事。
在一个系统中,如果没有图形界面,我们要访问一个资源,必然是通过一个黑窗口来访问的,就是通过路径来访问的。一个B/S架构的web项目,就是一个类似于命令行一样的应用程序,我们唯有通过url,也就是路径去获得我们想要的资源和服务。
再来看RequestMapping,最终对应的必然是一个方法,方法的功能无非就是进行一些业务的操作,或者返回一个什么东西。
比如

我们就是通过这个方法获得了想要的jsp页面,RequestMapping的作用就是提供了一个句柄,让我们可以访问到对应的方法,最终获得我们想要的东西。综上所述,RequestMapping就是一个映射路径。
1.3 @ResponseBody的作用
在Controller里面,我们经常可以看到@ResponseBody这个注解,它的意思很简单,就是说明这个方法返回的东西会通过IO流的方式写入到浏览器。
比如我们写一个方法:
@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(HttpServletRequest request){
return "<h1 style='color:lightGreen'>Hello Web!</h1>";
}
最终在浏览器获得的效果是这样的:

SpringMVC中的@Controller和@RequestMapping到底什么鬼?的更多相关文章
- SpringMVC中的Controller默认单例
众所周知,Servlet是单例的. 在struts中,Action是多例的,每一个请求都会new出来一个action来处理. 在Spring中,Controller默认是单例的,多个请求都会访问同一个 ...
- springmvc中的controller是单例的
今天发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变 ...
- SpringMVC中在Controller类的每个方法执行前调用某个方法的实现
在使用SpringMVC做项目的时候,如果想在@Controller类中每个@RequestMapping方法执行前都调用某个方法,要怎么实现呢?答案是使用Spring的@ModelAttribute ...
- springMVC中的Controller里面定义全局变量
转自:http://notebookdong.iteye.com/blog/1869852 使用SpringMVC的时候,如果想要在Controller中定义一个全局变量,并且实现在不同用户访问程序的 ...
- springMVC中一个controller多个方法
web.xml文件: <?xml version="1.0" encoding="UTF-8"?><web-app version=" ...
- SpringMVC中的controller默认是单例的原因
http://lavasoft.blog.51cto.com/62575/1394669/ 1.性能 :单例不用每次new浪费资源时间. 2.不需要:一般controller中不会定义属性这样单例就不 ...
- SpringMVC中对Controller使用AOP
转自http://usherlight.iteye.com/blog/1306111 正确配置spring aop,在controller中使用AOP 在controller中使用AOP的问题主要在于 ...
- 方法调用---springMVC中调用controller的方法
我们有一个路由StudentController,里面有一个方法count().如果要在另外一个GradeController中调用count()方法有2种方式: 因为StudentControlle ...
- Spring|SpringMVC中的注解
文章目录 一.Spring注解 @Controller @ResuController @Service @Autowired @RequestMapping @RequestParam @Model ...
随机推荐
- CSS基础布局--居中对齐,左侧定宽右侧自适应
CSS页面布局是web前端开发的最基本的技能,本文将介绍一些常见的布局方法,涉及到盒子布局,column布局,flex布局等内容.本文中,你可以看到一些水平垂直居中的方法,左侧固定宽度,右侧自适应的一 ...
- JAVA加密算法系列-MD5
package **; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; publi ...
- 抽象工厂模式(Abstract Factory)
(二)抽象工厂模式(Abstract Factory) 1.抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.抽象工厂模式是 ...
- 在开源中国(oschina)上创建托管项目
***************************************************************** 目标: 1.能上传自己的项目到oschina上并且进行管理 2.能进 ...
- 读书笔记 effective c++ Item 46 如果想进行类型转换,在模板内部定义非成员函数
1. 问题的引入——将operator*模板化 Item 24中解释了为什么对于所有参数的隐式类型转换,只有非成员函数是合格的,并且使用了一个为Rational 类创建的operator*函数作为实例 ...
- 基于MVC和Bootstrap的权限框架解决方案 二.添加增删改查按钮
上一期我们已经搭建了框架并且加入了列表的显示, 本期我们来加入增删改查按钮 整体效果如下 HTML部分,在HTML中找到中意的按钮按查看元素,复制HTML代码放入工程中 <a class=&qu ...
- JVM知识在离线数据中的运用
又是飞花的季节了.多愁善感的林妹妹看到柳絮说:“嫁与东风春不管,凭尔去,忍淹留.”宝姐姐看了却来一句:“好风凭借力送我上青云”. 特别羡慕情商高的人,经常在想他们是怎么做到的.从来看不出他们不喜欢谁, ...
- 微信小程序入门学习
前(che)言(dan): 近几天,微信小程序的内测引起了众多开发人员的热议,很多人都认为这将会成为一大热门,那么好吧,虽然我是一个小白,但这是个新玩意,花点时间稍稍钻研一下也是无妨的,谁让我没有女朋 ...
- ef code first
, 网上有很多的ef code first 的使用的方式,很乱,下面是我自己整理出来的,有什么不正确的地方还请指正,本人菜鸟一枚! 1.新建一个类库 =>引用 右击 管理NuGet程序包 添加 ...
- IP设置
由于家里的IP地址与公司的不一样,每次都要修改很麻烦,所以自己只做了一个IP修改bat. 打开记事本,把一下代码复制到记事本里,保存成bat就OK了.在23行设置自己的IP地址就可以了. @echo ...