diff --git a/src/main/webapp/comet_zh_CN.html b/src/main/webapp/comet_zh_CN.html new file mode 100644 index 0000000..15137f6 --- /dev/null +++ b/src/main/webapp/comet_zh_CN.html @@ -0,0 +1,113 @@ + + + + + Comet + + +
+

+ + + Lift的一个关键功能就是Comet(服务器推送)和相关连的Ajax支持。 + 本页包含了一个多人聊天室应用,当任何人发送聊天消息时,会以Comet更新浏览器。 + 用户可以通过页面的输入框发送一行信息到聊天室,信息会以异步请求的方式发送到服务器(页面在请求的时候不会重新加载)。 + + +

+ +
+ + +
+ + +
+
+ + + + 让我们看看应用的Comet(服务器推送聊天内容列表)部分的标记代码: + + +
view code
+ +
+ + + 我们只是简单的标记<ul>标签为一个snippet调用,用来载入名为Chat的Comet组件。 + 让我们看看Chat组件。 + + +
+ +
view code
+ + +
+ + + 再次证明,对于其他框架来说很难或者根本不可能的事情,对于Lift来说小菜一碟。 + 开发人员不用管浏览器是如何轮询(poll)最新的变化。 + Lift默认使用long polling和合并多个comet组件到一个单独的long poll,Lift将会自动支持这些功能而不影响你写的代码。 + 开发人员只用管“什么时候服务器端发生变化了,就更新组件”,Lift来完成剩下的工作。 + + +
+ +
+ +
+ + + 请注意,你可以试试用cross site scripting攻击来攻击本网站(例如,在聊天输入框输入<script>alert('我黑了你的机器')</script>)。 + 你会发现在开发者没有做任何事情的情况下,Lift正确的转码了你输入的东西。 + + +
+ +
+ +
+ + + 让我们来看看关于Ajax输入表单的标记代码: + + +
+ +
view code
+ +
+ + + 我们用Form.ajax snippet来指示这个form是一个Ajax表单。 + 文本输入触发ChatIn snippet。 + 来看看这个snippet: + + +
+ +
view code
+ +
+ + + 再次表明,我们不许要任何深入研究。 + Lift负责行为(发送输入的StringChatServer。)的关联。 + 我们没有设置routes或任何其他东西。 + 甚至这段代码可以抵抗replay攻击,因为这个自动生成的routes是动态、随机和不可预测的。 + 当你想用标准的REST访问来完成任务的时候,Lift提供非常棒的REST支持。 + 并且Lift支持数据或者HTML的Comet,所以你可也用Lift作为Cappuccino、SproutCore、ExtJS等应用的服务端,并获得全面的Comet支持。 + + +
+ + +
+ + diff --git a/src/main/webapp/index_zh_CN.html b/src/main/webapp/index_zh_CN.html new file mode 100644 index 0000000..3b8ecdd --- /dev/null +++ b/src/main/webapp/index_zh_CN.html @@ -0,0 +1,32 @@ + + + + + Home + + + +
+

+ Lift是现今最强大,最安全的网页框架。 + 嗯,这样说有点嚣张,但是本网站会展示Lift的七种武器,别的框架很难或者根本不可能提供这些功能。 + 这七种武器是创建和维护高互动、安全网站的关键。 + 在相应页面里你可以看到使用七种武器的源代码。 + 你会明白Lift的不同之处以及为什么这样会更好。 +

+
    +
  1. 延迟加载
  2. +
  3. 页面并行渲染
  4. +
  5. Comet与Ajax
  6. +
  7. Wiring -- 申明页面元素之间的相互依赖关系
  8. +
  9. 设计友好的模板系统
  10. +
  11. 向导组件 -- 多页面输入,支持返回按钮
  12. +
  13. 安全性
    +
  14. +
+ + Lift给你以上的七种武器,并且你的代码将非常简洁和易于维护,还有Lift的高性能和可扩展性,你还可以将你的应用部署到非常成熟的J/EE基础之上并获得所有J/EE的好处。 + +
+ + diff --git a/src/main/webapp/lazy_zh_CN.html b/src/main/webapp/lazy_zh_CN.html new file mode 100644 index 0000000..f923b89 --- /dev/null +++ b/src/main/webapp/lazy_zh_CN.html @@ -0,0 +1,54 @@ + + + + + Lazy + + +
+

Lift内建支持延迟加载。

+

+

+
+ 计算开始于 + start ,结束于 。 + +
+ 注意到文字上面的图标了吗? 那个图标表示正在计算中。 + 浏览器首先渲染了页面,当页面中需要计算的部分计算完成时,相关HTML代码会发送给浏览器。 + 并且一个页面可以包含多个延迟加载控件:
+
+
计算开始于 start ,结束于
+
+
+ 会不会很难实现呢?下面就是显示部分的代码:
+
+
view code
+ +
+ + + 只有一点点的标记代码。 + 它只是标记了这个块将需要长时间计算。 + Lift帮你完成剩下的工作。 + 让我们来看看snippet代码: + + +
+ +
view code
+ + +
+ + + 大部分框架的核心不提供延迟加载功能。 + 这个功能一般很难实现,但是Lift有非常棒的comet支持,所以可以很容易的从服务器“推送(push)”内容到浏览器。 + + +
+ + +
+ + diff --git a/src/main/webapp/parallel_zh_CN.html b/src/main/webapp/parallel_zh_CN.html new file mode 100644 index 0000000..15e9f1b --- /dev/null +++ b/src/main/webapp/parallel_zh_CN.html @@ -0,0 +1,96 @@ + + + + + Parallel + + +
+

+ + + Lift可以让页面并行渲染。 + 当你渲染页面的时候需要从其他外部服务器获取信息的时候,这个功能非常有用。 + 当你必须连接10个不同的广告服务器,每个连接需要半秒钟响应,你就能体会到并行执行的优势了: + + +

+ +
+ 广告服务器 #1: The Ad +
+ +
+ 广告服务器 #2: The Ad +
+ +
+ 广告服务器 #3: The Ad +
+ +
+ 广告服务器 #4: The Ad +
+ +
+ 广告服务器 #5: The Ad +
+ +
+ 广告服务器 #6: The Ad +
+ +
+ 广告服务器 #7: The Ad +
+ +
+ 广告服务器 #8: The Ad +
+ +
+ 广告服务器 #9: The Ad +
+ +
+ 广告服务器 #10: The Ad +
+ + + + + 标记代码部分非常简单: + + +
view code
+ +
+ + + 只有一点点的标记代码。 + 当你将一个片段标记为parallel,Lift将这个片段的计算交给线程池里的其他线程。 + 同时,Lift继续计算页面的其他部分,并将最后的计算结果组合起来,再将组合后的页面发送给浏览器。 + 让我们来看看snippet代码: + + +
+ +
view code
+ + +
+ + + 再次证明,对于其他框架来说很难或者根本不可能的事情,对于Lift来说小菜一碟。 + 这个武器有多厉害? + 你的页面是否因为在生成页面的时候需要访问很多很多的后台服务而减慢页面的加载速度? + Lift可以让它们并行执行。 + + +
+ + +
+ + diff --git a/src/main/webapp/security_zh_CN.html b/src/main/webapp/security_zh_CN.html new file mode 100644 index 0000000..06d8f61 --- /dev/null +++ b/src/main/webapp/security_zh_CN.html @@ -0,0 +1,47 @@ + + + + + Security + + +
+
+ + + 基于Lift的网页应用已经包含了很多的安全性设计。 + Lift应用可以防御多种常见的安全性漏洞。 + + +
+ +
+ + + 这里是Lift内置的安全保障来对付大部分的OWASP Top 10漏洞: +
    +
  • A1: 注入 - Lift的Mapper和Record会在将query string发送到后台数据库之前。
  • +
  • A2: XSS - 在整个页面渲染周期中,Lift一直将页面视为DOM,直到最后的阶段。 + 这就让Lift可以在把页面发送浏览器之前自动转码Stings。
  • +
  • A3: Session管理 - Lift使用J/EE container的session管理机制,允许登录的时候创建新session,并且保证所有密码全程都是安全编码过的。
  • +
  • A4: 直接对象引用 - Lift表单不会暴露直接对象引用,对象只是保存在服务器端,并发布一个关于特定session的token来引用对象。
  • +
  • A5: CSRF - Lift利用特定session的绑定来绑定HTML元素与这个元素的服务器端的行为。 + 绑定是不可预测的,所以不可能用Cross Site请求来调用特定session的绑定。
  • +
  • A8: URL Access - Lift包含SiteMap机制,它为应用的URL可访问性提供定义规则。 + SiteMap会拒绝访问URL除非满足特殊URL的访问标准。
  • +
+
+
+
+ +
+ + + 因为Lift应用在默认情况下就有更强的安全性,开发者只用将精力放在功能上而不是写一些ad hoc的防御代码来对付OWASP Top 10还有其他的漏洞。 + + +
+ +
+ + diff --git a/src/main/webapp/templates-hidden/default_zh_CN.html b/src/main/webapp/templates-hidden/default_zh_CN.html new file mode 100644 index 0000000..89d9376 --- /dev/null +++ b/src/main/webapp/templates-hidden/default_zh_CN.html @@ -0,0 +1,126 @@ + + + + + + Seven Things: + + + + + + + + + + + + + + + + + +
+
+

Lift的七种武器

+
+ +
+ + + +
+
The main content will get bound here
+
+ +
+
+

+ Lift + is Copyright 2007-2011 WorldWide Conferencing, LLC. + Distributed under an Apache 2.0 License.

+
+
+ + + diff --git a/src/main/webapp/templates_zh_CN.html b/src/main/webapp/templates_zh_CN.html new file mode 100644 index 0000000..8faae26 --- /dev/null +++ b/src/main/webapp/templates_zh_CN.html @@ -0,0 +1,54 @@ + + + + + Designer Friendly Templates + + + + + +
+
+ + + Lift支持设计友好的模板系统。 + 这意味着你网站的所有模板,嗯,所有页面都是符合Html5或XHTML规范的。 + 你的设计师和你的开发人员可以编辑同样的页面。 + 你的设计师们不许要去学习任何新的tag库或任何其他语言。 + 动态的内容由Lift的snippet完成,并且snippet是通过特殊的css class名来调用的。 + 这里就是本页的源代码: + + +
+ + +
view code
+ +
+ + + 你的团队可以获得一下好处: +
    +
  • 团队成员的所有代码都在同一个地方
  • +
  • 开发人员不再需要把设计师给他们的页面“切碎(shred)”或使用其他方法来保持页面同步
  • +
  • 页面总是符合规范的
  • +
  • 设计师不需要学习任何新东西
  • +
+
+
+
+ +
+ + diff --git a/src/main/webapp/wiring_zh_CN.html b/src/main/webapp/wiring_zh_CN.html new file mode 100644 index 0000000..0d23e4b --- /dev/null +++ b/src/main/webapp/wiring_zh_CN.html @@ -0,0 +1,92 @@ + + + + + Wiring + + +
+
+ + + 网页变得越来越复杂,页面上的很多东西之间有大量的相互依赖关系。 + 例如,你有一个邀请名单和一个邀请数量。 + 当你接受或拒绝一个邀请(假设这是通过Ajax完成),你希望邀请数量自动更新。 + Lift的Wiring允许你声明页面上各种元素之间的关系,当任何前置元素发生改变,依赖元素会在下一个HTTP响应(Ajax或Comet)刷新显示。 + + +
+ +
+ +
+ + + 说了这么多。 + 让我们看看如何建立一个清单的界面: + + +
+ + +
+
input goes here
+
+ +
+ +
总额: subtotal
+ +
税率:
+ +
税前: taxable
+ +
税额: Tax
+ +
税后: Total
+
+ + + + + 让我们看看清单的标记代码: + + +
view code
+ +
+ + + 界面中需要自动更新的每一项都声明为一个snippet。 + 并且每一个wired元素snippet的实现也很简单: + + +
+ +
view code
+ + +
+ + + 最后,我们声明这些元素(或者按Wiring的说法称为cell)之间的关系: + + +
+ +
view code
+ +
+ +
+ + + 使用Wiring,你可以创建元素之间有非常复杂的关系的界面。 + 当其中一个更新了,所有依赖的元素都会自动更新。 + 这会节约大量的时间并且你的网站更容易维护,因为维护者不需要知道所有的依赖元素。 + + +
+
+ + diff --git a/src/main/webapp/wizard_zh_CN.html b/src/main/webapp/wizard_zh_CN.html new file mode 100644 index 0000000..d197d71 --- /dev/null +++ b/src/main/webapp/wizard_zh_CN.html @@ -0,0 +1,70 @@ + + + + + Wizard + + +
+
+ + + Lift向导允许你定义多页面输入界面,包含feild和form级别的校验。 + 它可以是普通的HTTP表单(并支持返回按钮)或是Ajax表单。 + + +
+ +
+
+
+ +
+ +
+ 以Ajax运行向导: + +
+ +
+ +
+ + + 向导的源文件: + + +
+ + +
view code
+ +
+ +
+ + + Lift向导提供的功能与JBoss Seam的类似。 + 然而,Lift向导是纯代码声明的而非Java + XML。 + 甚至所有fields都是类型安全的。 + 例如,年龄field是Int类型,所以你可以将年龄乘以3而不许要额外的类型转换。 + + +
+ +
+ +
+ + + Lift向导允许你设计复杂的用户输入——超级表单——以陈述的方式,所以逻辑清晰,维护也简单。 + + +
+ + + + +
+ +