分享 play Framework 一些心得
来源:互联网 发布:linux rpm安装目录 编辑:程序博客网 时间:2024/06/04 00:26
转眼间 用Play 已经有2个年头了。 根据自己项目中 遇到的实际情况 分享一下 我对 Play 的一些看法。
或许习惯了SSH吧。从上学到接触Play 以前。 一直都是 SSH。 所以潜意识里 总是忍不住去跟 SSH比较。 性能哪个好呀。 安全性哪个高啊。 用了2年。 可是很抱歉的说 我真的不知道 哪个性能好。 哪个安全性高。 我甚至觉得 应该还是 SSH 好一些。 毕竟SSH是长期积累下来的精华。 好了 闲扯 到此结束。
play 最吸引人的一点或许就是 所谓的 热部署 了。 好吧 我承认 至少这是吸引我的一点。 不需要重启 TOMCAT 不需要。什么都不需要。 只要刷新页面就足够了 。
play 还有吸引人的一点 就是 错误提示。 play 的错误提示做的非常棒。
现在谈谈 play 的一些应用吧 。 以及在项目中实际遇到的一些问题。
第一个问题: 权限控制。
play 中 每个 Controller 可以设置一个 @Before @Before中还可以设置 过滤方法 或者 检查方法
- @Before(unless={"index"}) //前置方法
- public static void check(String from) {
- String type=session.get(Constants.LOGIN_USER);
- from=Tool.isEmpty(from)?request.url:from;
- if(type==null)
- Application.userLogin(from);
- }
其中 unless里面的方法将不受约束 比如 index 方法 将不受下面 check 方法的约束。 而其他方法会受到约束。 如果只有 @Before 则是约束所有方法。
第二个问题: 浏览器显示路径
我们总是希望 自己的路径 被隐藏。 不再是 www.baidu.com?id=123。
play 中 提供了 routes 来管理自己的路径。routes 文件在 conf 中。 如图...
打开 routes 我们可以看到 。
- # Home page
- GET / Application.index // 设置主入口 即用户浏览时候调用
- # Ignore favicon requests
- GET /favicon.ico 404
- # Map static resources from the /app/public folder to the /public path
- GET /public/ staticDir:public
- # Catch all
- * /syslogin SysMeizhijia.index // 用户输入 <a href="http://localhost:10000/syslogin">http://localhost:10000/syslogin</a> 或者 <a href="http://www.meizhijia.com/syslogin">www.meizhijia.com/syslogin</a> 的时候调用
- * /{telLoginName} Shops.dianpuByTel // 这里配置好了 我只要在浏览器 输入 <a href="http://www.meizhijia.com/15066379597">www.meizhijia.com/15066379597</a> 就可以进入我的商铺中。
- * /{controller}/{action}/2023512{id}3.html {controller}.{action} // 显示页面时添加数字混淆
- * /{controller}/{action} {controller}.{action} // 默认配置 根据 Controller 的名字 和 action 名字 来查找相应的 Controller 和 方法。 例如:<pre class="java" name="code"><a title="点击查看 ${tc.name} 下的所有促销活动" href="@{Intervals.huodongByType(tc.id)}">${tc.name}</a></pre>
- 对应的就是
- <pre class="java" name="code">public class Intervals extends Controller 下面的
- public static void huodongByType(Long tid){
- //执行操作
- render(); //返回
- }</pre>
第三个问题 render()
play 中 自由度很大。 你不需要写一个Map 里面再装着好多东西 返回前台。 在play 中 你可以返回N个结果。 只要用 , 分割开就好。
- public static void tuan(Integer page){
- page=page==null?1:page;
- User u = getUser(); // 获取当前用户
- List<Participate> plist = Participate.findTuanByTrem(page);
- Long count = Participate.count("huiyuan.id =?",u.id);
- String pages = Tool.getPage(count, pageSize, page);
- render(plist,pages,u);
- }
这里你可以 同时返回 3个值。 plist , pages , u . 在前台页面中 可以直接使用.
- #{list plist , as : 'm'}
- <td align="center">${m_index}</td>
- <td align="center"><a href="@{Shops.view(m.groupBuy.product.id)}"> ${m.groupBuy.product.name}</a></td>
- <td align="center">${m.cout}</td>
- <td align="left">${m.createTime?.format('yyyy-MM-dd')}</td>
- <td align="center"><a href="@{Shops.dianpu(m.groupBuy.product.shoper.id)}">${m.groupBuy.product.shoper.name}</a> </td>
- <td align="center">${m.groupBuy.endTime?.format('yyyy-MM-dd')}</td>
- <td align="center">已交定金</td>
- </tr>
- #{/list}
play 的输出 符号是 ${} 。 比如 ${u.name} 就是输出 user 的 name。
当然 如果 public static void tuan(Integer page) 想跟 index() 方法 公用一个 html 页面。 那么 只要吧 tuan() 里面的 render(plist,pages,u); 修改成 render("/Controller(名)/index.html",plist,pages,u);
第三个问题 JSON
长用到的一个问题。 我用的是 Jquery。 所以我就结合 Jquery 来说一下 JSON的应用。
首先是前台的 Jquery Ajax 代码:
- $("#Login").click(function(){
- $.ajax({
- type: "POST",
- url: "@{Application.ajaxLogin()}", // 要调用的方法
- data: "name="+$("#name").val()+"&password="+$("#pwd").val()+"&id=${id}&type=${type}", // 传递参数 Play 可以在 JS 中 可以直接 使用 ${} 来输出值
- success: function(data){
- if(data.success){ // 如果返回成功
- if(data.isCart){
- parent.shoucang();
- }else{
- if(data.isFee){// 商家已经交费
- parent.isFee();
- }else{
- parent.noFee();
- }
- }
- }else{
- alert(data.error); // 提示错误信息
- }
- }
- });
- })
抱歉 后台返回的时候 内容有点多 本来 我想删除掉 做一个最简洁的 但是 后来想想 还是留着吧 毕竟是真实用到的东西。 暂且如此 我们看看后台代码 然后结合起来分析一下
- JSONObject json = new JSONObject();
- json.put("success",true);
- json.put("isFee", isFee);
- json.put("id", id);
- if(type!=null&&type.equals("sc"))
- json.put("isCart", true);
- else
- json.put("isCart", false);
- renderJSON(json.toJSONString());
方法名字 跟 如何获取到的数据 我就不写了。 第一关系到项目的一些参数 。 第二 内容有点多。 所以我只写 跟JSON 有关的一些东西。 JSON 我用的是 JSONObject 。 是 json_simple-1.1.jar 下的。 我会共享一下。如果大家需要可以下载下来。
好的 大家可以看到 json.put("success",true); 这句话。 其实对应的就是 上面 AJAX 返回中的 data.success 判断。 好了那么 我们现在就明白了 后台的 json 就是 前台的 data。 所以 后台 json 中 put的所有属性 前台中 data 都可以拿来使用。
第四个问题 html 中 页面的 for循环。
这个问题 或许很简单。但是却困扰了我很久。抱歉 开始实在没想到。 到最后 我甚至动用了 <% %>来做循环。 提示一下: play 中 是支持 <% %> 的。 在 play 自带的 chat 例子中使用到。
长话短说 先贴出来 play 中 html 页面的循环小例子
- #{list 1..4,as:'i'}
- 第${i}次
- #{/list}
就这么简单 意思是 从 第一次 到 第四次 第一次 跟 第四次都算在里面。
对,就是这么几行代码 困扰了我很久。
第五个问题 返回对象为空
或许这个是 play 引以为傲的东西了吧。 比如 后台返回一个 User 。 但是 User 是空的。 前台输出 ${User.name} 这样是错误的。因为 空的User 不会有 name属性。 这样会报错的。
但是在 play中 你只要 ${User?.name}. 对。你没看错 只要在 User后面加上一个 ? 就可以了。 意思就是 如果 User为空 后面的 我就不管了。 (就当是这个意思吧,反正 我是这么理解的)
第六个问题 关于时间格式问题
play 中 这一点做得很棒。 后台任何格式度不重要 前台只要设置一下就好了 ${data.format('yyyy-MM-dd hh')} ${data.format('MM-dd')} 什么格式的都随你 。只要符合时间格式就可以。
第七个问题 关于小数点
这一点 play 做得也很棒 比如 我们计算一个数值 ${sumMoney/count} 总价格/数量。 这样得到的或许是一个小数 很有可能是个 无限小数。 那么怎么办?
play中可以 直接 ${(sumMoney/count).format('#')} 意思是 保留小数点后一位 得到的 是 10.2
第八个问题 websocket 和 LongPolling
play 的 websocket 我没用过。 怎么用? IE6 IE8的天下。 你不能用呀。 所以我没有研究。 至于 LongPolling 我倒是用到过 1对1聊天 或者 1对多 或者 多对多。 具体看一下 play中自带的 chat 例子就可以了。
开始感觉准备了好多。 可是当自己开始写的时候 却发现没有多少东西可写。 悲催 。 第一次写。 如果对大家用。 就默默看下。 如果没用。 还是直接跳过去吧。
另外推荐一个 网站 : www.meizhijia.com 用play开发的。 不过遗憾的是 网通单线的 。 电信用户 您就饶了我 别喷我。
想想 如果还有什么可以补充的 有时间我再补上。
- 分享 play Framework 一些心得
- Play Framework Ebean 一些数据库查询操作
- play framework
- play framework
- play framework
- Play Framework
- play framework
- play framework
- play Framework play json
- 关于Framework的一些使用心得
- 网络创业的一些心得分享
- 分享一些牛人的心得
- 分享一些牛人的心得
- 分享一些数据库使用的心得
- 分享一些牛人的心得
- IOS一些面试题心得分享
- 分享一些牛人的心得
- 不定期更新,记录和分享一些心得
- SAP ME1M如何以ALV形式显示(鹦鹉学舌篇)
- linux设备驱动归纳总结(八):4.总线热插拔
- Lock与synchronized 的区别
- json文件的解析(读写操作)
- 什么是反射
- 分享 play Framework 一些心得
- ANS(安狮)应用加速,LOL畅玩无压力
- ueditor最简单使用
- Visual Studio 2013 Visual Studio 2015 百度网盘下载
- datatables中参数的处理(处理时间戳)
- 接口回调
- 项目管理一般知识 典型试题分析
- scrapy下载图片问题
- Null check not work for GameObject sometimes