SpringMvc框架(熟悉基本开发流程)

目录,更新ing,学习Java的点滴记录

  目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

SpringMvc知识

第一篇---->SpringMvc初识|MVC|三层架构
第二篇---->IoC容器上下文和映射请求上下文
第三篇---->熟悉基本开发流程
第四篇---->接收各类请求参数的方式
第五篇---->获取请求中的Request,Session,Cookie等对象属性
第六篇---->拦截器开发
第七篇---->视图和视图解析器
第八篇---->数据校验
第九篇---->文件上传方式
第十篇---->数据转换和数据格式化

1 SpringMvc基本开发流程

  • 通过前两篇的关于初始化及入门案例的介绍,可以发现SpringMvc的开发流程其实并不难.要想开发SpringMvc程序,只需要掌握好SpringMvc的组件有哪些以及运行流程就可以了,所以在具体开发过程中也会贯穿SpringMvc的运行流程
  • 目前主流的开发方式就是以注解形式去开发SpringMvc.

1.1 @RequestMapping

  • SpringMvc使用@RequestMapping注解为控制器指定可以处理哪些URL请求
  • 关于web应用的根目录如何查看
      SpringMvc框架(熟悉基本开发流程)_第1张图片
      SpringMvc框架(熟悉基本开发流程)_第2张图片
  • @RequestMapping注解可以标注的位置
      1) 类上:提供初步的请求映射信息,是请求URL的第一级访问目录.如果不写的话,默认相当于web应用的根目录.写的话需要以/开头.它的出现的目的是为了使我们的URL可以模块化管理
      SpringMvc框架(熟悉基本开发流程)_第3张图片
      2) 方法上:提供进一步的细分映射信息,是请求URL的第二级访问目录.相对于类定义处的URL.如果类定义处没有标注@RequestMapping,则方法处标记的URL相对于Web应用的根目录
  • @RequestMapping的源码
      SpringMvc框架(熟悉基本开发流程)_第4张图片
      上面7个都可以作为属性在@RequestMapping注解中进行配置,用到最多的就是请求路径和请求类型,以上属性可以同时配置多个,他们的关系是与关系,只有同时满足配置的所有参数要求才会映射到指定类或者方法
  • 为了方便我对于示例中的代码进行文字描述,先约定一些内容:
      1) 假设项目根目录为:springmvc
      2) 配置的视图解析器中前缀为/WEB-INF/views/,后缀为.jsp
  • 示例1:标注在类和方法上(value属性使用)
      SpringMvc框架(熟悉基本开发流程)_第5张图片
      1) 类定义处标记的@RequestMapping限定了该类只能处理所有相对于根目录的/user的请求,如果注解中只有一个value属性的话,可以省略value=,直接写@RequestMapping(“user”)即可
      2) 方法处的标记进一步细化了url的访问路径,由于类定义出已经设置了@RequestMapping,那么访问具体方法的请求就必须先经过类的筛选,比如进入login方法,就需要的请求是—springmvc/user/login才可以.
  • 示例2:method属性使用
      SpringMvc框架(熟悉基本开发流程)_第6张图片
      method属性绝大多数都用在方法的@RequestMapping上,表示什么类型的请求才会被该方法处理,之前也提到过,各个属性之间是与的关系,也就是说,目前能够进入到login方法的请求必须是---->springmvc/user/login,且方法请求类型为GET类型,此外,如果不明确指出method属性的值的话,那么所有请求类型都可以匹配
  • 示例3:params属性使用
      SpringMvc框架(熟悉基本开发流程)_第7张图片
      1) 通过params="id"表示请求中必须带有名为id的参数,比如请求为—>springmvc/user/login?id=1,通过这种?传参的方式将参数传递过来且必须含有id参数才可以匹配.
      2) 同时params和headers还支持一些表达式:
       param1:表示请求必须包含名为param1的请求参数
       !param2:表示请求不能包含名为param2的请求参数
       param1 != value1:表示请求包含名为param1的请求参数,并且值不能是value
       {“param1=value1”,“param2”}:请求必须包含param1和param2,且param1的值必须为value1
  • @RequestMapping支持Ant风格的URL,Ant风格支持3种匹配符:
      SpringMvc框架(熟悉基本开发流程)_第8张图片

1.2 控制器的开发

  • 控制器开发时SpringMvc的核心内容,步骤分为3步
      1) 获取请求参数
      2) 处理业务逻辑
      3) 绑定模型和视图

1.2.1 获取请求参数

  • 在SpringMvc中接收参数的方法有很多,后面会单独整理一篇来谈,这里先使用一下常见的作为演示,同时建议不要使用Servlet容器所提供的API,因为这样控制器将会依赖于Servlet容器.,比如下面代码:
      SpringMvc框架(熟悉基本开发流程)_第9张图片
  • SpringMvc会自动解析代码中的方法参数session,request,response等,然后传递关于Servlet容器的API参数,所以是可以获取到的.通过request或者session都可以很容易得到HTTP请求过来的参数,这是一个方法但并非是一个好方法.如果这样做了,对于/login匹配的方法来说,就和Servlet容器紧密关联了,不利于扩展和测试.SpringMvc同时也提供了更好的获取请求参数的方法
  • 使用@RequestParam注解就可以做到这一点,比如现在有一个请求携带名称为id的请求参数,那么我们就可以按照下面这种方式获取
      SpringMvc框架(熟悉基本开发流程)_第10张图片
  • 通过@RequestParam注解,Springmvc就会明白要从请求中获取指定参数,即使用类似于以下的逻辑进行转换
      在这里插入图片描述
  • 然后才会进入到login方法内部,它会自动进行类型转换
  • 默认情况下,对于@RequestParam注解中的参数而言,要求不能为空,拿上面的例子而言,如果你指定了要获取名为id的属性,但是请求中并没有携带该参数,也就是获取不到HTTP请求参数时,就会抛出异常.如何解决这个问题呢?我们来看一下@RequestParam的源码
      SpringMvc框架(熟悉基本开发流程)_第11张图片
  • 根据源码的信息,重新给一个示例
      SpringMvc框架(熟悉基本开发流程)_第12张图片
      解释:要求从请求中拿到名为id的请求参数,如果获取不到也没关系,或采用默认值10086代替,最终将值传递给方法形参id
  • 这里就简要介绍这一个注解,后面还有各种情况下使用的接收参数的注解,期待呦

1.2.2 实现业务逻辑和绑定视图

  • 一般而言,实现业务逻辑和数据库有关联,我倾向于使用xml的方式(在Spring配置文件中)配置数据库,当然基于注解也可以.如果你需要使用第三方包开发的时候,使用xml会更方便一些.
  • 后面的代码基于第一篇中的案例,需要将web.xml中关于SpringIOC容器的设置打开,然后在src下创建一个applicationContext.xml文件,并且添加一个第三方jar包Druid,作为数据库连接池
      SpringMvc框架(熟悉基本开发流程)_第13张图片
      druid jar包:链接:链接:https://pan.baidu.com/s/1VHtsXZSzNoAHsGvcI6ht3w 提取码:5slg
  • 现在开始配置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:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd">
    <!--设置组件扫描-->
    <context:component-scan base-package="com.mvc"/>

    <!--1. 配置数据库连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/spring"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="1"/>
        <property name="minIdle" value="1"/>
        <property name="maxActive" value="10"/>
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="10000"/>
    </bean>
    <!--2. 配置JdbcTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>
  • 演示控制器逻辑和绑定视图暂时先不涉及事务,所以就不声明事务管理器了,由于MyBatis还没开始,所以先以Spring的JdbcTemplate来操作数据库,后面的代码就不再单独创建接口和实现类了,方便一点
  • 数据库建表
      SpringMvc框架(熟悉基本开发流程)_第14张图片
      SpringMvc框架(熟悉基本开发流程)_第15张图片
  • 创建User实体类
      SpringMvc框架(熟悉基本开发流程)_第16张图片
  • 创建UserDao层,实现与数据库的交互,实现查询指定id用户的信息
      SpringMvc框架(熟悉基本开发流程)_第17张图片
  • 创建UserService层
      SpringMvc框架(熟悉基本开发流程)_第18张图片
  • 创建UserController层,接收并处理用户的请求
      SpringMvc框架(熟悉基本开发流程)_第19张图片
  • 在这里我们设置一个断点,测试一下能否接受到查询到的user对象,对于后面的视图渲染部分,先不执行,等下一节再分析
  • 现在开始执行断点调试
      SpringMvc框架(熟悉基本开发流程)_第20张图片
  • 浏览器输入url,访问对应控制器,比如我这里是:http://localhost:8080/springmvc01/user/find?id=1,回车以后浏览器由于设置了断点会卡住,现在我们看一下断点调试中拿到的数据
      SpringMvc框架(熟悉基本开发流程)_第21张图片
  • 可以看到我们的数据已经从数据库中取出了数据,对于上面的内容,只是完成了业务逻辑,还没有实现视图渲染,也就是将数据库中的数据以某种方式渲染到视图中,展示到前端.

1.3 视图渲染

  • 按照上面的配置,SpringMvc会默认使用JstlView进行渲染,也就是它将`查询出来的模型绑定到JSTL(JSP标准标签库)模型中,这样JSTL就可以把数据模型在jsp中读取展示数据了.在SpringMvc中还存在着大量的视图可以使用,在后面更新后也会谈到,这样就可以很方便把数据以各种形式进行展现,来响应用户请求
  • 现在回到上面的UserController代码中,使用ModelAndView对象,最终要返回的页面是/WEB-INF/views/success.jsp,然后在这个页面中编写JSTL标签将模型数据读出来
  • 现在开始编写success.jsp页面,开头要引入jstl,这就需要新导入两个jstl有关的jar包
      jar包资料:链接:https://pan.baidu.com/s/1eYl_JSLmO1B6s9NHFBUoXw 提取码:w5qj
      然后将jar包放入到WEB-INF/lib目录下,并右键add as library就行了
      SpringMvc框架(熟悉基本开发流程)_第22张图片
  • 在success.jsp中将会显示查询到的id=1的用户信息,我们可以通过EL表达式获取数据
  • 重新启动服务测试
      SpringMvc框架(熟悉基本开发流程)_第23张图片
      SpringMvc框架(熟悉基本开发流程)_第24张图片
  • 测试成功,但是目前的前端技术中,使用Ajax技术很多,而使用Ajax的要求就是后端返回的数据必须是Json格式,SpringMvc也提供了视图的支持—MappingJackson2JsonView,但是这不是唯一的方法,更通用的方式是使用SpringMvc提供的@ResponseBody注解,这也是最主流的.

1.4 小结

  • 通过本篇的描述,相信你对SpringMvc开发过程有了一个基本的认识,其核心内容就是流程和组件,掌握了它们才能熟练掌握SpringMvc.
  • 当然本篇只是对基本开发流程进行了介绍,但是并没有详细说明一些重点,比如@RequestMapping,获取请求参数的各种方式,视图的解析等等,后面的文章会谈到

你可能感兴趣的:(Java)