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

    技术2024-07-24  22

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

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

    SpringMvc知识

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

    1 SpringMvc基本开发流程

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

    1.1 @RequestMapping

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

    1.2 控制器的开发

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

    1.2.1 获取请求参数

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

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

    一般而言,实现业务逻辑和数据库有关联,我倾向于使用xml的方式(在Spring配置文件中)配置数据库,当然基于注解也可以.如果你需要使用第三方包开发的时候,使用xml会更方便一些.后面的代码基于第一篇中的案例,需要将web.xml中关于SpringIOC容器的设置打开,然后在src下创建一个applicationContext.xml文件,并且添加一个第三方jar包Druid,作为数据库连接池      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来操作数据库,后面的代码就不再单独创建接口和实现类了,方便一点数据库建表      创建User实体类   创建UserDao层,实现与数据库的交互,实现查询指定id用户的信息   创建UserService层   创建UserController层,接收并处理用户的请求   在这里我们设置一个断点,测试一下能否接受到查询到的user对象,对于后面的视图渲染部分,先不执行,等下一节再分析现在开始执行断点调试   浏览器输入url,访问对应控制器,比如我这里是:http://localhost:8080/springmvc01/user/find?id=1,回车以后浏览器由于设置了断点会卡住,现在我们看一下断点调试中拿到的数据   可以看到我们的数据已经从数据库中取出了数据,对于上面的内容,只是完成了业务逻辑,还没有实现视图渲染,也就是将数据库中的数据以某种方式渲染到视图中,展示到前端.

    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就行了   在success.jsp中将会显示查询到的id=1的用户信息,我们可以通过EL表达式获取数据重新启动服务测试      测试成功,但是目前的前端技术中,使用Ajax技术很多,而使用Ajax的要求就是后端返回的数据必须是Json格式,SpringMvc也提供了视图的支持—MappingJackson2JsonView,但是这不是唯一的方法,更通用的方式是使用SpringMvc提供的@ResponseBody注解,这也是最主流的.

    1.4 小结

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