日期:2014-05-20  浏览次数:21324 次

分享 play Framework 一些心得

转眼间 用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           // 用户输入 http://localhost:10000/syslogin  或者 www.meizhijia.com/syslogin 的时候调用
*         /{telLoginName}                                Shops.dianpuByTel          //  这里配置好了 我只要在浏览器 输入 www.meizhijia.com/15066379597  就可以进入我的商铺中。
*         /{controller}/{action}/2023512{id}3.html       {controller}.{action}    // 显示页面时添加数字混淆
*         /{controller}/{action}                         {controller}.{action}                 // 默认配置   根据 Controller 的名字 和  action 名字 来查找相应的 Controller  和 方法。 例如:
<a title="点击查看 ${tc.name} 下的所有促销活动" href="@{Intervals.huodongByType(tc.id)}">${tc.name}</a>
?对应的就是
public class Intervals extends Controller 下面的   
public static void huodongByType(Long tid){
     //执行操作 
  render(); //返回
}
?

?

第三个问题? 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'}     
		<tr>
            		  <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开发的。 不过遗憾的是 网通单线的 。 电信用户 您就饶了我 别喷我。

想想 如果还有什么可以补充的? 有时间我再补上。???