【发布时间】:2015-06-05 18:37:33
【问题描述】:
实际上我正在用 php 创建一个类似于 Java Servlet 模型但使用 Facebook Big pipe 类似技术的框架。
看一下这个Servlet(PHP Servlet)
<?php
class login_servlet extends Servlet{
public function doGet($request, $response){
$response->getWriter()->write('hii');
} // __ end of doGet
public function doPost($request, $response){ } // end of doPost
} // __ Servlet
?>
所以当用户输入http://myweb.com/login
这个 servlet 将被调用,映射将由框架完成,框架做这样的事情:-
$servlet_name = genrate_servlet_name('login');
$servlet_boj = new $servlet_name(new Request(), new Response());
$servlet_obj-> init(new ServletConfig());
$servlet_obj-> service();
$servlet_obj-> destroy();
所以我们可以说单个 servlet 类似于 MVC 中的控制器,并且根据我上面解释的请求和响应参数,框架将调用 doGet 或 doPost 方法,但视图分为多个 pagelet,例如:-
正如您在图片中看到的,此页面包含 4 个小页面:-
1 个标题 2 中左部分 3 中间右侧部分(登录部分) 4页脚
所以 login_servlet 代码如下所示:-
<?php
class login_servlet extends Servlet{
public function doGet($request, $response){
$writer = $response->getWriter();
$pg_strucutre = new PageletIndexStructure($request, $response);
$writer->writePagelet($pg_strucutre);
$pg = new PageletIndexHead($request, $response);
$writer->writePagelet($pg);
$pg = new PageletIndexLeft($request, $response);
$writer->writePagelet($pg);
$pg = new PageletIndexRight($request, $response);
$writer->writePagelet($pg);
$pg = new PageletIndexFooter($request, $response);
$writer->writePagelet($pg);
} // __ end of doGet
public function doPost($request, $response){ } // end of doPost
} // __ Servlet
?>
pagelet 类看起来是这样的,每个 pagelet 都必须扩展:-
<?php
class Pagelet{
public $template_name = '';
public $js = array();
public $css = array();
public $output = null;
public $container_id = 'root'; // __default is root
private $request = null;
private $response = null;
function __construct($request, $response){
$this->request = $request;
$this->response = $response;
$this->doProcess();
/* default */
} // __ construct
public function doProcess(){
// __ here all code will comes
} // __doprocess
public function render(){
$arr = array(
'js' => $this->js,
'css' => $this->css,
'content' => $this->output,
'container_id' => $this->container_id,
'response_type' => 2
);
return json_encode($arr);
} // __ end of render
} // __ end of class
?>
客户端响应如下所示:-
<!Doctype html>
<html>
<head>
<script type="text/javascript" src="js/jquery.min.js"> </script> <script type="text/javascript" src="js/require.js" data-main="js/load.js"></script> <script type="text/javascript" src="js/boot.js"> </script> <link rel="stylesheet" href="css/nnj.css" />
</head>
<body>
<div id="__global"> </div> <div style="position : fixed; width : 100%; height : 50px; background-color : black; bottom : 0px; left : 0px;"></div>
<iframe id ="__navigate" style=""> </iframe>
<script type="text/javascript"> boot.on_arrived({"response_type" : 1}); </script>
<script type='text/javascript'> boot.on_arrived({"js":["index_structure"],"css":["index_structure"],"content":"<div id=\"cntr\"> <div id=\"cntr_head\"> </div> <div> <div id=\"cntr_left\"> </div> <div id=\"cntr_right\"> </div> </div> <div id=\"cntr_footer\"> </div></div>","container_id":"root","response_type":2}); </script>
<!-- <code><div id="cntr"> <div id="cntr_head"> </div> <div> <div id="cntr_left"> </div> <div id="cntr_right"> </div> </div> <div id="cntr_footer"> </div></div></code> -->
<script type='text/javascript'> boot.on_arrived({"js":[""],"css":[""],"content":"<b> This is the login page : Enter your informations </b>","container_id":"cntr_head","response_type":2}); </script>
<!-- <code><b> This is the login page : Enter your informations </b></code> -->
<script type='text/javascript'> boot.on_arrived({"js":[""],"css":[""],"content":"<h2> login and join others</h2>","container_id":"cntr_left","response_type":2}); </script>
<!-- <code><h2> login and join others</h2></code> -->
<script type='text/javascript'> boot.on_arrived({"js":[""],"css":[""],"content":"<form action=\"/login\" method=\"post\"> Email : <input type=\"text\" name=\"email\"> <br> Pasword : <input type=\"password\" name=\"password\"> <br> <input type=\"submit\"></from><br><br><a href=\"/register\"> don't have account ? </a>","container_id":"cntr_right","response_type":2}); </script>
<!-- <code><form action="/login" method="post"> Email : <input type="text" name="email"> <br> Pasword : <input type="password" name="password"> <br> <input type="submit"></from><br><br><a href="/register"> don't have account ? </a></code> -->
<script type='text/javascript'> boot.on_arrived({"js":[""],"css":[""],"content":"<div style=\"width : 150px; text-align : left; display : inline-block;\"> About </div><div style=\"width : 150px; text-align : left; display : inline-block;\"> help </div><div style=\"width : 150px; text-align : left; display : inline-block;\"> Privacy </div><div style=\"width : 150px; text-align : left; display : inline-block;\"> Terms and Conditions </div><div style=\"width : 150px; text-align : left; display : inline-block;\"> Advertise </div>","container_id":"cntr_footer","response_type":2}); </script>
<!-- <code><div style="width : 150px; text-align : left; display : inline-block;"> About </div><div style="width : 150px; text-align : left; display : inline-block;"> help </div><div style="width : 150px; text-align : left; display : inline-block;"> Privacy </div><div style="width : 150px; text-align : left; display : inline-block;"> Terms and Conditions </div><div style="width : 150px; text-align : left; display : inline-block;"> Advertise </div></code> --> <script type="text/javascript"> boot.on_arrived({"response_type" : 3}); </script>
</body>
</html>
所以我的问题是我做得对还是我需要改变一些东西,,?抱歉英语不好:(,提前谢谢
【问题讨论】:
-
它工作得很好:) ,,
-
但是现在我在这个技术中进行了修改,我不会为不同的 2 小页面创建不同的 2 js,因为那样我会以很多 js 文件结束,我做了什么,我为页面结构创建一个 js 文件,该文件与第一个响应一起发送,浏览器立即开始下载该文件,其他 pagelts 刚刚与他们的 css 一起到达,然后我们下载 css 并在页面中添加 pagelet,所以发生的情况是:- 我们的 js 也是 parrrerly在我们的服务器生成其他 pagelet 时下载,:),我认为它更好:p,但不确定,谢谢,抱歉英语不好 :(
标签: javascript php servlets frameworks