文章目录

  • SpringMVC简单介绍
  • SpringMVC小案例
  • SpringMVC执行流程
  • SpringMVC注解
  • 处理器方法的参数
  • 请求参数中文乱码问题
  • 处理器方法的返回值

SpringMVC简单介绍

SpringMVC是Spring框架的一部分
优点:

  1. 基于MVC架构,分工明确,解耦合。
  2. 上手快,使用简单,轻量级,jar包小,不依赖特定的类和接口
  3. 作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop,方 便 整 合。Strtus,MyBatis,Hiberate,JPA 等其他 框架。
  4. SpringMVC 强化注解的使用,在控制器,Service ,Dao 都可以使用注解 。方便灵活

SpringMVC小案例

  1. 新建maven web项目
  2. 配置依赖pom.xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
  1. 注册中央调度器DispatcherServlet

    1. )DispatcherServlet它是一个Servlet, 父类继承了HttpServlet
    2. )DispatcherServlet的作用
      1. )是接收请求,显示处理结果给用户。
      2. )把接收到的请求分派给处理器(控制器)对象。
    3. )DispatcherServlet也叫做前端控制器(front controller)
      web.xml
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup>
<servlet>
<servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>*.do</url-pattern>
</servlet-mapping>

在Tomcat启动时,根据load-on-startup的值创建dispatcherservlet对象,这是一个Servlet,创建时执行init()方法,,这个方法执行时会创建WebApplicationContext,创建容器时会读取spring需要的配置文件,这个配置文件的默认存在路径是WEB-INF,默认名称是当前servlet的 <servlet-name> -servlet.xml
url-pattern:将请求传递给中央调度器。常用的方式:1. **.do **.action **.mvc等,使用 **.jsp容易分不清请求与页面,所以不用。2. “/"
4. 创建处理器@Controller
@Controller默认是单例模式,在处理器类上添加@Controller注册为处理器类,它不是servlet, 起到servlet的作用。
方法上面加入@RequestMapping(value=“请求的uri地址”)

@Controller
public class MyController {@RequestMapping(value = "/my.do")public ModelAndView doSome() {ModelAndView mv = new ModelAndView();//添加到model部分,数据放到request.setAttrubute(),放到request作用域中mv.addObject("msg", "第一个springmvc项目");mv.addObject("fun", "doSome");//指定视图,框架对视图执行的是forWord操作:req.getRequestDisaptcher("/show.jsp").forwoard(req,resp);mv.setViewName("show");return mv;}
}
  1. spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 声明组件扫描器--><context:component-scan base-package="com.ljf.controller" /><!--创建视图View对象, 指定视图的路径,和扩展名--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--前缀:指定视图文件的路径--><property name="prefix" value="/WEB-INF/view/" /><!--后缀:指定视图文件的扩展名--><property name="suffix" value=".jsp" /></bean>
</beans>
  1. 定义目标页面
    webapp/index.jsp
    用来发送请求my.do
<a href="my.do" >my.do</a>

webapp/WEB-INF/view/show.jsp
用于接收传回来的值

<!-- el表达式 -->
msg数据:${msg}
<hr>
fun数据:${fun}

SpringMVC执行流程

  1. DispatcherServlet的初始化做了什么
    在父类的init()initServletBean();
    initServletBean(){
    创建springmvc的容器的对象, 读取springmvc的配置文件
    this.webApplicationContext = initWebApplicationContext();

    把springmvc的容器对象放入到ServletContext中
    String attrName = getServletContextAttributeName();
    getServletContext().setAttribute(attrName, wac);
    }

  2. 请求的处理
    1)用户发起some.do
    2)DispatcherServlet接收some.do, 把请求交给了处理器映射器
    处理器映射器:springmvc中的对象, 需要实现HandlerMapping的接口。
    在框架中映射器有很多。
    映射器作用:根据请求some.do找到处理他的处理器对象(MyController)
    然后把MyController对象放到“处理器执行链”的类中保存
    3)DispatcherServlet把“处理器执行链”的控制器对象交给了处理器适配器
    处理器适配器:springmvc的对象,需要实现HandlerAdapter接口(可以有多个)
    适配器作用:执行控制器对象的方法(MyController中的doSome())

    执行流程分析:
    (1)浏览器提交请求到中央调度器
    (2)中央调度器直接将请求转给处理器映射器。
    (3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。
    (4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。
    (5)处理器适配器调用执行处理器。
    (6)处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。
    (7)处理器适配器直接将结果返回给中央调度器。
    (8)中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
    (9)视图解析器将封装了的视图对象返回给中央调度器
    (10)中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。
    (11)中央调度器响应浏览器。

SpringMVC注解

@Controller 注册创建控制器对象
@RequestMapping 表示接收请求

  1. 属性:value :接收的请求
    method:请求的方式
  2. 可以用在方法名上面,表示这个请求需要执行的方法;用在类名上面,表示这个类是一个请求模块,其内部还有其他子请求

处理器方法的参数

  1. 可以在@RequestMapping修饰的方法添加形参:HttpServletRequest HttpServletResponse HttpSession 这三种类型的参数
  2. 可以形参可以与请求中携带的参数名一致,但是类型也必须一致。框架会自动进行赋值
  3. 形参与请求参数名不一致时,可以通过@RequestParam进行指定
    @RequestParam(“请求参数名”) 形参类型 形参名
  4. 当传入的多个参数是某个实体类的属性时,且请求参数名与这个实体类的属性名一致,那么形参可以是这个实体类的类型(当然类型也要相同),实体类必须声明set方法。
    传入name,age 。实体类Student属性:name,age
    public void doSome(Student student){ … }
    在接收请求时,doSome方法还没实行,先创建Student对象,将name、age通过set方法赋值Student的对象。
  5. 当上面3、4同时出现时
    public void doSome(Student student,String name){ … }
    name会传给student,也会传给形参name

请求参数中文乱码问题

对于前面所接收的请求参数,若含有中文,则会出现中文乱码问题
解决方案:过滤器

<filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

处理器方法的返回值

  1. ModelAndView

    • ModelAndView 表示请求处理结果的数据和视图
    • Model:表示数据的,Model实际是Map结构
      mv.addObject(“msg”, “第一个springmvc项目”);
      mv.addObject(“fun”, “doSome”);
    • View:表示视图的,也就是jsp
      mv.setViewName(“other”);
  2. String类型
    return “逻辑视图名”
    有视图解析器,可以将逻辑视图名配置成完整路径
  3. void
    一般用来传递json数据
  4. Object
    处理器方法返回 Object 对象。这个 Object 可以是 Integer,String,自定义对象,Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。
    返回对象,一般使用JSON格式的数据,需要使用@ResponseBody 注解。
  • 需要添加依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>
  • 声明注解驱动
    <mvc:annotation-driven />
    将 Object 数据转化为 JSON 数据,需要由消息转换器 HttpMessageConverter 完成。而转换器的开启,需要由mvc:annotation-driven/来完成。
    当 Spring 容器进行初始化过程中,在mvc:annotation-driven/处创建注解驱动时,默认创建了七个 HttpMessageConverter 对象。也就是说,我们注册mvc:annotation-driven/,就是为了让容器为我们创建 HttpMessageConverter 对象。
    HttpMessageConverter 接口四个方法 :
    boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json 等)
    boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。LIst getSupportMediaTypes():该转换器支持的媒体类型。
    T read(Class<? extends T> clazz,HttpInputMessage inputMessage):将请求信息流转换为 T 类型的对象。
    void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将 T 类型的对象写到响应流中,同时指定相应的媒体类型为 contentType

  • 返回自定义类型对象
    返回自定义类型对象时,不能以对象的形式直接返回给客户端浏览器,而是将对象转换为 JSON 格式的数据发送给浏览器的。需要jackson的相关依赖,同时需要在处理方法上面使用@ResponseBody修饰。这表示返回的自定义类型对象是json格式的

  • 返回List集合
    将返回的list集合转换成json格式进行返回,需要jackson的相关依赖,同时需要在处理方法上面使用@ResponseBody修饰。

  • 返回String类型
    如果方法上不使用@ResponseBody修饰,则返回值表示返回一个页面。
    使用@ResponseBody修饰,则表示返回值是一个字符串类型的数据。

SpringMVC(一)相关推荐

  1. 【SpringMVC】概述

    概述: SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的.                       理解是servlet的一个升级 Sp ...

  2. 【SpringMVC】基本概念

    SpringMVC的基本概念 三层架构 我们的开发一般都是基于c/s或者b/s架构.在JavaEE开发中,几乎全都是基于B/S架构开发.在B/S架构中,系统标准的三层架构包括:表现层,业务层,持久层. ...

  3. SSM框架整合(Spring+SpringMVC+MyBatis)

    输出结果 1.Maven Web项目创建 之前有写过Eclipse+Maven创建web项目的帖子,如果需要,请参考这里写链接内容 创建好项目之后因为入下图: 2.SSM整合 2.1 引入需要的JAR ...

  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  5. SpringMVC——通俗易懂讲讲Ajax~

    聊聊Ajax 一.什么是Ajax 二.iframe标签简单伪造Ajax 三.Ajax的实现 1. 基本概念的了解 Ajax的核心是什么? XMLHttpRequest是什么? Ajax数据传输的数据格 ...

  6. Jackson、FastJson快速入门(整合SpringMVC)

    目录 1. 什么是 JSON 2. JSON 语法规则 3. JSON 与 JS 对象的关系 4. JSON 和 JS 对象互转 5. Jackson-数据格式转换 1. 环境搭建 2. 对象转jso ...

  7. RESTful风格及其SpringMVC实现

    目录 1.RESTful概念 2.RESTful功能 3.对比:传统方式操作资源 4.SpringMVC实现传统方式操作资源 5.使用RestFul操作资源 6.SpringMVC实现RESTful操 ...

  8. 使用注解开发SpringMVC详细配置教程

    目录 1.使用注解开发SpringMVC 1.新建一个普通的maven项目,添加web支持 2.在pom.xml中导入相关依赖 3.配置web.xml 4.编写SpringMVC配置文件 1. 自动扫 ...

  9. SpringMVC的form:form表单的使用

    为什么要使用SpringMVC的form:form表单,有两个原因:一是可以更加快捷的完成表单的开发,比如会替你做好数据类型装换等本来需要你自己动手的工作.其次就是能够更加方便的实现表单回显. 首先要 ...

  10. SpringMVC工作环境搭建 配置文件

    web.xml配置 在服务器端容器启动之前加载配置文件的顺序:context-param>listener>filter>servlet //容器配置application上下文的时 ...

最新文章

  1. java易语言_java程序员,0基础学习开发易语言。
  2. 后年将有60亿部手机!
  3. matlab 直方图_MATLAB作图实例:19:用二元直方图分析图片颜色
  4. 【机器学习基础】数学推导+纯Python实现机器学习算法4:决策树之ID3算法
  5. 神奇的python(二)之python打包成应用程序
  6. Java基础---代码块和final关键字
  7. [转]由自助餐想到软件团队的管理
  8. 权限管理----用户与模块关系
  9. 用一个键盘和鼠标控制两台双显示器计算机的最佳方法是什么?
  10. SAP-ML物料账报错处理>ML4HMASTER113/ML4HRUN053>2021-01-09
  11. 怎样才能够修改PDF文件中的文字大小
  12. python 应用程序无法正常启动 000007b_为你解答应用程序无法正常启动00xc000007b怎么办...
  13. 由KKT互补松弛条件,支持向量的系数不一定为0,非支持向量的系数一定为0
  14. 质量流量计读数不准的其中三点原因
  15. mac brew 下载加速
  16. jvm工具系列之 -- jmap
  17. 个人总结了下自己在XP系统下键盘组合代码,顺便分享下,其实很实用,可是你用到了麽?
  18. 上海应用技术大学计算机类,2018年上海应用技术大学计算机学院计算机大类考研调剂信息公布...
  19. playfair 加密与解密
  20. LeetCode 牛客网 C++ 算法 刷题必备基础知识

热门文章

  1. canvas 简单入门
  2. 看完这篇区块链的文章,就有东西和别人扯皮了,而且扯的还很好
  3. 怎么样合成照片?图片如何做gif动态图片?
  4. 【论文翻译】(ECCV2020)Learning Object Permanence from Video 从视频中学习客体永久性
  5. 【NOIP训练】塔防游戏 序列DP / 数据结构
  6. EasyDSS流媒体服务器软件-正式环境安装部署攻略
  7. 将数字货币金额转换为大写格式(java)
  8. 第 1 章 一 JVM 和 Java 体系架构 (虚拟机介绍、字节码、Java跨平台性)
  9. 充电电池充电时间多长最佳
  10. Hadoop集群启动Hbase的步骤流程