SpringMVC之HelloWorld

什么是SpringMVC

SpringMVC其实就是spring框架的一个模块,SpringMVC和spring之间可以无缝整合,SpringMVC也是一个非常优秀的基于MVC的web框架,什么是MVC这里就不多说了,下面来了解一下springmvc的执行流程。

SpringMVC执行流程

spring-mvc执行流程图

如上图所示,这是springmvc的执行流程图:

  1. 首先,用户向springmvc发送请求,springmvc的前端控制器拦截到用户的请求

  2. springmvc中的前端控制器请求springmvc的处理器映射器查找Handler(通过xml配置或者注解配置)

  3. 处理器映射器返回查找到的Handler给前端控制器

  4. 前端控制器拿到Handler,请求处理器适配器去执行Handler

  5. 处理器适配器去执行Handler

  6. Handler执行完毕返回ModelAndView

  7. 处理器适配器执行完Handler之后返回ModelAndView给前端控制器

  8. 前端控制器向ViewResolver(视图解析器)传递ModelAndView,视图解析器解析ModelAndView

  9. 视图解析器解析完ModelAndView就返回View

  10. 前端控制器进行视图渲染(进行数据填充)

  11. 前端控制器获取到渲染后的视图

  12. 前端控制器将视图对象返回给用户

入门程序HelloWorld

创建一个maven的web项目,添加依赖的jar包,如下为几个核心的jar包:

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.1.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.1.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.1.2.RELEASE</version>
    </dependency>

然后开始配置:

第一步是在web.xml文件中配置前端控制器:


<!--配置前端控制器-->

<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:spring-mvc.xml</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>dispatcherServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

接着是在resource下创建spring-mvc.xml文件,这里需要注意的是,如果你在这个文件外面再加一个文件夹的话,对应于classpath也要修改,否则会找不到这个文件。

然后在spring-mvc.xml里面配置:

 <!--配置处理器映射器,BeanNameUrlHandlerMapping也是spring默认的处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--配置处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--配置自定义controller-->
    <bean id="helloController" name="/hello.do" class="com.ssm.core.controller.HelloController"/>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

接着是自定义controller:

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        ModelAndView mv = new ModelAndView();
        //mv.addObject("hello", "Hello World");
        //mv.addObject("message","spring-mvc的controller");
        mv.setViewName("/WEB-INF/jsp/welcome.jsp");
        return mv;
    }
}

最后是测试结果:

springmvc请求测试,出现如上就表示我们已经成功了。

程序解析

我们通过上面的例子去理解一下spring-mvc的执行流程:

  1. 用户发送请求(在浏览器中发送请求 http://localhost:8080/项目名/hello.do

  2. web.xml中配置的 DispatcherServlet前端控制器拦截用户的请求

  3. 前端控制器请求在 spring-mvc.xml中配置的 BeanNameUrlHandlerMapping 处理器映射器根据用户请求的url(即是 /hello.do)去寻找Handler,并返回给前端控制器

  4. 前端控制器拿到Handler之后去请求在spring-mvc.xml中配置的处理器适配器SimpleControllerHandlerAdapter去执行Handler

  5. 处理器适配器根据前端控制器传来的Handler去寻找相应的我们定义的Controller去调用方法

  6. 我们定义的Controller执行完方法之后给处理器适配器返回 ModelAndView

  7. 处理器适配器返回 ModelAndView 给前端控制器

  8. 前端控制器拿到ModelAndView之后传给在 spring-mvc.xml中配置的视图解析器 InternalResourceViewResolver去解析

  9. 视图解析器解析完成视图之后,返回真正的view给前端控制器

  10. 前端控制器拿到view之后进行渲染和返回给用户

如上,就是spring-mvc的执行流程

非注解的处理器映射器和处理器适配器

a.处理器映射器

springmvc有三个处理器映射器,分别是:SimpleUrlHandlerMapingControllerClassNameHandlerMapping它们分别对应不同的功能:

  • BeanNameUrlHandlerMapping:是默认配置的,功能是根据url请求去匹配bean的name属性的url获取Controller,使用在上面的例子中

  • SimpleUrlHandlerMaping:根据请求的url去匹配简单的key,在根据key对应的Controller的id去寻找Controller,例如:

    SimpleURLHandlerMapping


    我们请求上面中的hello.dotest.doss.do都可以访问到同一个HelloController。

     

  • ControllerClassNameHandlerMapping:根据类名.do (类名首字母小写)去寻找Controller, 已经废弃,就不做演示了

这些处理器映射器之间都可以共存,我们可以同时定义多个。

b.处理器适配器

springmvc提供有两个处理器适配器:

  • SimpleControllerHandlerAdapter:需要实现Controller接口,调用Controller里面的方法,返回ModelAndView ,使用如上面的例子
  • HttpRequestHandlerAdapter:编写的Controller需要实现HttpRequestHandler 接口,例子如下:

    HttpRequestHandler

两个处理器适配器可以共存

注解的处理器映射器和处理器适配器

注解式开发在实际开发中非常常用,一般都是使用注解式开发,所以需要重点了解和掌握

在spring3.1之前使用DefaultAnnotationHandlerMapping注解映射器,在spring3.1之后使用RequestMappingHandlerMapping

在spring3.1之前使用AnnotationMethodHandlerAdapter注解适配器,在spring3.1之后使用RequestMappingHandlerAdapter

想要使用注解,我们需要在配置文件中开启注解:

注解

或者直接开启注解驱动

驱动

然后我们直接Controller中加入注解@Controller就可以使用了,不需要在实现接口,如下图:

test

然后我们在浏览器中就可以直接访问:http://localhost:8080/test

springmvc常用注解

  • @Controller:注册bean到spring容器中,bean的id是类型首字母小写,也可以自己指定
  • @RequestMapping:用来定义访问的url。可以是方法级别的,也可以是类级别的。两者可以协同工作,缩小选择范围。用法:
@RequestMapping(value="",method={"",""},headers={},params={"",""})

上面参数可不全部都设,其中

value:设置访问地址
method:设置访问方式,常用的method=RequestMethod.POST,和method=RequestMethod.GET
headers:头域,可以设置浏览器支持的格式
params:访问参数设置
  • @Autowired:对成员变量、方法和构造函数进行标注,来完成自动装配工作。可以消除get,set方法。
  • @ResponseBody:直接放在方法上,表示返回类型将会直接作为Http响应字节流输出,可以用于Ajax。
  • @Valid:实体设置+类+类的引用,直接将页面中封装的实体对象信息封装@Valid后面定义的实体中。有了这个注解,就不用request.getParameter("")了,jsp页面上控件的name属性 跟实体字段一样,这样不用主动获取,就能自动的拿到页面控件的值了。
  • @RequestParam:获取全局变量的值,用法:
@RequestParam(required=,value="",defaultValue="")
required:参数是否必须,boolean类型,默认为true
value:传递的参数名称,String类型,可选项,有值则对应方法的参数
defaultValue:参数没有传递时为参数默认指定的值
  • @PathVariable:用于方法中的参数,表示方法参数绑定到地址URL的模板

springmvc封装参数

springmvc封装参数与struts2不同,springmvc基于方法进行封装参数,struts2基于属性进行参数封装,下面实现一个简单类型的参数封装例子:
首先在页面中定义:

页面

然后在Controller方法中定义接受方法:

controller

这里面有一个需要注意的是:页面中定义的参数的name和controller方法中的形参名称一样,如果不一样,需要用@RequestParam进行绑定,还有,最好使用包装类型。
  pojo参数的封装跟上面的差不多,对应属性的名称在pojo里面的名称最好一样,这样可以自动封装进去。
  针对特殊类型的参数,springmvc提供了converter(转换器)可以使用,还有在日期绑定等特殊格式的时候我们还可以自定义converter。

自定义converter步骤如下:

新建类实现converter接口:

converter

然后在方法里面实现转换的逻辑

然后在spring-mvc.xml文件里面配置:

converter

converter

如此,便可以实现自定义转换器,到这里就基本是springmvc的基础入门。

源码下载:https://download.csdn.net/download/x_san3/10591649

欢迎留言交流!

非常详细的另一篇文章:https://blog.csdn.net/x_san3/article/details/79998112

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值