一、SpringMVC入门
1.1 认识SpringMVC
M model 模型层 DAO封装 >>> Mybatis
V view 视图层 html css js jsp
C controller 控制层 Servlet封装 >>> springMVC
- SpringMVC是spring为展现层提供的基于MVC设计理念的优秀WEB框架,是目前最主流的MVC框架之一
- SpringMVC通过一套注解,可以让普通的JAVA类成为contrllor控制器,无需继承Servlet,实现了控制层和Servlet之间的解耦
- SpringMVC支持Rest风格的URL写法
- SpringMVC采用了松耦合,可热插的主键结构,比其他的框架更具扩展性和灵活性
1.2 第一个SpringMVC程序
第一步
创建一个maven web项目,导入依赖。创建好包结构
<!--springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
第二步
核心配置文件springmvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!--扫描controller-->
<context:component-scan base-package="com.lzf.controller"/>
<!--处理器映射器、处理器适配器-->
<mvc:annotation-driven/>
<!--视图解析器-->
<!-- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
<!-- <property name="prefix" value="/WEB-INF/view/"/>-->
<!-- <property name="suffix" value=".jsp"/>-->
<!-- </bean>-->
<!--静态资源放行-->
<!-- <mvc:resources mapping="/js/**" location="/js/"/>-->
<!-- <mvc:resources mapping="/css/**" location="/css/"/>-->
<!-- <mvc:resources mapping="/img/**" location="/img/"/>-->
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--Spring 中提供的字符编码过滤器-->
<filter>
<filter-name>encFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
controller层
@Controller
public class MyController {
@RequestMapping("/first")
public String fistController(){
System.out.println("hello springmvc");
return "index.jsp";
}
}
配置好Tomcat就可以启动测试访问first了。
1.3 SpringMVC执行流程
1.DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
2.HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的 映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3.Handler:处理器 (自己定义的Controller处理单元)
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由 Handler 对具体的用户请求进行处理。
4.HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
5.View Resolver:视图解析器
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名 即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
6.View:视图
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是 jsp。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开 发具体的页面。
二、请求处理
@RequestMapper
/**
* value:表示映射路径
* method:可以控制请求的方式,值为RequestMethod的枚举值
* params:控制请求参数
* headers:控制请求头
*/
@RequestMapping(value= "/first",
method = RequestMethod.GET,
params = {"username == root"},
headers = {"Accept-Encoding=gzip, deflate"}
)
public String first(){
System.out.println("hello springmvc");
return "index.jsp";
}
@PathVariable
路径变量,支持RESTful风格。
普通形式的url
*****/contextPath/aaa.do
*****/contextPath/aaa.jsp
*****/contextPath/aaa.html
*****/contextPath/css/aaa.css
*****/contextPath/js/aaa.js
*****/contextPath/aaa.do?id=10&username=root
restFul风格的url
*****/contextPath/aaa/10/root
*****/contextPath/aaa
controller 处理单元
@RequestMapping("testPathVariable/{id}/{username}")
public String testPathVariable(@PathVariable("id") Integer id, @PathVariable("username") String username){
System.out.println(id);
System.out.println(username);
return "index.jsp";
}
获取请求参数
名字一致接收
//表单
<input type = "input" name = "username"/>
//java代码
public String getParam(String username){}//名字一样直接获取
//不一样可以用注解@RequestParam
public String getParam(@RequestParam("username")String name){}
实体类接收
//表单
<form action="getData">
<p>姓名<input type="text" name="pname"></p>
<p>年龄<input type="text" name="page"></p>
<p>性别:
<input type="radio" name="gender" value="1" >男
<input type="radio" name="gender" value="0" >女
</p>
<p>爱好
<input type="checkbox" name="hobby" value="1"> 篮球
<input type="checkbox" name="hobby" value="2"> 足球
<input type="checkbox" name="hobby" value="3"> 羽毛球
</p>生日
<p>
<input type="text" name="birthdate">
</p>
<input type="submit">
</form>
//实体类,属性名要和表单保持一致
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Serializable {
private String pname;
private String page;
private String gender;
private String[] hobby;
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private Date birthdate;
}
//controller
public String getDataByPojo(Person person){}
List接收
//实体类Person里组合List
public class Person{
private List<Pet> pets;
}
//controller
@RequestMapping("/getDataByPojo")
public String getDataByPojo(Person p){
return "success";
}
//form表单
宠物1: 名字:<input type="text" name="pets[0].petName" >类型:<input type="text" name="pets[0].petType">
宠物2: 名字:<input type="text" name="pets[1].petName" >类型:<input type="text" name="pets[1].petType">
Map接收
//实体类Person里组合Map
public class Person implements Serializable {
private Map<String,Pet> petMap;
}
//controller
@RequestMapping("/getDataByPojo")
public String getDataByPojo(Person p){
return "success";
}
//form表单
宠物1: 名字:<input type="text" name="petMap['a'].petName" >类型:<input type="text" name="petMap['a'].petType">
宠物2: 名字:<input type="text" name="petMap['b'].petName" >类型:<input type="text" name="petMap['b'].petType">
三、响应处理
返回String
//请求转发(不写默认就是请求转发)
@RequestMapping("testForward")
public String testForward( ){
return "forward:/success.jsp";
}
//响应重定向
@RequestMapping("testRedirect")
public String testRedirect( ){
return "redirect:/success.jsp";
}
返回View
//请求转发
@RequestMapping("testViewForward")
public View testView(){
View view = new InternalResourceView("/success.jsp");
return view;
}
///响应重定向
@RequestMapping("testViewRedirect")
public View testViewRedirect(){
View view = new RedirectView("success.jsp");
return view;
}
返回ModeAndView
//请求转发
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(){
ModelAndView modelAndView = new ModelAndView();
//modelAndView.setViewName("forward:/success.jsp");
modelAndView.setView(new InternalResourceView("/success.jsp"));
return modelAndView;
}
//响应重定向
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(){
ModelAndView modelAndView = new ModelAndView();
//modelAndView.setViewName("redirect:/success.jsp");
modelAndView.setView(new RedirectView("success.jsp"));
return modelAndView;
}
返回JSON
@RequestMapping(value = "testJson")
@ResponseBody
public Person testJson(Person p){
Person person = new Person();
person.setPname("猪八戒");
return person;
}
作用域传递数据
- Model
@RequestMapping("setData")
public String setData(Model model){
//request域中放入数据
model.addAttribute("user","lzf");
//跳转
return "/showDataPage.jsp";
}
- ModelAndView
@RequestMapping("setData")
public ModelAndView setData(){
//request域中放入数据
ModelAndView modelAndView = new ModelAndView();
Map<String, Object> model = modelAndView.getModel();
model.put("user","123");
modelAndView.setViewName("/showDataPage.jsp");
//跳转
return modelAndView;
}
- Map
@RequestMapping("setData")
public String setData(Map map){
//request域中放入数据
map.put("user","123");
//跳转
return "/showDataPage.jsp";
}
四、SSM整合
第一步
导入依赖
<dependencies>
<!--mybatis相关-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.wisdom-framework</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34_1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--spring相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.8</version>
</dependency>
<!--springmvc相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
<!--其他-->
<!--spring mybatis整合包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<!--log4j2 日志-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.14.0</version>
<scope>test</scope>
</dependency>
<!--spring test测试支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.5</version>
<scope>test</scope>
</dependency>
<!--junit5单元测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<!--lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
第二步
编写配置文件
- log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="Console" target="SYSTEM_ERR">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="DEBUG">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
- jdbc.properties
jdbc_driver=com.mysql.cj.jdbc.Driver
jdbc_url=jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc_username=root
jdbc_password=root
- springMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!--扫描controller层-->
<context:component-scan base-package="com.lzf.controller"/>
<!--三大组件-->
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value=""/>
<property name="suffix" value=""/>
</bean>
<!--静态资源放行-->
<!--<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>-->
<!--<mvc:resources mapping="/css/**" location="/css/"></mvc:resources>-->
<!--<mvc:resources mapping="/img/**" location="/img/"></mvc:resources>-->
<!--<mvc:resources mapping="/static/**" location="/static/"></mvc:resources>-->
</beans>
- applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!--1.整合mybatis-->
<!--加载外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--德鲁伊数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc_driver}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_username}"/>
<property name="password" value="${jdbc_password}"/>
</bean>
<!--配置sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--实体类别名扫描-->
<property name="typeAliasesPackage" value="com.lzf.pojo"/>
</bean>
<!--配置MapperScanner 扫描mapper.xml 和接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--配置MapperScanner 扫描mapper.xml 和接口-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--扫描mapper-->
<property name="basePackage" value="com.lzf.mapper"/>
</bean>
<!--2.扫描service-->
<context:component-scan base-package="com.lzf.service"/>
<!--3.aop自动生产代理对象-->
<aop:aspectj-autoproxy/>
<!--4.事务-->
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
- web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--spring核心配置文件位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--spring Listener-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--编码过滤器-->
<filter>
<filter-name>encFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--DispatcherServlet-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
第三步
开发业务代码
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login.do" method="post">
<input type="text" name="uname">
<input type="password" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
- success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录成功
</body>
</html>
- fail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录失败
</body>
</html>
- 实体类
package com.lzf.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer uid;
private String uname;
private String password;
}
- mapper层
public interface UserMapper {
User findUser(String username,String password);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lzf.mapper.UserMapper">
<select id="findUser" resultType="user">
select * from user where uname =#{param1} and password =#{param2}
</select>
</mapper>
- service层
public interface UserService {
User login(String username, String password);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User login(String username, String password) {
return userMapper.findUser(username,password);
}
}
- controller层
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/login")
public String login(String uname,String password){
String view = "";
User user = userService.login(uname, password);
if(null!=user){
view = "/success.jsp";
}else {
view = "/fail.jsp";
}
return view;
}
五、拦截器
实现接口HandlerInterceptor定义拦截器
package com.lzf.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
/*
请求到达handler之前工作
返回值尾true表示请求可以继续达到handler
false表示不行
* */
@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
/*
* handler返回ModelAndView的时候工作
* */
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
/*
* 页面渲染完毕,但是还没有给浏览器响应数据时执行
* */
@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
springmvc配置文件中注册拦截器
<!--注册拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/login"/>
<bean class="com.lzf.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
六、异常处理
第一种
Controller
@Controller
public class ControllerDemo1 {
@RequestMapping("test1")
public String test1(){
int i = 1/0;
return "success.jsp";
}
/**
* 只能对当前controller的异常进行处理
* @return
*/
@ExceptionHandler(value = Exception.class)
public ModelAndView handelExce(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/fail.jsp");
return modelAndView;
}
}
第二种
全局
@ControllerAdvice
public class GloabExceptionHandler1 {
/**
* 全局的异常处理,可以对所有的controller进行处理
* 记得让spring扫描到这个类(扫描包)
* @return
*/
@ExceptionHandler(value = Exception.class)
public ModelAndView handelExce(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/fail.jsp");
return modelAndView;
}
}
第三种
spring配置文件中配置SimpleMappingExceptionResolver
<!--自定义异常解析器-->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArithmeticException">redirect:/error.jsp</prop>
<prop key="java.lang.NullPointerException">redirect:/error2.jsp</prop>
</props>
</property>
</bean>
配置类
/**
* 全局异常,记得扫描到这个类
*/
@Configuration
public class GloableException2 {
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties prop = new Properties();
prop.put("java.lang.NullPointerException","error1.jsp");
prop.put("java.lang.ArithmeticException","error2.jsp");
resolver.setExceptionMappings(prop);
return resolver;
}
}
第四种
自定义的HandlerExceptionResolver
/**
* 全局异常
* HandlerExceptionResolve
*/
@Configuration
public class GloableException3 implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
if(e instanceof NullPointerException){
mv.setViewName("error1");
}
if(e instanceof ArithmeticException){
mv.setViewName("error2");
}
mv.addObject("msg",e);
return mv;
}}
resolver = new SimpleMappingExceptionResolver();
Properties prop = new Properties();
prop.put(“java.lang.NullPointerException”,“error1.jsp”);
prop.put(“java.lang.ArithmeticException”,“error2.jsp”);
resolver.setExceptionMappings(prop);
return resolver;
}
}
### 第四种
自定义的HandlerExceptionResolver
```java
/**
* 全局异常
* HandlerExceptionResolve
*/
@Configuration
public class GloableException3 implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
if(e instanceof NullPointerException){
mv.setViewName("error1");
}
if(e instanceof ArithmeticException){
mv.setViewName("error2");
}
mv.addObject("msg",e);
return mv;
}}