SpringInAction第五章学习笔记:SpringMVC

第五章:构建SpringWeb应用程序

5.1 SpringMVC起步
1、跟踪SpringMVC的请求
每当用户在浏览器中点击链接或提交表单的时候,请求就开始工作了。
SpringInAction第五章学习笔记:SpringMVC_第1张图片
1、第一站是SpringMVC的前端控制器DispatcherServlet。前端控制器是常用的Web应用程序模式,一个单实例的Servlet将请求委托给应用程序的其他组件来执行实际的处理。
2、前端控制器查询一个或多个处理器映射器,处理器映射器会根据请求的URL信息进行决策选择哪个控制器。
3、通过处理器适配器,去实际调用程序员所写的处理器(Controller),等待控制器处理信息并返回结果。
4、控制器返回视图,标示用于渲染输出的视图名。返回给前端控制器
5、前端控制器将视图名传递给视图解析器,去查找产生结果的真正视图。
6、返回视图渲染结果给用户。

2、搭建SpringMVC
(1)在web.xml中配置,并加载SpringMVC.xml
最简单的即使用web.xml配置前端控制器,一键配置。配置加载位于classpath下的spring*.xml文件(*代表后接任意),springMVC.xml配置示例如下,要配置注解启动,组件扫描,视图解析器,静态资源不被拦截。
SpringInAction第五章学习笔记:SpringMVC_第2张图片
SpringInAction第五章学习笔记:SpringMVC_第3张图片
(2)在Java类中配置
基于Spring3.1和Servlet3的规范,可以使用Java配置前端控制器在容器中,如下:
①继承AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动配置DispatcherServlet和Spring applicationContext,上下文会位于应用程序的Servlet上下文中。
★★在Servlet3.0中,容器会在类路径中查找实现了ServletContainerInitializer接口的类,如果有发现就会用它来配置Servlet容器。Spring提供了这个接口的实现,为SpringServletContainerInitializer,这个类会查找实现了WebApplicationInitializer的类并将配置任务交给其完成。Spring3.2提供了一个AbstractAnnotationConfigDispatcherServletInitializer
为基础实现。
②继承类覆写三个方法,分别为
·getServletMappings() 配置拦截路径,将一个或多个路径映射到DispatcherServlet
·getServletConfigClasses(),加载配置到SpringApplicationContext。(@Configuration注解的类)
★★DispatcherServlet启动时,会创建Spring applicationContext ,并加载配置文件或配置类,所以使用getServletConfigClasses()加载的所需的配置类。
·getRootConfigClasses(),加载配置到ContextLoaderLister(@Configuration注解的类)。
★★DispatcherServlet启动时,也会创建ContextLoaderListener ,SpringWeb通常还有另外一个上下文由ContextLoaderListener创建,我们希望用Spring上下文加载包含Web组件的Bean(控制器/视图解析器/处理器映射器),而通过ContextLoaderListener加载其他bean(通常是驱动应用后端的中间层和数据层组件)。

编写前端控制器配置类如下,拦截“/”,分别加载两个类到ApplicationContext和ContextLoaderListener
SpringInAction第五章学习笔记:SpringMVC_第4张图片
两个配置类如下:
SpringInAction第五章学习笔记:SpringMVC_第5张图片
SpringInAction第五章学习笔记:SpringMVC_第6张图片
5.2编写基本的控制器
在控制器上添加@RequestMapping注解,声明这个类所要处理的请求。在能被扫描到的包中编写控制器,@Controller和@Component内容几乎相同。在方法中,注解@RequestMapping声明要处理“/test”,Get请求便会调用此方法。方法返回一个字符串,由于配置了视图解析器,所以返回的实际视图为 /WEB-INF/jsp/test.jsp。在此文件夹中编写一个测试的jsp。
SpringInAction第五章学习笔记:SpringMVC_第7张图片
1、编写测试类来测试控制器
从Spring3.2开始,包含了一种mock SpringMVC并针对控制器执行HTTP请求的机制,可以通过控制器的方式来测试SpringMVC中的控制器。
SpringInAction第五章学习笔记:SpringMVC_第8张图片
搭建一个MockMvc,对/test进行get的请求,断言结果视图为test123。

2、定义类级别的请求处理
也可以将请求处理注解在类上,将其合并到方法上的Mapping,即此时的请求是/test/totestPge上
SpringInAction第五章学习笔记:SpringMVC_第9张图片

3、传递模型数据到视图中
编写Service如下,模拟从后端取数据
SpringInAction第五章学习笔记:SpringMVC_第10张图片
测试用例如下,用Mock生成一个模拟的Service。期望返回的视图和数据:
SpringInAction第五章学习笔记:SpringMVC_第11张图片
返回了一个spittleList,可以在前端jsp中使用jstl的标签渲染spittle列表。

5.3接受请求的输入
SpringMVC允许多种方式将客户端的数据传送到控制器的处理器方法中。
·查询参数(Query Parameter)
·表单参数(Form Parameter)
·路径变量(Path Variable)

1、处理查询参数
在controller中,设置传入max和count参数(@RequestParam意为将url中参数为”max”的值绑定到long max中,默认是与形参名相同,所以这里没任何作用。)
SpringInAction第五章学习笔记:SpringMVC_第12张图片
测试用例如下,从URL传入两个值,可以实际调用得到值(因mock假设了对应的调用能得到值),没有异常,说明controller得到了url的值,Service实际调用了对应值。
SpringInAction第五章学习笔记:SpringMVC_第13张图片
@RequestParam()中可以设置默认值和是否必须, name参数和value是相同的意思没有区别。
@RequestParam(value = “max” , required = false , defaultValue = “100”) long max

2、通过路径参数接受输入
这种方法通过REL路径进行标示,识别出要查询的资源。
此时通过/spittles/{spittleId}即可传递值进入,不再需要将参数附在后面的查询参数中,在@RequestMapping中使用{spittleId}占位符,在参数中使用@PathVariable(“spittleId”)注解表明在路径中,将占位符部分的值传递到形参的spittleId中。如果形参和占位符名称相同,也可以注解只注解@PathVariable。
SpringInAction第五章学习笔记:SpringMVC_第14张图片
SpringInAction第五章学习笔记:SpringMVC_第15张图片
5.4处理表单
如果要传递大量数据,可以通过表单传递数据。
1、直接用对象接受post的表单数据。
定义如下controller进行注册,注意在post方法中,直接传入了一个Spittle对象,SpringMVC会自动进行封装(必须有无参构造函数,并且有set方法,属性名和前端传的参数名相同)。
SpringInAction第五章学习笔记:SpringMVC_第16张图片
注意:return的时候为”redirect:”,则InternalResourceViewResolver视图解析器会知道将其解析为重定向规则,也可以将其以”forward:”,作为转发转发路径,不解析视图格式。
测试用例如下:
SpringInAction第五章学习笔记:SpringMVC_第17张图片

2、校验表单
如果想校验某个值的值(例如不为空或必须满足长度条件等),Spring提供了Java Validation API,其中定义了多个注解,放到属性上即可限制属性的值。所有的注解都位于javax.validation.constraints包中。
·@AssertFalse 必须是Boolean且为flase
·@AssertTrue 必须是Boolean且为true
·@DecimalMax 必须是数字,且值小于等于给定的Big Decimal String值
·@DecimalMin 必须是数字,且值大雨等于给定的Big Decimal String值
·@Digits 必须是数字,且值必须有指定的位数
·@Future 必须是一个未来的日期
·@Past 必须是一个过去的日期
·@Max 必须是数字,且值小于等于给定的值
·@Min 必须是数字,且值大于等于给定的值
·@NotNull 必须不能为null
·@Null 必须为null
·@Pattern 必须匹配给定的正则表达式
·@Size 必须是String、集合或数组,长度符合给定的范围

SpringInAction第五章学习笔记:SpringMVC_第18张图片
SpringInAction第五章学习笔记:SpringMVC_第19张图片
必须在SpringMVC中用@Valid告知Spring启用对Spittle的校验,添加Errors类对象,以判断是否有错误,错误信息会封装在errors中。

你可能感兴趣的:(SpringInAction)