当我们在执行程序的时候,会出现异常抛出情况,需要我们将异常跳转到制定的网页下,而不是令网页宕机。
首先我们可以配置一个RequestMapping(“/handlerEx”)
public String handlerException(IntegerdataIndex)throws Exception{
String[] stus =new String[]{"小强1","小强2","小强3","小强4","小强5"};
if(dataIndex>=0&&dataIndex<=4){
System.out.println("---->"+stus[dataIndex]);
}else{
System.out.println("出现了异常");
throw new NotEnoughMoney("您输入的信息有误");
}
return "/exTest/success";
}
异常是自己手写的一个异常
package mvc.data.exTest.service;
public class NotEnoughMoneyextends RuntimeException{
/**
*
*/
private static final long serialVersionUID = 6761680430463600991L;
public NotEnoughMoney() {
super();
// TODO Auto-generated constructor stub
}
public NotEnoughMoney(Stringmessage, Throwablecause,boolean enableSuppression,boolean writableStackTrace) {
super(message,cause,enableSuppression,writableStackTrace);
// TODO Auto-generated constructor stub
}
public NotEnoughMoney(Stringmessage, Throwablecause) {
super(message,cause);
// TODO Auto-generated constructor stub
}
public NotEnoughMoney(Stringmessage) {
super(message);
// TODO Auto-generated constructor stub
}
public NotEnoughMoney(Throwablecause) {
super(cause);
// TODO Auto-generated constructor stub
}
}
当我们向该网址传入的dataIndex属性值不在区间内时就会报错宕机,为了不使宕机出现。我们需要配置一个ExTestHandlerExceptionResolver类,这个类实现的是HandlerExceptionResolver接口
package mvc.data.exTest.exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class ExtestHandlerExceptionResolver implements HandlerExceptionResolver{
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView mav = new ModelAndView("/exTest/error");
mav.addObject("errorData", ex);
return mav;
}
}
这个类需要配置到上下文文件内,这个上下文文件应该为在web.xml文件内配置的DispatcherServlet的param-value属性内对应的classpath值.从执行过程中可以看出,如果出现异常,系统则会调用HandlerExceptionResolver的实现类对这些异常进行处理,返回一个ModelAndView对象,将所需要的jsp文件返回给服务器进行解析。
之前在研究ajax实现异步操作时,通过访问servlet的形式,可以采用SpringMVC对ajax的封装实现代码的简化。
首先实现的是原始的ajax
Jsp页面上的代码如下
function sendJsonData(){
//var param='{"stuName":"小强","stuNo":"123456","age":19}';
var param ='456';
$.post("${ctx}/jsonData.action",{"stuName":"小强","stuNo":"123456","age":19},function(data){
alert(param);
alert(data.age+"<----->"+data.stuName);
},"json")
}
对应的Controller层的代码如下
@RequestMapping("/jsonData")
public void jsonRequest(HttpServletResponseresponse,HttpServletRequestrequest)throws Exception{
String stuName =request.getParameter("stuName");
System.out.println(stuName);
response.setCharacterEncoding("UTF-8");
Student stu =new Student("小明","123456",19);
System.out.println(stu);
String json =new Gson().toJson(stu);
response.getWriter().write(json);
}
原始的ajax异步请求需要HttpServletResponse提供的getWriter方法.
现将java格式的对象转化为json格式的对象,通过流的形式将转化成的json格式的对象反馈给对应的function中
如果使用SpringMVC对ajax的封装,可以省去很多的代码
Jsp页面上的代码如下
function sendJsonData01(){
var param='{"stuName":"小强","stuNo":"123456","age":19}';
$.ajax({
/**
1.url:访问路径
2.data:传递的数据
3.contentType:传递的数据格式
4.dataType:接受的数据类型的格式
5.type:传值的方式
6.success:传值成功之后执行的函数
*/
url : "${ctx}/mvcJsonData.action",
data : param,
contentType : "application/json;charset=UTF-8",
type:"post",
dataType : "json",
success : function(data){
alert(data.stuName);
}});
}
对应的Controller层的代码如下
@RequestMapping("/mvcJsonData")
@ResponseBody
public Student mvcJsonData(@RequestBody Studentstus){
System.out.println(stus);
Student stu =new Student("小明","123456",19);
return stu;
}
这样就实现了自动封装,省去了很多代码,由SpringMVC将功能进行实现,其中RequestBody是将传入的json格式的数据转化为java格式的数据(Student stus),而ResponseBody是将java格式的数据自动转化为了json格式的数据,相当于这样的两行代码
String json = new Gson().toJson(stu);
response.getWriter().write(json);