前言:
一、总共有10节,也就是10篇博客来讲述Spring的MVC,几乎涵盖了所有Spring MVC中的内容。
二、我创建的例子是一个球场预订系统,例子我已经测试调试通过,是一个Maven的project,包含一个Parent project:wsheng-spring-base和一个子Module:wsheng-spring-mvc.
三、在Eclipse中直接import maven的project即可,会同时引入上诉两个project的。
四、如果你没有耐心,可以不必往下学习,因为网上有很多例子,但是都是讲的Spring MVC很少的面,而且你可以快速的上手,但如果你想真正了解Spring MVC中的很多细节,就可以慢慢的去看博客(从第一节到第十节),如果有什么问题,欢迎信息告诉我。
五、学习的方法是你可以先将源码导入到eclipse中,然后根据博客上的内容,对照源码,慢慢消化,这是个漫长的过程,但是会帮助你了解很多Spring MVC的细节。
===================================================================================
在Spring3.X @MVC - (八)Spring MVC创建并导出Excel和PDF视图的基础上:
http://josh-persistence.iteye.com/admin/blogs/1885286
继续学习怎样在Spring中映射异常视图。
1. 问题:
在应用中发生未知的异常信息时,有可能应用服务器通常会向用户显示令人不快的异常堆栈信息。这些异常信息除了让用户不开心外,其实也会有一些潜在的风险,因为这些异常信息可能将内部方法调用层次暴露给用户。
学过Java web应用的程序员都知道。我们可以在web.xml中配置当HTTP错误或者类异常发生时显示友好的JSP页面,但是Sping MVC中支持更加健壮的方法管理类异常视图。
2. 解决方案:
在Web应用上下文中注册一个或者多个异常解析器Bean来解析未捕捉的异常。这些Bean必须实现HandlerExceptionResolver接口,以便使DispatcherServlet能自动检测他们。其实Spring MVC中自带了一个简单的异常解析器,让你将给类异常映射到视图。
3. 工作原理:
假定预订服务由于预订不可用抛出如下异常:
package com.wsheng.spring.service;
import java.util.Date;
public class ReservationNotAvailableException extends RuntimeException {
public static final long serialVersionUID = 1L;
private String courtName;
private Date date;
private int hour;
public ReservationNotAvailableException(String courtName, Date date, int hour) {
this.courtName = courtName;
this.date = date;
this.hour = hour;
}
public String getCourtName() {
return courtName;
}
public Date getDate() {
return date;
}
public int getHour() {
return hour;
}
}
为了解析为捕捉的异常,你可以自定义自己的异常解析类来实现HandlerExceptionResolver接口。通常情况下,我们希望的是对于不同类别的的异常信息映射到不同的错误页面。Spring MVC自带了异常解析器SimpleMappingExceptionResolver,使你能在web应用上下文中配置异常映射。例如,你可以在court-servlet.xml中注册如下的异常解析器:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.wsheng.spring.service.ReservationNotAvailableException">
reservationNotAvailable
</prop>
<prop key="com.wsheng.spring.web.ReservationWebException">
reservationWebException
</prop>
<!-- <prop key="java.lang.Exception">
error
</prop>
-->
</props>
</property>
<property name="defaultErrorView" value="error"/>
</bean>
在这个异常解析器中,我们为ReserverationNotAvailableException定义了逻辑视图的名称为reservationNotAvailable。我们还可以使用<prop>元素添加任何数量的异常类,直到最后更通用的异常类:java.lang.Exception。这样,根据异常类的类型,用户得到一个与异常一致的视图。
根据对应的视图,如果你的web应用上下文中配置了InternalResourceViewResolver,预订不可用的情况下会显示如下的reservationNotAvailable.jsp页面。
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Reservation Not Available</title>
</head>
<body>
Your reservation for ${exception.courtName} is not available on
<fmt:formatDate value="${exception.date}" pattern="yyyy-MM-dd" /> at
${exception.hour}:00.
</body>
</html>
1. 当应用中抛出ReservationNotAvailableException 类型的Exception时,会显示reservationNotAvailable.jsp的页面。
2. 在错误页面中,异常实例可以由${exception}变量访问,所以你可以在在这个异常中为用户显示更多的细节。
3. 为任何未知的的异常定义一个默认的错误页面是好的做法。你可以使用<property name="defaultErrorView" value="error"/>定义默认视图,或者将一个页面映射到关键字java.lang.Exception作为做后一个映射项目,这样如果之前的项目多没有匹配,就会显示该页面:error.jsp
<html>
<head>
<title>Error</title>
</head>
<body>
An error has occurred. Please contact our administrator for details.
</body>
</html>