一、概述

1.1 SpringMVC是什么

  • SpringMVC是Spring的一个模块,提供web层解决方案(基于mvc设计架构)

1.2 MVC在b/s系统的应用

MVC是一个设计模式,在b/s系统的应用:

  • 1、用户发起request请求至控制器(Controller) 控制接收用户请求的数据,委托给模型进行处理
  • 2、控制器通过模型(Model)处理数据并得到处理结果 模型通常是指业务逻辑
  • 3、模型处理结果返回给控制器
  • 4、控制器将模型数据在视图(View)中展示,web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。
  • 5、控制器将视图response响应给用户,通过视图展示给用户要的数据或处理结果。

1.3 SpringMVC 原理

  • 第一步:用户发起request请求,请求至DispatcherServlet前端控制器
  • 第二步:DispatcherServlet前端控制器请求HandlerMapping处理器映射器查找Handler
    • DispatcherServlet:前端控制器,相当于中央调度器,各各组件都和前端控制器进行交互,降低了各各组件之间耦合度。
  • 第三步:HandlerMapping处理器映射器,根据url及一些配置规则(xml配置、注解配置)查找Handler,将Handler返回给DispatcherServlet前端控制器
  • 第四步:DispatcherServlet前端控制器调用适配器执行Handler,有了适配器通过适配器去扩展对不同Handler执行方式(比如:原始servlet开发,注解开发)
  • 第五步:适配器执行Handler,Handler是后端控制器,当成模型。
  • 第六步:Handler执行完成返回ModelAndView
    • ModelAndView:SpringMVC的一个对象,对Model和view进行封装。
  • 第七步:适配器将ModelAndView返回给DispatcherServlet
  • 第八步:DispatcherServlet调用视图解析器进行视图解析,解析后生成view视图解析器根据逻辑视图名解析出真正的视图。
    • View:SpringMVC视图封装对象,提供了很多view,jsp、freemarker、pdf、excel。。。
  • 第九步:ViewResolver视图解析器给前端控制器返回view
  • 第十步:DispatcherServlet调用view的渲染视图的方法,将模型数据填充到request域 。
  • 第十一步:DispatcherServlet向用户响应结果(jsp页面、json数据。。。。)

  • DispatcherServlet:前端控制器,由SpringMVC提供

  • HandlerMappting:处理器映射器,由SpringMVC提供

  • HandlerAdapter:处理器适配器,由SpringMVC提供

  • !!!Handler:处理器,需要程序员开发

  • ViewResolver:视图解析器,由SpringMVC提供

  • !!!View:真正视图页面需要由程序编写

二、入门程序

2.1 需求

  • 实现商品列表查询

2.2 引入依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
<scope>provided</scope>
</dependency>

2.3 前端控制器

  • 在web.xml中配置
<!-- 前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc配置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 配置文件的地址
如果不配置contextConfigLocation,
默认查找的配置文件名称classpath下的:servlet名称+"-serlvet.xml"即:springmvc-serlvet.xml
-->
<param-value>classpath:springmvc.xml</param-value>
</init-param> </servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
可以配置/ ,此工程 所有请求全部由springmvc解析,此种方式可以实现 RESTful方式,需要特殊处理对静态文件的解析不能由springmvc解析
可以配置*.do或*.action,所有请求的url扩展名为.do或.action由springmvc解析,此种方法常用
不可以/*,如果配置/*,返回jsp也由springmvc解析,这是不对的。
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>

2.4 springmvc.xml

  • 在springmvc.xml中配置SpringMVC架构三大组件(处理器映射器、适配器、视图解析器)

2.5 配置处理器映射器

  • 在springmvc.xml中配置
  • BeanNameUrlHandlerMapping: 根据请求url(XXXX.action)匹配spring容器bean的 name
  • 找到对应的bean(程序编写的Handler)
<!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  • 所有处理器映射器都实现HandlerMapping接口。

2.6 处理器适配器

  • 在springmvc.xml中配置
 <bean      class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

  • 所有的适配器都是实现了HandlerAdapter接口。
  • 程序编写Handler根据适配器的要求编写。

  • SimpleControllerHandlerAdapter适配器要求

  • 通过源码中supports方法知道Handler必须要实现哪个接口,此SimpleControllerHanlderAdapter中需要实现Controller接口

public boolean supports(Object handler)
/* */ {
/* 42 */ return handler instanceof Controller;
/* */ }

2.7 Handler编写

  • 由上一步可知,需要实现Controller接口:
public class ItemController1 implements Controller {

    @Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception { // 使用静态数据将商品信息列表显示在jsp页面
// 商品列表
List<Items> itemsList = new ArrayList<Items>(); Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setCreatetime(new Date());
items_1.setDetail("ThinkPad T430 联想笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!"); itemsList.add(items_1);
itemsList.add(items_2); ModelAndView modelAndView = new ModelAndView();
//将数据填充到request
// request.setAttribute("itemsList", itemsList);
modelAndView.addObject("itemsList", itemsList);
//指定转发的jsp页面
modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
return modelAndView;
} }

2.8 配置Handler

  • 在springmvc.xml配置Handler由spring管理Handler。
 <!-- 配置Handler 由于使用了BeanNameUrlHandlerMapping处理映射器,name配置为url -->
<bean id="itemController1" name="/itemList.action"
class="com.hao.controller.ItemController1" />

2.9 配置视图解析器

  • 配置视图解析,能够解析jsp视图:
<!-- 配置视图解析器 要求将jstl的包加到classpath -->
<!-- ViewResolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" /> </bean>

三、其它非注解处理器映射器和适配器

3.1 映射器

1. BeanNameUrlHandlerMapping(映射器)(上面例子已讲解)

  • 根据请求url(XXXX.action)匹配spring容器bean的 name
  • 找到对应的bean(程序编写的Handler)

2. SimpleUrlHandlerMapping(映射器)

  • 注意:在springmvc.xml配置了多个处理器映射器,多个处理器映射器可以共存。
<bean id="itemController1" name="/itemList.action"
class="com.hao.controller.ItemController1" /> <!--简单url映射 集中配置bean的id对应 的url -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/itemsTest1.action">itemController1</prop>
<prop key="/itemsTest2.action">itemController2</prop>
</props>
</property>
</bean>

3.2 适配器

1. SimpleControllerHandlerAdapter(适配器)(上面例子已讲解)

  • 要求程序编写的Handler(Controller)需要实现 Controller接口。

2. HttpRequestHandlerAdapter(适配器)

  • 在springmvc.xml配置:HttpRequestHandlerAdapter
  • 要求Handler 实现 HttpRequestHandler接口

  • 开发Handler

public class ItemController2 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 使用静态数据将商品信息列表显示在jsp页面
// 商品列表
List<Items> itemsList = new ArrayList<Items>(); Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setCreatetime(new Date());
items_1.setDetail("ThinkPad T430 联想笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!"); itemsList.add(items_1);
itemsList.add(items_2); request.setAttribute("itemsList", itemsList);
//转发到jsp页面
request.getRequestDispatcher("/WEB-INF/jsp/itemsList.jsp").forward(request, response); }
}

四、注解映射器和适配器

4.1 注解映射器

  • spring3.1之前默认加载映射器是 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
  • 3.1之后要使用: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
  • springmvc.xml中配置RequestMappingHandlerMapping:使用RequestMappingHandlerMapping需要在Handler 中使用@controller标识此类是一个控制器,使用@requestMapping指定Handler方法所对应的url

4.2 注解适配器

  • spring3.1之前默认加载映射器是
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
  • 3.1之后要使用:
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
  • RequestMappingHandlerAdapter,不要求Handler实现任何接口,它需要和 RequestMappingHandlerMapping注解映射器配对使用,主要解析Handler方法中的形参。

4.3 注解开发Hanlder

@Controller
public class ItemController3 {
//商品列表,@RequestMapping中url建议和方法名一致,方便开发维护
@RequestMapping("/queryItems")
public ModelAndView queryItems(){ // 使用静态数据将商品信息列表显示在jsp页面
// 商品列表
List<Items> itemsList = new ArrayList<Items>(); Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setCreatetime(new Date());
items_1.setDetail("ThinkPad T430 联想笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!"); itemsList.add(items_1);
itemsList.add(items_2); ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsList", itemsList);
//指定逻辑视图名
modelAndView.setViewName("itemsList"); return modelAndView;
}
//商品添加 //商品删除 }

4.4 配置Handler

  • 建议使用组件扫描,组件扫描可以扫描@Controller@Service@component@Repsitory
<!-- 注解的handler,单个配置 -->
<!-- <bean class="com.hao.controller.ItemController3"/> -->
<!-- 使用spring组件扫描 -->
<context:component-scan base-package="com.hao.controller" />

五、注解开发详解

5.1 @RequestMapping

  • 设置方法对应的url(完成url映射)
  • 窄化请求映射
    • 在class上定义根路径
    • 好处:更新规范系统 的url,避免 url冲突。
  • 限制http请求的方法
    • 通过requestMapping限制url请求的http方法,
    • 如果限制请求必须是post,如果get请求就抛出异常

5.2 关于Controller方法返回值

  • 返回ModelAndView
  • 返回字符串
    • 如果Controller方法返回jsp页面,可以简单将方法返回值类型定义 为字符串,最终返回逻辑视图名。
  • 返回void

5.3 redirect重定向

  • 如果方法重定向到另一个url,方法返回值为“redirect:url路径”
  • 使用redirect进行重定向,request数据无法共享,url地址栏会发生变化的。

5.4 forward转发

  • 使用forward进行请求转发,request数据可以共享,url地址栏不会。
  • 方法返回值为“forward:url路径”

5.5 @ModelAttribute

  • 需求:商品类别信息在商品信息页面显示。
//单独将商品类型的方法提出来,将方法返回值填充到request,在页面显示
@ModelAttribute("itemsType")
public Map<String, String> getItemsType()throws Exception{ HashMap<String, String> itemsType = new HashMap<String,String>();
itemsType.put("001", "数码");
itemsType.put("002", "服装");
return itemsType; }
商品类别:
<select>
<c:forEach items="${itemsType }" var="item">
<option value="${item.key }">${item.value }</option>
</c:forEach> </select>
  • 使用@ModelAttribute将公用的取数据的方法返回值传到页面,不用在每一个controller方法通过Model将数据传到页面。

5.6 @RequestBody和@ResponseBody

  • @RequestBody:将请求的json数据转成java对象
  • @ResponseBody:将java对象转成json数据输出。

七、springmvc和struts的区别

  • springmvc是通过方法的形参接收参数,在使用时可以以单例方式使用,建议使用单例。
  • struts是通过成员变量接收参数,在使用时必须以多例方式使用。
  • springmvc是基于方法开发,struts基于类开发。
  • springmvc将一个请求的Method和Handler进行关联绑定,一个method对应一个Handler。
  • springmvc开发以方法为单位进行开发,方法更帖进service(业务方法)。
  • 经过实际测试,发现struts标签解析速度比较慢,建议在实际开发时使用jstl。

六、小结

  • a. DispatcherServlet:前端控制器,相当于中央调度器,可以降低组件之间的耦合度。
  • b. HandlerMapping:处理器映射器,负责根据url查找Handler
  • c. HandlerAdapter:处理器适配器,负责根据适配器要求的规则去执行处理器。可以通过扩展适配器支持不同类型的Handler。
  • d. viewResolver:视图解析器,根据逻辑视图名解析成真正的视图,
<!-- 配置视图解析器 要求将jstl的包加到classpath -->
<!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

真正视图地址==前缀+逻辑视图名+后缀

  1. DispatcherServlet通过HandlerMapping查找Handler
  2. DispatcherServlet通过适配器去执行Handler,得到ModelAndview
  3. 视图解析,视图解析完成得到一个view
  4. 进行视图渲染 将Model中的数据 填充到request域。

【SpringMVC】入门的更多相关文章

  1. 【Spring】SpringMVC入门示例讲解

    目录结构: // contents structure [-] SpringMVC是什么 Spring MVC的设计原理 SpringMVC入门示例 1,复制Jar包 2,Web.xml文件 3,My ...

  2. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  3. SpringMVC入门第二天

    SpringMVC第二天 1.   回顾 1.Springmvc介绍? Springmvc是Spring公司 2.Springmvc入门程序 第一步:Web工程 第二步:导Jar包 第三步:web.x ...

  4. 3.2.1 SpringMVC入门

    一. SpringMVC入门 1. MVC介绍 MVC全名 是Model View Controller, 是模型(model) - 视图(view) - 控制器(controller) 的缩写, 它 ...

  5. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

  6. SpringMVC入门学习(一)

    SpringMVC入门学习(一) ssm框架 spring  SpringMVC是一个Java WEB框架,现在我们知道Spring了,那么,何为MVC呢? MVC是一种设计模式,其分为3个方面 mo ...

  7. springMVC入门(一)

    1.   SpringMVC入门 1.1SpringMVC是什么 Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出 ...

  8. SpringMVC.入门篇《二》form表单

    SpringMVC.入门篇<二>form表单 项目工程结构: 在<springmvc入门篇一.HelloWorld>基础上继续添加代码,新增:FormController.ja ...

  9. SpringMVC.入门篇.一.HelloWorld

    SpringMVC.入门篇<一>HelloWorld 项目包结构如下: HelloController.java 代码 package com.charles.controller; im ...

  10. SpringMVC入门(基于注解方式实现)

    ---------------------siwuxie095                             SpringMVC 入门(基于注解方式实现)         SpringMVC ...

随机推荐

  1. keepalived两台机器同时出现vip问题

    配置文件: 主:192.168.1.14 ! Configuration File for keepalived global_defs { script_user root enable_scrip ...

  2. LeetCode_119. Pascal's Triangle II

    119. Pascal's Triangle II Easy Given a non-negative index k where k ≤ 33, return the kth index row o ...

  3. 使用httpwebrequest Post数据到网站

    怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器?例如编写个程序实现自动用户登录,自动提交表单数据到网站等.假如某个页面有个如下的表单(Form): <form nam ...

  4. python:序列化与反序列化(json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  5. dubbo的负载均衡策略和容错策略

    一.dubbo 负载均衡策略 random loadbalance 默认情况下,dubbo 是 random load balance 随机调用实现负载均衡,可以对 provider 不同实例设置不同 ...

  6. Win10利用CodeBlocks搭建Objective-C开发环境(二)

    工程文件已经建好:但此时会发现main.m文件为灰色,且无法点击,此时需右键点击main.m文件,在option选项中勾选 compile file和 link file选项. 设置完成后,双击mai ...

  7. ipad 没有数据线如何上传文件到局域网windows PC 的解决方案

    是的,ios 的封闭性,真麻烦,不想用数据线,还不想用iTunes ,那你找对了. 方案一: (好像只能上传文件,不能下载,能在线查看媒体.) 我的想法是在Windows建立一个http file s ...

  8. 给出一个javascript的Helloworld例子

    1.基础知识:Helloworld:例 1.1<html><head>    <!--  如果你用notepad建立一个txt之后你再改为html,一定在存时,要存成ut ...

  9. C++:标准模板库vector

    一:介绍 vector是C++标准模板库,是一个容器,底层是数组,为连续内存. 命名空间为std,所属头文件为<vector>   注意:不是<vector.h> vector ...

  10. Hibernate一对多自关联、多对多关联

    今天分享hibernate框架的两个关联关系    多对多关系注意事项 一定要定义一个主控方 多对多删除 主控方直接删除 被控方先通过主控方解除多对多关系,再删除被控方 禁用级联删除 关联关系编辑,不 ...