|
角色管理统一异常处理(1) |
|
|
京淘
权限管理系统
Day18
1. 角色管理初步优化 1-1
1.1. 统一异常处理 1-1
1.1.1. 定义业务层异常类 1-2
1.1.2. 定义统一异常处理类 1-2
1.2. 统一结果集封装 1-3
1.2.1. 定义JsonResult类 1-3
1.2.2. 应用JsonResult类 1-4
2. 用户管理需求设计 2-5
2.1. 功能设计 2-5
2.2. 表的设计 2-5
2.3. 实体设计 2-5
3. 用户管理原型设计 3-6
3.1. 用户列表页面 3-6
3.2. 用户添加页面 3-6
3.3. 用户修改页面 3-7
4. 用户管理查询模块服务端实现 4-7
4.1. 查询模块DAO实现 4-7
4.2. 查询模块Mapper元素实现 4-7
4.3. 查询模块Service接口方法定义及实现 4-8
4.4. 查询模块Controller方法的实现 4-9
5. 查询模块客户端页面实现 5-10
5.1. 定义客户端页面user_list.html 5-10
5.2. 客户端页面中JS代码实现. 5-10
5.3. 客户端页面start.html注册菜单事件 5-11
6. 总结 6-11
6.1. 重点和难点分析 6-11
6.2. 常见FAQ 6-12
角色管理初步优化
异常处理
提高系统容错机制的一种方式,并可以更好的改善用户体验.
我们业务数据异常通常要反馈给用户这种反馈可通过异常的传递进行实现.
项目统一异常处理基本步骤:
一个异常类,业务层异常
一个的异常处理handler),在此类中进行全局异常处理.
定义业务层异常
publicclassServiceExceptionextendsRuntimeException{
privatestaticfinallongserialVersionUID=-4181072079763562413L;
publicServiceException(){
super();
}
publicServiceException(Stringmessage,Throwablecause,
booleanenableSuppression,booleanwritableStackTrace){
super(message,cause,enableSuppression,writableStackTrace);
}
publicServiceException(Stringmessage,Throwablecause){
super(message,cause);
}
publicServiceException(Stringmessage){
super(message);
}
publicServiceException(Throwablecause){
super(cause);
}
}
定义统一异常处理类
@ControllerAdvice
publicclassControllerExceptionHandler{
@ExceptionHandler(ServiceException.class)
@ResponseBody
publicStringhandleServiceException(
ServiceExceptione){
e.printStackTrace();
returne.getMessage();
}
}结果集
在实际项目中,为了客户端更好的处理服务端数据,通常会在服务端数据进行
的状态,具体信息,数据等.
定义JsonResult类
publicclassJsonResult{//Result/R
/状态码(例如404是一个状态)
State=1,表示业务成功完成.
State=0,表示业务完成失败/
privateintstate=1;
/与状态码对应的具体消息(
例如404表示错误信息,是url对应的地址没找到)
/
privateStringmessage="OK";
/借助此属性封装服务端返回的具体数据,
例如查询的结果/
privateObjectdata;
publicJsonResult(){}
publicJsonResult(intstate,Stringmessage){
this.state=state;
this.message=message;
}
publicJsonResult(intstate,Stringmessage,Objectdata){
this.state=state;
this.message=message;
this.data=data;
}
/当在控制层将一个JsonResult对象
转换为JSON串时,会调用此对象对应的
get方法/
publicintgetState(){
returnstate;
}
publicStringgetMessage(){
returnmessage;
}
publicObjectgetData(){
returndata;
}
}
应用JsonResult类
RoleController中列表页面数据查询定义
@RequestMapping("doFindPageObjects")
@ResponseBody
publicJsonResultdoFindPageObjects(IntegerpageCurrent,Stringname){
PageObjectpageObject=
sysRoleService.
findPageObjects(pageCurrent,name);
returnnewJsonResult(1,"queryok",pageObject);//data
}
客户端JS实现页面数据部分JS:
functiondoGetObjects(){
varurl="role/doFindPageObjects.do";
varpageCurrent=$("#pageId").data("pageCurrent");
if(!pageCurrent)pageCurrent=1;
varparams={"pageCurrent":pageCurrent};
params.name=$("#searchNameId").val();
$.getJSON(url,params,function(result){//JsonResult
if(result.state==1){
//将服务端返回的数据添填充在表格中
setTableTBodyRows(result.data.records);
//设置分页信息
setPagination(result.data);
}else{
alert(result.message);
}
});
}
用户管理如下表创建在_sys数据库中CREATETABLE`sys_users`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`username`varchar(50)NOTNULL,
`password`varchar(100),
`salt`varchar(50),
`email`varchar(100),
`mobile`varchar(100),
`valid`tinyint(4),
`createdTime`datetime,
`modifiedTime`datetime,
`createdUser`varchar(20),
`modifiedUser`varchar(20),
PRIMARYKEY(`id`),
UNIQUEKEY`username`(`username`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8;
实体设计
创建实体类对应我们的数据库表
publicclassSysUserimplementsSerializable{
privatestaticfinallongserialVersionUID=1768931144633277198L;
privateIntegerid;
privateStringusername;
privateStringpassword;
privateStringemail;
privateStringmobile;
privateStringsalt;//盐值
privateIntegervalid;
privateDatecreatedTime;
privateStringcreatedUser;
privateStringmodifiedUser;
privateDatemodifiedTime;
//set,get
}
用户管理原型设计
用户列表页面
用户添加页面
用户修改页面
用户管理查询模块服务端实现
查询模块DAO实现
定义SysUserDao接口,并在接口中添加如下两个方法,要考虑到分页。
ListfindPageObjects(
@Param("username")Stringusername,
@Param("startIndex")IntegerstartIndex,
@Param("pageSize")IntegerpageSize);
intgetRowCount(@Param("username")Stringusername);
查询模块Mapper元素实现
在SysUserMapper中添加查询元素。
定义公共的查询条件:
usernameLIKECONCAT(''%'',#{username},''%'')
select
id,
username,
email,
mobile,
valid
fromsys_users
LIMIT#{startIndex},#{pageSize}
resultType="java.lang.Integer">
selectcount()fromsys_users
查询模块Service接口方法定义及实现
定义SysUserService接口及接口方法实现。
publicinterfaceSysUserService{
PageObjectfindPageObjects(Stringusername,IntegercurrentPage);
}
接口实现类自己写:
@Service
publicclassSysUserServiceImplimplementsSysUserService{
@Autowired
@Qualifier("sysUserDao")
privateSysUserDaosysUserDao;
@Override
publicPageObjectfindPageObjects(Stringusername,
IntegerpageCurrent){
//1.查询当前页数据
intpageSize=3;
intstartIndex=(pageCurrent-1)pageSize;
Listrecords=
sysUserDao.findPageObjects(username,
startIndex,pageSize);
//2.根据条件查询总记录数
introwCount=sysUserDao.getRowCount(username);
intpageCount=rowCount/pageSize;
if(rowCount%pageSize!=0){
pageCount++;
}
//3.封装数据(当前页数据,分页信息)
PageObjectpageObject=
newPageObject<>();
pageObject.setPageCount(pageCount);
pageObject.setRowCount(rowCount);
pageObject.setPageCurrent(pageCurrent);
pageObject.setRecords(records);
returnpageObject;
}
}
查询模块Controller方法的实现
定义SysUserController类,并在类中定义do.
@Controller
@RequestMapping("/user/")
publicclassSysUserController{
@Autowired
privateSysUserServicesysUserService;
@RequestMapping("listUI")
publicStringlistUI(){
return"sys/user_list";
}
@RequestMapping("doFindPageObjects")
@ResponseBody
publicJsonResultdoFindPageObjects(
Stringusername,
IntegerpageCurrent){
PageObjectpageObject=
sysUserService.findPageObjects(
username,pageCurrent);
returnnewJsonResult(1,"ok",pageObject);
}
}
查询模块客户端页面
定义客户端页面)在WEB-INF/pages/sys目录下添加user_list.html)修改页面内容
具体页面内容:/WEB-INF/sys/user_list.html
客户端页面中JS代码实现.
js实现
functiondoGetObjects(){
varurl="user/doFindPageObjects.do";
varpageCurrent=
$("#pageId").data("pageCurrent");
if(!pageCurrent)pageCurrent=1;
varparams={"pageCurrent":pageCurrent};
//console.log($(this));
params.username=$("#searchNameId").val();
console.log(params);
$.getJSON(url,params,function(result){//JsonResult
if(result.state==1){
//将服务端返回的数据添填充在表格中
setTableTBodyRows(result.data.records);
//设置分页信息
setPagination(result.data);
}else{
alert(result.message);
}
});
}
详细js参考user_list.html
客户端页面start.html注册菜单
先定义要点击的管理元素的id,然后点击事件$("#load-user-id").click(function(){
//console.log("helloworld");
$(".container-fluid").load("user/listUI.do",function(){
$(".container-fluid").removeData("id");
});
})
总结
重点和难点分析
常见FAQ
1-2
|
|
|
|
|
|
|
|
|
|
|