我正在寻找一个基于谷歌地图的网络应用程序.我最初的想法是,在第一阶段,重点应放在前端,后端应该易于编写和原型,并应尽可能地帮助前端的发展.
没有"经典"页面,只有meebo.com风格的界面.javascript + jquery.(意思是,如果没有静态页面,则很少).
我的眼睛已经抓住了彗星风格的服务器推送范例,我真的很有兴趣用这个做一些概念证明.
您是否有任何建议或优缺点或使用经验:
Python + Tornado vs Scala + Lift?
Web应用程序的其他方面还有哪些优点或缺点可供选择?
注意:这适用于最多2位开发人员,而不是大型分布式和变更团队.
谢谢
是否可以在Lift Web框架中创建通过AJAX做出反应的表单(和链接),但是也可以在没有Javascript支持的情况下工作?如果是这样,怎么样?
当我使用构建表单时<lift:form.ajax>,表单action被设置为javascript://不再没有JS提交.如果我在没有显式AJAX支持的情况下构建表单,我不知道如何插入AJAX功能.
我想我可以构建一个RESTful接口(无论如何我们必须构建它)并编写自定义Javascript以通过它提交表单.我想避免代码重复:如果可以使用相同的代码处理所有三个输入(RESTful,传统HTTP POST,AJAX),那将是最好的.
我想知道是否有办法在Liftweb中使用Mapper进行一些复杂的SQL查询.
实际上,我想要做的是使用它们通过1对多关系链接的事实从数据库Employe和Departments执行Join查询.另一个例子也是受欢迎的.
提前致谢.
以下是一些更多细节:假设我有2个表:
Employee : birthday, department ID, salary
Department : department ID, budget, address
Run Code Online (Sandbox Code Playgroud)
现在我想获得一个对象Employee(用Mapper创建)的列表,它有一个salary > 10$和一个department budget < 100$.
当然,我的原始代码比这复杂得多,但我的目标是能够Employee在其自己的表或链接表中具有与标准对应的映射对象列表(即).
我有一个包含大量测试数据的JSON文件,我想要解析并推送我正在测试的算法.它的大小约为30MB,列表中有大约60,000个元素.我最初尝试使用scala.util.parsing.json中的简单解析器,如下所示:
import scala.util.parsing.json.JSON
val data = JSON.parseFull(Source.fromFile(path) mkString)
Run Code Online (Sandbox Code Playgroud)
其中path只是一个包含大JSON文件路径的字符串.那拉了大约45分钟,然后扔了这个:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)
然后有人向我指出没有人使用这个库,我应该使用Lift的JSON解析器.所以我在Scala REPL中尝试了这个:
scala> import scala.io.Source
import scala.io.Source
scala> val s = Source.fromFile("path/to/big.json")
s: scala.io.BufferedSource = non-empty iterator
scala> val data = parse(s mkString)
java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)
这次只花了大约3分钟,但同样的错误.
因此,显然我可以将文件分解为较小的文件,迭代JSON文件的目录并将我的数据一块一块地合并在一起,但是如果可能的话我宁愿避免使用它.有没有人有任何建议?
有关详细信息 - 过去几周我一直在使用Clojure中的相同数据集(用于与Incanter进行可视化)而没有任何问题.以下工作完全正常:
user=> (use 'clojure.data.json)
nil
user=> (use 'clojure.java.io)
nil
user=> (time (def data (read-json (reader "path/to/big.json"))))
"Elapsed time: 19401.629685 msecs"
#'user/data
Run Code Online (Sandbox Code Playgroud) 什么样的应用程序是Scala电梯网络框架的最佳选择.
我的要求:
Lift是否满足这些要求?
有没有办法使用lift-json库的JObject类来表现得像Map?
例如:
val json = """
{ "_id" : { "$oid" : "4ca63596ae65a71dd376938e"} , "foo" : "bar" , "size" : 5}
"""
val record = JsonParser.parse(json)
record: net.liftweb.json.JsonAST.JValue = JObject(List(JField(_id,JObject(List(JField($oid,JString(4ca63596ae65a71dd376938e))))), JField(foo,JString(bar)), JField(size,JInt(5))))
</code>
Run Code Online (Sandbox Code Playgroud)
我原本期望记录("foo")返回"bar"
我注意到一个值函数,它打印出一个Map,但实际的对象是一个JValue.this.Values?
scala> record.values
res43: record.Values = Map((_id,Map($oid -> 4ca63596ae65a71dd376938e)), (foo,bar), (size,5))
scala> record.values("foo") :12: error: record.values of type record.Values does not take parameters record.values("foo")
scala> record.values
res43: record.Values = Map((_id,Map($oid -> 4ca63596ae65a71dd376938e)), (foo,bar), (size,5))
scala> record.values("foo")
:12: error: record.values of type record.Values does not take parameters …
所有七件事(http://seventhings.liftweb.net/)当然都不错,但我特别热衷于模板(http://seventhings.liftweb.net/templates)声称"Lift支持设计师友好模板".
作为我学习Lift的做法的一个步骤,我正在尝试创建一个简单的对象创建表单:获取一些参数,将它们用作构造函数参数,然后将对象存放起来.经过一些研究和实验,我有两个问题:
我的基础是:
表单示例/文档似乎都是关于特殊提升:标签.Exploring Lift 表示表单应如下所示:(http://exploring.liftweb.net/master/index-6.html)
<lift:Ledger.add form="POST">
<entry:description />
<entry:amount /><br />
<entry:submit />
</lift:Ledger.add>
Run Code Online (Sandbox Code Playgroud)
我不确定它甚至是有效的html5,虽然它可能是有效的xhtml,但它并不觉得这符合我们的设计师朋友让你的模板看起来像真正的HTML的精神.我在其他地方读了(再也找不到了)我们确实可以选择使用实际的输入标签,但是我们不会得到Lift的花哨形式的某些部分,或者某些,这段话不是很清楚关于我究竟错过了什么,这些例子似乎对我写一个简单的html表单并制作简单的html帖子感兴趣.
demo.liftweb.net示例(1)的代码表明您的模板应如下所示(2)
<lift:surround with="default" at="content">
<div class="lift:PersonScreen"></div>
</lift:surround>
Run Code Online (Sandbox Code Playgroud)
PersonScreen片段的代码也不完全是有启发性的(3).还有一些模板的其他示例,例如,在特定位置只有一个ul标签,只能在片段中生成一系列具有嵌套元素的复杂li.当然,你可以在Scala中使用xml并且它可以读取,但它仍然在各处分散你的标记.这似乎违反了"设计师友好模板"的精神.
我想要了解什么.
很长一段时间我在webapp开发中严格遵循两条规则:
Idiomatic Lift似乎完全放弃了第一条规则,完全错过了第二条规则的价值.这些规则对我很有帮助,我还没准备好跟随那些似乎违反这些规则的例子而不理解为什么它不会造成混乱.我想了解为什么在Lift中可以在Snippets中生成如此多的显示代码.我也想了解为什么模板中的标记很少反映输出.
我(我想)想要的是什么:
我希望我的所有标记都有很少的(如果有的话)异常存在于我的模板中.我希望我的代码段能够进行最小的模板修改,通常只替换"leaf"标签上的元素文本,并可能调整属性值.我想我已经为一个相当复杂的显示示例做了这个,我怀疑我可以使用相同的技术生成一个vanilla html表单然后自己处理params.如果我希望我的模板看起来像最终结果表单那么我需要做什么?
回应和任何其他想法,尤其是了解有关这些东西的Lift心态,将非常感激.
谢谢!
回应@ OXMO456.(感谢您的回复.)
我有,他们似乎只是证实了我的担忧:例如我们开始:
提升模板不包含可执行代码.它们是纯粹的,原始的,有效的HTML.
太棒了.然后呢:
后两种调用代码片段的机制不会产生有效的Html5模板.
然而每个人似乎都使用这两种机制中的第一种.还说,它说:
第三,设计人员不必担心学习编程任何东西以便设计HTML页面,因为程序执行是从HTML中抽象而不是嵌入HTML中.
但非常一致的是,我在OP中引用的示例片段完全以编程方式生成标记.这似乎与设计友好模板的目标(a)背道而驰,因此设计人员不必担心Freemarker标记和(b)将显示逻辑与业务逻辑分离.
第二个链接很有帮助,也很有启发性,但很明显这不是The Lift Way.然而,The Lift Way似乎也将标记生成的整个负载拖入片段,这是(我认为)标记和业务逻辑的巨大复合.是电梯之路吗?
电梯是否有办法将参数传递给片段?
我正在尝试为我的页面编写一个pluraize过滤器,它将显示单词"user"或"users",具体取决于有多少:
1 user
2 users
Run Code Online (Sandbox Code Playgroud)
它在Django中的工作方式称为过滤器,它们的编写如下:
You have {{ num_messages }} message{{ num_messages|pluralize }}.
Run Code Online (Sandbox Code Playgroud)
所以在这里你可以看到pluralize函数接受一个整数num_messages和输出以及适当的字符串 - 空""或"s".
编辑:请注意,在这种情况下,num_messages是一个实际的上下文变量,从视图传递给模板.
我试图使用Spring与Scala.我知道Autowired可以使用Scala类,但我使用的是需要一个对象的Web框架,我想在其中注入一个dao.我想知道该怎么做?对不起,我是Scala的新手,先谢谢了.
@Service
object UserRest extends RestHelper {
@Autowired
@BeanProperty
val userRepository: UserRepository = null;
.....
}
<beans>
.....
<bean id="userRest" class="com.abc.rest.UserRest" >
<!--- this is my attempt to manually wire it --->
<property name="userRepository" ref="userRepository"/>
</bean>
</beans>
Run Code Online (Sandbox Code Playgroud) 编辑
缓慢的编译时间现在可以通过子项目启用的构建大大减轻,这是一个巨大的胜利.
已经从Play的内置资产生成器(即Coffeescript和LESS)转移到第三方Grunt JS ; 现在增量构建期间的代码更改仅受scalac编译时间的限制,而不受Play的相对较慢资产生成的开销限制.
ORIGINAL
总体上非常满意Play 2.1 Scala(2012年9月14日发布,就在切换到Scala 2.10之前); 但是,有一些发展的痛点:
1)路由:在路由改变时,一个人的整个路由 - 控制器结构
can被重新编译:不好.2)由于路由
POST /foo/bar/:id冲突,REST似乎不被直接支持DELETE /foo/bar/:id; 即路径路径必须是唯一的,可能是反向路由.3)视图:每个foo动作使用scala.html文件,文件计数增长很快,这意味着构建时间越慢,编译越多; 由于缺乏IDE支持而不支持泛型和盲编码(当然,迄今为止没有scala模板引擎具有IDE支持,AFAIK)是特别棘手的领域.
4)增量构建工作,但过程中的任何内容都不能称为"snappy",即使对scala.html文件进行简单更改,实际上也需要@ 2秒,这是很长一段时间,当你想要即时代码时 - 更改浏览器刷新反馈周期.
我知道Play开发人员正在研究上述一些问题,而慢速构建时间也与sbt,scala版本和自己的代码结构直接相关.总的来说,Play一直是一种愉快的开发体验.然而,这是关于痛苦的,我想知道Lift在这方面带来了什么......
Lift似乎采取了不同的方法.升降机是否会受到以上物品的影响?假设没有,因为MVC,Lift不是,并且xml样式的片段方法可能不会产生与幕后构建机器的一些Play相同的编译时间.
Lift有哪些难点?