活动地址:CSDN21天学习挑战赛
目录
一.Spring MVC入门
Spring MVC是Spring提供的一个轻量级Web框架,它实现了 Web MVC设计模式。Spring MVC在使用和性能等方面比另外一个框架Struts2更加优异。
它有以下特点:
- SpringMVC 具有强大的灵活性、非侵入性和可配置型。
- SpringMVC 提供了一个前端控制器DispatcherServlet,尅发着无须额外开发控制器对象。
- SpringMVC 分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析器,等等,每一个功能实现由一个专门的对象负责完成。
- SpringMVC可以自动绑定用户输入,并正确地转换数据类型。例如,SpringMVC 能自动解析字符串,并将其设置为模型的int或float类型的属性。
- SpringMVC使用一个名称/值de Map对象实现更加灵活的模型数据传输。
- SpringMVC内置了常见的校验器,可以校验用户输入,如果校验不通过,则重定向回输入表单。输入校验是可选的,并且支持编程方式及声明方式。
- SpringMVC支持国际化,支持根据用户区域显示多国语言,并且国际化的配置非常简单。
- SpringMVC支持多种视图技术,最常见的有JSP技术以及其他技术,包括Velocity和FreeMarker。
- SpringMVC提供了一个简单而强大的JSP标签库,支持数据绑定功能,使得编写JSP页面更加容易。
1.第一个Spring MVC应用
1.创建项目,引入JAR包
在 Eclipse中,创建一个名称为 chapter11的Web项目,在项目的lib目录中添加运行 Spring MVC程序所需要的JAR包,并发布到类路径下。
项目中添加了4个核心JAR包、 commons-logging的JAR包以及两个Web相关的JAR包,这两个Web相关的JAR包就是 Spring MVC框架所需的JAR包
2.配置前端控制器
在web.xml中,配置Spring MVC的前端控制器DispatcherServlet。
3.创建 Controller类
在src目录下,创建一个 controller包,并在包中创建控制器类ControllerTest,该类需要实现 Controller接口。
本案例中,向模型对象中添加了一个名称为msg的字符串对象,并设置返回的视图路径为 welcome. jsp”,这样,请求就会被转发到 welcome. jsp页面。
4.创建 Spring MVC的配置文件,配置控制器映射信息
在src目录下,创建配置文件 springmvc-config.xml,并在文件中配置控制器信息。
注意:在老版本的Spring中,配置文件内必须要配置处理器映射器、处理器适配器和视图解析器。但在 Spring4.0以后,如果不配置处理器映射器、处理器适配器和视图解析器,也会使用 Spring内部默认的配置来完成相应的工作。
5.创建视图(View)页面
在web-app下创建 welcome. jsp,在该页面中使用EL表达式获取msg中的信息。
6.启动项目,测试应用
将chapter11项目发布到Tomcat服务器并启动服务器。
在浏览器中访问:http://localhost: 8848/chapter11/controllerTest
具体参考:我的第一个Spring MVC应用的过程与解释_无忧#的博客-CSDN博客
2.Spring MVC的注解
在 Spring2.5之前,只能使用实现 Controller接口的方式来开发一个控制器,上节中的案例就是使用的此种方式。在 Spring2.5之后,新增加了基于注解的控制器以及其他一些常用注解,这些注解的使用极大地减少了程序员的开发工作。
(1).DispatcherServlet
DispatcherServlet的全名是org. springframework. web. servlet. DispatcherServlet,它在程序中充当着前端控制器的角色。在使用时,只需将其配置在项目的 web.xml文件中。
配置代码如下:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<int-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</int-param>
<load-on-startup>1</load-on-startup>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</servlet>
(2).Controller注解类型
org. springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,其注解形式为@Controller。该注解在使用时不需要再实现 Controller接口,只需要将@ Controller注解加入到控制器类上,然后通过 Spring的扫描机制找到标注了该注解的控制器即可。
@Controller注解在控制器类中的使用示例如下:
@Controller
public class ControllerTest{
……
}
为了保证Spring能够找到控制器类,还需要在Spring MVC配置文件中添加相应的扫描配置信息:
<context:component-scan base-package="controller"/>
注意:在使用注解方式时,需要导入spring-aop.jar
(3).RequestMapping注解类型
(1).@ RequestMapping注解的使用:
Spring通过@Controller注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的,这就需要使用org.springframework.web.bind.annotation.RequestMapping注解类型。
(2).@ RequestMapping注解的属性:
@ RequestMapping注解除了可以指定 value属性外,还可以指定其他一些属性。所有属性都是可选的,但其默认属性是value。当value是其唯一属性时,可以省略属性名,例如下面两种标注的含义相同。
@RequestMapping(value="/annotationController")
@RequestMapping("/annotationController")
(3).组合注解
而在Spring框架的4.3版本及以后的版本中,引入了组合注解来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。
(4).请求处理方法的参数类型和返回类型
在控制器类中,每一个请求处理方法都可以有多个不同类型的参数,以及一个多种类型的返回结果。
①.redirect重定向
例如,在修改用户信息操作后,将请求重定向到用户查询方法的实现代码如下:
@RequestMapping(value="/update")
public string update(httpServletRequest request,HttpServletRespoNse response,
Model model){
……
//重定向请求路径
return "redirect: queryUser";
}
②.forward请求转发
例如,用户执行修改操作时,转发到用户修改页面的实现代码如下 :
@RequestMapping(value="/toEdit")
public string toEdit(httpServletRequest request,HttpServletRespoNse response,
Model model){
……
//请求转发
return "forward:editUser";
}
(4).ViewResolver(视图解析器)
Spring MVC中的视图解析器负责解析视图,可以在配置文件中定义一个ViewResolver来配置视图解析器,其配置示例如下:
<!-- 定义视图解析器 -->
<bean id="viewResolver "
class=" org.springframework.web.servlet.view.InternalResourceViewResolver ">
<!-- 设置前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!--设置后缀-->
<property name="suffix" value=".isp" />
</bean>
3.基于注解的Spring MVC应用
对第一个Spring MVC应用进行修改
(1).搭载项目环境
(2).修改配置文件
(3).修改Controller类
(4).启动项目
详情参考:基于注解的Spring MVC实例开发过程_无忧#的博客-CSDN博客
二.Spring MVC数据绑定
1.数据绑定概述
在执行程序时,Spring MVC根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中。这种将请求消息数据与后台方法参数建立连接的过程就是 Spring MVC中的数据绑定。
根据客户端请求参数类型和个数的不同,将 Spring Mvc中的数据绑定主要分为简单数据绑定和复杂数据绑定。
2.简单数据绑定
(1).绑定默认数据类型
当前端请求的参数比较简单时,可以在后台方法的形参中直接使用 Spring MVC提供的默认参数类型进行数据绑定。
常用的默认参数类型如下:
- HttpServletRequest:通过request对象获取请求信息。
- HttpServletResponse:通过 response处理响应信息。
- HttpSession:通过session对象得到session中存储的对象。
- Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将Model数据填充到request域。
(2).绑定简单数据类型
简单数据类型的绑定,就是指Java中几种基本数据类型的绑定,如int、String、Double等类型。
selectUser()方法的参数修改为使用简单数据类型的形式。
@RequestMapping(value="/selectUser")
public String selectUser(Integer id) {
System.out.println("id="+id);
return "success";
}
(3).绑定POJO类型
在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较烦琐。此时就可以使用POJO类型进行数据绑定。
POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。
(4).绑定包装POJO
所谓的包装POJO,就是在一个POJO中包含另一个简单POJO。例如,在学生对象中包含班级对象。这样在使用时,就可以通过学生查询到班级信息。
3.复杂数据绑定
(1).绑定数组
实际项目开发中,除了简单数据类型,还会经常遇到一些比较复杂的数据绑定问题,比如数组的绑定、集合的绑定。
在实际开发时,可能会遇到前端请求需要传递到后台一个或多个相同名称参数的情况(如批量删除),此时不合适采用简单数据绑定,而可以使用绑定数组的方式。
(2).绑定集合
在项目中,前端请求传递过来的数据可能就会批量包含各种类型的数据,如 Integer、String等。这种情况使用数组绑定是无法实现的。针对这种情况,可以使用集合数据绑定,即在包装类中定义一个包含对象类的集合,然后在接收方法中将参数类型定义为该包装类的集合。
三.JSON数据交互和RESTful支持
Spring MVC中的数据绑定需要对传递数据的格式进行转换,除了简单类型和复杂数据类型,实际上还包括了JSON等其它类型的数据。
1.JSON数据交互
JSON与XML非常相似,都是用于存储数据的,但JSON相对于XML来说,解析速度更快,占用空间更小。
JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,最近几年才流行起来。JSON是基于JavaScript的一个子集,使用了C、C++、C#、Java、 JavaScript、Per、 Python等其他语言的约定,采用完全独立于编程语言的文本格式来存储和表示数据。
(1).JSON概述
与XML一样,JSON也是基于纯文本的数据格式。初学者可以使用JSON传输一个简单的String、 Number、 Boolean,也可以传输一个数组或者一个复杂的 Object对象。
JSON有如下两种数据结构:
- 对象结构
- 数组结构
①.对象结构:
对象结构以“{”开始,以“}”结束。中间部分由0个或多个以英文“,”分隔的“key:value”对构成,其中key和value之间也是英语“:”。对象结构的语法结构代码如下:
{
keyl: valuel,
key2: value2,
……
}
其中关键字(key)必须为String类型,值(value)可以是String、Number、Object、Array等数据类型。例如,一个address对象包含城市、街道等信息,使用JSON的表示形式如下:
{"city":"Guangzhou","street":"Zhongsan Road" }
②.数组结构:
数组结构以“[”开始,以“]”结束。中间部分由0个或多个以英文“,”分隔的值的列表组成。数组结构的语法结构代码如下:
[
valuel,
value2,
……
]
例如,一个数组包含String、Number、Boolean、null类型数据,使用JSON的表示形式如下。
["jack",27,false,null]
JSON这两种数据结构可以分别组合构成更为复杂的数据结构。例如,一个person对象包含name、hobby和address对象,其代码表现形式如下:
{
"name":"zhangsan",
"hobby":["羽毛球","读书"],
"address":{
"city": "Guangzhou",
"street": "Zhongsan Road"
}
}
(2).JSON数据转换
为了实现浏览器与控制器类(Controller)之间的数据交互,Spring提供了一个HttpMessageConverter<T>接口来完成此项工作。
MappingJacksona2HttpMessageConverter是 Spring MVC默认处理JSON格式请求响应的实现类。该实现类利用 Jackson开源包读写JSON数据,将Java对象转换为JSON对象和XML文档,同时也可以将JSON对象和XML文档转换为Java对象。
要使用MappingJacksona2HttpMessageConverter对数据进行转换,就需要使用 Jackson的开源包,开发时所需的开源包及其描述如下所示:
- jackson-annoations-2.11.0.rc1.jar:JSON转换注解包。
- jackson-core-2.8. 8.jar:JSON转换核心包。
- Jackson- databind-2.8.8.jar:JSON转换的数据绑定包。
以上3个 Jackson的开源包可以通过链接:
https://mvnrepository.com/artifact/com.fasterxml.jackson.core
在使用注解式开发时,需要用到两个重要的JSON格式转换注解@RequestBody和@ ResponseBody。
注解 |
说明 |
@RequestBody |
用于将请求体中的数据绑定到方法的形参中,该注解用在方的形参上。 |
@ResponseBody |
用于直接返回return对象,该注解用在方法上。 |
(3).RESTful支持
Spring MVC除了支持JSON数据交互外,还支持 RESTful风格的编程。
RESTful也称之为REST(Representational State Transfer),可以将它理解为一种软件架构风格或设计风格。
RESTful风格就是把请求参数变成请求路径的一种风格。
例如,传统的URL请求格式为:http://.../queryitems?id=1
而采用RESTful风格后,其∪RL请求为:http://.../items/1
(4).Spring MVC使用JSON的过程与步骤
参考:
四.拦截器
拦截器的使用非常普遍,例如,在OA系统中通过拦截器可以拦截未登陆的用户,或者使用它来验证已登录的用户是否有相应的操作权限等。Spring MVC中提供了拦截器功能,通过配置即可对请求进行拦截。
1.拦截器概述
Spring MVC中的拦截器类似于Servlet中的过滤器,它主要用于拦截用户请求并做相应的处理。例如:通过拦截器可以进行权限验证,判断用户是否已经登录等。
(1).拦截器的定义
要使用 Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
一种是通过实现 HandlerInterceptor接口,或者继承 HandlerInterceptor接口的实现类来定义;另一种是通过实现 WebRequestInterceptor接口,或继承 WebRequestInterceptor接口的实现类来定义。自定义的拦截器类实现了HandlerInterceptor接口,并实现了接口中的三个方法。
(2).拦截器的配置
要使自定义的拦截器类生效,需要在Spring MVC的配置文件中进行配置,配置代码如下所示。
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/**" />
<!-- 配置不需要拦截器作用的路径 -->
<mvc:exclude-mapping path="" />
<!-- 定义在<mvc:interceptor下面的,表示对匹配路径的请求才进行拦截 -->
<bean class="interceptor.Interceptor1" />
</mvc:interceptor>
或者
<mvc:interceptor>
<mvc:mapping path="/hello" />
<bean class="interceptor.Interceptor2" />
</mvc:interceptor>
path的属性值"/**"表示拦截所有路径,"/hello"表示拦截所有以"hello"结尾的路径。如果需要在请求路径中包括不需要拦截的内容,则可以通过<mvc:exclude-mapping>元素进行配置。
2.拦截器的执行流程
如果在项目中只定义了一个拦截器,那么该拦截器在程序中的执行流程如图所示。
在大型项目中,通常会定义很多拦截器来实现不同的功能。多个拦截器的执行顺序如图所示。
3.验证拦截器的执行流程
参考: