为什么80%的码农都做不了架构师?>>>   

错误信息包括两种,一种是异常信息的显示,一种是后台验证信息显示。而且显示又分直接页面跳转的提交,和通过Ajax的提交。 先看,异常信息与直接页面跳转的例子。在例子中,运用play框架的catch注解标签统一处理: 自定义异常类 app.models.MyException:

package models;public class MyException extends Exception{public MyException(Exception e) {super(e);}public MyException(String msg){super(msg);}public MyException(String msg, Exception e) {super(msg,e);}
}

控制器父类 app.controllers.Application.java中的拦截方法,这里处理了html请求与ajax请求

@Catch(MyException.class)
public static void ExceptionCatcher(MyException e){String accept= request.headers.get("accept").toString();String s[]=accept.split(",");String msg = e.getMessage();if (s[0].equalsIgnoreCase("[text/html")){render("errors/550.html",msg);}else if (s[0].equalsIgnoreCase("[application/json")){Validation.clear();   //有了异常只显示异常信息,清空之前的validation数据Validation.addError("ServerError" ,msg);Response.current().status = 550;renderText(JSONUtil.parseObject(Validation.errors()));}else{render("errors/550.html",msg);}
}

制造一个简单的异常 app.controllers.CalcAction.java:

package controllers;
import models.MyException;public class CalcAction extends Application{public static void zero() throws MyException{try{int ka = 2/0;           }catch(Exception e){throw new MyException(e);}}
}

routes中路由节点

GET    /zero                CalcAction.zero

错误信息的i18n对应文档,conf/messages

# Validation messages
validation.required=%s不能为空
validation.minSize=%s长度必须大于%d位
validation.maxSize=%s长度不能超过%d位
validation.range=%s必须在 %d和 %d之间
validation.equals=%s必须一致
validation.email=电子邮箱(Email)格式不正确
validation.phone=手机号格式不正确
validation.isTrue=%s must be checked
validation.match=%s格式不正确
validation.min=%s必须大于%d
validation.invalid=%s输入无效
validation.unique=%s已存在
serverError=服务器异常,请联系管理员

错误显示页面 views/errors/550.html

Application error
<h1>Oops, an error occured</h1>
This exception has been logged with id <strong>${msg}</strong>.

显示结果: 然后是后台的验证信息与ajax方式提交的显示,这种情况在数据校验的时候常用。统一校验已经在系列前文中提到,这里就直接上代码了,重在显示验证错误信息的显示。 使用的models,其中包含了验证字段,app.models.User.java:

package models;import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;import play.data.validation.Email;
import play.data.validation.MinSize;
import play.data.validation.Required;
import play.db.jpa.GenericModel;@Entity
@Table(name="user")
public class User extends GenericModel {@Idpublic long id;@Requiredpublic String code;@MinSize(value = 4)public String name;public String pwd;public int sex;@Emailpublic String email;public String regip;public Date regtime;
}

控制器父类 app.controllers.Application.java中的拦截方法

@Catch(MyException.class)
@Before
public static void validationIntercept() {if(validation.hasErrors()){response.status = 550;renderText(JSONUtil.parseObject(validation.errors()));}
}

routes路由

POST    /user        UserAction.save

添加用户的界面veiw/Application/reg.html,这里为了方便,将html与javascript代码写在一起了。通过引入#{i18n /}可以直接调用i18n函数,进行国际化。

#{extends 'main.html' /}
#{set title:'Home' /}
#{i18n /}
<script type="text/javascript">var submitform = function(){$.ajax({url: "/user",type: "POST",dataType: "json",data: $("#myform").serialize(),success: function(data){window.location.href="/user/"+data; },error: function(XMLHttpRequest, textStatus, errorThrown){if (XMLHttpRequest.status == 550) {var exp = JSON.parse(XMLHttpRequest.responseText);showMsg(exp);}}});}var showMsg = function(exp,obj){for(var i=exp.length-1;i>=0;i--){var object=$('#myform input[name="'+exp[i].key+'"]');if(exp[i].key!="ServerError"){object.parent().next().css('color','red');var error=object.prev().html();object.parent().next().html(i18n(exp[i].message,error,exp[i].variables[0],exp[i].variables[1]));if(i==0){object.focus();}}else{showMsg(i18n(exp[i].message, exp[i].key));}}}
</script>
<body>
<div style="padding-left:20px;padding-top: 20px;"><form action="/user" method="post" id="myform"><div><label>用户名:</label><input type="text" id="code" name="user.code"/></div><span></span><br/><div><label>昵称:</label><input type="text" id="name" name="user.name"/></div><span></span><br/><div><label>密码:</label><input type="password" id="pwdid" name="user.pwd"/></div><span></span><br/><div><label>邮箱:</label><input type="text" id="email" name="user.email"/></div><span></span><br /><div><label>性别:</label><label><input type="radio" name="user.sex" value="1"checked="checked">男</label><label><input type="radio" name="user.sex" value="0">女</label></div><span></span><input type="button" value="submit" onclick="submitform()"></form>
</div>
</body>

测试结果:

转载于:https://my.oschina.net/markho/blog/498133

Play 1.x框架学习之五:错误信息显示 (error message display In play framework)相关推荐

  1. SQLServer学习笔记 --- (20008, 'DB-Lib error message 20008, severity 9:\nUnable to open socket\nNet-Li

    使用 python 连接sql server 数据库的时候,报错如下信息:  (20008, 'DB-Lib error message 20008, severity 9:\nUnable to o ...

  2. 【安卓Framework学习】Wifi框架学习之开启与关闭流程

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...

  3. day 83 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui

    Vue学习之五DIY脚手架.webpack使用.vue-cli的使用.element-ui 本节目录 一 vue获取原生DOM的方式 二 DIY脚手架 三 vue-cli脚手架的使用 四 webpac ...

  4. rose框架学习总结

    rose框架学习总结 rose框架为paoding rose框架 具体可见https://code.google.com/p/paoding-rose/ 1   对rose框架的整体认识 1.1B/S ...

  5. jQuery框架学习第一天:开始认识jQuery

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  6. SpringMVC框架--学习笔记(下)

    接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...

  7. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  8. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

  9. Java框架学习顺序是哪些?

    Java编程是互联网行业不可或缺的一门编程语言,也是世界第一编程语言,Spring.Struts.Hibernate是经典中的经典,最常用的框架类型.下面小编就为大家详细的介绍一下Java框架学习顺序 ...

最新文章

  1. golang源码分析-启动过程概述
  2. 5.2 大间距分类器-机器学习笔记-斯坦福吴恩达教授
  3. RabbitMQ(4) TopicExchange
  4. Visual 2015创建新项,缺少ADO.NET 实体数据模型的解决方法
  5. java基础----String、StringBuffer、StringBuilder
  6. Java 多线程练习---创建两个子线程,每个线程交替输出“你好--来自线程***”...
  7. 英语口语Week 15 Wednesday
  8. jq之animate()队列
  9. php框架例子,php框架中的动态实例化对象详解
  10. Intel Skylake (Server) 架构/微架构/流水线 (5) - 非时效存储
  11. NTFS格式分区大小数值表
  12. [Silverlight入门系列]动态创建控件和绑定
  13. php图片发送另一台,PHP从一台服务器将图片发送到另一台服务器并保存
  14. 移远EC20模组网口SGMII通讯调试以及FC20wifi通讯调试
  15. matlab课后习题,Matlab 课后习题集
  16. chrome谷歌浏览器离线安装axure插件打开页面原型
  17. 【Python】《Python网络爬虫权威指南》第三章任务:验证六度分隔理论
  18. Sudoku Killer(搜索)
  19. 华为荣耀屏鸿蒙,荣耀智慧屏:华为鸿蒙迈出的第一步
  20. 会计期间(转摘至互动百科)

热门文章

  1. Oracle执行exists优化,PHP_解决Oracle性能优化中的问题, 在Oracle性能优化时,用exists - phpStudy...
  2. Java数据结构 利用双栈实现链表操作
  3. Verilog设计实例(7)基于Verilog的数字电子钟设计
  4. FPGA之道(21)HDL语言的选择
  5. 初识 Spring(02)---(IOC)
  6. 中间件事务码R3AC1里Block Size的含义
  7. IDEA开启关闭拼写检查
  8. C# SQL封装(一)
  9. 众里寻他千百度-- 轻量级持久化框架
  10. mysql数据库锁定机制