Pure JS (5.2):服务器端与客户端共用页面渲染代码
接着上一篇文章,我们来谈谈如何在服务器端和客户端共用 JS 代码,以便实现第一次返回页面时在服务器端完成初始渲染,而之后的操作在客户端进行修改并重新渲染页面的模式。
运行示例
首先,需要先运行mongod;然后下载附件中的 PureJS 工程,解压后加载到 eclipse 中,打开文件 main/com/purejs/core/JSServer.java,右键选择 Run As -> Java Application。
在浏览器中输入
http://localhost:8080, 可以看到如下页面:
引用
这个界面与 4.2 中是一样的,但实现方式已经不同了。第一次返回的页面已经包含了部分渲染的结果和 users 数据,而增加 user 或删除 user 将会使用客户端 JS 重新渲染界面。
接下来,让我们分别看看各部分的 JS 是如何编写的。
引用
第一次打开页面时间较长,这可能跟 JS 加载有关。
但与 JSP 不同,并非每个页面都要花时间编译,而是第一次用到 jQuery 时需要花较长时间加载。
这在运行测试案例时也会发现(第一个测试案例执行时间较长,之后的测试案例执行都很快)。
包含页面模板的 HTML
以下是包含模板的 html 文件,也就是后续需要进行操作的文件:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link href="css/index.css" rel="stylesheet" type="text/css" />
<title>DBO Example</title>
</head>
<body>
<div align="center">
<h1>DBO Example</h1>
<table id="content"></table>
</div>
<script id="data"></script>
<script id="content-tmpl" type="tmpl">
<tr align="left">
<th class="w100">User</th>
<th class="w150">Description</th>
<th class="w100" colspan="2">Operation</th>
</tr>
<tr align="left">
<td> <input class="w90"/> </td>
<td> <input class="w140" /> </td>
<td> <a href="##">Save</a> </td>
<td> <a href="##">Delete</a> </td>
</tr>
</script>
<script id="user-tmpl" type="tmpl">
<tr index="${index}" align="left">
<td> ${name} </td>
<td> <input class="w140" value="${desc}" /> </td>
<td> <a href="##">Save</a> </td>
<td> <a href="##">Delete</a> </td>
</tr>
</script>
<script id="data-tmpl" type="tmpl">
users = ${users};
</script>
<script src="js/lib/jquery.js"> </script>
<script src="js/lib/jquery.tmpl.js"> </script>
<script src="js/lib/json.js"> </script>
<script src="js/lib/pure.js"> </script>
<script src="js/both/views.js"> </script>
<script src="js/index.js"> </script>
</body>
</html>
【content-tmpl】:包含表格的列标题和最后一行(用于增加 user )。
【user-tmpl】:表格的一行,包含 user 数据。
【data-tmpl】:用于在服务器端将 users 数据输出到客户端。
渲染函数
在 webapp/js/both/views.js 中,我们可以看到如下代码:
views = {
index: function($, users) {
$(users).each(function(i) { this.index = i; });
var content = $("#content-tmpl").tmpl(),
rows = $("#user-tmpl").tmpl(users);
$("#content").html(content);
$("#content tr:first").after(rows);
}
};
这里实现了 page.index() 方法,接收两个参数:jQuery 对象和 users 数据,然后完成对页面的渲染。
服务器端 JS
与该页面相关的服务器端 JS 位于 scripts/app/page.js:
page = function(){
pure.render.prefix = "webapp/";
return {
index: function(params, req, res) {
var users = dbo.users.list(),
data = { users: JSON.stringify(users) };
return pure.render("index", function($){
views.index($, users);
$("#data").html($("#data-tmpl").tmpl(data));
});
}
}
}();
在 pure.render 函数中做了两件事:
1. 调用公共的页面渲染函数进行界面渲染
2. 将 users 数据输出客户端。
客户端 JS
客户端与该页面对应的 JS 文件是 webapp/js/index.js :
$(function(){
bind();
// 每次修改数据时重新排序并渲染页面、绑定事件
function show() {
sort();
views.index($, users);
bind();
}
function sort() {
// users 重新排序,略
}
// 绑定事件
function bind() {
var rows = $("#content tr[index] a"),
last= $("#content tr:last a");
rows.filter(":even").click(update);
rows.filter(":odd").click(remove);
last.eq(0).click(add);
last.eq(1).click(clear);
}
// 增加 user ,需要重新排序和渲染
function add() {
var $input = $(this).parent().parent().find("input"),
$name = $input.eq(0),
$desc = $input.eq(1),
name = $name.val(),
desc = $desc.val();
// 数据验证,略
var user = { name: name, desc: desc };
users.push(user);
save(user);
}
function clear() {
// 清空数据,略
}
// 修改 user ,需要重新排序和渲染
function update() {
var $tr = $(this).parent().parent(),
$desc = $tr.find("input"),
index = $tr.attr("index"),
desc = $desc.val();
// 数据验证,略
var user = users[parseInt(index)];
user.desc = desc;
save(user);
}
// 删除 user ,需要重新排序和渲染,并发送请求
function remove() {
var $tr = $(this).parent().parent(),
index = $tr.attr("index");
$tr.remove();
var name = users.splice(index, 1)[0].name;
show();
pure.post({ action: "users.remove", params: name });
}
// 在增加或保存修改 user 时调用,重新排序和渲染,并发送请求
function save(user) {
show();
pure.post({ action: "users.save", params: user });
}
});
以上就是服务器端和客户端共用 JS 的过程了。除此之外,数据验证函数也可以提取出来,在服务器端和客户端共用,有时间的话请自行尝试吧。
谢谢。
分享到:
相关推荐
标题 "Pure JS (5.1):在服务器端使用 JQuery DOM 和 JQuery Template" 暗示了这篇博客可能探讨如何在非浏览器环境,比如服务器端,利用JavaScript的JQuery库来处理DOM操作和模板渲染。虽然JQuery通常与前端开发关联...
《PureMVC服务器端代码详解》 PureMVC框架,作为一个多层架构设计模式的实现,为开发者提供了强大的组织和管理应用代码的方式。它源于ActionScript,后来发展为跨平台的框架,支持Java、Flex等多种编程语言。在本篇...
PureMVC是一个开源的、轻量级的、...通过研究这个案例,开发者可以了解如何将PureMVC的组件和原则应用于实际项目中,同时也能看到如何与后端的Java CXF Web服务进行集成,从而构建出一个完整的客户端-服务器应用程序。
在Web应用中,JavaScript通常被用来处理客户端交互,但随着Node.js的出现,JavaScript也能够运行在服务器端。本篇文章将探讨如何使用纯JavaScript(即不依赖任何特定库或框架)在服务器端调用MongoDB数据库。MongoDB...
pure.db.js的核心理念是通过Rhino将JavaScript与MongoDB的Java驱动连接起来,提供一套纯JavaScript的接口供前端或服务器端的JavaScript代码调用。这样,开发者可以使用熟悉的JavaScript语法进行数据库操作,无需学习...
这与传统的客户端渲染(CSR)不同,后者在浏览器中加载JS文件并执行以生成页面。 1. **ReactDOMServer**: React提供了`ReactDOMServer`模块,用于在服务器端渲染React组件。使用`renderToString`或`...
6. **Ajax**:异步JavaScript和XML,用于在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容。 7. **函数式编程**:介绍JavaScript中的函数式编程概念,如map、reduce、filter等高阶函数,以及函数组合和...
标题 "Pure JS (1): 在 jetty 上运行 JavaScript" 暗示了本文将探讨如何在 Jetty 服务器上执行纯 JavaScript 代码。Jetty 是一个轻量级、开源的 Java Web 应用服务器,而 Pure JS 提示我们将讨论如何在后端环境中...
PureJS可能是一个强调使用原生JavaScript代码的库或者框架,而不是依赖其他库如jQuery。版本号6.5表明这是一个更新过的版本,可能包含了一些新的特性和改进。 描述部分虽然为空,但根据标签“源码”和“工具”,...
Pure Go Oracle客户端 重要笔记: 客户端已经针对oracle 10G,11G和12G进行了测试,并且可以正常工作 支持的参数类型是整数,双精度型,字符串,time.Time和[] byte SELECT和DML语句现在支持BLOB 不支持命名参数...
Pure.js 坚持 JavaScript 的原型性质,没有引入新的想法,允许与内置构造函数更好地集成。安装 npm install purejs或者使用凉亭 bower install purejs鲍尔要使用该组件,您必须使用类的工具捆绑该组件。 例如: ./...
标题 "Pure JS (6.2):结合 Rhino 和 Junit GUI 测试 JS" 提到的是一个关于使用纯JavaScript(Pure JS)与Rhino JavaScript引擎以及JUnit进行图形用户界面(GUI)测试的实践方法。Rhino是Mozilla基金会开发的一个...
您可以使用它与adb服务器(而不是设备/仿真器上的adb守护程序)进行通信。 当您使用adb命令时 现在您可以使用pure-python-adb作为adb命令行连接到adb服务器 该软件包支持adb命令行工具的大多数功能。 adb设备 ...
6. **测试智能感知**:现在,打开一个包含PureJS代码的文件,开始输入,你应该能看到Spket提供PureJS相关的代码提示和自动完成。例如,当你输入`pure.`时,Spket应该会列出`util`、`dom`等PureJS模块下的方法。 ...
虽然题目主要涉及客户端渲染,但值得一提的是,React还支持服务器端渲染,可以提高SEO和首屏加载速度。通过同构(Isomorphic)应用,可以在服务器和客户端共享代码,实现更好的用户体验。 10. **性能优化** React...
一个 Javascript(SlimJEC.js,可选的 SlimJEC_Config.js 来设置凭据):使客户端工作的代码 HTML 页面(SlimJEC.html、SlimJEC.css):客户端的静态 HTML 包装器 它让你 以匹配模式或模糊模式执行全文搜索 在您想要...
**BlazeDS** 是Adobe提供的一个开源项目,用于在Flex客户端与Java服务器之间实现双向通信。它支持AMF(Action Message Format)协议,允许高效的数据传输,降低了网络延迟,提升了用户体验。在本实例中,BlazeDS作为...
React服务器渲染(React Server Rendering,简称SSR)是React框架的一种高级用法,它允许在服务器端生成HTML标记,然后将其发送到客户端,从而提供更好的性能和SEO优化。这一技术的核心理念是结合了传统的服务器端...