springmvc请求流程:

  • 1、用户发送请求至前端控制器DispatcherServlet
  • 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  • 3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  • 4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  • 5、执行处理器(Controller,也叫后端控制器)。
  • 6、Controller执行完成返回ModelAndView
  • 7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  • 8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  • 9、ViewReslover解析后返回具体View
  • 10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  • 11、DispatcherServlet响应用户
 

入门程序

1.创建web工程,不使用SpringMVC模板。

2、设置项目名称为SpringMVCDemo

3、导入jar包

4、jar包引入到项目中。

5、在src下添加一个Spring配置文件,项目目录结构如下:

6、SpringMVC本身就是Spring的子项目,对Spring兼容性很好,不需要做很多配置。这里只配置一个Controller扫描就可以了,让Spring对页面控制层Controller进行管理。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  7. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
  9.  
  10. <!-- 配置controller扫描包 -->
  11. <context:component-scan base-package="com.yyb.controller" />
  12. </beans>

7、 配置前端控制器。配置SpringMVC的前端控制器DispatcherServlet。在web.xml中:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6.  
  7. <!-- 配置SpringMVC前端控制器 -->
  8. <servlet>
  9. <servlet-name>springmvc-demo</servlet-name>
  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  11. <!-- 指定SpringMVC配置文件 -->
  12. <!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
  13. <init-param>
  14. <param-name>contextConfigLocation</param-name>
  15. <param-value>classpath:springmvc.xml</param-value>
  16. </init-param>
  17. </servlet>
  18.  
  19. <servlet-mapping>
  20. <servlet-name>springmvc-demo</servlet-name>
  21. <!-- 设置所有以action结尾的请求进入SpringMVC -->
  22. <url-pattern>*.action</url-pattern>
  23. </servlet-mapping>
  24. </web-app>

8、在index.jsp中添加以下代码:

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
  4. <html>
  5. <head>
  6. <title>$Title$</title>
  7. </head>
  8. <body>
  9. <table width="100%" border=1>
  10. <tr>
  11. <td>商品名称</td>
  12. <td>商品价格</td>
  13. <td>生产日期</td>
  14. <td>商品描述</td>
  15. </tr>
  16. <c:forEach items="${list}" var="item">
  17. <tr>
  18. <td>${item.name }</td>
  19. <td>${item.price }</td>
  20. <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
  21. <td>${item.detail }</td>
  22. </tr>
  23. </c:forEach>
  24. </table>
  25. </body>
  26. </html>

9、创建pojo,创建商品pojo:

  1. package com.yyb.bean;
  2.  
  3. import java.util.Date;
  4.  
  5. /**
  6. * Created by yang on 2017/8/12.
  7. */
  8. public class Item {
  9. // 商品id
  10. private int id;
  11. // 商品名称
  12. private String name;
  13. // 商品价格
  14. private double price;
  15. // 商品创建时间
  16. private Date createtime;
  17. // 商品描述
  18. private String detail;
  19.  
  20. public Item() {}
  21.  
  22. public Item(int id, String name, double price, Date createtime, String detail) {
  23. this.id = id;
  24. this.name = name;
  25. this.price = price;
  26. this.createtime = createtime;
  27. this.detail = detail;
  28. }
  29.  
  30. public int getId() {
  31. return id;
  32. }
  33.  
  34. public void setId(int id) {
  35. this.id = id;
  36. }
  37.  
  38. public String getName() {
  39. return name;
  40. }
  41.  
  42. public void setName(String name) {
  43. this.name = name;
  44. }
  45.  
  46. public double getPrice() {
  47. return price;
  48. }
  49.  
  50. public void setPrice(double price) {
  51. this.price = price;
  52. }
  53.  
  54. public Date getCreatetime() {
  55. return createtime;
  56. }
  57.  
  58. public void setCreatetime(Date createtime) {
  59. this.createtime = createtime;
  60. }
  61.  
  62. public String getDetail() {
  63. return detail;
  64. }
  65.  
  66. public void setDetail(String detail) {
  67. this.detail = detail;
  68. }
  69. }

10、创建ItemController。ItemController是一个普通的java类,不需要实现任何接口。需要在类上添加@Controller注解,把Controller交由Spring管理,在方法上面添加@RequestMapping注解,里面指定请求的url。其中“.action”可以加也可以不加。

  1. package com.yyb.controller;
  2.  
  3. import com.yyb.bean.Item;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.servlet.ModelAndView;
  7.  
  8. import java.util.ArrayList;
  9. import java.util.Date;
  10. import java.util.List;
  11.  
  12. /**
  13. * Created by yang on 2017/8/12.
  14. */
  15. @Controller
  16. public class ItemController {
  17. // @RequestMapping:里面放的是请求的url,和用户请求的url进行匹配
  18.  
  19. // action可以写也可以不写
  20.  
  21. @RequestMapping("/itemList.action")
  22.  
  23. public ModelAndView queryItemList() {
  24.  
  25. // 创建页面需要显示的商品数据
  26.  
  27. List<Item> list = new ArrayList<>();
  28.  
  29. list.add(new Item(1, "1华为 荣耀8", 2399, new Date(), "质量好!1"));
  30.  
  31. list.add(new Item(2, "2华为 荣耀8", 2399, new Date(), "质量好!2"));
  32.  
  33. list.add(new Item(3, "3华为 荣耀8", 2399, new Date(), "质量好!3"));
  34.  
  35. list.add(new Item(4, "4华为 荣耀8", 2399, new Date(), "质量好!4"));
  36.  
  37. list.add(new Item(5, "5华为 荣耀8", 2399, new Date(), "质量好!5"));
  38.  
  39. list.add(new Item(6, "6华为 荣耀8", 2399, new Date(), "质量好!6"));
  40.  
  41. // 创建ModelAndView,用来存放数据和视图
  42. ModelAndView modelAndView = new ModelAndView();
  43. // 设置数据到模型中
  44. modelAndView.addObject("list", list);
  45. // 设置视图jsp,需要设置视图的物理地址
  46. modelAndView.setViewName("index.jsp");
  47.  
  48. return modelAndView;
  49.  
  50. }
  51. }

11、启动项目测试。启动项目,浏览器访问地址:http://localhost:8080/SpringMVCDemo/itemList.action

效果如下图:

Springmvc架构

框架结构如下图:

组件说明

以下组件通常使用框架提供实现:

  • DispatcherServlet:前端控制器。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
  • HandlerMapping:处理器映射器。HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
  • Handler:处理器,也就是程序员要开发的部分。Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
  • HandlAdapter:处理器适配器。通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
  • ViewResolver:视图解析器。View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
  • View:视图。springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。需要用户开发的组件有handler、view。

默认加载的组件:

我们没有做任何配置,就可以使用这些组件,因为框架已经默认加载这些组件了,配置文件位置如下图:

 组件扫描器:

使用组件扫描器省去在spring容器配置每个Controller类的繁琐。使用<context:component-scan>自动扫描标记@Controller的控制器类,在springmvc.xml配置文件中配置如下:

  1. <!-- 配置controller扫描包,多个包之间用,分隔 -->
  2. <context:component-scan base-package="cn.itcast.springmvc.controller" />

注解映射器和适配器

1、配置处理器映射器

@RequestMapping:定义请求url到处理器功能方法的映射。

注解式处理器映射器,对类中标记了@ResquestMapping的方法进行映射。根据@ResquestMapping定义的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。HandlerMethod对象中封装url对应的方法Method。从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。

在springmvc.xml配置文件中配置如下:

  1. <!-- 配置处理器映射器 -->
  2. <bean
  3. class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
  4. </bean>

2、配置处理器适配器

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。在springmvc.xml配置文件中配置如下:

  1. <!-- 配置处理器适配器 -->
  2.  
  3. <bean
  4.   class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
  5. </bean>

3、注解驱动

上面的方式直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。SpringMVC使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter。可以在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

  1. <!-- 注解驱动 -->
  2. <mvc:annotation-driven />

视图解析器

视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析,在springmvc.xml配置文件中配置如下:

  1. <!-- 配置视图解析器,不用每次都写前缀和后缀,比如:/WEB-INF/jsp/test.jsp -->
  2.  
  3. <bean
  4.   class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  5.   <!-- 配置逻辑视图的前缀 -->
  6.   <property name="prefix" value="/WEB-INF/jsp/" />
  7.   <!-- 配置逻辑视图的后缀 -->
  8.   <property name="suffix" value=".jsp" />
  9. </bean>

逻辑视图名需要在controller中返回ModelAndView指定,最终jsp物理地址:前缀+逻辑视图名+后缀

  1. // 设置视图jsp,需要设置视图的物理地址
  2. // modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");
  3. // 配置好视图解析器前缀和后缀,这里只需要设置逻辑视图就可以了。
  4. // 视图解析器根据前缀+逻辑视图名+后缀拼接出来物理路径
  5. modelAndView.setViewName("itemList");

在SpringMVC中 /* 和 / 的区别

  • <url-pattern> / </url-pattern>:会匹配到 /springmvc 这样的路径型url,而不会匹配到像 .jsp 这样的后缀型的url。
  • <url-pattern> /* </url-pattern>:会匹配到所有的url:路径型url 和后缀型的url (包括/springmvc,.jsp,.js,和.html等)。

对静态资源放行

web.xml配置时,是设置所有的请求都进入SpringMVC。但是SpringMVC无法处理css、js等静态资源,所以无法正常显示。

方式一:在springmvc.xml中配置:

  1. <!--对静态资源放行-->
  2. <!--**防止文件夹下又有文件夹-->
  3. <mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
  4. <mvc:resources mapping="/fonts/**" location="/fonts/"></mvc:resources>
  5. <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>

方式二:在springmvc.xml中配置:

  1. <!-- 解决静态资源无法被springMVC处理的问题 -->
  2. <mvc:default-servlet-handler />

SpringMVC学习笔记一(请求流程和配置,启动项目)的更多相关文章

  1. SpringMVC 学习笔记(处理器映射器的配置)

    前端控制器(dispatchServlet) 在web.xml中配置前端控制器,在服务器启动时就被创建,用来对请求和响应进行接收 和 分发处理,其在配置时可以设置一个初始化参数,用来定位SpringM ...

  2. springMVC学习记录1-使用XML进行配置

    SpringMVC是整个spring中的一个很小的组成,准确的说他是spring WEB这个模块的下一个子模块,Spring WEB中除了有springMVC还有struts2,webWork等MVC ...

  3. springmvc学习笔记(简介及使用)

    springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...

  4. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

  5. springMVC 学习笔记(一):springMVC 入门

    springMVC 学习笔记(一):spring 入门 什么是 springMVC springMVC 是 spring 框架的一个模块,springMVC 和 spring 无需通过中间整合层进行整 ...

  6. 史上最全的SpringMVC学习笔记

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  7. springmvc学习笔记---面向移动端支持REST API

    前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...

  8. SpringMVC:学习笔记(8)——文件上传

    SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...

  9. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

  10. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

随机推荐

  1. linux命令--网络命令

    一.网络命令 1.配置ip 1.1 配置 IP 地址 IP 地址是计算机在互联网中唯一的地址编码.每台计算机如果需要接入网络和其他计算机进行数 据通信,就必须配置唯一的公网 IP 地址. 配置 IP ...

  2. SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题

    本文源码:GitHub·点这里 || GitEE·点这里 一.传统Session认证 1.认证过程 1.用户向服务器发送用户名和密码. 2.服务器验证后在当前对话(session)保存相关数据. 3. ...

  3. 被忽略的CSS规则

    说起CSS规则,除了普通规则(属性和值,key:value),可能大家都会想到@media,@keyframes,@fontface等常用的,那剩余的大家是否有所了解呢. 我们先来看一看CSS有哪些规 ...

  4. 【编译系统02】编译器 - 语义分析器(semantic)的简单设计思路(变量类与变量表)

    当我们分析到 "int n;",说明其已经定义了一个变量,之后又遇到一个 "n=3",我们从哪里去找这个n并且赋值呢? 答案是:通过我们定义的 变量表(Tabl ...

  5. C# calculate disk size

    static void Main(string[] args) { string dir = @"C:\"; string[] dirs=Directory.GetDirector ...

  6. Selenium(二):选择元素的基本方法

    1. 选择元素的基本方法 对于百度搜索页面,如果我们想自动化输入爱编程的小灰灰,怎么做呢? 这就是在网页中,操控界面元素. web界面自动化,要操控元素,首先需要选择界面元素 ,或者说定位界面元素 就 ...

  7. Python内部参数中对外部实参的影响

    无论函数传递的参数的可变还是不可变,只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用,而如果传递的参数是可变类型,在函数内部使用方法修改了数据的内容,同样会影响到外部 ...

  8. socket之线程来提高吞吐量

    线程demo: 线程: package com.company.s5; import java.io.InputStream; import java.io.InputStreamReader; im ...

  9. ES6-新增的数组操作,数组解构,forEach,fillter,some.map的数组遍历,数组转换字符串

    ES6-新增的数组操作 // es6数组格式 let json = { '0' : 'anan', '1' : 'anani', '2' : 'anania', length:3 } //es6 把数 ...

  10. MD5是个好东西 / MD5 is a nice guy

    md5是一种摘要生成算法,通过对消息生成唯一摘要,可校验消息是否被篡改. 众所周知,md5广泛用在http接口通讯的安全控制上,通过在签名原始串后加上商户通信秘钥,进行MD5运算,形成的摘要字符串即为 ...