按照0052中的办法,如果一个站点设计有1000个请求,那就得写1000个controller,还得配置1000个<bean id="helloController" class="net.sonng.mvcdemo.controller.HelloController" ></bean>,这个工作量无疑没有必要。

实际上,还可以通过注解实现,用@Controller注解将一个类指定为Controller,就不用实现Controller接口,也不用一定是ModelAndView handleRequest(HttpServletRequest,HttpServletResponse)这个方法签名了;用@RequstMapping将请求映射到方法上,也就不用那1000条配置了

将0052中的HelloController改成下面这样:

package net.sonng.mvcdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; @Controller //该注解表明这是个Controller,这个类也就不用实现Controller接口了
public class HelloController { @RequestMapping(value="/hello") //这个注解替代了xml中SimpleUrlHandlerMapping的配置,将请求映射到处理方法上
public ModelAndView hello(){ //方法签名完全不用遵循handleRequest,返回值和形参也都可以不同
ModelAndView mav=new ModelAndView();
mav.getModel().put("msg", "这是Model中的数据,这是hello方法");
mav.setViewName("hello");
return mav;
}
@RequestMapping(value="/world") //采用注解配置,一个Controller内可以包含多个方法,对应多个不同的请求
public ModelAndView world(){
ModelAndView mav=new ModelAndView();
mav.getModel().put("msg", "这是Model中的数据,这是world方法");
mav.setViewName("hello");
return mav;
}
}

xml配置改为这样

    <!-- 开启组件注解扫描,扫描base-package值下面的类或子包下的类,包含了特定注解的类就注解为Spring的Bean
比如,上面的Controller,就将其注册为Controller组件;除此之外还有@Service、@Conponent、@Repository等-->
<context:component-scan base-package="net.sonng.mvcdemo" />
<!-- 这是annotation类型的处理映射器,根据请求查找映射 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 这是annotation类型的处理器适配器,完成对hello和world方法的调用 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/content/" />
<property name="suffix" value=".jsp" />
</bean>

部署以上代码后,到浏览器中访问:http://localhost:8080/mvcdemo/hello和http://localhost:8080/mvcdemo/world

Spring MVC的执行流程

  1. 用户向服务器发出请求,被DispatcherServlet截获
  2. DispatcherServlet对请求的url进行解析,调用handlerMapping(RequestMappingHandlerMapping)获得相关的对象,比如Handler对象、对应的拦截器对象,封装到HandlerExecutionChain对象中返回
  3. DispatcherServlet选择一个HandlerAdapter,用于处理上面返回Handler对象,调用Handler处理请求的方法,比如hello和world方法
  4. 执行handler(Controller),之前还有些预处理,比如参数类型转换,传上来的json/xml数据转成对象,或者将传上来的数据封装成一个实体对象等
  5. handler执行完毕,向DispatcherServlet返回一个ModelAndView对象(或者其他对象)
  6. 根据返回的对象,找个合适的ViewResolver视图解析器,返回给DispatcherServlet
  7. 视图解析器根据Model和View生成结果
  8. 将结果返回给客户端

其他:

上面xml配置中的这两行:

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

在Spring 4.0以后,可以用下面一行配置替代,当然注意不要少了mvc的命名空间

<mvc:annotation-driven />

0053 用注解方式配置Spring MVC的更多相关文章

  1. Java方式配置Spring MVC

    概述 使用Java方式配置Spring MVC,以及回顾一下Spring MVC的各种用法. Spring MVC简述 关于Spring MVC的介绍网上有很多,这里就不再赘述了,只是要说一下,Spr ...

  2. SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP

    AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP之所以能得到广泛应用,主要是因为它将应用系统拆分分了2个部分 ...

  3. MyBatis 及 MyBatis Plus 纯注解方式配置(Spring Boot + Postgresql)

    说明 当前的版本为 MyBatis 3.5.9 MyBatis Plus 3.5.1 Spring Boot 2.6.4 Postgresql 42.3.3 与 Spring Boot 结合使用 My ...

  4. 纯注解方式配置spring+springMVC

    1.新建类initConfig,继承AbstractAnnotationConfigDispatcherServletInitializer,并重写getRootConfigClasses().get ...

  5. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  6. bean的自动装配,使用注解开发,使用java的方式配置Spring

    bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...

  7. Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置

    用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...

  8. 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...

  9. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

随机推荐

  1. Controller和RestController的区别

    1. Controller, RestController的共同点 都是用来表示Spring某个类的是否可以接收HTTP请求 2.  Controller, RestController的不同点 @C ...

  2. Wishbone B3总线Generic RAM写法

    以下Verilog HDL代码符合wishbone总线B3标准协议,在Altera和Xilinx的开发工具上可以实现综合,自动推断并采用片上RAM资源,可以完成内存内容的初始化. /* ******* ...

  3. linux之fork()函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...

  4. from表单实现无跳转上传文件,接收页面后台数据

    实现无跳转发送表单数据.文件,并能接收后台返回的数据. 主要技术要点: 1.form表单添加target属性,指定一个iframme的name:form表单提交后在iframe内嵌窗口接受响应,主页面 ...

  5. JS前端下载文本文件小技巧:1、download属性;2、借助Blob转换成二进制下载

    一.HTML download 与文件下载 如果希望在前端侧直接触发某些资源的下载,最方便快捷的方法就是使用HTML5原生的download属性,例如: <a href="large. ...

  6. Java笔记20:迭代器模式

    迭代器模式 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以Java中的容器为例,模拟Iterator的原理. 1 定义一个容器Collection接口 pub ...

  7. 对Class.getResourceAsStream和ClassLoader.getResourceAsStream方法所使用的资源路径的解释

    这是个非常基础的问题了,这里提供一些演示样例,帮助高速理解和记忆这个问题. 在该方法的文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Cla ...

  8. phpcms 后台验证码不显示date() expects parameter 2 to be long

    方法一: 主要在于是否开启gd库 查看办法 找到php.ini文件 搜索extension=php_gd2.dll这段代码 然后把前面的;符号去掉即可. 方法二: 关键一点是获取验证码的图片与全局变量 ...

  9. WPF使用ARCGIS App文件配置Cs后台文件

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  10. JMeter 十:录制脚本--使用bodboy

    1. 下载bodboy 下载地址:http://www.badboy.com.au/download 这里填写完基本信息,点击下方的Continue即可跳转到下载页面. 任选一个version,点击后 ...