- json处理
- 统一异常处理
1.json处理
//pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>zljzyssm</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>zljzyssm Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version> <!--添加jar包依赖--> <!--1.spring 5.0.2.RELEASE相关--> <spring.version>5.0.2.RELEASE</spring.version> <!--2.mybatis相关--> <mybatis.version>3.4.5</mybatis.version> <!--mysql--> <mysql.version>5.1.44</mysql.version> <!--pagehelper分页jar依赖--> <pagehelper.version>5.1.2</pagehelper.version> <!--mybatis与spring集成jar依赖--> <mybatis.spring.version>1.3.1</mybatis.spring.version> <!--3.dbcp2连接池相关 druid--> <commons.dbcp2.version>2.1.1</commons.dbcp2.version> <commons.pool2.version>2.4.3</commons.pool2.version> <!--4.log日志相关--> <log4j2.version>2.9.1</log4j2.version> <log4j2.disruptor.version>3.2.0</log4j2.disruptor.version> <slf4j.version>1.7.13</slf4j.version> <!--5.其他--> <junit.version>4.12</junit.version> <servlet.version>4.0.0</servlet.version> <lombok.version>1.18.2</lombok.version> <mybatis.ehcache.version>1.1.0</mybatis.ehcache.version> <ehcache.version>2.10.0</ehcache.version> <redis.version>2.9.0</redis.version> <redis.spring.version>1.7.1.RELEASE</redis.spring.version> <jackson.version>2.9.3</jackson.version> <jstl.version>1.2</jstl.version> <standard.version>1.1.2</standard.version> <tomcat-jsp-api.version>8.0.47</tomcat-jsp-api.version> <commons-fileupload.version>1.3.3</commons-fileupload.version> <hibernate-validator.version>5.0.2.Final</hibernate-validator.version> <shiro.version>1.3.2</shiro.version> </properties> <dependencies> <!--1.spring相关--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!--2.mybatis相关--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!--pagehelper分页插件jar包依赖--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</version> </dependency> <!--mybatis与spring集成jar包依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!--mybatis与ehcache整合--> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>${mybatis.ehcache.version}</version> </dependency> <!--ehcache依赖--> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>${ehcache.version}</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${redis.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>${redis.spring.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <!--3.dbcp2连接池相关--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>${commons.dbcp2.version}</version> <exclusions> <exclusion> <artifactId>commons-pool2</artifactId> <groupId>org.apache.commons</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>${commons.pool2.version}</version> </dependency> <!--springmvc依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!--4.log日志相关依赖--> <!-- log4j2日志相关依赖 --> <!-- log配置:Log4j2 + Slf4j --> <!-- slf4j核心包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> <scope>runtime</scope> </dependency> <!--核心log4j2jar包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency> <!--用于与slf4j保持桥接--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j2.version}</version> </dependency> <!--web工程需要包含log4j-web,非web工程不需要--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>${log4j2.version}</version> <scope>runtime</scope> </dependency> <!--需要使用log4j2的AsyncLogger需要包含disruptor--> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>${log4j2.disruptor.version}</version> </dependency> <!--5.其他--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <!-- <scope>test</scope>--> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>${standard.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> <version>${tomcat-jsp-api.version}</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${hibernate-validator.version}</version> </dependency> <!--shiro依赖--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${shiro.version}</version> </dependency> </dependencies> <build> <finalName>zljzyssm</finalName> <resources> <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--> <resource> <directory>src/main/resources</directory> <includes> <include>jdbc.properties</include> <include>*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <dependencies> <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> </dependencies> <configuration> <overwrite>true</overwrite> </configuration> </plugin> </plugins> </build> </project>
package com.zlj.model; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.ToString; import org.hibernate.validator.constraints.NotBlank; import javax.validation.constraints.NotNull; @ToString public class Stu { @NotNull(message = "学生编号不能为空") // @Size(max = 100,min = 10,message = "大小必须在10至100之间") protected Integer sid; @NotBlank(message = "学生名不能为空") protected String same; @NotBlank(message = "学生年龄不能为空") protected Integer sage; @JsonIgnore private String spic="暂无图片"; public Stu(Integer sid, String same, Integer sage, String spic) { this.sid = sid; this.same = same; this.sage = sage; this.spic = spic; } public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSame() { return same; } public void setSame(String same) { this.same = same; } public Integer getSage() { return sage; } public void setSage(Integer sage) { this.sage = sage; } public String getSpic() { return spic; } public void setSpic(String spic) { this.spic = spic; } public Stu() { } }
stu类里@JsonIgnore:隐藏信息
//StuMapper.xml <?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.zlj.mapper.StuMapper" > <resultMap id="BaseResultMap" type="com.zlj.model.Stu" > <constructor > <idArg column="sid" jdbcType="INTEGER" javaType="java.lang.Integer" /> <arg column="same" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="sage" jdbcType="INTEGER" javaType="java.lang.Integer" /> <arg column="spic" jdbcType="VARCHAR" javaType="java.lang.String" /> </constructor> </resultMap> <sql id="Base_Column_List" > sid, same, sage, spic </sql> <select id="selectByCon" resultType="com.zlj.model.Stu" parameterType="com.zlj.model.Stu"> select <include refid="Base_Column_List" /> from student <where> <if test="same != null"> and same like concat('%',#{same},'%') </if> </where> </select> <!-- mapListPager--> <select id="mapListPager" resultType="java.util.Map" parameterType="com.zlj.model.Stu"> select <include refid="Base_Column_List" /> from student <where> <if test="same != null"> and same like concat('%',#{same},'%') </if> </where> </select> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > select <include refid="Base_Column_List" /> from student where sid = #{sid,jdbcType=INTEGER} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" > delete from student where sid = #{sid,jdbcType=INTEGER} </delete> <insert id="insert" parameterType="com.zlj.model.Stu" > insert into student (sid, same, sage, spic) values (#{sid,jdbcType=INTEGER}, #{same,jdbcType=VARCHAR}, #{sage,jdbcType=INTEGER}, #{spic,jdbcType=VARCHAR}) </insert> <insert id="insertSelective" parameterType="com.zlj.model.Stu" > insert into student <trim prefix="(" suffix=")" suffixOverrides="," > <if test="sid != null" > sid, </if> <if test="same != null" > same, </if> <if test="sage != null" > sage, </if> <if test="spic != null" > spic, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="sid != null" > #{sid,jdbcType=INTEGER}, </if> <if test="same != null" > #{same,jdbcType=VARCHAR}, </if> <if test="sage != null" > #{sage,jdbcType=INTEGER}, </if> <if test="spic != null" > #{spic,jdbcType=VARCHAR}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.zlj.model.Stu" > update student <set > <if test="same != null" > same = #{same,jdbcType=VARCHAR}, </if> <if test="sage != null" > sage = #{sage,jdbcType=INTEGER}, </if> <if test="spic != null" > spic = #{spic,jdbcType=VARCHAR}, </if> </set> where sid = #{sid,jdbcType=INTEGER} </update> <update id="updateByPrimaryKey" parameterType="com.zlj.model.Stu" > update student set same = #{same,jdbcType=VARCHAR}, sage = #{sage,jdbcType=INTEGER}, spic = #{spic,jdbcType=VARCHAR} where sid = #{sid,jdbcType=INTEGER} </update> </mapper>
package com.zlj.mapper; import com.zlj.model.Stu; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Map; @Repository public interface StuMapper { int deleteByPrimaryKey(Integer sid); int insert(Stu record); int insertSelective(Stu record); Stu selectByPrimaryKey(Integer sid); int updateByPrimaryKeySelective(Stu record); int updateByPrimaryKey(Stu record); List<Stu> selectByCon(Stu stu); List<Map> mapListPager(Stu stu, Object o); }
package com.zlj.biz; import com.zlj.model.Stu; import com.zlj.util.PageBean; import java.util.List; import java.util.Map; /** * @author zlj * @create 2023-09-07 17:09 */ public interface StuBiz { int deleteByPrimaryKey(Integer sid); int insert(Stu record); int insertSelective(Stu record); Stu selectByPrimaryKey(Integer sid); int updateByPrimaryKeySelective(Stu record); int updateByPrimaryKey(Stu record); List<Stu> ListPager(Stu stu, PageBean PageBean); List<Map> mapListPager(Stu stu, Object o); }
package com.zlj.biz.Impl; import com.zlj.biz.StuBiz; import com.zlj.mapper.StuMapper; import com.zlj.model.Stu; import com.zlj.util.PageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; /** * @author zlj * @create 2023-09-08 14:52 */ @Service public class StuBizImpl implements StuBiz { @Autowired private StuMapper stuMapper; @Override public int deleteByPrimaryKey(Integer sid) { return stuMapper.deleteByPrimaryKey(sid); } @Override public int insert(Stu record) { return stuMapper.insert(record); } @Override public int insertSelective(Stu record) { return stuMapper.insertSelective(record); } @Override public Stu selectByPrimaryKey(Integer sid) { return stuMapper.selectByPrimaryKey(sid); } @Override public int updateByPrimaryKeySelective(Stu record) { return stuMapper.updateByPrimaryKeySelective(record); } @Override public int updateByPrimaryKey(Stu record) { return stuMapper.updateByPrimaryKey(record); } @Override public List<Stu> ListPager(Stu stu, PageBean pageBean) { return stuMapper.selectByCon(stu); } @Override public List<Map> mapListPager(Stu stu, Object o) { return stuMapper.mapListPager(stu,o); } }
package com.zlj.web; import com.zlj.biz.StuBiz; import com.zlj.model.Stu; import com.zlj.util.PageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; //@ResponseBody //@Controller @RestController //@RestController=@ResponseBody+@Controller @RequestMapping("/stu/json") public class JsonController { @Autowired private StuBiz stuBiz; /** * 返回List<T> * @param req * @param stu * @return */ // @ResponseBody @RequestMapping("/list") public List<Stu> list(HttpServletRequest req, Stu stu){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Stu> lst = this.stuBiz.ListPager(stu, pageBean); return lst; } /** * 返回T * @param req * @param stu * @return */ // @ResponseBody @RequestMapping("/load") public Stu load(HttpServletRequest req, Stu stu){ if(stu.getSid() != null){ List<Stu> lst = this.stuBiz.ListPager(stu, null); return lst.get(0); } return null; } /** * 返回List<Map> * @param req * @param stu * @return */ // @ResponseBody @RequestMapping("/mapList") public List<Map> mapList(HttpServletRequest req, Stu stu){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Map> lst = this.stuBiz.mapListPager(stu, pageBean); return lst; } /** * 返回Map * @param req * @param stu * @return */ // @ResponseBody @RequestMapping("/mapLoad") public Map mapLoad(HttpServletRequest req, Stu stu){ if(stu.getSid() != null){ List<Map> lst = this.stuBiz.mapListPager(stu, null); return lst.get(0); } return null; } // @ResponseBody @RequestMapping("/all") public Map all(HttpServletRequest req, Stu stu){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Stu> lst = this.stuBiz.ListPager(stu, pageBean); Map map = new HashMap(); map.put("lst",lst); map.put("pageBean",pageBean); return map; } // @ResponseBody //返回单个字符串,而不是页面 @RequestMapping("/jsonStr") public String jsonStr(HttpServletRequest req, Stu stu){ System.out.println("333....."); return "stuEdit"; } }
@RestController=@ResponseBody+@Controller
2.统一异常处理
为什么要全局异常处理
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
异常处理思路
系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
处理异常方式一演示(StuBizImpl的mapList方法加 stu=null; System.out.println(stu.getSame();--------jsonCotrollor的list方法加)System.out.println(1 / 0);),spring-mvc.xml配置,建一个error.jsp页面,分别报两个错
package com.zlj.biz.Impl; import com.zlj.biz.StuBiz; import com.zlj.mapper.StuMapper; import com.zlj.model.Stu; import com.zlj.util.PageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; /** * @author zlj * @create 2023-09-08 14:52 */ @Service public class StuBizImpl implements StuBiz { @Autowired private StuMapper stuMapper; @Override public int deleteByPrimaryKey(Integer sid) { return stuMapper.deleteByPrimaryKey(sid); } @Override public int insert(Stu record) { return stuMapper.insert(record); } @Override public int insertSelective(Stu record) { return stuMapper.insertSelective(record); } @Override public Stu selectByPrimaryKey(Integer sid) { return stuMapper.selectByPrimaryKey(sid); } @Override public int updateByPrimaryKeySelective(Stu record) { return stuMapper.updateByPrimaryKeySelective(record); } @Override public int updateByPrimaryKey(Stu record) { return stuMapper.updateByPrimaryKey(record); } @Override public List<Stu> ListPager(Stu stu, PageBean pageBean) { return stuMapper.selectByCon(stu); } @Override public List<Map> mapListPager(Stu stu, Object o) { stu=null; System.out.println(stu.getSame()); return stuMapper.mapListPager(stu,o); } }
package com.zlj.web; import com.zlj.biz.StuBiz; import com.zlj.model.Stu; import com.zlj.util.PageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; //@ResponseBody //@Controller @RestController //@RestController=@ResponseBody+@Controller @RequestMapping("/stu/json") public class JsonController { @Autowired private StuBiz stuBiz; /** * 返回List<T> * @param req * @param stu * @return */ // @ResponseBody @RequestMapping("/list") public List<Stu> list(HttpServletRequest req, Stu stu){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Stu> lst = this.stuBiz.ListPager(stu, pageBean); System.out.println(1 / 0); return lst; } /** * 返回T * @param req * @param stu * @return */ // @ResponseBody @RequestMapping("/load") public Stu load(HttpServletRequest req, Stu stu){ if(stu.getSid() != null){ List<Stu> lst = this.stuBiz.ListPager(stu, null); return lst.get(0); } return null; } /** * 返回List<Map> * @param req * @param stu * @return */ // @ResponseBody @RequestMapping("/mapList") public List<Map> mapList(HttpServletRequest req, Stu stu){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Map> lst = this.stuBiz.mapListPager(stu, pageBean); return lst; } /** * 返回Map * @param req * @param stu * @return */ // @ResponseBody @RequestMapping("/mapLoad") public Map mapLoad(HttpServletRequest req, Stu stu){ if(stu.getSid() != null){ List<Map> lst = this.stuBiz.mapListPager(stu, null); return lst.get(0); } return null; } // @ResponseBody @RequestMapping("/all") public Map all(HttpServletRequest req, Stu stu){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Stu> lst = this.stuBiz.ListPager(stu, pageBean); Map map = new HashMap(); map.put("lst",lst); map.put("pageBean",pageBean); return map; } // @ResponseBody //返回单个字符串,而不是页面 @RequestMapping("/jsonStr") public String jsonStr(HttpServletRequest req, Stu stu){ System.out.println("333....."); return "stuEdit"; } }
//spring-mvc.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: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-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)--> <context:component-scan base-package="com.zlj"/> <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --> <mvc:annotation-driven /> <!--3) 创建ViewResolver视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!--4) 单独处理图片、样式、js等资源 --> <!-- <mvc:resources location="/css/" mapping="/css/**"/>--> <!-- <mvc:resources location="/js/" mapping="/js/**"/>--> <!-- <mvc:resources location="WEB-INF/images/" mapping="/images/**"/> --> <mvc:resources location="/static/" mapping="/static/**"/> <!-- 处理文件上传下载问题--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 --> <property name="defaultEncoding" value="UTF-8"></property> <!-- 文件最大大小(字节) 1024*1024*50=50M--> <property name="maxUploadSize" value="52428800"></property> <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常--> <property name="resolveLazily" value="true"/> </bean> <!-- 配置拦截器--> <mvc:interceptors> <bean class="com.zlj.interceptor.LoginInterceptor"></bean> </mvc:interceptors> <!--单拦截器--> <!-- <mvc:interceptors>--> <!-- <bean class="com.zlj.interceptor.OneInterceptor"></bean>--> <!-- </mvc:interceptors>--> <!-- <mvc:interceptors>--> <!-- <!–2) 多拦截器(拦截器链)–>--> <!-- <mvc:interceptor>--> <!-- <mvc:mapping path="/**"/>--> <!-- <bean class="com.zlj.interceptor.OneInterceptor"/>--> <!-- </mvc:interceptor>--> <!-- <mvc:interceptor>--> <!-- <mvc:mapping path="/stu/**"/>--> <!-- <bean class="com.zlj.interceptor.TwoInterceptor"/>--> <!-- </mvc:interceptor>--> <!-- </mvc:interceptors>--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter"/> </list> </property> </bean> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件--> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- springmvc提供的简单异常处理器 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 定义默认的异常处理页面 --> <property name="defaultErrorView" value="error"/> <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> <property name="exceptionAttribute" value="ex"/> <!-- 定义需要特殊处理的异常,这是重要点 --> <property name="exceptionMappings"> <props> <prop key="java.lang.RuntimeException">error</prop> </props> <!-- 还可以定义其他的自定义异常 --> </property> </bean> <!-- 处理controller层发送请求到biz,会经过切面拦截处理--> <aop:aspectj-autoproxy/> </beans>
package com.zlj.exception; public class GlobalException extends RuntimeException { public GlobalException() { } public GlobalException(String message) { super(message); } public GlobalException(String message, Throwable cause) { super(message, cause); } public GlobalException(Throwable cause) { super(cause); } public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }
处理方式二,GobalHandler
package com.zlj.component; import com.zlj.exception.GlobalException; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class GlobalExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv = new ModelAndView(); mv.setViewName("error");//WEB-INF/jsp/error.jsp if (e instanceof GlobalException){ GlobalException globalException = (GlobalException) e; mv.addObject("ex",globalException.getMessage()); mv.addObject("msg","全局异常...."); }else if (e instanceof RuntimeException){ RuntimeException runtimeException = (RuntimeException) e; mv.addObject("ex",runtimeException.getMessage()); mv.addObject("msg","运行时异常...."); }else{ mv.addObject("ex",e.getMessage()); mv.addObject("msg","其他异常...."); } return mv; } }
注:@Component注释后会没有效果
<%-- Created by IntelliJ IDEA. User: 朱 Date: 2023/9/13 Time: 15:31 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 错误信息界面。。。 <hr> ${ex} </hr> <hr> ${msg} </hr> </body> </html>
方式三
package com.zlj.component; import com.zlj.exception.GlobalException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import java.util.HashMap; import java.util.Map; @ControllerAdvice public class GlobalExceptionResolver { // 跳转错误页面 // @ExceptionHandler // public ModelAndView handler(Exception e){ // ModelAndView mv = new ModelAndView(); // mv.setViewName("error"); // if (e instanceof GlobalException){ // GlobalException globalException = (GlobalException) e; // mv.addObject("ex",globalException.getMessage()); // mv.addObject("msg","全局异常...."); // }else if (e instanceof RuntimeException){ // RuntimeException runtimeException = (RuntimeException) e; // mv.addObject("ex",runtimeException.getMessage()); // mv.addObject("msg","运行时异常...."); // } // return mv; // } // 返回错误json数据 @ResponseBody @ExceptionHandler public Map handler(Exception e){ Map map = new HashMap(); if (e instanceof GlobalException){ GlobalException globalException = (GlobalException) e; map.put("ex",globalException.getMessage()); map.put("msg","全局异常...."); }else if (e instanceof RuntimeException){ RuntimeException runtimeException = (RuntimeException) e; map.put("ex",runtimeException.getMessage()); map.put("msg","运行时异常...."); }else { map.put("ex",e.getMessage()); map.put("msg","其它异常...."); } return map; } }
package com.zlj.component; import com.zlj.exception.GlobalException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice public class GlobalExceptionResolver { // 跳转错误页面 @ExceptionHandler public ModelAndView handler(Exception e){ ModelAndView mv = new ModelAndView(); mv.setViewName("error"); if (e instanceof GlobalException){ GlobalException globalException = (GlobalException) e; mv.addObject("ex",globalException.getMessage()); mv.addObject("msg","全局异常...."); }else if (e instanceof RuntimeException){ RuntimeException runtimeException = (RuntimeException) e; mv.addObject("ex",runtimeException.getMessage()); mv.addObject("msg","运行时异常...."); } return mv; } // 返回错误json数据 // @ResponseBody // @ExceptionHandler // public Map handler(Exception e){ // Map map = new HashMap(); // if (e instanceof GlobalException){ // GlobalException globalException = (GlobalException) e; // map.put("ex",globalException.getMessage()); // map.put("msg","全局异常...."); // }else if (e instanceof RuntimeException){ // RuntimeException runtimeException = (RuntimeException) e; // map.put("ex",runtimeException.getMessage()); // map.put("msg","运行时异常...."); // }else { // map.put("ex",e.getMessage()); // map.put("msg","其它异常...."); // } // return map; // } }