SpringMVC处理异常
SpringMVC处理异常很简单,只需要在SpringMVC的配置文件配置以下内容即可。java.lang.NullPointerException是要处理的异常的类型,error是出现异常以后要跳转的视图名称。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.NullPointerException">error</prop>
</props>
</property>
</bean>
SpringMVC的运行流程
1.首先请求发送到控制器DispatcherServlet
2.然后在DispatcherServlet中对请求进行解析,判断是否存在与请求对应的映射关系,若存在则进行处理,若不存在则分为以下两种情况:
- 配置了mvc:default-servlet-handler/,此时就会交给默认的servlet进行处理,若是静态资源之类的就会进行返回,若默认的servlet也无法找到资源就会进行404,然后在控制台没有任何输出信息。
- 没有配置mvc:default-servlet-handler/就会直接404处理,然后在控制台打印输出No mapping found for HTTP request with URI的错误信息
3.DispatcherServlet找到映射关系之后会跳转到handlerMapping(其中包含所有的请求和映射的关系),然后调用getHandle方法获取HandlerExecutionChain(具体的某一个请求和映射的关系)。
4.HandlerExecutionChain会根据获得的Handler来选择一个合适的HandlerAdapter用来执行handle。
5.首先调用调拦截器的PreHandle方法,然后在去执行用户所写的程序,若程序中出现了异常就会让HandlerExceptionResolver处理异常并且获得新的ModeAndView对象、若没有一场就会执行调用拦截器的PostHandle方法。
6.根据生成的ModeAndView对象来获得具体的View,然后进行渲染
7.最后调用调用拦截器的afterCompletion方法。
Spring与SpringMVC的整合
使用监听器模拟整合
1.创建spring的配置文件,并配置要扫描的包,这里在包中创建了一个User类,并加上了@Component注解
<context:component-scan base-package="com.glq">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
2.创建监听器,重写contextInitialized()方法,这里可以通过sce对ApplicationContext 对象进行写到域中,以便其他类访问
public void contextInitialized(ServletContextEvent sce) {
/* This method is called when the servlet context is
initialized(when the Web application is deployed).
You can initialize servlet context related data here.
*/
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
sce.getServletContext().setAttribute("ac",ac);
}
3.在web.xml中配置监听器
<listener>
<listener-class>com.glq.listener.Listener</listener-class>
</listener>
4.创建测试类进行测试,可以看到能够正常输出user对象
@RequestMapping("test")
public String test(HttpSession session){
System.out.println("test");
ApplicationContext ac = (ApplicationContext)session.getServletContext().getAttribute("ac");
System.out.println(ac);
User user = ac.getBean(User.class);
System.out.println("controller:"+user);
return "success";
}
使用SpringMVC自带的监听器进行整合
使用SpringMVC自带的监听器就很简单了,只需要在web.xml中配置以下内容即可,注意param-value中要修改成自己的配置文件。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
测试:
只需要注意获取域中的数据的键是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE。
@RequestMapping("test")
public String test(HttpSession session){
System.out.println("test");
ApplicationContext ac = (ApplicationContext)session.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
System.out.println(ac);
User user = ac.getBean(User.class);
System.out.println("controller:"+user);
return "success";
}