SpringMVC——全局异常和日期类型处理

一,SpringMVC处理全局异常

1.1 使用@ExceptionHandler注解

第一步:创建一个基类的BaseController,用来实现全局异常。

使用@ExceptionHandler注解标注handleException()方法。

package com.lmc.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

public class BaseController {
	
	@ExceptionHandler
	public String handleException(HttpServletRequest req, Exception ex){
		return "error";
	}

}

注意:handleException() 方法有两个参数,不能省略。

  • request:当前发生异常的请求
  • exception:异常对象

第二步:定义一个普通控制器,继承BaseController基类

package com.lmc.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.RequestMapping;

@org.springframework.web.bind.annotation.RestController
public class RestController extends BaseController {
	
	@RequestMapping("hello")
	public String sayHello(){
		if(true) throw new RuntimeException();
		return "say hello";
	}

}


1.2自定义异常处理类

第一步:创建一个自定义异常处理类

public class MyExceptionHandler implements HandlerExceptionResolver {

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("msg", "服务器发生异常,请稍后再试!");
		mv.setViewName("error");
		//输出异常的跟踪信息
		ex.printStackTrace();
		return mv;
	}

}

第二步:在SpringMVC配置文件中配置该异常处理类

bean class="com.lmc.MyExceptionHandler"/>

二,SpringMVC日期类型处理

如果表单提交过来的数据是日期格式,但是控制器使用Date类型接收该参数时,会提示类型转换失败。

解决方法:

2.1 使用@DateTimeFormat

(1)使用@DateTimeFormat指定转换格式

public class User{
    private String name;
    private String password;
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date birthday;
}

(2)控制器中加入一段数据绑定代码。

@Controller
public class UserController{
    @InitBinder
    public void init(WebDataBinder binder){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    binder.regiesterCustomEditor(Date.class,new CustomDateEditor(sdf,true));
    }
    
}

这样每次访问该控制器方法的时候都会执行@InitBinder绑定的方法

2.2 配置全局日期类型转换器

首先,定义一个日期转换器类,该类实现Converter接口。

package com.lmc.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

/**
 * 对提交的表单日期字符串类型转换成日期类型
 * @author Administrator
 *
 */
@Component
public class DateConverter implements Converter<String, Date> {

	@Override
	public Date convert(String date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return format.parse(date);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

}

然后在Spring的配置文件中进行配置

<!-- 启动注解功能 -->
    <mvc:annotation-driven conversion-service="dateConvertor"/>
    
    <!-- 定义全局的日期转换器 -->
    <bean id="dateConvertor" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    	<property name="converters">   
    		<list>
    			<bean class="com.lmc.utils.DateConverter"/>
    		</list>
    	</property>
    </bean>
1.编写类MyDate.java 2.该类有如下构造方法 2.1 无参数构造方法public MyDate(),以当前的系统时间构造MyDate对象 2.2 public MyDate(int year, int month, int day), 以指定的年月日构造MyDate对象 3.该类有如下属性 3.1 private int year ;//年 3.2 private int month; //月 3.3 private int day; //日 4.该类有如下方法 4.1 public String after(int day); //返回当前对象代表的日期之后day天的日期,比如当前对象是2008-8-8,调用after(5)以后,应该返回2008-8-13,格式可自定义 4.2 public String before(int day); //返回当前对象代表的日期之前day天的日期,比如当前对象是2008-8-8,调用before(5)以后,应该返回2008-8-3,格式可自定义 4.3 public void setYear(int year); //设置年为指定值year 4.4 public void setMonth(int month); //设置月为指定值month 4.5 public void setDay(int day); //设置日为指定值day 4.6 public int getYear(); //返回当前对象的年 4.7 public int getMonth(); //返回当前对象的月 4.8 public int getDay(); //返回当前对象的日 4.9 public void set (int year, int month, int day); //设置年、月、日为指定的值year、month、day 4.10 public String toString();//以字符串形式返回当前对象的年月日,例如2008年08月08日,格式可自定义 4.11 public boolean equals(MyDate mydate);//当前对象与另一个对象比较,如果两个对象的年月日均相等,则返回true,反之返回false 5.编写TestMyDate.java,在main方法中对MyDate类的各个方法进行测试 6.按照编程规范为MyDate.java编写规范的代码 7.按照java doc API的要求,对代码编写规范的注释,然后利用javadoc.exe命令生成MyDate.java的API doc 8.撰写上机报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值