论坛首页 Java企业应用论坛

Struts2与EasyUI整合时,对于Exception异常的处理,返回含错误信息的JSON字符串

浏览 11626 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-06-02  

一、背景

既然使用了EasyUI那么,基本上都是通过JSON来进行数据交换。那么问题就来了,struts2可以通过配置,发生异常时,可以转发到相应错误页面,并显示错误信息。我们不需要返回错误页面啊!那如何返回一个JSON字符串呢?

 

 

struts.xml配置文件:

 

    <package name="xxx-default" extends="json-default">
        <global-results>
            <result name="error">/WEB-INF/jsp/common/error.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping result="error" exception="java.lang.Exception">
            </exception-mapping>

 

        </global-exception-mappings>
    </package>

 用户列表JSP页面:

 

<table id="user_dg" class="easyui-datagrid"
	data-options="url:'${pageContext.request.contextPath}/user_list.do',
        fit:true,
        rownumbers:true,
        toolbar:'#user_toolbar',
        singleSelect:true,
        pagination:true,
        pageSize:20,
        loadFilter:function(result){ 
                    if(!result.rows||!result.total){ 
                        if(result.errorMsg){  
                            $.messager.alert('错误提示','获取用户列表信息失败!错误原因:<br/>'+result.errorMsg,'error');  
                        }else{  
                            $.messager.alert('错误提示','获取用户列表信息失败!','error');  
                        }  
                        return {total:0,rows:[]};  
                    }
                }">
	<thead>
		<tr>
			<th data-options="field:'id',width:50">id</th>
			<th data-options="field:'username',width:150,sortable:true">用户名</th>
			<th data-options="field:'name',width:150,sortable:true">姓名</th>
			<th data-options="field:'email',width:200">邮箱地址</th>
			<th data-options="field:'mobile',width:200">手机</th>
			<th data-options="field:'birthday',width:150,sortable:true">生日</th>
			<th data-options="field:'options',width:150">操作</th>
		</tr>
	</thead>
</table>

 

 

原先可能你会这么写错误页面:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误页面</title>
</head>
<body>
	错误信息:
	<s:property value="exception.message" />
</body>
</html>

 

 

二、思路

思路其实很简单,指定的错误页面是JSP,那么我们可以让JSP页面显示JSON字符串不就行了么。

现在你只需要让错误页面,返回一个包含错误信息的JSON字符串

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
{"errorMsg":"<s:property value="exception.message" />"}

 

来试试看,故意抛出个异常,

    /**
     * 用户列表JSON
     * 
     * @return
     */
    public String list() throws Exception {
        dataMap.clear();
        // 故意抛出个异常,看看是否凑效
        if (true)
            throw new HibernateException(new RuntimeException(new Exception("[这是异常啊!!!!}\"..._}]")));
        int total = userService.countAll();
        Collection<User> users = userService.findPageByHQLQuery(
                getStartIndex(), getPageSize());
        log.debug("用户数:" + total);
        dataMap.put("total", total);
        // 过滤集合中元素的属性
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.registerPropertyExclusions(User.class, new String[] {
                "roles", "OPTIONS" });
        dataMap.put("rows", JSONArray.fromObject(users, jsonConfig));
        return "list";
    }

 



 

可以显示错误信息,OK,这样就搞定了,O(∩_∩)O~

大家如果有什么更好的方法,更优雅的方法,让struts2处理异常信息时返回JSON字符串,请赐教,欢迎讨论。。。

  • 大小: 27.4 KB
  • 大小: 61.5 KB
   发表时间:2014-06-06  
Ajax异常的处理,有意思!
0 请登录后投票
   发表时间:2014-06-07  
白糖_ 写道
Ajax异常的处理,有意思!


0 请登录后投票
   发表时间:2014-06-07  
有想法,给个思路,可以在struts异常拦截器中处理,判断用户请求的content-type如果是json类型在返回json信息,否则的话还是异常页面
0 请登录后投票
   发表时间:2014-06-08   最后修改:2014-06-08
rain2005 写道
有想法,给个思路,可以在struts异常拦截器中处理,判断用户请求的content-type如果是json类型在返回json信息,否则的话还是异常页面


非常感谢你的建议,这样比较通用些,我想问的是,能否有更加优雅的方式,把具体的异常信息进行分类,细化,转换为用户可以接受的错误信息。配置Exception固然可以接受所有抛出的异常,但是用户看到这个异常的话,肯定很郁闷。

那是不是再error.jsp页面里,判断是什么异常,然后显示相应信息呢?

比如: 是SQLException,显示错误信息“数据库发生异常”

        
0 请登录后投票
   发表时间:2014-06-09  
jaychang 写道
rain2005 写道
有想法,给个思路,可以在struts异常拦截器中处理,判断用户请求的content-type如果是json类型在返回json信息,否则的话还是异常页面


非常感谢你的建议,这样比较通用些,我想问的是,能否有更加优雅的方式,把具体的异常信息进行分类,细化,转换为用户可以接受的错误信息。配置Exception固然可以接受所有抛出的异常,但是用户看到这个异常的话,肯定很郁闷。

那是不是再error.jsp页面里,判断是什么异常,然后显示相应信息呢?

比如: 是SQLException,显示错误信息“数据库发生异常”

        


自定义一个异常类ErrorException,新增一个属性code,code对应错误编号,不同编号代表不同意思,比如1000=新增异常,1001读取文件异常,在后台catch异常之后将其转换为自定义异常throw new ErrorException("1000",e);异常拦截器捕获到ErrorException之后再根据code取对应的错误消息给用户。
0 请登录后投票
   发表时间:2014-06-10  
白糖_ 写道
jaychang 写道
rain2005 写道
有想法,给个思路,可以在struts异常拦截器中处理,判断用户请求的content-type如果是json类型在返回json信息,否则的话还是异常页面


非常感谢你的建议,这样比较通用些,我想问的是,能否有更加优雅的方式,把具体的异常信息进行分类,细化,转换为用户可以接受的错误信息。配置Exception固然可以接受所有抛出的异常,但是用户看到这个异常的话,肯定很郁闷。

那是不是再error.jsp页面里,判断是什么异常,然后显示相应信息呢?

比如: 是SQLException,显示错误信息“数据库发生异常”

        


自定义一个异常类ErrorException,新增一个属性code,code对应错误编号,不同编号代表不同意思,比如1000=新增异常,1001读取文件异常,在后台catch异常之后将其转换为自定义异常throw new ErrorException("1000",e);异常拦截器捕获到ErrorException之后再根据code取对应的错误消息给用户。
在哪个地方try catch?Action的方法,抛出ErrorException?
0 请登录后投票
   发表时间:2014-06-10  
jaychang 写道
白糖_ 写道
jaychang 写道
rain2005 写道
有想法,给个思路,可以在struts异常拦截器中处理,判断用户请求的content-type如果是json类型在返回json信息,否则的话还是异常页面


非常感谢你的建议,这样比较通用些,我想问的是,能否有更加优雅的方式,把具体的异常信息进行分类,细化,转换为用户可以接受的错误信息。配置Exception固然可以接受所有抛出的异常,但是用户看到这个异常的话,肯定很郁闷。

那是不是再error.jsp页面里,判断是什么异常,然后显示相应信息呢?

比如: 是SQLException,显示错误信息“数据库发生异常”

        


自定义一个异常类ErrorException,新增一个属性code,code对应错误编号,不同编号代表不同意思,比如1000=新增异常,1001读取文件异常,在后台catch异常之后将其转换为自定义异常throw new ErrorException("1000",e);异常拦截器捕获到ErrorException之后再根据code取对应的错误消息给用户。
在哪个地方try catch?Action的方法,抛出ErrorException?

Action throws ErrorException
而ErrorException可以在业务层throw,这个完全看开发人员自觉性
0 请登录后投票
   发表时间:2014-06-11  
白糖_ 写道
jaychang 写道
白糖_ 写道
jaychang 写道
rain2005 写道
有想法,给个思路,可以在struts异常拦截器中处理,判断用户请求的content-type如果是json类型在返回json信息,否则的话还是异常页面


非常感谢你的建议,这样比较通用些,我想问的是,能否有更加优雅的方式,把具体的异常信息进行分类,细化,转换为用户可以接受的错误信息。配置Exception固然可以接受所有抛出的异常,但是用户看到这个异常的话,肯定很郁闷。

那是不是再error.jsp页面里,判断是什么异常,然后显示相应信息呢?

比如: 是SQLException,显示错误信息“数据库发生异常”

        


自定义一个异常类ErrorException,新增一个属性code,code对应错误编号,不同编号代表不同意思,比如1000=新增异常,1001读取文件异常,在后台catch异常之后将其转换为自定义异常throw new ErrorException("1000",e);异常拦截器捕获到ErrorException之后再根据code取对应的错误消息给用户。
在哪个地方try catch?Action的方法,抛出ErrorException?

Action throws ErrorException
而ErrorException可以在业务层throw,这个完全看开发人员自觉性

多谢,思路清晰了些
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics