学习《spring 3.x企业应用开发实战》之SpringMVC

1、SpringMVC概述
1.1、体系结构
(1)和大多数Web MVC框架一样,Spring MVC通过一个前端servlet接收所有请求,并将具体工作委托给其他组件进行处理,DispatcherServlet就是Spring MVC的前端servlet。
(2)SpringMVC请求过程解析:
①整个过程始于客户端发出一个 HTTP请求,Web应用服务器接收到这个请求,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),Web容器将该请求转交给DispatcherServlet处理。
②DispatcherServlet接收到这个请求后,将根据请求的信息(包括URL、HTTP方法、请求报文头、请求参数、Cookie等)及HandlerMapping的配置找到处理请求的处理器(Handler)。可将HandlerMapping看成路由控制器,将Handler看成目标主机,Spring中的Handler都是POJO。
③当DispatcherServlet根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。
④处理器完成业务逻辑的处理后将返回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名和模型数据信息。
⑤ModelAndView中包含的是“逻辑视图名”而非真正的视图对象,DispatcherServlet借由ViewResolver完成逻辑视图名到真实视图对象的解析工作。
⑥当得到真实的视图对象View后,DispatcherServlet就使用这个View对象对ModelAndView的模型数据进行视图渲染。
⑦最终客户端得到的响应信息,可能是一个普通的HTML页面,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式。

1.2、配置DispatcherServlet
(1)要了解SpringMVC框架的工作机理,必须先问以下3个问题:
  • DispatcherServlet框架如何截获特定的HTTP请求,交由SpringMVC框架处理?
  • 位于Web层的Spring容器(WebApplicationContext),如何与位于业务层的Spring容器(ApplicationContext)建立关联,以使Web层的Bean可以调用业务层的Bean?
  • 如何初始化SpringMVC的各个组件,并将它们装配到DispatcherServlet中?
(2)DispatcherServlet配置示例:

(3)如果DispatcherServlet上下文对应的Spring配置文件有多个,则可使用其contextConfigLocation属性按照Spring资源路径的方式指定,如:

(4)探究DispatcherServlet内部逻辑
DispatcherServlet的initStrategies()方法在WebApplicationContext初始化后自动执行,该方法先通过反射机制查找并装配Spring容器中用户显式自定义的组件Bean,如果找不到则采用默认的组件实例。在org.springframework.wen.servlet.jar包中有个DispatcherServlet.properties配置文件,该文件指定了所使用的默认组件。

(5)下表深入讲解了DispatcherServlet装配每种组件的过程:

☆-组件只允许存在一个实例;
★-组件允许存在多个实例,并通过order属性确定优先级,值越小优先级越高。

2、注解驱动的控制器
2.1、使用@RequestMapping映射请求
(1)@RequestMapping不仅支持标准的URL,还 支持Ant风格的URL,比如?,*,**。
(2) 此外还支持带占位符的URL,例如/abc/{num}或/abc/de{num},带占位符的URL映射是Spring MVC向REST目标挺进的里程碑。通过@PathVariable可以将URL中的占位符参数(类或者方法处)绑定到控制器的方法入参中。如下:

注:最好在@PathVariable中显式指定参数名,否则需要将方法入参名起的跟占位符名一样,但是即使如此,也需要JVM打开debug模式,但是生产环境一般不会打开,因为会使目标类变大,影响运行效率,所以最好显示指定名称。
(3) 通过请求参数和请求头进行映射
①Spring3.0提供了 HiddenHttpMethodFilter,允许用户通过“ _method”的表单参数指定特殊的HTTP方法(实际上还是通过POST提交表单),Spring只是在服务端根据“_method”参数模拟出相应的HTTP方法。
②示例如下:


2.2、请求处理方法签名概述
经典的方法签名参数:


2.3、处理方法签名详细说明
(1)使用 @RequestParam绑定请求参数值
属性如下:
  • value:参数名;
  • required:是否必须,默认为true,如果不存在该参数将抛出异常。
注:如果required为fasle,但是参数是基本数据类型时,同样会报错,因为Spring无法将null值给基本数据类型。
(2)使用 @CookieValue绑定请求中的Cookie值
属性和@RequestParam一样,value代表cookie的名称。
(3)使用 @RequestHeader绑定请求报文头属性
属性和@RequestParam一样,value代表报文头的名称。
(4)使用 命令/表单对象绑定请求参数值
命令/表单对象只是一个POJO,它是按照POJO属性和请求参数名匹配的方式进行填充,支持级联属性。
(5)使用 Servlet API作为入参对象
如果自行使用HttpServletResponse作为返回,则将方法的返回类型设置为void即可,示例如下:

此外Spring MVC还提供了Servlet API的代理类,通过这些类也可以访问,如:WebRequest等
(6)使用 IO对象作为入参
ServletRequest拥有getInputStream()和getReader()方法,可以通过它们读取请求信息,ServletResponse拥有getOutputStream()和getWriter()方法,可以通过它们输出响应信息。
Spring MVC允许控制器的处理方法使用InputStream/Reader和OutputStream/Writer作为方法的入参。
(7)其他类型参数
Locale和Principal,与输入输出流类似,可以从自动从Servlet API获取。

2.4、使用HttpMessageConverter<T>
(1)HttpMessageConverter<T>由AnnotationMethodHandlerAdapter使用,它可以将请求信息转换为对象,也可以将对象转换为响应信息。包括MIME类型和RSS等:

(2)如何使用HttpMessageConverter<T>,Spring MVC提供了如下2种方式:
  • 使用@RequestBody/@ResponseBody标注;
  • 使用HttpEntity<T>/ResponseEntity<T>作为处理方法的入参或返回值。
(3)RestTemplate是Spring3.0新增的模板类,它可以直接调用Web服务。
(4) @RequestBody只能访问报文体( 所以无法使用get方式传参 ),但是@HttpEntity<T>不但可以访问报文体的数据,也可以访问报文头的数据
(5)处理XML和JSON,只要通过修改报文头的数据格式为XML或JSON即可。
(6)HttpMessageConverter<T>实现类:




(7)在使用 <mvc:annotation-driven />标签配置时,默认配置了RequestMappingHandlerAdapter,它包括以下HttpMessageConverter:
  • ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
  • StringHttpMessageConverter:   负责读取字符串格式的数据和写出二进制格式的数据;
  • ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据; 
  • FormHttpMessageConverter:       负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
  • MappingJacksonHttpMessageConverter:  负责读取和写入json格式的数据;
  • SouceHttpMessageConverter: 负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
  • Jaxb2RootElementHttpMessageConverter:  负责读取和写入xml 标签格式的数据;
  • AtomFeedHttpMessageConverter:   负责读取和写入Atom格式的数据;
  • RssChannelHttpMessageConverter:   负责读取和写入RSS格式的数据;

2.5、处理模型数据
(1)Spring提供了多种途径输出模型数据:
  • ModelAndView
  • @ModelAttribute:对方法入参标记该注解,则入参对象就会放到数据模型中。
  • Map及Model,入参为Model、ModeMap或java.util.Map时,返回会自动添加数据到模型中。
  • @SessionAttributes:将模型中的数据暂存到HttpSession中。
(2) @ModelAttribute
  • 用在方法入参处,会将其加入到ServletRequest属性中。
  • 用在方法定义处,在调用处理器的任何方法前,都会先执行该方法,并将返回对象以@ModelAttribute(value="xxx")的value属性为key,加入到ServletRequest的属性中。
(3) @SessionAttributes
①使用示例如下:

注:
  • 如果处理器返回字符串,则返回的是一个逻辑视图名。
  • 如果返回的字符串含有:”forward:”或“redirect:”,则处理器返回的是一个URL。
②上面的SessionStatus#setComplete()方法会清除会话的所有属性,否则,会话的属性会一直存在。
(4)运行上面的@SessionAttributes示例会报错,是因为Spring MVC对@ModelAttribute和@SessionAttributes有一个特定的处理流程:

所以正确示例如下:


3、处理方法的数据绑定
3.1、数据绑定流程分析
数据绑定的核心部件是DataBinder,DataBinder调用装配在Spring Web上下文中的ConversionService组件进行数据类型转换、数据格式化工作,将ServletRequest中的消息填充到入参对象中。然后再调用Validator组件对已经绑定了请求消息数据的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingResult对象。

3.2、数据转换
(1)java原生的PropertyEditor的核心功能是将字符串转换为java对象,但是拥有如下缺陷:
  • 只能用于字符串转换成对象,不能用于任意2个类型的转换。
  • 对源对象及目标对象的上下文信息不敏感。
有鉴于此,在org.springframework.core.convert包中的类型转换体系用于替换PropertyEditor。
(2) ConversionService
ConversionService是Spring类型转换体系的核心接口,可以利用org.springframework.context.support.ConversionServiceFactoryBean定义一个ConversionService,配置如下:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="xxxxxx"/>
</list>
</property>
</bean>
(3)Spring支持哪些转换器
  • Convert<S,T>
  • GenericConverter
  • ConverterFactory
其中,GenericConverter会根据源对象及目标对象的上下文信息进行类型转换工作。
ConversionServiceFactoryBean的converters属性接收以上3个接口的实现类,并把这些转换器的转换逻辑统一封装到一个ConversionService实例中(即 GenericConversionService
(3)使用实例
①编写Converter实例


②配置到Spring上下文

<mvc:annotation-driven/>标签
有2个作用:
  • 简化Spring MVC相关配置,它会创建并并注册一个默认的DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter,上下文中的显示配置会覆盖该标签的配置。
  • 注册一个默认的ConversionService,及FormattingConversionServiceFactoryBean。要运用自定义的转换器,除了上面的配置,还要通过设置<mvc:annotation-driven/>标签的conversion-service属性来完成。
④应用转换器的示例:


(4)使用@InitBinder和WebBindingInitializer装配自定义编辑器

3.3、数据格式化
Spring3.0引入了一个新的格式化框架,这个框架位于org.springframework.format类包中。
(1) Formatter<T>
Formatter<T>接口扩展于Printer<T>和Parser<T>接口,Printer<T>负责对象是格式化输出,而Parser<T>负责对象的格式化输入。
①时间格式化对象
org.springframework.format.datetime.DateFormatter
②数字格式化对象
org.springframework.format.number包中的:
  • NumberFormatter 用于数字类型格式化
  • CurrencyFormatter 用于货币类型格式化
  • PercentFormatter 用于百分数数字类型格式化
(2) 注解驱动格式化的重要接口
Spring提供了AnnotationFormatterFactory<A extends Annotation>接口的2个实现类来支持数字及日期类型的注解驱动格式化:
①@NumberFormat
由NumberFormatAnnotationFormatterFactory支持。
②@DateTimeFormat
由JodaDateTimeFormatAnnotationFormatterFactory支持。
(3) 启用注解驱动格式化功能
Spring定义了FormattingConversionService实现类,该类既扩展了GenericConversionService,也具有格式化的功能。FormattingConversionService也具有一个工厂类:FormattingConversionServiceFactoryBean。FormattingConversionServiceFactoryBean会在内部自动注册NumberFormatAnnotationFormatterFactory和JodaDateTimeFormatAnnotationFormatterFactory,所以装配了FormattingConversionServiceFactoryBean就可以使用注解驱动功能。配置如下:

(4) 注解驱动格式化实例
①示例如下:

②@DateTimeFormat有以下几个互斥的属性(即只能使用一个属性):

@DateTimeFormat可以对java.util.Date、java.util.Calendar、java.long.Long以及Joda时间类型属性进行标注。
(3)@NumberFormat也有以下几个互斥的属性(即只能使用一个属性):


3.4、数据校验
(1) JSR303
JSR303是java为Bean的合法性校验所提供的标准框架,通过在Bean的属性上标注@NotNull、@Max等注解指定校验规则。注解如下:

(2) Spring校验框架
Spring3.0拥有独立的数据校验框架,同时支持JSR303。SpringMVC可直接通过注解方式校验数据。主要的接口有Validator和LocalValidatorFactoryBean。LocalValidatorFactoryBean既实现了Spring的Validator接口,也实现了JSR303的接口。
(3) SpringMVC数据校验
<mvc:annotation-driven/>或默认装配一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid注解即可在SpringMVC完成数据绑定后执行数据校验的工作。
①使用示例如下:

User对象属性中是用JSR303标准标注的校验注解。
②校验对象和校验结果必须成对出现,中间不能有其他参数,校验结果参数必须是BindingResult或Errors类型,如下:

③如何在页面中显示错误
可通过Spring表单标签显示错误信息:


(4)自定义校验器

4、视图和视图解析器
4.1、认识视图
视图是为了渲染模型数据,将数据以jsp、pdf或Excel的形式展现给用户,为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet包中定义了一个高度抽象的View接口,该接口中定义了2个方法:
  • String getContentType():视图对应的MIME类型,如text/html,image/jpeg等。
  • void render(Map model,HttpServletRequest request,HttpServletResponse response):将模型数据以某种MIME类型渲染出来。
视图对象是一个Bean,通常由视图解析器创建,因其是无状态的,所以它们不会有线程安全问题。不同的视图实现技术对应不同的View实现类,这些视图实现类都位于org.springframework.web.servlet.view的包中,如下:


4.2、认识视图解析器
(1)所有的视图解析器都实现了ViewResolver接口,该接口仅有一个方法:
View resolveViewName(String viewName,Locale locale);
Spring拥有众多视图解析器实现类:

(2)Spring会按照视图解析器的优先级顺序进行视图解析,值越小,优先级越高。

4.3、JSP和JSTL
(1) 使用InternalResourceViewResolver
InternalResourceViewResolver默认使用InternalResourceView作为视图实现类,如果JSP文件使用了JSTL的国际化功能,确切的说当JSP页面使用JSTL的<fmt:message/>等标签时,用户需要使用JstlView替换默认的视图实现类,如下:
<bean class="org.springframework.web.servlet.view.InternalResourceView"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="xxxx" p:suffix="xxx"/>
添加国际化资源:
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>i18n/messages</value>
</list>
</property>
</bean>
(2) Spring表单标签库

4.4、模板视图
(1)FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,它可以生成Html、XML、Java源代码等多种类型的输出内容。
Spring中配置FreeMarker如下:

classic_compatible属性与JSTL处理方式类似,当遇到NULL值时,返回空字符串而非抛出异常。
(2) 使用Spring为FreeMarker提供的宏
示例如下:


(3)Spring为FreeMarker提供的宏



4.5、Excel
(1)如果希望使用Excel展示列表,仅需要扩展Spring的AbstractExcelView或AbstractJExcelView即可。实现buildExcelDocument()方法,在方法中使用模型数据对象构造Excel文档即可。AbstractExcelView基于POI API,而AbstractJExcelView基于JExcel API。
(2)因为视图对象是一个Bean,所以在Controller层返回的应该是一个bean的id,所以需要配置<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="10"/>这个Bean解析器。

4.6、PDF
(1)PDF和Excel一样,也是使用一个Bean作为视图对象。需要扩展AbstractPdfView,而AbstractPdfView是基于IText。
(2)默认的lowagie类包不支持亚洲文字,针对这个问题,lowagie提供了一个附加的iTextAsian.jar包。

4.7、输出XML
(1)MarshallingView使用Marshaller将模型数据转换为XML,通过marshaller属性注入一个Marshaller实例。默认情况下,MarshallingView会将模型中的所有属性都转换为XML,由于模型属性会包含很多隐式数据,所以MarshallingView允许通过modelKey指定模型中哪个属性需要输出为XML。
(2)输出XML和输出Excel和Pdf一样,都是返回一个Bean,配置示例如下:


4.8、输出JSON
(1)Spring的MappingJacksonJsonView借助Jackson框架的ObjectMapper将模型数据转换为JSON格式输出,MappingJacksonJsonView也默认将所有属性输出,所以可以通过renderedAttributes指定要输出的属性。
(2)输出JSON也是返回一个Bean。

4.9、使用XmlViewResolver
(1)XmlViewResolver和BeanNameViewResolver功能相似,唯一不同的是它可以将视图Bean定义在一个独立的XML文件中。配置如下:

(2)不过在XmlViewResolver指定的配置文件中定义的Bean,只能被XmlViewResolver独享,无法被Spring Web上下文引用。

4.10、使用ResourceBundleViewResolver
配置如下:

besename代表国际化资源文件的文件名前缀。

4.11、混合使用多种视图技术
(1) ContentNegotiatingViewResolver
ContentNegotiatingViewResolver和HttpMessageConverter在功能上有些重叠,HttpMessageConverter只能输出格式化后的纯数据,ContentNegotiatingViewResolver像一个代理,根据请求信息选择合适的视图解析器,所以ContentNegotiatingViewResolver的优先级是最高的。
(2)ContentNegotiatingViewResolver根据请求的MIME类型选择合适的解析器,工作模式如下:
①如果其favorPathExtension属性设置为true(默认为true),则根据URL中的文件扩展名确定MIME类型(如xxx.xml,xxx.json等)。
②如果其favorParameter属性设置为true(默认为fasle),则根据请求参数的值确定MIME类型,默认的请求参数是format,可以通过parameterName属性指定一个自定义的参数。
③如果还没有找到对应的MIME类型,且Java Activation Framework(JAF)位于类路径下,则通过JAF的FileTypeMap.getContentType(url)方法对URL进行判断,以获取对应的MIME类型。
④如果以上步骤都失败,且ignoreAcceptHeader属性设置为false(默认为false),则采用Accept请求报文头的值确定MIME类型。一般不同浏览器产生的Accept头都是不一样的,所以一般不采用Accept确定MIME类型。
(3) 使用同一URL获取不同形式的返回内容
通过上面(2)中的favorParameter方式可以实现使用同一URL获取不同形式的返回内容,如:
localhost/user/userlist?content=json
配置示例如下:



5、本地化解析
5.1、本地化概述
(1)web应用通常根据浏览器的设置判断客户端本地化类型,也有通过Cookie和session来判断的。
Spring MVC默认根据Accept-Language参数判断客户端的本地化类型,此外还提供了指定客户端本地化类型的方式:Cookie和Session。
Spring还提供了拦截器以允许动态更改本地化类型,都定义在org.springframework.web.servlet.i18n包中。
(2)Spring提供了4个本地化解析器:
  • AcceptHeaderLocaleResolver:根据HTTP报文头的Accept-Language参数确定本地化类型,它是默认的本地化解析器。
  • CookieLocaleResolver:根据指定Cookie值确定本地化类型。
  • SessionLocaleResolver:根据Session中特定的属性值确定本地化类型。
  • LocaleChangeInterceptor:从请求参数中获取本次请求对应的本地化类型。

5.2、使用CookieLocaleResolver
配置示例:


5.3、使用SessionLocaleResolver
SessionLocaleResolver查找Session中属性名为SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME的属性,并将其转换为Locale对象,以此作为客户端的本地化类型。

5.4、使用LocaleChangeInterceptor
(1)配置如下:

(2)LocaleChangeInterceptor在默认情况下通过“locale”请求参数获取本次请求对应的本地化类型,用户可以通过其paramName属性指定一个其他参数名。由于LocaleChangeInterceptor的主要任务是从请求中获取本地化类型并将其设置给真正的本地化解析器,所以在配置LocaleChangeInterceptor之前,必须在上下文中先配置一个本地化解析器。

6、文件上传
6.1、配置MultipartResolver
(1)Spring使用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。配置如下:

(2)要上传文件,还需要fileupload和IO包。示例如下:


7、杂项
7.1、静态资源处理
(1) 采用<mvc:default-servlet-handler/>
配置这个后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会检查进入DispatcherServlet的请求,静态资源就会交给Web应用服务器默认的Servlet处理,否则交给DispatcherServlet处理。
一般的Web应用服务器(包括Tomcat、Jetty、Glassfish、JBoss、Resin、WebLogic、WebSphere)默认的Servlet名称都是default,所以DefaultServletHttpRequestHandler能够找到它。如果你使用的Web服务器的默认Servlet不是叫default,那么需要通过default-servlet-name属性显式指定:
<mvc:default-servlet-handler default-servlet-name="默认的servlet名"/>
(2) 采用<mvc:resources/>
<mvc:resources/>可以自己处理静态资源,允许静态资源存放在任何地方,如WEB-INF目录下,类路径下,甚至是JAR包中。通过location属性指定静态资源的位置,由于location属性是Resource类型,因此可以使用诸如”classpath:“等Ant风格。
其次,<mvc:resources/>可以通过cacheSeconds属性指定静态资源在浏览器端的缓存时间,在输出静态资源时,会根据配置设置好响应报文头的Expires和Cache-Control值。
在接收到静态资源获取请求时,会检查请求头的Last-Modified值,如果静态资源没有发生变化,则直接返回303响应状态码,指示客户端使用浏览器缓存的数据。配置如下:
<mvc:resources mapping="/resources/**" location="/,classpath:/META-INF/xxxxx"/>
以上配置将Web根路径“/”及类路径下“/META-INF/xxxxx”的目录映射为“/resources”路径。
如果同一个资源在多个物理路径下都存在,<mvc:resources/>的机制是按照location属性中指定的顺序,找到第一个后就返回。Spring MVC在处理静态资源时,会查看引用路径是否包含WEB-INF或META-INF,如果包括,则直接返回null值。但是,如果WEB-INF被设置在了location属性中,则可以通过“/resources/web.xml”访问到web.xml,所以需要特别小心。
<mvc:resources mapping="/resources/**" location="/,classpath:/META-INF/xxxxx" cache-period="1234567890"/>
cache-period属性用于设置静态资源在客户端浏览器中的缓存时间。
(3) 在<mvc:resources/>中加入发布版本号
有时候发布新版时,由于浏览器缓存的原因,使得下载不到最新的静态资源。一个好的解决办法是将版本号包含到<mvc:resources/>的静态资源逻辑路径中。如下:

这样就可以在页面中通过${resourceRoot}引用其值了,配置文件调整如下:

页面配置如下:


7.2、装配拦截器
(1)DispatcherServlet接收到请求后,将请求交给HandlerMapping,让它找出对应请求的HandlerExecutionChain对象。HandlerExecutionChain是个执行链,结构如下:

(2)我们通过拦截器的几个接口方法进行了解:
  • preHandle:这个方法返回true,则将请求传给下一个拦截器直至Handler,否则直接返回。
  • postHandler:在请求被HandlerAdapter执行后,执行这个后置处理方法。
  • afterCompletion:在响应已经被渲染后,执行该方法。
(3)配置示例如下:


7.3、异常处理
(1)Spring MVC通过HandlerExceptionResolver处理程序的异常,包括处理器映射、数据绑定以及处理器执行时发生的异常。
HandlerExceptionResolver有4个实现类:
  • DefaultHandlerExceptionResolver
  • SimpleMappingExceptionResolver
  • AnnotationMethodHandlerExceptionResolver
  • ResponseStatusExceptionResolver
(2) DefaultHandlerExceptionResolver
Spring MVC默认装配了DefaultHandlerExceptionResolver,它会将Spring MVC框架的异常转化为相应的响应状态码,如下:

可以在web.xml中通过如下配置为响应状态码配置一个对应的页面:
<error-page>
<error-code>404</error-code>
<location>/404.htm</location>
</error-page>
(3) AnnotationMethodHandlerExceptionResolver
Spring MVC已默认注册了AnnotationMethodHandlerExceptionResolver,它允许通过@ExceptionHandler的注解指定处理特定异常的方法。示例如下:

①处方法抛出的异常会被处于同一处理器类中②处的handleException()方法捕获,@ExceptionHandler可以指定多个异常,如:@ExceptionHandler(xxx.class,xxx.class)
(4) SimpleMappingExceptionResolver
SimpleMappingExceptionResolver可以将所有异常进行统一处理,它将异常类名映射为视图名。配置示例如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。   第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。   第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架的三个最重要的框架级接口进行了剖析,并对Bean的生命周期进行讲解。   第4章:讲解如何在Spring配置文件中使用Spring 3.0的Schema格式配置Bean的内容,并对各个配置项的意义进行了深入的说明。   第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。   第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的内核中,分析它的底层结构和具体实现。   第7章:对如何使用基于AspectJ配置AOP的知识进行了深入的分析,这包括使用XML Schema配置文件、使用注解进行配置等内容。   第8章:介绍了Spring所提供的DAO封装层,这包括Spring DAO的异常体系、数据访问模板等内容。   第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。   第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。   第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生和获取等难点知识。   第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。   第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。   第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。   第15章:对Spring MVC框架进行详细介绍,对REST风格编程方式进行重点讲解,同时还对Spring 3.0的校验和格式化框架如果和Spring MVC整合进行讲解。   第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。   第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、项目设计、代码开发、单元测试直到应用部署经历整个实际项目的整体开发过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值