Play Framework有哪些可以c 加快编译速度的设置

博客分类:
四年前,从spring mvc框架转移到play framework框架完全是为了更快,更好的去创业,那时候由于spring mvc配置的臃肿,以及不堪忍受tomcat研发时的加载,一度想去转向php开发,但很难舍弃对java的热爱,无意中发现了play framework,让我眼前一亮,随即花了一两天时间对它进行深入的研究,发现它就是我理想中想要的java框架,即满足我的灵活配置,同时可以抛弃tomcat以及又可以部署发布在多平台与tomcat里。一直这样坚持下来用了四年,也一直在用1.2.x版本,也觉得这个版本最稳定,2.0之上的版本完全已经不是java风格了。
2 框架搭建
我喜欢把MVC体系架构分成三个系统来设计,M我会用数据系统来代替,V我会用业务系统来代替,而C我喜欢我接口系统来替代,虽然这样开发会加大工作量,其实对于熟练的人来说,这工作量可以忽略不计,但是这有一个很大的好处在于未来平台的扩展以及业务的清晰与了解,开发的纯粹与质量。
3 数据系统配置
首先搭建一个play框架项目,结合mybatis与spring,手动加载spring1.0.3在本地的moduels里。
在dependencies.yml文件里配置
- org.mybatis -& mybatis 3.1.1
- org.mybatis -& mybatis-spring 1.1.1
- com.jolbox -& bonecp 0.7.1.RELEASE
- play -& spring 1.0.3
在application.conf文件末尾加载spring配置
# The spring module
module.spring=${play.path}/modules/spring-1.0.3
ponent-scan=true
ponent-scan.base-packages=models
play.spring.add-play-properties=false
数据库连接设置
public class BoneCPDataSourceFactoryBean implements FactoryBean&BoneCPDataSource&, InitializingBean{
private BoneCPDataSource boneCPDataS
public final static int DEFAULT_POOL_MAX_SIZE = 30;
public final static int DEFAULT_POOL_MIN_SIZE = 10;
public BoneCPDataSource getObject() throws Exception {
return boneCPDataS
public Class&?& getObjectType() {
return BoneCPDataSource.
public boolean isSingleton() {
public void afterPropertiesSet() throws Exception {
boneCPDataSource = new BoneCPDataSource();
boneCPDataSource.setJdbcUrl(Play.configuration.getProperty("db.url"));
boneCPDataSource.setUsername(Play.configuration.getProperty("db.user"));
boneCPDataSource.setPassword(Play.configuration.getProperty("db.pass"));
boneCPDataSource.setDriverClass(Play.configuration.getProperty("db.driver"));
boneCPDataSource.setMaxConnectionsPerPartition(getIntValue("db.pool.maxSize", DEFAULT_POOL_MAX_SIZE));
boneCPDataSource.setMinConnectionsPerPartition(getIntValue("db.pool.minSize", DEFAULT_POOL_MIN_SIZE));
public int getIntValue(String config, int defalutValue){
String value = Play.configuration.getProperty(config );
if(!StringUtils.isEmpty(value)){
defalutValue = Integer.parseInt(value);
}catch (Exception e) {
return defalutV
内部数据系统与业务系统之间通信采用rmi,所以在application.conf配置
#rmi服务的端口号设置。
bsd.rmi.server.host=localhost
bsd.rmi.server.port=1100
创建rmi服务类
public class BsdRmiServiceExporter extends RmiServiceExporter {
public void afterPropertiesSet() throws RemoteException {
System.setProperty("java.rmi.server.hostname ", Play.configuration.getProperty("bsd.rmi.server.host"));
super.afterPropertiesSet();
创建application-context.xml文件配置rmi与mybatis
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&
&property name="locations"&
&value&classpath:application.conf&/value&
&/property&
&bean id="dataSource" class="common.jdbc.datasource.BoneCPDataSourceFactoryBean" /&
&tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" /&
&!-- Transaction manager for a single JDBC DataSource --&
&bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&property name="dataSource" ref="dataSource" /&
&!-- SqlSessionFactory --&
&bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&
&property name="dataSource" ref="dataSource" /&
&property name="configLocation" value="classpath:mybatis/configuration.xml"&&/property&
&property name="mapperLocations" value="classpath:models/model/mapper/*.xml" /&
&bean id="bsdRmiServiceExporter" class="common.rmi.BsdRmiServiceExporter"&
&property name="serviceName" value="bsdRmiService" /&
&property name="service" ref="bsdRmiService" /&
&property name="serviceInterface" value="models.rmi.BsdRmiService" /&
&property name="registryPort" value="${bsd.rmi.server.port}" /&
4 业务系统配置
创建业务工厂类
public class RmiService {
public static BsdRmiService getBsdRmiService()
return (BsdRmiService)play.modules.spring.Spring.getBean("bsdRmiService");
在application.conf里配置rmi接收端口
rmi.base.url=rmi://localhost:1100
配置rmi文件application-context.xm
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&
&property name="locations"&
&value&classpath:application.conf&/value&
&/property&
&bean id="bsdRmiService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"&
&property name="serviceUrl" value="${.rmi.base.url}/bsdRmiService" /&
&property name="serviceInterface" value="models.rmi.BsdRmiService" /&
&property name="lookupStubOnStartup" value="false" /&
&property name="refreshStubOnConnectFailure" value="true" /&
5 接口系统配置
play framework是一个非常好做接口的框架,特别是restful以及http等,仅仅只需要renderJSON 就可以发布一个http接口出去。
发布GET或者POST接口,只需要在routes文件里配置即可,这里不再详细描述
后面我会抽时间写一些工作阶段遇到的问题及解决办法,写这些也是记录这么多年的工作经验,让笔记留住它。
TsingHua2008
浏览: 1091 次
来自: 北京
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'idea 配置play项目运行环境 - 简书
idea 配置play项目运行环境
idea已被业界定义为最佳java编辑器,此文主要介绍play framework在idea中的运行配置,至于play项目的创建、导入,本文不做介绍,有需要的可以百度一下。
进入编辑运行环境界面
输入图片说明
配置全局运行环境
输入图片说明
点击左上角的+新建项目的运行环境,为新建立的运行环境指定别名
输入图片说明
服务器配置,手动输入或可通过...按钮选择play jar包手工选择
输入图片说明
play.server.Server
jvm参数配置,具体参数值可根据机器配置,-XX:-UseSplitVerifier可解决jdk版本不一致问题
输入图片说明
-XX:PermSize=256m
-XX:MaxPermSize=512m
-XX:-UseSplitVerifier
-Dplay.debug=yes
-Dplay.id=test
-Dapplication.path="."
项目根目录配置
输入图片说明
项目静态资源配置,需要将conf、public目录设为资源目录,否则会造成启动不了,资源文件查不到
输入图片说明
经过以上的配置,play项目的运行环境即配置完毕,点击shift+F9即可以debug模式运行项目了,如下图所示,则说明配置成功。
Paste_Image.png
编码也是一种艺术,不断提升自己的艺术水准,才得起程序员这个称号博客分类:
#应用程序全局设置
1.全局对象
在工程中定义全局对象可以允许你操作你的应用程序的全局设置。这个全局对象必须定义在根包下。
import play.*;
public class Global extends GlobalSettings {
2.应用程序启动和关闭的拦截
你可以重写onStart和onStop操作,通知对应的应用程序命周期事件。
import play.*;
public class Global extends GlobalSettings {
public void onStart(Application app) {
("Application has started");
public void onStop(Application app) {
("Application shutdown...");
3.提供一个应用程序错误页
当你的程序有异常发生时,onError操作会被调用。默认使用框架内部错误页,你可以重写它:
import play.*;
import play.mvc.*;
import static play.mvc.Results.*;
public class Global extends GlobalSettings {
public Result onError(Throwable t) {
return internalServerError(
views.html.errorPage(t)
4.处理action未找到
当框架找不到请求的action时,onActionNotFound操作会被调用:
import play.*;
import play.mvc.*;
import static play.mvc.Results.*;
public class Global extends GlobalSettings {
public Result onActionNotFound(String uri) {
return notFound(
views.html.pageNotFound(uri)
如果路由能找到,但是不能绑定请求参数时,onBadRequest操作会被调用。
import play.*;
import play.mvc.*;
import static play.mvc.Results.*;
public class Global extends GlobalSettings {
public Result onBadRequest(String uri, String error) {
return badRequest("Don't try to hack the URI!");
1.重新onRequest
GlobalSettings类的一种重要概念是它提供了在请求被分发到action之前拦截请求,执行业务逻辑的方法。例如:
import play.*;
public class Global extends GlobalSettings {
public Action onRequest(Request request, Method actionMethod) {
System.out.println("before each request..." + request.toString());
return super.onRequest(request, actionMethod);
通过Action组件,也可以实现对指定Action方法的拦截。
public class ApplicationContext extends GlobalSettings
public void beforeStart(Application app)
System.out.println("============beforeStart=============Application has beforeStart");
public void onStart(Application app)
System.out.println("============onStart===========Application has started");
public void onStop(Application app)
System.out.println("============onStop=============Application shutdown...");
public Configuration onLoadConfig(Configuration config, File path, ClassLoader classloader)
System.out.println("=======onLoadConfig========& " + config.asMap());
public F.Promise&SimpleResult& onBadRequest(RequestHeader request, String error)
System.out.println("=========================Application onBadRequest...");
public F.Promise&SimpleResult& onHandlerNotFound(RequestHeader request)
System.out.println("=========================Application onHandlerNotFound
public Action onRequest(Request request, Method actionMethod)
System.out.println("before each request..." + request.toString());
return super.onRequest(request, actionMethod);
没有package我这样写了一个全局设置,但是一直没有执行。请问,为什么你需要在你的application.conf中加上application.global=Global
浏览: 172896 次
来自: 北京
能整个好点的
对js的支持没你说的那么好,你用他取爬下淘宝
请问下ebean可以执行原生sql语句吗?
楼主威武,正好解决了我的问题。
string2020 写道
public class Appl ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Play Framework系列之一如何搭建一个play 框架的spring体系&&
& & &四年前,从spring mvc框架转移到play framework框架完全是为了更快,更好的去创业,那时候由于spring mvc配置的臃肿,以及不堪忍受tomcat研发时的加载,一度想去转向php开发,但很难舍弃对java的热爱,无意中发现了play framework,让我眼前一亮,随即花了一两天时间对它进行深入的研究,发现它就是我理想中想要的java框架,即满足我的灵活配置,同时可以抛弃tomcat以及又可以部署发布在多平台与tomcat里。一直这样坚持下来用了四年,也一直在用1.2.x版本,也觉得这个版本最稳定,2.0之上的版本完全已经不是java风格了。
2 框架搭建
& & 我喜欢把MVC体系架构分成三个系统来设计,M我会用数据系统来代替,V我会用业务系统来代替,而C我喜欢我接口系统来替代,虽然这样开发会加大工作量,其实对于熟练的人来说,这工作量可以忽略不计,但是这有一个很大的好处在于未来平台的扩展以及业务的清晰与了解,开发的纯粹与质量。
3 数据系统配置
& & 首先搭建一个play框架项目,结合mybatis与spring,手动加载spring1.0.3在本地的moduels里。
& & 在dependencies.yml文件里配置
- org.mybatis -& mybatis 3.1.1
- org.mybatis -& mybatis-spring 1.1.1
- com.jolbox -& bonecp 0.7.1.RELEASE
- play -& spring 1.0.3
& & &在application.conf文件末尾加载spring配置
# The spring module
module.spring=${play.path}/modules/spring-1.0.3
ponent-scan=true
ponent-scan.base-packages=models
play.spring.add-play-properties=false
& & 数据库连接设置
public class BoneCPDataSourceFactoryBean implements FactoryBean&BoneCPDataSource&, InitializingBean{
private BoneCPDataSource boneCPDataS
public final static int DEFAULT_POOL_MAX_SIZE = 30;
public final static int DEFAULT_POOL_MIN_SIZE = 10;
public BoneCPDataSource getObject() throws Exception {
return boneCPDataS
public Class&?& getObjectType() {
return BoneCPDataSource.
public boolean isSingleton() {
public void afterPropertiesSet() throws Exception {
boneCPDataSource = new BoneCPDataSource();
boneCPDataSource.setJdbcUrl(Play.configuration.getProperty(&db.url&));
boneCPDataSource.setUsername(Play.configuration.getProperty(&db.user&));
boneCPDataSource.setPassword(Play.configuration.getProperty(&db.pass&));
boneCPDataSource.setDriverClass(Play.configuration.getProperty(&db.driver&));
boneCPDataSource.setMaxConnectionsPerPartition(getIntValue(&db.pool.maxSize&, DEFAULT_POOL_MAX_SIZE));
boneCPDataSource.setMinConnectionsPerPartition(getIntValue(&db.pool.minSize&, DEFAULT_POOL_MIN_SIZE));
public int getIntValue(String config, int defalutValue){
String value = Play.configuration.getProperty(config );
if(!StringUtils.isEmpty(value)){
defalutValue = Integer.parseInt(value);
}catch (Exception e) {
return defalutV
& & 内部数据系统与业务系统之间通信采用rmi,所以在application.conf配置
#rmi服务的端口号设置。
bsd.rmi.server.host=localhost
bsd.rmi.server.port=1100
& & 创建rmi服务类
public class BsdRmiServiceExporter extends RmiServiceExporter {
public void afterPropertiesSet() throws RemoteException {
System.setProperty(&java.rmi.server.hostname &, Play.configuration.getProperty(&bsd.rmi.server.host&));
super.afterPropertiesSet();
& & 创建application-context.xml文件配置rmi与mybatis
class=&org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&&
&property name=&locations&&
&value&classpath:application.conf&/value&
&/property&
&bean id=&dataSource& class=&common.jdbc.datasource.BoneCPDataSourceFactoryBean& /&
&tx:annotation-driven transaction-manager=&transactionManager&
proxy-target-class=&true& /&
&!-- Transaction manager for a single JDBC DataSource --&
&bean id=&transactionManager&
class=&org.springframework.jdbc.datasource.DataSourceTransactionManager&&
&property name=&dataSource& ref=&dataSource& /&
&!-- SqlSessionFactory --&
&bean id=&sqlSessionFactory& class=&org.mybatis.spring.SqlSessionFactoryBean&&
&property name=&dataSource& ref=&dataSource& /&
&property name=&configLocation& value=&classpath:mybatis/configuration.xml&&&/property&
&property name=&mapperLocations& value=&classpath:models/model/mapper/*.xml& /&
&bean id=&bsdRmiServiceExporter& class=&common.rmi.BsdRmiServiceExporter&&
&property name=&serviceName& value=&bsdRmiService& /&
&property name=&service& ref=&bsdRmiService& /&
&property name=&serviceInterface& value=&models.rmi.BsdRmiService& /&
&property name=&registryPort& value=&${bsd.rmi.server.port}& /&
4 业务系统配置
& & 创建业务工厂类
public class RmiService {
public static BsdRmiService getBsdRmiService()
return (BsdRmiService)play.modules.spring.Spring.getBean(&bsdRmiService&);
& & 在application.conf里配置rmi接收端口
& & &rmi.base.url=rmi://localhost:1100
& & 配置rmi文件application-context.xm
class=&org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&&
&property name=&locations&&
&value&classpath:application.conf&/value&
&/property&
&bean id=&bsdRmiService& class=&org.springframework.remoting.rmi.RmiProxyFactoryBean&&
&property name=&serviceUrl& value=&${.rmi.base.url}/bsdRmiService& /&
&property name=&serviceInterface& value=&models.rmi.BsdRmiService& /&
&property name=&lookupStubOnStartup& value=&false& /&
&property name=&refreshStubOnConnectFailure& value=&true& /&
5 接口系统配置
& & play framework是一个非常好做接口的框架,特别是restful以及http等,仅仅只需要renderJSON 就可以发布一个http接口出去。
& & 发布GET或者POST接口,只需要在routes文件里配置即可,这里不再详细描述
后面我会抽时间写一些工作阶段遇到的问题及解决办法,写这些也是记录这么多年的工作经验,让笔记留住它。
被转藏 : 1次
被转藏 : 1次关于play framework的几个问题
我的图书馆
关于play framework的几个问题
& &play 最吸引人的一点或许就是 所谓的 热部署 了,不需要重启应用服务器。 只要刷新页面就足够了 。&&&&&&&& play 还有吸引人的一点 就是 错误提示。 play 的错误提示做的非常棒。现在谈谈 play 的一些应用吧 。 以及在项目中实际遇到的一些问题。&第一个问题: 权限控制。play 中 每个 Controller 可以设置一个& @Before& @Before中还可以设置 过滤方法 或者& 检查方法Java代码&&@Before(unless={"index"})&&&public&static&void&check(String&from)&{&&&&&&&&&&&&&&&String&type=session.get(Constants.LOGIN_USER);&&&&&&&&&&&from=Tool.isEmpty(from)?request.url:&&&&&&&&&&&&&&&&&&if(type==null)&&&&&&&Application.userLogin(from);&&&&&&&&&&}&&& 其中 unless里面的方法将不受约束 比如 index 方法 将不受下面 check 方法的约束。 而其他方法会受到约束。&&如果只有& @Before 则是约束所有方法。&第二个问题:& 浏览器显示路径&&& 我们总是希望 自己的路径 被隐藏。& 不再是&&。& play 中 提供了 routes 来管理自己的路径。routes 文件在& conf 中。 如图...&打开 routes& 我们可以看到 。&Java代码&&#&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&&&&&&&&&&&&&*&&&&&&&&&/{telLoginName}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Shops.dianpuByTel&&&&&&&&&&&&*&&&&&&&&&/{controller}/{action}/2023512{id}3.html&&&&&&&{controller}.{action}&&&&&&*&&&&&&&&&/{controller}/{action}&&&&&&&&&&&&&&&&&&&&&&&&&{controller}.{action}&&&&&&&&&&&&&&&&&&&&对应的就是&&&pre&name="code"&class="java"&public&class&Intervals&extends&Controller&下面的&&&&&public&static&void&huodongByType(Long&tid){&&&&&&&&&&&render();&&&}&/pre&&&&&&&第三个问题& render()&& play 中 自由度很大。 你不需要写一个Map 里面再装着好多东西& 返回前台。 在play 中& 你可以返回N个结果。 只要用 , 分割开就好。Java代码&&public&static&void&tuan(Integer&page){&&&page=page==null?1:&&&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 .&& 在前台页面中& 可以直接使用.Java代码&&&&&#{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 代码:Java代码&&$("#Login").click(function(){&&&&&&$.ajax({&&&&&&&&&&&&&type:&"POST",&&&&&&&&&&&&&url:&"@{Application.ajaxLogin()}",&&&&&&&&&&&&&&&&&data:&"name="+$("#name").val()+"&password="+$("#pwd").val()+"&id=${id}&type=${type}",&&&&&&&&&&&&&&&&success:&function(data){&&&&&&&&&&&&&&&&&if(data.success){&&&&&&&&&&&&&&&&&&&&&if(data.isCart){&&&&&&&&&&&&&&&&&&&&&&&&&&parent.shoucang();&&&&&&&&&&&&&&&&&&}else{&&&&&&&&&&&&&&&&&&&&&&if(data.isFee){&&&&&&&&&&&&&&&&&&&&&&&&&&parent.isFee();&&&&&&&&&&&&&&&&&&&&&&}else{&&&&&&&&&&&&&&&&&&&&&&&&&&parent.noFee();&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&}else{&&&&&&&&&&&&&&&&&&&alert(data.error);&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&}&&&&&&&&&&});&&&&&&})&&&抱歉& 后台返回的时候 内容有点多& 本来 我想删除掉 做一个最简洁的& 但是 后来想想 还是留着吧 毕竟是真实用到的东西。&&暂且如此 我们看看后台代码 然后结合起来分析一下Java代码&&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 页面的循环小例子Java代码&&#{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 例子就可以了。
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢}

我要回帖

更多关于 c 加快编译速度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信