初始Spring MVC框架:
MVC设计模式:
比较常见的Web项目,其架构模式基本一致,都进行了分层设计:
1.DAO层: 数据访问接口
2.Service层: 处理业务逻辑
3.pojo层: 数据实体
4.Servlet: 负责前端请求的接收并处理
5.jsp: 负责前端页面展示
这种架构模式就是MVC设计模式, 它将软件系统的输入,处理和输出被强行分开,把软件系统分为三个基本部分: 模型(Model). 视图(View). 控制器(Controller)
-
View(视图): 负责格式化数据并呈现给用户, 包括数据展示, 用户交互, 数据验证, 界面设计等功能,对应的组件为JSP或者HTML文件
-
Controller(控制层):负责接收并转发请求, 对请求进行处理后指派视图并相应结果发给客户端,其对应组件为Servlet
-
Model(模型): 模型对象拥有最多的处理任务, 是应用程序的主体部分, 他负责数据逻辑(业务规则)的处理和实现数据操作(在数据库中存取数据), 其对应组件是JavaBean
MVC中最重要的核心就是控制器, 控制器与视图和模型相对独立,起到分发请求和返回处理结果的作用, 对请求和数据模型的处理一般由JavaBean负责.
控制层可把不同的视图和模型组合在一起, 已完成不同的请求. 因此,控制层包含了用户请求权限的概念.
对于Web应用,即使将多个JSP页面都注册给一个模型, 当模型发生变化时也无法主动给JSP页面发送消息(因为Web应用都是基于请求/响应模式的),只有当用户请求浏览该页面时,控制器才负责调用模型数据来更新JSP页面.
在Spring框架中,Controller替换Servlet来担负控制器的职责, Controller接收请求, 并调用相应的Model来进行处理, 处理完成后返回结果.Controller调用相应的View并对处理结果进行视图渲染, 最终客户端得到响应.
关于SpringMVC项目的配置:
1.引入jar包
2.在web.xml中配置前端控制器:
由于SpringMVC是基于Servlet的, 所以DispatcherServlet是整个Spring MVC的核心, 他负责截获请求并将其分派给相应的处理器. 那么配置Spring MVC框架,首先就要进行DispatcherServlet的配置,当然跟所有的Servlet一样,用户必须在web.xml中进行配置. 示例:
html
<!-- springMVC的前端控制器-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 -->
<init-param>
<!-- contextConfigLocation为固定值 -->
<param-name>contextConfigLocation</param-name>
<!-- 使用classpath:表示从类路径查找配置文件,例如maven工程中的src/main/resources -->
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!--
作为框架的核心组件,在启动过程中有大量的初始化操作要做
而这些操作放在第一次请求时才执行会严重影响访问速度
因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!--
设置springMVC的核心控制器所能处理的请求的请求路径
/所匹配的请求可以是/login或.html或.js或.css方式的请求路径
但是/不能匹配.jsp请求路径的请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
3.创建Controller类
4.创建Spring MVC框架的配置文件,配置控制器映射信息
5.创建视图(View)页面.
自此基本的SpringMVC项目配置完成
配置处理器映射:
在web.xml配置文件中配置了DispatcherServlet,并配置了哪些请求需要通过此Servlet进行相应的处理. 那么接下来DispatcherServlet要将一个请求交给哪个特定的Controller处理呢? 他需要咨询一个Bean, 这个Bean就叫HandlerMapping, 其作用就是把一个URL请求指定给一个Controller处理(应用系统的web.xml文件使用<servlet-mapping>将URL映射到相应的Servlet上). Spring框架提供了很多种处理器映射
注意: 如果没有明确声明任何处理器映射,Spring框架就会默认使用BeanNameUrlHandlerMapping,即在Spring容器中查找与请求URL同名的Bean.这个映射器不需要配置,可根据请求的URL路径映射到控制器Bean的名称.
Spring MVC的配置文件的命名需要注意, 必须同在web.xml中配置DispatcherServlet时所指定的配置文件名称一致,一般命名为<servlet-name>-servlet.xml,如springmvc-servlet.xml
使用注解处理器映射:
最常用的是Spring MVC框架提供的一键式配置方法:<mvc:annotation-driven/>通过注解的方式来进行开发. 配置此标签后,SpringMVC框架会自动进行一些注册组件之类的操作.
简单理解就是配置此标签后,就可以通过注解的方式,把一个URL映射到Controller上.示例:
html
<context:component-scan base-package="cn.dsscm.controller"/>
<mvc:annotation-driven/>
- 配置 <mvc:annotation-driven/>时会自动注册DefaultAnnotationHandlerMapping(处理器映射)与AnnotationMethodHandlerAdapter(处理器适配器)这两个Bean. Spring MVC框架需要通过这两个Bean实例来完成对@Controller和@ResquestMapping等注解的支持.从而找出URL与Handler Method的关系予以关联. 换句话说,完成在Spring容器中这两个Bean的注册时SpringMVC为@Controller分发请求的必要支持.
2.配置<context:component-scan base-package="cn.dsscm.controller"/>: context:component-scan标签是对包进行扫描,实现注解驱动Bean的定义. 同时将Bean自动注入容器中使用.即使标注了SpringMVC框架的注解(如@Controller等)的Bean生效,换句话说,若没有配置此标签,那么标注@Controller的Bean仅仅是一个普通的JavaBean,而不是一个可以处理请求的控制器.
SpringMVC框架的工作流程和优势:
请求处理的流程步骤:
1.首先用户发送请求到前端控制器(DispatcherServlet),前端控制器根据请求信息(如URL)来决定选择由哪个页面控制器(Controller)来进行处理, 并把请求委托给他,
2.页面控制器接收到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)
3.前端控制器收回控制权,然后根据返回的逻辑视图名选择相应的真正视图,并把模型数据传入以便将视图进行渲染展示.
4.前端控制器再次收回控制权,将响应结果返回给用户.至此整个流程结束.
在整个框架中,通过一个前端控制器(DispatcherServlet)接受所有的请求, 并将具体的工作委托给其他组件进行处理, DispatcherServlet处于核心地位, 他负责协调组织不同组件完成请求处理并返回响应.
关于前端控制器的配置:
<load-on-startup>元素和<init-param>元素都是可选的,如果<load-on-startup>元素的值为1 ,则必阿是在应用程序启动时就会立即加载该Servlet;如果<load-on-startup>元素不存在,则应用程序会在第一个Servlet请求时加载该Servlet. 如果<init-param>元素存在并通过其子元素配置了Spring MVC框架配置文件的路径,则应用程序在启动时会加载配置路径下的配置文件; 如果没有通过<init-param>元素配置,则应用程序会默认到WEB-INF目录下面寻找如下方式命名的配置文件: servletName-servlet.xml servletName是指部署在web.xml中的DispatcherServlet的名称,在上面web.xml配置代码中即为springMVC,而-servlet.xml是配置文件的固定写法,所以应用程序会在WEB-INF目录下面寻找springMVC-servlet.xml.
在控制器类中每一个请求处理方法都可以有多个不同类型的参数,以及一个多种类型的返回结果.
关于返回类型:常用的就是ModelAndView, String, void其中ModelAndView类型可以携带Model数据, 并指定视图; String类型的返回值可以跳转视图, 但是不能携带数据; void类型主要在异步请求时使用,他只能返回数据,不会跳转视图.
由于ModelAndView类型未实现数据与视图之间的解耦,所以在企业开发时,方法的返回类型通常都会使用String类型:通过Model参数类型,即可添加需要在视图中显示地属性, 示例:
model.addAttribute("msg", "giao起来");
String类型还可以用于重定向和请求重发:
1.重定向到queryUser方法:
java
return "redirect:queryUser";
2.转发到用户修改页面:
java
return "forward:editUser";
数据交互与绑定:
在执行程序时, Spring MVC框架会根据客户端请求参数的不同,将请求消息中的以一定的方式转换并绑定到控制器类的方法参数中. 这种将请求消息数据与后台方法参数建立连接的过程就是SpringMVC框架的数据绑定
关于信息处理过程的步骤描述如下:
-
SpringMVC框架将ServletRequest对象传递给DataBinder
-
将处理方法的入参对象传递给DataBinder
-
DataBinder调用ConversionService组件进行数据类型转换,格式化等工作,并将ServletRequest对象中的消息填充到参数对象.
4.调用Validator组件对已经绑定了请求消息数据的参数进行数据合法性校验
5.校验完成后会生成数据绑定结果BindingResult对象,SpringMVC框架会将BandingResult对象中的内容赋给处理方法的相应参数
简单参数传递:
View to Controller:
1. 绑定默认数据类型:
(1). HttpServletRequest: 通过request对象获取请求信息
(2). HttpServletResponse: 通过response对象获取信息
(3). HttpSession: 通过session对象获取信息
(4). Model/ ModelMap: Model是一个接口,ModelMap是一个接口实现,作用是将model数据填充到request域.
2.绑定简单数据类型:
如;int String Double,这里主要是修改控制器类中的方法的参数类型,修改为使用简单数据类型的形式.
有时候前端请求中参数名和后台控制器类方法名中的形参名不一致, 这就会导致后台无法正确绑定并接收到前端请求的参数. 为此SpringMVC框架提供了@RequestParam注解来进行间接数据绑定.
@RequestParam注解用于对请求的参数进行定义:
四个属性:
1.value: name属性的别名,这里指参数的名字, 即入参的请求参数的名字,如value="item_id"表示请求参数中昂传入名字为item_id的参数值. 如果只使用了value属性,则可以省略value属性名
-
name: 指定请求头绑定的名称
-
required: 用于指定参数是否是必需, 默认为true,表示请求中一定要有相应的参数
-
defaultValue: 默认值,表示如果请求中没有同名参数时的默认值.
示例:
java
@RequestMapping("/selectUser")
Public String selectUser(@RequestParam(value="user_id")Integer id) {...}
上述代码会把请求中user_id参数的值赋给方法中的id形参
Http请求信息除了请求的URL地址, 还包括很多其他信息,如请求方法(POST, GET),HTTP协议及版本,HTTP的报文头, HTTP的报文体. 因此@RequestMapping除了可以使用URL映射请求, 还可以使用请求方法,请求参数等映射请求.
使用RequestMapping完成映射时,具体包括4个方面的信息箱, 即请求URL, 请求参数, 请求方法和请求头.
1. 通过请求URL进行映射
示例:
java
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/welcome")
public String welcome(@RequestParam("username") String name)) {...}
}
在类定义处的"/user"是相对于Web应用的部署路径,而在方法处指定的URL则是相对于类定义处指定的URL. 若在类定义处未标注@RequestMapping.此时方法处的URL则是相对于Web应用的部署路径.
在整个Web项目中,@RequestMapping映射的请求信息必保证全局唯一.
在实际项目开发中,通常会在不同业务的Controller的类定义处指定相应的@RequestMapping(把同一个Controller的操作请求都安排在同一个URL下),以便于区分请求.
对于@RequestMapping的value,通过源码发现其返回值是一个String[],也就是说可以写成如下格式:
java
@RequestMapping( {"/index", "/"} )
那么它的含义是请求地址为以"/index"和"/"结尾的都可以进入该处理方法.
2. 通过请求参数,请求方法进行映射@RequestMapping
除了可以使用请求URL映射请求,还可以通过请求参数,请求方法来映射请求,通过多条件可以让请求映射更加精准. 示例:
java
@RequestMapping(value="/welcome", method=RequestMethod.GET, params="username")
public String welcome(String username) {...}
如果选择方法参数直接入参, 方法名必须和请求中参数名保持一致.
3.绑定POJO类型:
POJO类型绑定数据就是将所有关联的请求封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定
在使用POJO类型数据绑定时,前端请求的参数名必须与绑定的POJO类型中的属性名一样, 这样才会自动的将请求数据绑定到POJO对象中,否则接收的参数值为null.
4.绑定包装POJO类型:
包装POJO类型就是在一个POJO类型中包含另一个简单的POJO类型
在使用包装POJO类型数据进行绑定时,前端请求的参数名编写必须符合一下两种情况:
(1)如果查询条件参数就是包装类的直接基本属性,则参数名直接用对应的属性名
(2)如果查询条件参数是包装类中POJO类型的子属性,则参数名必须为"对象.属性",其中"对象"要和包装POJO类型中的对象属性名称一致, "属性"要和包装POJO类型中对象的子属性一致.
Controller to View:
1. ModelAndView:
既包含视图信息又包含模型数据信息
通过addObject方法添加模型数据
通过setViewName方法设置逻辑视图名
2.Model:
通常SpringMVC框架在调用方法之前会创建一个隐含的模式对象,作为模型数据的存储容器, 一般称为"隐含模型". 若处理方法的入参为Model类型,SpringMVC框架会将隐含模型的引用传递给这些入参. 简单地说,就是在方法体内,开发人员可以通过一个Model类型的入参对象访问到模型中的所有数据, 当然也可以往模型中添加新的属性数据.方法为addAttribute(key, value),其中key不是必需的.这样的情况下会默认使用value的类型为key,如model.addAttribute(username), username是String类型,则key为字符串''string''.
3.Map:
Model其实就是一个Map数据结构,所以使用Map作为处理方法入参也是可行.示例:
java
@RequestMapping("/index")
public String giao(String username, Map<String, Object> model){}
4.@ModelAttribute:
5.@SessionAttribute:
关于请求头:
在Spring MVC中,请求头(HTTP Request Headers)是HTTP请求的重要组成部分,它们包含了客户端发送给服务器的各种元数据信息。这些请求头提供了关于请求和客户端的额外信息,有助于服务器理解和处理请求。以下是对Spring MVC中请求头的详细解释:
一、请求头的作用
请求头用于向服务器传递关于客户端和请求的各种信息,包括但不限于:
客户端信息:如User-Agent,表示发出请求的客户端类型(如浏览器、操作系统等)。
请求内容信息:如Content-Type,表示请求体的媒体类型(如application/json、text/html等)。
认证信息:如Authorization,用于携带认证信息(如令牌、密码等)。
缓存控制:如Cache-Control,用于控制缓存行为。
虽然HTTP请求头通常在客户端发送请求时设置,且一旦请求被发送到服务器,请求头就不能再被修改(因为HTTP协议本身不支持修改请求头),但在Spring MVC中,可以通过一些方式"模拟"或"添加"请求头信息,或者设置响应头
复杂数据绑定:
1.绑定自定义数据:
有些特殊类型的参数无法在后台进行直接转换,如日期, 这就需要开发人员自定义转换器(Converter)或者格式化(Formatter)来进行数据绑定.
1.Converter:
用于将一种类型的对象转换为另一种类型的对象.
自定义Converter类需要实现Converter接口:
java
public interface Converter<S, T> {
T convert(S source);
}
S表示源类型,T表示目标类型
当我们写了一个转换器类后,为了让SpringMVC知道并使用这个转换器,还需要在其配置文件中编写一个id为conversionService的Bean
schema信息是用于定义和配置自定义元素的机制
2.Formatter:
Formatter和Converter的作用相同, 只是Formatter的源类型必须是一个String类型,而Converter可以是任意类型.
使用Formatter自定义转换器类只需要Formatter接口
2.绑定数组:
对于一些复选框可以使用数组来接收:
java
public String giao(Integer[] ids)
3.绑定集合:
在包装类中定义一个包含用户信息类的集合,然后在接收方法中将参数类型定义为该包装类
在使用集合数据绑定时,后台方法不支持直接使用集合形参进行数据绑定,所以需要使用包装将POJO作为形参,然后在其中包装一个集合属性.
JSON数据交互:
JSON是一种新的数据格式, 他与XML非常类似,都是用于存储数据的,但是JSON相对于XML来说,解析速度更快,占用空间更小. 因此在实际开发中,使用JSON格式的数据进行前后台的数据交互是很常见的.
JSNO(JavaScript Object Notation, JS对象标记)是一种轻量级的数据交换格式
JSNO有两种数据结构:
1.对象结构:
对象结构以{}包裹, 中间部分有0个或多个英文","分隔的name:value对构成, 示例:
html
{
key1:value1,
key2:value2,
...
}
其中关键字必须为String
2.数组结构:
数据结构以[]包裹, 中间部分由0个或多个以英文","分隔的值的列表组成, 示例:
html
["abc", 13, false, null]
可以在一个数组中存储多种类型的数据,
数组结构和对象结构可以分别组合构成更加复杂的数据结构.
注意: 如果使用JSON存储单个数据,一定要使用数组的形式, 而不能使用Object形式, 因为Object必须是"名称:值"的形式.
JSON数据转换:
为了实现浏览器与控制器类之间的数据交互,Spring框架提供了一个HttpMassageConverter<T>接口来完成此项工作. 该接口主要用于将请求信息中的数据转换为一个类型为T的对象,并将类型为T的对象绑定到请求方法的参数中,或者将对象转换为相应信息传递给浏览器显示.
在项目选型时可以使用Gson和FastJson两种技术并行使用,若仅是功能要求,可以使用Gson;若对性能有要求可以先使用Gson将Bean转换JSON以确保数据的正确, 再使用FastJSON转换Bean
使用注解开发时,需要用到两个重要的JSON格式转换注解, 分别为
@RequestBody: 用于将请求体中的数据绑定到方法的形参中,该注解用在方法的形参上
@ResponseBody: 用于直接返回return对象, 该注解用在方法上.
<mvc:annotation-drivern />: SpringMVC框架的注解驱动
<mvc:resources../>用于配置静态资源的访问路径,由于在web.xml中配置的"/"会将页面中引入的静态文件进行拦截,而拦截后页面中找不到这些静态资源文件, 这样就会引起页面报错, 但是增加了静态资源的访问映射配置后,程序就会自动的去配置路径下找静态的内容
<mvc:resources../>有两个重要属性:
- location: 用于定位需要访问的本地静态资源文件路径,具体到某个文件夹
mapping: 匹配静态资源全路径.
${pageContext.request.contextPath}: 用于获取当前的上下文路径, 即部署在Servlet容器上的web应用的一个URL路径部分.
传递JSON数据思路: 当点击一个按钮后,执行一个函数:在函数中使用jQuery的AJAX方式将JSON格式的一些数据传递到指定的某个请求中.
在AJAX中包含了三个重要属性:
- data: 指请求时携带的数据,当使用JSON格式时,要注意编写规范
2.contentType: 当请求数据为JSON时,值必须为application/json
3.dataType: 当相应数据为JSON格式时,可以定义dataType属性, 而且值必须为json
其中dataType:json也可以省略不写, 页面会自动识别响应的数据格式.
使用jQuery的AJAX进行数据提交和响应的, 所以还需要引入jquery.js文件.
解决JSON数据传递过程中的常见问题:
- 中文乱码: 在Springmvc配置文件中装配消息转换器
2.日期格式问题:
方式1: 使用注解: JSONField(format="yyyy-MM-dd")
方式2: 配置FastJson的消息转换器
RESTful支持:
RESTful风格就是一种把请求参数变成请求路径的一种风格
RESTful风格中的URL不存在动词形式的路径.
比较:
html
http://.../queryItems?id=1
http://.../items/1
文件上传和下载与拦截器机制:
文件的上传和下载是项目开发中最常用的功能,如图片的上传和下载.
在实际项目中,拦截器的使用也是非常普遍的,比如关于用户是否登录的拦截等.
文件上传:
多数文件上传都是通过表单的形式提交给后台服务器的,因此,要实现文件的上传功能就需要提供一个文件上传的表单,而该表单必须满足三个条件:
1.form表单的method属性设置为post
2.form表单的enctype属性设置为multipart/from-data
3.提供<input type="file" name="filename" />的文件上传输入框
当客户端form表单的enctype属性为multipart/from-data时,浏览器就会采用二进制流的方式来处理表单数据,服务器端就会对文件上传的请求进行解析处理.
Spring MVC框架为文件上传提供了直接的支持, 这种支持是通过MultipartResolver(多部件解析器)对象实现的.他是一个接口对象,需要通过他的实现类CommonsMultipartResolver来完成文件上传工作.使用非常简单, 只需要在配置文件中定义这个接口的Bean即可.
因为MultipartResolver接口的实现类CommonsMultipartResolver内部是引用multipartResolver字符串获取该实现类对象并完成文件解析的,所以在配置CommonsMultipartResolver时必须指定该Bean的id为multipartResolver
文件下载:
文件下载就是将文件服务器中的文件下载到本机上. 文件下载比较简单, 直接在页面给出一个超链接, 该链接的href的属性等于要下载文件的文件名, 就可以实现文件下载了.
在SpringMVC框架中,实现文件下载大致可分为两个步骤:
1.在客户端页面使用一个文件下载的超链接, 该链接的href属性要指定后台文件下载的方法及文件名,示例:
html
<a href="${pageContext.request.contextPath }/download?filename=001.jpg">文件下载</a>
2.在后台Controller类中,使用SpringMVC框架提供的文件下载方法进行文件下载. SpringMVC框架提供了一个ResponseEntity类型的对象,使用它可以很方便地定义返回的HttpHeaders对象和HttpStatus对象,通过对这两个对象的设置,即可完成下载文件时所需要的配置信息. 示例:
java
@RequestMapping("/download")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
String filename) throws Exception {
//指定要下载的文件所在路径
String path = request.getServletContext().getRealPath("/upload/");
//创建该文件对象
File file = new File(path + File.separator + filename);
//设置响应头
HttpHeaders headers = new HttpHeaders();
//通知浏览器以下载的方式打开文件
headers.setContentDispositionFormData("attachment", filename);
//定义以流的形式下载返回数据文件
headers.setCotentType(ModiaType.APPLICATION_OCTET_STREAM);
//使用SpringMVC框架的ResponseEntity对象封装返回下载数据
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
}
在fileDownload()方法中,首先根据文件路径和需要下载的文件名来创建对象,然后对响应头中文件下载时的打开方式及下载方式进行设置,最后返回ResponseEntity封装下的下载结果对象
关于中文名称的下载,可以在前端页面发送请求时先对中文名称进行同样编码,然后在后台控制器类中对文件名称进行相应的转码.
拦截器:
SpringMVC中的拦截器主(Interceptor)类似于Servlet中的过滤器(Filte),他主要用于拦截用户请求并作出相应的处理, 如通过拦截器可以进行权限验证,记录请求信息的日志, 判断用户是否登录等.
要使用SpringMVC的拦截器,就要对拦截器类进行定义和配置.通常拦截器类用两种方式来定义:实现 HandlerInterceptor和WebRequestInterceptor接口或继承这两个接口的实现类.
HandlerInterceptor接口的三个方法:
preHandler()方法:
该方法可在控制器方法前执行,其返回值表示是否中断后续操作. 返回值为true时,表示继续向下执行,为false时,可中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)
postHandler()方法:
该方法会在控制器方法调用之后,且解析视图之前执行.可通过此方法对请求域中的模型或视图作进一步的修改
afterHandler()方法:
该方法在整个请求完成,即视图渲染结束之后执行,通过此方法可以实现一些资源清理,记录日志信息等工作
要是自定义的拦截器类生效,还需要在SpringMVC的配置文件中进行配置
<mvc:Interceptor>中的子元素必须按照一定的顺序进行缩写:<mvc:mapping.../> -> <mvc: excludemapping... /> -> <bean... />. 否则文件会报错
当有多个拦截器同时工作时, 他们的preHandler()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()和afterHandle()方法则会按照配置文件的反序执行.
一个字符串方法: url.indexOf("/login"): 如果"/login"是url的一个子串,则返回首次出现的索引
深入使用Spring MVC框架:
Spring框架的异常处理, 表单标签库的用法, 数据格式化, 数据校验等
Spring框架的异常处理:
Spring MVC框架通过HandlerExceptionResolver处理异常程序,包括处理器异常,数据绑定异常,及处理器执行时发生的异常.仅有一个接口方法, 当异常发生时,SpringMVC框架调用resolveException()方法,并转到ModelAndView对应的视图中, 作为一个异常反馈给用户. 对于异常处理一般分为局部异常处理和全局异常处理
1.局部异常处理:
局部异常处理表示仅能处理Controller中的异常, 可使用@ExceptionHandler注解实现
2.全局异常处理:
全局异常处理可以用SimpleMappingExceptionResolver来实现. 它将异常类名映射为视图名,即异常发生时使用对应的视图报告异常
在SpringMVC的配置文件中配置
如果需要在对应的视图中显示异常信息: ${exception.message}
表单标签库:
表单标签库的实现类在Spring-webmvc.jar文件中, 标签库描述文件是spring-form.tld.要使用Spring MVC框架的表单标签库,必须在JSP页面的开头处声明taglib指令.
关于form标签, 当没有指定form标签的id属性时,他会自动获取该form标签绑定的Model中对应属性名称command作为id; 对于input标签,在没有指定id的情况下他会自动获取Path指定的属性值作为id和name
数据转换和格式化:
在请求信息到达真正调用处理方法的这段时间内, SpringMVC框架还会完成很多其他的工作, 包括请求信息转换, 数据转换, 数据格式化及数据校验.
数据绑定的流程:
SpringMVC框架将ServletRequest对象以及处理方法的参数对象实例传递给DataBinder, DataBinder调用装配在Spring Web上下文中的ConversionService组件进行数据转换. 数据格式化工作.并将ServletRequest中的消息填充到参数对象中,然后再调用Validator组件对已经绑定了的请求消息数据的参数对象进行数据合法性校验, 并最终生成数据绑定结果BindingResult对象. BindingResult不经包含已完成数据绑定的参数对象, 还包含相应的校验错误对象, SpringMVC框架抽取BindingResult参数对象及校验错误对象,将他们赋给处理方法的相应参数.
数据校验:
一个健壮的应用系统必须将非法输入阻止在应用之外防止这些非法输入进行系统,这样才能保证系统不受影响.
应用程序必须能够正确处理表现层接收的各种数据, 通常的做法是遇到异常输入时应用程序直接返回, 并提示用户必须重新输入,也就是将那些异常输入过滤掉. 这种对异常输入的过滤,就是输入校验,也称为"数据校验"
输入校验分为客户端校验和服务器端校验, 客户端校验主要是过滤正常用户的误操作, 通常通过JavaScript代码实现; 服务器端校验是整个应用组织非法数据的最后防线,主要通过在应用中编程实现.
SpringMVC框架提供了两种强大的数据校验功能,其中有两种方法可以进行验证输入,一种是利用Spring框架自带的Validation; 另一种是利用JSR303(Java验证规范)实现校验功能.