Клиентская часть, написанная на PHP
Index.php
<?
header("Content-Type: text/html; charset=utf-8");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Система учета прохода в здание</title>
<link href="http://127.0.0.1:8080/AccessInBuilding-war/css.css" type="text/css" rel="stylesheet" />
<link href="http://127.0.0.1:8080/AccessInBuilding-war/css/jquery-ui-1.9.1.custom.css" type="text/css" rel="stylesheet">
<script src="http://127.0.0.1:8080/AccessInBuilding-war/jquery-1.8.2.min.js"></script>
<script src="http://127.0.0.1:8080/AccessInBuilding-war/jquery-ui.js"></script>
<script type='text/javascript'>jQuery.noConflict();</script>
<script src="/js.js"></script>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="700" align="center" class="body">
<tr>
<td>
<h1>Система учета прохода в здание</h1>
<div align="right" class="add_b">
<div align="right">Добавить нового пользователя</div>
</div>
<form action="add.jsp" method="post" enctype="multipart/form-data" class="add_form">
Имя<sup>*</sup>: <input type="text" name="name" id="add_name" value="" />
Код: <input type="text" name="code" id="add_code" value="" />
<input type="submit" value="Добавить пользователя" class="add" /><span class="add_load"> </span>
<div class="add_err"></div>
</form>
<form action="find.jsp" method="post" enctype="multipart/form-data" class="find_form">
Имя<sup>*</sup>: <input type="text" name="name" id="find_name" value="" />
Код: <input type="text" name="code" id="find_code" value="" />
<input type="submit" value="Найти" class="find" /><span class="find_load"> </span>
<div class="find_err">Поиск пользователя, например: <span>Иванов Иван</span> </div>
</form>
<br>
<div class="cnt_act"></div>
<div class="users"></div>
<div align="right"><br><span class="log"></span></div>
</td>
</tr>
</table>
</body>
</html>
Connect.php
<?
include $_SERVER['DOCUMENT_ROOT']."/connect_funcs.php";
$clogin = new ConnectLogin();
header('Content-Type: application/json; charset=utf8');
header('Cache-Control: no-cache');
usleep (100);
if( ($type=$_REQUEST['type']) != "" && $clogin->token ) {
switch($type) {
case "act":
echo $clogin->getData($type);
break;
case "users":
echo $clogin->getData($type);
break;
case "logs":
echo $clogin->getData($type);
break;
case "add":
echo $clogin->getData($type,$opt = array("name"=>$_REQUEST['name'], "code"=>$_REQUEST['code']));
break;
case "find":
echo $clogin->getData($type,$opt = array("name"=>$_REQUEST['name'], "code"=>$_REQUEST['code']));
break;
case "update_act":
echo $clogin->getData($type,$opt = array("id"=>$_REQUEST['id'], "act"=>$_REQUEST['act']));
break;
}
exit;
}
$error = $clogin->error;
if( $error ) echo $error;
else echo '{"error":"101"}';
?>
connect_funcs.php
<?
session_start();
if( !function_exists('json_decode') ) {
include_once $_SERVER['DOCUMENT_ROOT']."/JSON.php";
$json = new Services_JSON();
function json_decode($str) { global $json; return $json->decode($str); }
function json_encode($value) { global $json; return $json->encode($value); }
}
define("TIME_TO_SESSION_LIVE", 3600*24*30); # Время жизни сессии = 3600*24*30 = месяц.
class ConnectLogin {
var $login = "client";
var $pwd = "pwd_client";
var $URL = "http://localhost:8080/AccessInBuilding-war/connect.jsp";
var $token;
var $error;
function ConnectLogin() {
$this->token = $_COOKIE['token'];
if( !$this->token ) {
$this->token = $this->Autorization();
if( $this->token ) setcookie('token', $this->token, time()+TIME_TO_SESSION_LIVE, '/', $_SERVER['HTTP_HOST']);
}
return $this->token;
}
function Autorization() {
$ch = curl_init();//echo "[".$this->URL . "?auth_login=" . $this->login . "&auth_pwd=" . $this->pwd."]";
curl_setopt($ch, CURLOPT_URL, $this->URL . "?auth_login=" . $this->login . "&auth_pwd=" . $this->pwd);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT']."/cookies.dat");
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT']."/cookies.dat");
if( !is_file($_SERVER['DOCUMENT_ROOT']."/cookies.dat") ) file_put_contents($_SERVER['DOCUMENT_ROOT']."/cookies.dat", "");
$result = curl_exec($ch);
curl_close($ch);
$result = json_decode($result);
if( $result->token ) {
return $result->token;
} elseif( $result->error ) {
$this->error = json_encode($result);
}
}
function getData($type="act", $opt=array()) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->URL . "?token=" . $this->token . "&type=" . $type. (sizeof($opt) > 0 ? "&".http_build_query($opt) : ""));
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT']."/cookies.dat");
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT']."/cookies.dat");
if( !is_file($_SERVER['DOCUMENT_ROOT']."/cookies.dat") ) file_put_contents($_SERVER['DOCUMENT_ROOT']."/cookies.dat", "");
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
function disconect() {
$this->token = "";
setcookie('token', "", time()-TIME_TO_SESSION_LIVE, '/', $_SERVER['HTTP_HOST']);
}
}
?>
Js. js
var timer;
jQuery(document).ready(function() {
function showMessage(id,msg) {
jQuery(id).hide().html(msg).show();
setTimeout(function(){ jQuery(id).fadeOut(500); }, 3000);
}
function updateCnt(obj) {
var _this = obj;
jQuery.get("/connect.php",{type:"act"},function(data) {
data = eval(data);
if( data.cnt > 0 ) txt = "В здании находится " + data.cnt + " человек(а)";
else txt = "В здании никого нет";
jQuery(_this).fadeOut(0).html(txt).fadeIn(1000);
});
}
function updateUsers(obj) {
var _this = obj;
jQuery.get("/connect.php",{type:"users"},function(data) {
data = eval(data);
data = data.users;
if( data != "" ) {
jQuery(_this).fadeOut(0).html(data).fadeIn(1000);
jQuery(".radio").buttonset().refresh();
}
});
}
function updateLogs(obj) {
var _this = obj;
jQuery.get("/connect.php",{type:"logs"},function(data) {
data = eval(data);
data = data.logs;
if( data == "error" ) data = "Ошибка подключения к базе";
jQuery(_this).html(data);
});
}
jQuery(".add_b div").click(function(){
if( jQuery(this).is(".show") ) {
jQuery(this).removeClass("show");
jQuery(".add_form").slideUp().removeClass("add");
} else {
jQuery(this).addClass("show");
jQuery(".add_form").slideDown();
}
});
jQuery(".add").click(function() {
_this = this;
jQuery(".add_load").show();
name = jQuery("#add_name").val();
code = parseInt(jQuery("#add_code").val()) || 0;
jQuery(_this).parent().removeClass("add");
if( name != "" ) {
jQuery.get("/connect.php",{type:"add", name:name,code:code},function(data) {
data = eval(data);
data = data.data;
if( jQuery.trim( data ) == "done" ) {
showMessage(".add_err","Пользователь добавлен");
jQuery(_this).parent().addClass("add");
updateUsers(jQuery(".users").get(0));
updateLogs(jQuery(".log div").get(0));
} else {
showMessage(".add_err","Ошибка добавления");
}
jQuery(".add_load").hide();
});
} else {
showMessage(".add_err","Ошибка, не заполнено обязательное поле");
jQuery(".add_load").hide();
}
return false;
});
jQuery(".find").click(function() {
_this = this;
jQuery(".find_load").show();
var name = jQuery("#find_name").val();
code = parseInt(jQuery("#find_code").val()) || 0;
if( name != "" || code > 0 ) {
jQuery.get("/connect.php",{type:"find", name:name,code:code},function(data) {
data = eval(data);
data = data.data;
if( data == "error" ) {
showMessage(".find_err","Ошибка доступа к базе");
} else if( data > 0 ) {
showMessage(".find_err",name + ", в базе есть");
jQuery(".find_load").hide();
} else if( data == 0 ){
showMessage(".find_err","Нет");
jQuery(".find_load").hide();
};
jQuery(".find_load").hide();
});
} else {
showMessage(".find_err","Ошибка, не заполненно не одно из полей");
jQuery(".find_load").hide();
}
return false;
});
jQuery(".find_err span").click(function() {
jQuery(".find_form #find_name").val(jQuery(this).text());
jQuery(".find").trigger("click");
});
jQuery(".cnt_act").each(function() {
updateCnt(this);
});
jQuery(".users").each(function() {
updateUsers(this);
});
jQuery( '.radio' ).buttonset();
jQuery(".radio span").live("click",function(){
row = jQuery(this).parent().attr("for").split('_');
jQuery.get("/connect.php",{type:"update_act", id:parseInt(row[1]),act:parseInt(row[2])},function(data) {
updateCnt(jQuery(".cnt_act").get(0));
updateLogs(jQuery(".log div").get(0));
});
});
jQuery(".log").each(function() {
jQuery(this).html("Лог посещаемости<div class='logs'></div>");
});
jQuery(".log").live("click",function(){
div = jQuery('.logs',this);
if( div.is('.show') ) {
div.removeClass("show").slideUp('fast');
} else {
updateLogs(div);
div.addClass("show").slideDown();
}
});
});
cookies.dat –файл хранящий куку, созданный сервером для взаимосвязи склиен-сервера
# Netscape HTTP Cookie File
# http://curlm.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
localhost FALSE /AccessInBuilding-war FALSE 0 JSESSIONID cf8604e6f1026fb4d5de0b7fc587
Выводы
В процессе выполнения работы, мы ознакомились с принципами построения корпоративных распределенных приложений на основе технологии EJB. Разработали распределенное корпоративное Java-приложение, содержащее серверную часть в форме EJB-модуля и клиентскую часть с web-интерфейсом. Для этого мы спроектировали схему БД и реализовали хранение данных в СУБД Java DB с помощью технологии Java EE 5 Persistence. Дополнительно было изучено взаимодействие между 2-я приложениями, реализованными на разных языках программирования: java – серверная часть и много клиентов на php, которые взаимодействуют с помощью JSON запросов.