
- •Министерство образования республики беларусь
- •Минск 2010
- •Введение
- •1 Описание предметной области «биллинговой системы телефонной сети gsm» и определение требований к системе с точки зрения предметной области
- •2 Постановка задач и анализ системы «биллинговой системы телефонной сети gsm»
- •3 Модели представления системы «биллинговой телефонной сети gsm» и их описание
- •3.5 Диаграмма компонентов
- •3.5 Диаграмма развёртывания
- •4 Информационная модель системы «биллинговой телефонной сети gsm» и её описание
- •6 Описание алгоритмов реализующих бизнес-логику серверной части системы «биллинговой телефонной сети gsm»
- •7 Руководство пользователя
- •8 Результаты тестирования разработанной системы и оценка выполнения задач
- •8.1 Тестирование разработанной системы
- •8.2 Оценка выполнения задач
- •Заключение
- •Список использованной литературы
8 Результаты тестирования разработанной системы и оценка выполнения задач
8.1 Тестирование разработанной системы
Для тестирования программы следует сгенерировать и запустить jUnit тест. jUnit тест запускается на сервере проверяет все методы сервера. Выполним тест.
Рисунок 8.1 – Выполнение тестов
В самом деле, ошибок не возникло при выполнении тестов. Были вызваны все функции. Все удалённые методы работают правильно.
8.2 Оценка выполнения задач
Все задачи, поставленные ранее были выполнены. Данная система работает стабильно, хотя возникает иногда (примерно в 1-ом из 100 случаев) не вывод одной из таблиц на экране браузера. Данная проблема может быть решена установление времени ожидания для загрузки этих таблиц, но тогда система будет работать медленнее. Поэтому целесообразней оставить без изменений работу системы, и при возникновении такой ошибки обновить браузер. Данная система запускается без IDE, ant скрипты и файлы .bat представлены в приложении Д.
Заключение
Таким образом, была разработана система «Биллинговой телефонной сети GSM». Система позволяет хранить и изменять информацию об абонентах, о их затратах и внесённых платежах и услугах. Данная система должна позволяет сотруднику сети работать с системой удалённо, в то время как другие сотрудники тоже работают в этой системе. Система позволяет смотреть детализированную статистику для ответов на вопросы абонентов. Данные для сохранности, упорядоченности, лёгкой переносимости должны хранятся в реляционной базе данных, причём при связи таблиц «один-ко-многим» при удалении элемента родительской таблицы должны удаляются соответствующие элементы дочерней таблицы. Система имеет понятный интерфейс, предусмотрен откат действия при некорректном вводе. Интерфейс системы отображается в браузере. Данные передаются в формате xml и с помощью xsl(приложение E) преобразовываются в xhtml. Запускается система с помощью ant-скриптов(приложение Д).
Список использованной литературы
www.iXBT.com
www.nestor.minsk.by/sr/2007/04/sr70406.html
http://www.corporacia.ru/subscriber/dictionary
«Java 2. Наиболее полное руководство» П.Ноутон, Г.Шилдт.
Кей С. Хорстман «CoreJava» , «Вильямс», 2007
Э. Гамма Р. Хелм Р. Джонсон Дж. Влиссидес «Паттерны проектирования», Питер Бук, 2001
Буч_ - UML.Руководство пользователя
Приложение А
Рисунок Б.1 – Контекстная диаграмма.
Рисунок Б.2 – Декомпозиция контекстной диаграммы
Приложение А(продолжение)
Рисунок Б.3 – Декомпозиция блока «Работа с данными об абонентах».
Рисунок Б.4 – Декомпозиция блока «Рассчитать баланс абонентов».
Приложение А(продолжение)
Рисунок Б.5 – Декомпозиция блока «Вывести детализированную статистику».
Приложение Б
Листинг функции main сервера
public static void main(String[] args) throws RemoteException, AlreadyBoundException, SQLServerException, SQLException {
JFrameBeltyugovAV jFr = new JFrameBeltyugovAV();
jFr.setVisible(true);
LocateRegistry.createRegistry(1099);
// создаем и экспортируем удаленный объект
MainRMIBeltyugovAV obj = new MainRMIBeltyugovAV();
RmiRemoteBeltyugovAV stub = (RmiRemoteBeltyugovAV) UnicastRemoteObject.exportObject(obj, 0);
// Регистрируем удаленный объект в RMI-регистраторе под именем
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);
System.err.println("Server start ");
}
Листинг функции подключения к Базе данных
private void connectDB() throws SQLException {
SQLServerDataSource dataSource = new SQLServerDataSource();
dataSource.setUser("sa");
dataSource.setPassword("12345");
dataSource.setServerName("localhost");
dataSource.setPortNumber(14335);
dataSource.setDatabaseName("billingDB");
conn = dataSource.getConnection();
sqlCommand = conn.createStatement();
}
Листинг функции, которая запрашивает данные из таблицы Абонент базы данных и возвращает XLM документ
public Document getXMLplatezhi(String where) throws SQLException, IOException{
String command = "select * from platezhi";
if(where != null){
String d = where.split("\\ ")[1];
command += " where idab = " + where.split("\\ ")[0] + " and data >= '";
if(d.split("-").length == 3){
command += d.split("-")[2];
command += "." + d.split("-")[1] + "." + d.split("-")[0] + " 0:0:0' and data <= '";
command += d.split("-")[2] + "." + d.split("-")[1] + "." + d.split("-")[0] + " 23:59:59'";
}
else{
command += "1" + "." + d.split("-")[1] + "." + d.split("-")[0] + "' and data < '";
String m = null;
String y = null;
if(Integer.parseInt(d.split("-")[1]) != 12){
m = String.valueOf(Integer.parseInt(d.split("-")[1]) + 1);
y = d.split("-")[0];
Приложение Б(продолжение)
}
else{
m = "1";
y = String.valueOf(Integer.parseInt(d.split("-")[0]) + 1);
}
command += "1" + "." + m + "." + y + "'";
}
}
rezset = sqlCommand.executeQuery(command);
Element table = new Element("table");
Document myDocument = new Document(table);
Element element = null;
String split;
while(rezset.next()){
element = new Element("platezhi");
element.addContent(new Element("idab").addContent(rezset.getString(1)));
element.addContent(new Element("idpl").addContent(rezset.getString(2)));
split = rezset.getString(3).split("\\.")[0];
element.addContent(new Element("data").addContent(split));
element.addContent(new Element("sum").addContent(rezset.getString(4)));
table.addContent(element);
}
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
FileWriter writer = new FileWriter("platezhi.xml");
outputter.output(myDocument, writer);
writer.close();
return myDocument;
}
Листинг функции, которая составляет детализированную статистику за период и возращает XML документ
public Document getMasDetStat(String[] mstr) throws RemoteException, SQLException, IOException {
Element table = new Element("table");
Document myDocument = new Document(table);
Element element = null;
element = new Element("detstat");
element.addContent(new Element("idab").addContent(mstr[0]));
element.addContent(new Element("fio").addContent(mstr[2]));
element.addContent(new Element("data").addContent(mstr[1]));
int[] mas = new int[4];
String command = "";
command += "select sum(sum) from platezhi where idab = " + mstr[0];
command += " and data >= '";
if(mstr[1].split("-").length == 3){
command += mstr[1].split("-")[2];
command += "." + mstr[1].split("-")[1] + "." + mstr[1].split("-")[0] + " 0:0:0' and data <= '";
command += mstr[1].split("-")[2] + "." + mstr[1].split("-")[1] + "." + mstr[1].split("-")[0] + " 23:59:59'";
Приложение Б(продолжение)
}
else{
command += "1" + "." + mstr[1].split("-")[1] + "." + mstr[1].split("-")[0] + "' and data < '";
String m = null;
String y = null;
if(Integer.parseInt(mstr[1].split("-")[1]) != 12){
m = String.valueOf(Integer.parseInt(mstr[1].split("-")[1]) + 1);
y = mstr[1].split("-")[0];
}
else{
m = "1";
y = String.valueOf(Integer.parseInt(mstr[1].split("-")[0]) + 1);
}
command += "1" + "." + m + "." + y + "'";
}
rezset = sqlCommand.executeQuery(command);
rezset.next();
if(rezset.getString(1) != null){
mas[1] = Integer.parseInt(rezset.getString(1));
}
else{
mas[1] = 0;
}
command = "";
command += "select sum(st) from zatratiAbonent where idab = " + mstr[0];
command += " and tn >= '";
if(mstr[1].split("-").length == 3){
command += mstr[1].split("-")[2];
command += "." + mstr[1].split("-")[1] + "." + mstr[1].split("-")[0] + " 0:0:0' and tn <= '";
command += mstr[1].split("-")[2] + "." + mstr[1].split("-")[1] + "." + mstr[1].split("-")[0] + " 23:59:59'";
}
else{
command += "1" + "." + mstr[1].split("-")[1] + "." + mstr[1].split("-")[0] + "' and tn < '";
String m = null;
String y = null;
if(Integer.parseInt(mstr[1].split("-")[1]) != 12){
m = String.valueOf(Integer.parseInt(mstr[1].split("-")[1]) + 1);
y = mstr[1].split("-")[0];
}
else{
m = "1";
y = String.valueOf(Integer.parseInt(mstr[1].split("-")[0]) + 1);
}
command += "1" + "." + m + "." + y + "'";
}
rezset = sqlCommand.executeQuery(command);
rezset.next();
if(rezset.getString(1) != null){
mas[2] = Integer.parseInt(rezset.getString(1));
}
else{
mas[2] = 0;
}
int curbal;
Приложение Б(продолжение)
command = "";
command += "select balans from abonent where idab = " + mstr[0];
rezset = sqlCommand.executeQuery(command);
rezset.next();
if(rezset.getString(1) != null){
curbal = Integer.parseInt(rezset.getString(1));
}
else{
curbal = 0;
}
/*
* polychili current balans, teper polychim balans na konec perioda
* dlia etogo naidem zatrati i platezhi s konca perioda do current perioda
*/
GregorianCalendar d = new GregorianCalendar();
String curdate = String.valueOf(d.get(GregorianCalendar.DAY_OF_MONTH) + "." + String.valueOf(d.get(GregorianCalendar.MONTH)+1) + "." + d.get(GregorianCalendar.YEAR)
+ " " + d.get(GregorianCalendar.HOUR_OF_DAY) + ":" + d.get(GregorianCalendar.MINUTE) + ":" + d.get(GregorianCalendar.SECOND));
int curplat;
command = "";
command += "select sum(sum) from platezhi where idab = " + mstr[0];
command += " and data >= '";
if(mstr[1].split("-").length == 3){
command += mstr[1].split("-")[2] + "." + mstr[1].split("-")[1] + "." + mstr[1].split("-")[0] + " 23:59:59'" + " and data <= '";
command += curdate + "'";
}
else{
String m = null;
String y = null;
if(Integer.parseInt(mstr[1].split("-")[1]) != 12){
m = String.valueOf(Integer.parseInt(mstr[1].split("-")[1]) + 1);
y = mstr[1].split("-")[0];
}
else{
m = "1";
y = String.valueOf(Integer.parseInt(mstr[1].split("-")[0]) + 1);
}
command += "1" + "." + m + "." + y + "'";
command += " and data < '";
command += curdate + "'";
}
rezset = sqlCommand.executeQuery(command);
rezset.next();
if(rezset.getString(1) != null){
curplat = Integer.parseInt(rezset.getString(1));
}
else{
curplat = 0;
}
int curzt;
command = "";
command += "select sum(st) from zatratiAbonent where idab = " + mstr[0];
command += " and tn >= '";
if(mstr[1].split("-").length == 3){
command += mstr[1].split("-")[2] + "." + mstr[1].split("-")[1] + "." + mstr[1].split("-")[0] + " 23:59:59'" + " and tn <= '";
Приложение Б(продолжение)
command += curdate + "'";
}
else{
String m = null;
String y = null;
if(Integer.parseInt(mstr[1].split("-")[1]) != 12){
m = String.valueOf(Integer.parseInt(mstr[1].split("-")[1]) + 1);
y = mstr[1].split("-")[0];
}
else{
m = "1";
y = String.valueOf(Integer.parseInt(mstr[1].split("-")[0]) + 1);
}
command += "1" + "." + m + "." + y + "'";
command += " and tn < '";
command += curdate + "'";
}
rezset = sqlCommand.executeQuery(command);
rezset.next();
if(rezset.getString(1) != null){
curzt = Integer.parseInt(rezset.getString(1));
}
else{
curzt = 0;
}
mas[3] = curbal - curplat + curzt;
mas[0] = mas[3] - mas[1] + mas[2];
element.addContent(new Element("mas0").addContent(String.valueOf(mas[0])));
element.addContent(new Element("mas1").addContent(String.valueOf(mas[1])));
element.addContent(new Element("mas2").addContent(String.valueOf(mas[2])));
element.addContent(new Element("mas3").addContent(String.valueOf(mas[3])));
table.addContent(element);
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
FileWriter writer = new FileWriter("detstat.xml");
outputter.output(myDocument, writer);
writer.close();
return myDocument;
}
Листинг функции, которая принимает запросы от сервлета и посылает их серверу базы данных
public void updatedb(String command) throws SQLException{
System.out.println(command);
sqlCommand.executeUpdate(command);
conn.commit();
}
Приложение В
Блок-схема функции getXMLabonent()
Приложение В(продолжение)
Блок-схема функции updatedb(String command)
Приложение Г
Литинг sql-скрипта, генерирующего базу данных(с заполнением таблиц):
CREATE DATABASE billingDB
ON PRIMARY
( NAME = сн_Data,
FILENAME = 'D:\billingDB.mdf',
SIZE = 3MB,
MAXSIZE = 50MB,
FILEGROWTH = 2MB )
LOG ON
( NAME = сн_Log,
FILENAME = 'D:\billingDB.ldf',
SIZE = 1MB,
MAXSIZE = 10MB,
FILEGROWTH = 15% )
GO
USE billingDB
GO
CREATE TABLE [dbo].[zatrati](
[idzt] [int] IDENTITY(1,1) NOT NULL,
[naz] [text] NOT NULL,
[ed] [text] NULL,
[st] [int] NULL,
CONSTRAINT [PK_zatrati] PRIMARY KEY CLUSTERED
(
[idzt] ASC
)
)
GO
CREATE TABLE [dbo].[abonent](
[idab] [int] IDENTITY(1,1) NOT NULL,
[fio] [text] NOT NULL,
[telnomer] [int] NULL,
[balans] [int] NULL,
CONSTRAINT [PK_abonent] PRIMARY KEY CLUSTERED
(
[idab] ASC
)
)
GO
CREATE TABLE [dbo].[zatratiAbonent](
[idab] [int] NOT NULL,
[idzt] [int] NOT NULL,
[idop] [int] IDENTITY(1,1) NOT NULL,
[tn] [datetime] NOT NULL,
[tk] [datetime] NULL,
[kol] [int] NULL,
[st] [int] NULL,
CONSTRAINT [PK_zatratiAbonent] PRIMARY KEY CLUSTERED
(
[idab] ASC,
[idzt] ASC,
[idop] ASC
)
)
GO
CREATE TABLE [dbo].[platezhi](
[idab] [int] NOT NULL,
[idpl] [int] IDENTITY(1,1) NOT NULL,
Приложение Г(продолжение)
[data] [datetime] NOT NULL,
[sum] [int] NOT NULL,
CONSTRAINT [PK_platazhi] PRIMARY KEY CLUSTERED
(
[idab] ASC,
[idpl] ASC
)
)
GO
ALTER TABLE [dbo].[zatratiAbonent] WITH CHECK ADD CONSTRAINT [FK_zatratiAbonent_abonent] FOREIGN KEY([idab])
REFERENCES [dbo].[abonent] ([idab])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[zatratiAbonent] CHECK CONSTRAINT [FK_zatratiAbonent_abonent]
GO
ALTER TABLE [dbo].[zatratiAbonent] WITH CHECK ADD CONSTRAINT [FK_zatratiAbonent_zatrati] FOREIGN KEY([idzt])
REFERENCES [dbo].[zatrati] ([idzt])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[zatratiAbonent] CHECK CONSTRAINT [FK_zatratiAbonent_zatrati]
GO
ALTER TABLE [dbo].[platezhi] WITH CHECK ADD CONSTRAINT [FK_platezhi_abonent] FOREIGN KEY([idab])
REFERENCES [dbo].[abonent] ([idab])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[platezhi] CHECK CONSTRAINT [FK_platezhi_abonent]
use billingDB
INSERT INTO abonent (fio , telnomer , balans) VALUES ('Бельтюгов Алексей Васильевич', 2468017, 0)
INSERT INTO abonent (fio , telnomer , balans) VALUES ('Омельченко Сергей Витальевич', 5344673, 0)
INSERT INTO abonent (fio , telnomer , balans) VALUES ('Солонович Игорь Николаевич', 5467863, 0)
INSERT INTO abonent (fio , telnomer , balans) VALUES ('Кузьмич Максим Сергеевич', 7433458, 0)
INSERT INTO platezhi (idab , data , sum) VALUES (1, '2010-26-5 21:26:55', 3000)
UPDATE abonent SET balans = balans + 3000 WHERE idab = 1
INSERT INTO platezhi (idab , data , sum) VALUES (2, '2010-26-5 21:27:5', 5000)
UPDATE abonent SET balans = balans + 5000 WHERE idab = 2
INSERT INTO platezhi (idab , data , sum) VALUES (4, '2010-26-5 21:27:18', 1000)
UPDATE abonent SET balans = balans + 1000 WHERE idab = 4
INSERT INTO platezhi (idab , data , sum) VALUES (3, '2010-26-5 21:27:27', 2000)
UPDATE abonent SET balans = balans + 2000 WHERE idab = 3
INSERT INTO platezhi (idab , data , sum) VALUES (1, '2010-23-5 21:27:49', 2000)
UPDATE abonent SET balans = balans + 2000 WHERE idab = 1
INSERT INTO platezhi (idab , data , sum) VALUES (2, '2010-23-5 21:28:2', 6000)
UPDATE abonent SET balans = balans + 6000 WHERE idab = 2
INSERT INTO platezhi (idab , data , sum) VALUES (4, '2010-23-5 21:28:27', 3000)
INSERT INTO zatrati (naz , ed, st) VALUES ('Разговор внутри сети', 'минута', 30)
INSERT INTO zatrati (naz , ed, st) VALUES ('Разговор на другие сети', 'минута', 300)
INSERT INTO zatrati (naz , ed, st) VALUES ('смс', 'штука', 105)
Приложение Д
Запуск системы ant-скриптами
Запуск сервера
Листинг запустить rmixml.bat (запускаем его)
ant -buildfile rmi.xml
Листинг rmi.xml (запустить rmi.jar)
<project name="billingDB" default="Startjar" basedir=".">
<property name="project.name" value="rmi" />
<property name="dist.dir" location="./dist" />
<target name="Startjar">
<java jar="${dist.dir}/${project.name}.jar" fork="true"/>
</target>
</project>
Запуск клиента
Листинг war.bat
ant -buildfile war.xml
Листинг war.xml (удаляем из папки webapps Tomcat старую версию проекта, если существует, и копируем текущую)
<?xml version="1.0" encoding="UTF-8"?>
<project basedir=".">
<delete file="f:\Program Files\Apache Software Foundation\Apache Tomcat 6.0.20\webapps\billing.war"/>
<delete dir="f:\Program Files\Apache Software Foundation\Apache Tomcat 6.0.20\webapps\billing"/>
<copy file=".\dist\billing.war" todir="f:\Program Files\Apache Software Foundation\Apache Tomcat 6.0.20\webapps"/>
</project>
Листинг tc.bat(запускаем Tomcat)
ant -buildfile tc.xml
Листинг tc.xml
<project name="KursovoiiiServer" default="StartTomCat" basedir="f:/">
<property name="tomcat" location="Program Files/Apache Software Foundation/Apache Tomcat 6.0.20/bin/startup.bat" />
<target name="StartTomCat">
<exec executable="${tomcat}">
</exec>
</target>
</project>
Приложение Д(продолжение)
Листинг browser.bat (запускаем browser с введённой адресной строкой, которая указывает на index.jsp)
ant -buildfile browser.xml
Листинг browser.xml
<project name="billingDB" default="Start" basedir="F:/">
<property name="browser" location="F:\Program Files\Opera\opera.exe" />
<target name="Start">
<exec executable="${browser}" spawn="true">
<arg value="http://localhost:8084/billing/index.jsp"/>
</exec>
</target>
</project>
Приложение E
Листинг abonent.xsl
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" indent="yes"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<!--XHTML document outline-->
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>test1</title>
<style type="text/css">
table {table-layout: fixed;}
div {width:100%; overflow:auto}
</style>
</head>
<body>
<form align='center' onsubmit='return proverka();' >
<br></br>
<input type='hidden' name='id' id='id' size="3"/>
ФамилияИО*
<input type='text' name='fio' id='fio' size="30"/>
<br></br>
НомерТел
<input type='text' name='nomer' id='nomer' />
Баланс(в)
<input type='text' name='balans' id='balans' size="10" />
<input type='hidden' name='hid' id='hid' />
<br></br>
<input type='submit' value='Добавить' id='sub' />
<br></br>
<input type='hidden' name='dt' id='dt' size="10"/>
<input type='hidden' value='Показать детализированную статистику за день' id='d' onClick="day()"/>
<input type='hidden' name = 'mt' id='mt' size="10"/>
<input type='hidden' value='Показать детализированную статистику за месяц' id='m' onClick = "month()"/>
</form>
<P align='center'>Таблица Список Абонентов</P>
<table align='center' border='1' cellpadding="1" cellspacing="1" id='abonenttable' >
<tr>
<td width="10%" align="center">ID</td>
<td width="55%" align="center">ФамилияИО</td>
<td width="20%" align="center">НомерТел</td>
<td width="15%" align="center">Баланс</td>
</tr>
<xsl:apply-templates/>
</table>
Приложение E(продолжение)
<script language='JavaScript'>
function day(){
document.getElementById('hid').value = 'day';
document.forms[0].submit();}
function month(){
document.getElementById('dt').value = document.getElementById('mt').value;
document.getElementById('hid').value = 'day';
document.forms[0].submit();}
function proverka(){
if (document.forms[0].fio.value == '') {
alert('Введите ФИО');
return false;}
return true; }
function OverMnu(mnu){
mnu.style.backgroundColor='#00FFFF';}
function OutMnu(mnu){
mnu.style.backgroundColor='';}
var flagdbl = false;
var nomercol = 1;
function mozhetYdalit(mnu){
nomercol = mnu;
timer = setTimeout("Ydalit()", 200); }
function Ydalit(){
if(flagdbl == true) {return false;}
nomercol.style.backgroundColor='#FF0000';
if (!confirm('Удалить запись?')) return false;
var table = document.getElementById('abonenttable');
var trList= table.getElementsByTagName('tr');
var tdList = trList[nomercol.sectionRowIndex].getElementsByTagName('div');
document.getElementById('id').value = tdList[0].innerHTML;
document.getElementById('hid').value = 'ydalit';
document.forms[0].submit(); }
function Pravit(mnu){
flagdbl = true;
mnu.style.backgroundColor='#00FF00';
if (!confirm('Редактировать запись?')) return false;
timer = setTimeout("flagdblf()", 300);
var table = document.getElementById('abonenttable');
var trList= table.getElementsByTagName('tr');
var tdList = trList[mnu.sectionRowIndex].getElementsByTagName('div');
document.getElementById('id').value = tdList[0].innerHTML;
document.getElementById('fio').value = tdList[1].innerHTML;
document.getElementById('nomer').value = tdList[2].innerHTML;
document.getElementById('balans').value = tdList[3].innerHTML;
document.getElementById('id').setAttribute('readonly', 'true');
document.getElementById('sub').value = 'Закончить редактирование';
cur = new Date();
document.getElementById('dt').type = 'text';
document.getElementById('dt').value = cur.getYear() + '-' + (cur.getMonth() + 1) + '-' + (cur.getDate() - 1);
document.getElementById('d').type = 'button';
document.getElementById('mt').type = 'text';
Приложение E(продолжение)
document.getElementById('mt').value = cur.getYear() + '-' + cur.getMonth();
document.getElementById('m').type = 'button';
document.getElementById('hid').value = 'pravit'; }
function flagdblf(){
flagdbl = false; }
</script>
</body>
</html>
</xsl:template>
<xsl:template match="abonent">
<tr ondblclick="Pravit(this);" onclick="mozhetYdalit(this);" onmouseover='OverMnu(this);' onmouseout='OutMnu(this);'>
<td align="center"><div><xsl:value-of select="id"/></div></td>
<td align="center"><div><xsl:value-of select="fio"/></div></td>
<td align="center"><div><xsl:value-of select="telnomer"/></div></td>
<td align="center"><div><xsl:value-of select="balans"/></div></td>
</tr>
</xsl:template>
</xsl:stylesheet>
Приложение E(продолжение)
Листинг detstat.xsl
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" indent="yes"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<!--XHTML document outline-->
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>test1</title>
<style type="text/css">
table {table-layout: fixed;}
div {width:100%; overflow:auto}
</style>
</head>
<body>
<xsl:apply-templates/>
<form align='center'>
<input type='submit' value='назад' id='back' onClick='f()'/>
<input type='hidden' name='h' id='h' />
</form>
<script language='JavaScript'>
window.parent.frames[2].location.reload();
window.parent.frames[3].location.reload();
function f(){
window.parent.frames[2].location.reload();
window.parent.frames[3].location.reload();}
</script>
</body>
</html>
</xsl:template>
<xsl:template match="detstat">
<P>Детализированная статистика </P>
<P>ID абонента: <xsl:value-of select="idab"/></P>
<P>ФИО абонента: <xsl:value-of select="fio"/></P>
<P>за период: <xsl:value-of select="data"/></P>
<P>Баланс на начало периода: <xsl:value-of select="mas0"/></P>
<P>Внесено за период: <xsl:value-of select="mas1"/></P>
<P>Израсходовано за период: <xsl:value-of select="mas2"/></P>
<P>Баланс на конец периода: <xsl:value-of select="mas3"/></P>
<P>В таблице Платежи Абонента указаны платежи данного абонента за данный период </P>
<P>В таблице Затраты Абонента указаны затраты данного абонента за данный период </P>
</xsl:template>
</xsl:stylesheet>
Приложение Ж
Листинг сервлета abonentBeltyugovAV
package servletpackBeltyugovAV;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import org.jdom.JDOMException;
import rmiInterfaceBeltyugovAV.RmiRemoteBeltyugovAV;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import java.util.GregorianCalendar;
import javax.servlet.RequestDispatcher;
import org.jdom.Document;
import org.jdom.Element;
/**
*
* @author Alexey Beltyugov
*/
public class AbonentServletBeltyugovAV extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, RemoteException, NotBoundException, JDOMException, TransformerConfigurationException, TransformerException, FileNotFoundException, SQLException, InterruptedException, ServletException
{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
out = response.getWriter();
if(firstRunServlets){
Thread.sleep(1000);
out.println("<SCRIPT LANGUAGE='JavaScript'>");
out.println("window.parent.frames[0].location.reload();");
out.println("window.parent.frames[2].location.reload();");
out.println("window.parent.frames[3].location.reload();");
out.println("</script>");
out.println("<meta http-equiv='REFRESH' content='0; url=http://localhost:8084/billing/AbonentServletBeltyugovAV'>");
out.flush();
firstRunServlets = false;
}
if(request.getParameter("hid") != null){
Приложение Ж(продолжение)
if(request.getParameter("hid").equals("day")){
PlatezhiServletBeltyugovAV.where = request.getParameter("id") + " " + request.getParameter("dt");
idab = request.getParameter("id");
data = request.getParameter("dt");
name = request.getParameter("fio");
try{
if(data.split("-").length == 2 || data.split("-").length == 3){
if(Integer.parseInt(data.split("-")[0]) < 1900 || Integer.parseInt(data.split("-")[0]) > 2200){
Integer.parseInt("f");
}
if(Integer.parseInt(data.split("-")[1]) < 1 || Integer.parseInt(data.split("-")[1]) > 12){
Integer.parseInt("f");
}
if(data.split("-").length == 3){
if(Integer.parseInt(data.split("-")[2]) < 1 || Integer.parseInt(data.split("-")[2]) > 31){
Integer.parseInt("f");
}
}
}
else{
Integer.parseInt("f");
}
GregorianCalendar d = new GregorianCalendar();
d.getInstance();
if(data.split("-").length == 3){
if(Integer.parseInt(data.split("-")[0]) > d.get(GregorianCalendar.YEAR)){
Integer.parseInt("f");
}
else{
if(Integer.parseInt(data.split("-")[0]) == d.get(GregorianCalendar.YEAR)){
if(Integer.parseInt(data.split("-")[1]) > d.get(GregorianCalendar.MONTH) + 1){
Integer.parseInt("f");
}
else{
if(Integer.parseInt(data.split("-")[1]) == d.get(GregorianCalendar.MONTH) + 1){
if(Integer.parseInt(data.split("-")[2]) >= d.get(GregorianCalendar.DAY_OF_MONTH)){
Integer.parseInt("f");
}
}
}
}
}
}
if(data.split("-").length == 2){
if(Integer.parseInt(data.split("-")[0]) > d.get(GregorianCalendar.YEAR)){
Приложение Ж(продолжение)
Integer.parseInt("f");
}
else{
if(Integer.parseInt(data.split("-")[0]) == d.get(GregorianCalendar.YEAR)){
if(Integer.parseInt(data.split("-")[1]) >= d.get(GregorianCalendar.MONTH) + 1){
Integer.parseInt("f");
}
}
}
}
RequestDispatcher dispatcher = request.getRequestDispatcher("DetStatBeltyugovAV");
dispatcher.forward(request, response);
}
catch(NumberFormatException e){
out.println("<SCRIPT LANGUAGE='JavaScript'>");
out.println("alert('Введите дату в правильном формате (год-месяц-день или год-месяц, например, 2010-5-24 или 2010-5 или введённый период ещё не закончился');");
out.println("history.back()");
out.println("</script>");
out.flush();
}
}
if(request.getParameter("hid").equals("ydalit")){
command = "DELETE FROM abonent WHERE idab = " + request.getParameter("id");
rmi().updatedb(command);
out.println("<SCRIPT LANGUAGE='JavaScript'>");
out.println("window.parent.frames[2].location.reload();");
out.println("window.parent.frames[3].location.reload();");
out.println("</script>");
out.println("<meta http-equiv='REFRESH' content='0; url=http://localhost:8084/billing/AbonentServletBeltyugovAV'>");
out.flush();
}
if(request.getParameter("hid").equals("pravit")){
id = request.getParameter("id");
fio = request.getParameter("fio");
nomer = request.getParameter("nomer");
balans = request.getParameter("balans");
try{
if(!balans.equals("")){
Integer.parseInt(balans);
}
}
catch(NumberFormatException e){
out.println("<SCRIPT LANGUAGE='JavaScript'>");
out.println("alert('Значение баланса должно быть целым положительным числом');");
out.println("history.back()");
out.println("</script>");
out.flush();
}
Приложение Ж(продолжение)
try{
if(!nomer.equals("") && Integer.parseInt(id) <= 0){
Integer.parseInt("f");
}
}
catch(NumberFormatException e){
out.println("<SCRIPT LANGUAGE='JavaScript'>");
out.println("alert('Номер телефона должен быть целым положительным числом');");
out.println("history.back()");
out.println("</script>");
out.flush();
}
command = "UPDATE abonent SET ";
if(!fio.equals("")){
command += "fio = '" + fio + "'";
}
else {
command += ", fio = null";
}
if(!nomer.equals("")){
command += ", telnomer = " + nomer;
}
else {
command += ", telnomer = null";
}
if(!balans.equals("")){
command += ", balans = " + balans;
}
else {
command += ", balans = null";
}
command += " WHERE idab = " + id;
rmi().updatedb(command);
out.println("<meta http-equiv='REFRESH' content='0; url=http://localhost:8084/billing/AbonentServletBeltyugovAV'>");
out.flush();
}
if(request.getParameter("id") != null && !request.getParameter("hid").equals("ydalit") && !request.getParameter("hid").equals("pravit") && !request.getParameter("hid").equals("day")){
id = request.getParameter("id");
fio = request.getParameter("fio");
nomer = request.getParameter("nomer");
balans = request.getParameter("balans");
try{
if(!balans.equals("")){
Integer.parseInt(balans);
}
}
catch(NumberFormatException e){
out.println("<SCRIPT LANGUAGE='JavaScript'>");
out.println("alert('Значение баланса должно быть целым положительным числом');");
Приложение Ж(продолжение)
out.println("history.back()");
out.println("</script>");
out.flush();
}
try{
if(!nomer.equals("") && Integer.parseInt(nomer) <= 0){
Integer.parseInt("f");
}
}
catch(NumberFormatException e){
out.println("<SCRIPT LANGUAGE='JavaScript'>");
out.println("alert('Номер телефона должен быть целым положительным числом');");
out.println("history.back()");
out.println("</script>");
out.flush();
}
String into = null;
String values = null;
into = "INSERT INTO abonent (";
values = "VALUES (";
into += "fio";
values += "'" + fio + "'";
if(!nomer.equals("")){
into += " , telnomer";
values += ", " + nomer;
}
if(!balans.equals("")){
into += " , balans";
values += ", " + balans;
}
into += ") ";
values += ")";
command = into + values;
rmi().updatedb(command);
out.println("<SCRIPT LANGUAGE='JavaScript'>");
out.println("</script>");
out.println("<meta http-equiv='REFRESH' content='0; url=http://localhost:8084/billing/AbonentServletBeltyugovAV'>");
out.flush();
}
}
else{
flagFour = true;
}
readXML();
out.close();
}
private RmiRemoteBeltyugovAV rmi() throws RemoteException, NotBoundException, IOException, SQLException{
String host = null;
// Получаем стаб регистратора с localhost
Registry registry = LocateRegistry.getRegistry(host);
Приложение Ж(продолжение)
// получаем стаб удаленного объекта от регистратора сервера
RmiRemoteBeltyugovAV stub = (RmiRemoteBeltyugovAV) registry.lookup("Hello");
return stub;
}
public void readXML() throws FileNotFoundException, TransformerConfigurationException, JDOMException, RemoteException, TransformerException, NotBoundException, IOException, SQLException, InterruptedException{
TransformerFactory tFactory = TransformerFactory.newInstance();
String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
String needpath = "";
int k = 0;
boolean flag = true;
while(flag){
needpath += path.split("/")[k] + "/";
if(path.split("\\/")[k].equals("billing")){
flag = false;
}
k++;
}
StreamSource xsltSource = new StreamSource(new FileInputStream(needpath + "abonent.xsl"));
StreamResult xmlResult = new StreamResult(out);
Transformer transformer = tFactory.newTransformer(xsltSource);
org.jdom.output.DOMOutputter outputterDom = new org.jdom.output.DOMOutputter();
// Thread.sleep(50);
Document doc;
if(flagFour){
docs = rmi().getFourDocument();
doc = docs[0];
}
else{
doc = rmi().getXMLabonent();
}
org.w3c.dom.Document domDocument = outputterDom.output(doc);
javax.xml.transform.Source xmlSource = new javax.xml.transform.dom.DOMSource(domDocument);
transformer.transform(xmlSource, xmlResult);
masAbID = new int[doc.getRootElement().getChildren("abonent").size()];
for(int i = 0; i < doc.getRootElement().getChildren("abonent").size(); i++){
Element element = (Element) doc.getRootElement().getChildren("abonent").get(i);
masAbID[i] = Integer.parseInt(element.getContent(0).getValue());
}
}
private String command;
Приложение Ж(продолжение)
private String id;
private String fio;
private String nomer;
private String balans;
public static int[] masAbID;
private PrintWriter out;
static boolean flagFour = false;
static String data;
static String name;
static String idab;
static Document[] docs = new Document[4];
private boolean firstRunServlets = true;
}
Приложение Ж(продолжение)
Листинг сервлета DetStatBeltyugovAV
package servletpackBeltyugovAV;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import org.jdom.JDOMException;
import rmiInterfaceBeltyugovAV.RmiRemoteBeltyugovAV;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import org.jdom.Document;
/**
*
* @author Alexey Beltyugov
*/
public class DetStatBeltyugovAV extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, RemoteException, NotBoundException, JDOMException, TransformerConfigurationException, TransformerException, FileNotFoundException, SQLException, InterruptedException, ServletException
{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
out = response.getWriter();
mstr = new String[3];
mstr[0] = AbonentServletBeltyugovAV.idab;
mstr[1] = AbonentServletBeltyugovAV.data;
mstr[2] = AbonentServletBeltyugovAV.name;
readXML();
out.close();
}
private RmiRemoteBeltyugovAV rmi() throws RemoteException, NotBoundException, IOException, SQLException{
String host = null;
// Получаем стаб регистратора с localhost
Registry registry = LocateRegistry.getRegistry(host);
// получаем стаб удаленного объекта от регистратора сервера
Приложение Ж(продолжение)
RmiRemoteBeltyugovAV stub = (RmiRemoteBeltyugovAV) registry.lookup("Hello");
return stub;
}
public void readXML() throws FileNotFoundException, TransformerConfigurationException, JDOMException, RemoteException, TransformerException, NotBoundException, IOException, SQLException, InterruptedException{
TransformerFactory tFactory = TransformerFactory.newInstance();
String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
String needpath = "";
int k = 0;
boolean flag = true;
while(flag){
needpath += path.split("/")[k] + "/";
if(path.split("\\/")[k].equals("billing")){
flag = false;
}
k++;
}
StreamSource xsltSource = new StreamSource(new FileInputStream(needpath + "detstat.xsl"));
StreamResult xmlResult = new StreamResult(out);
Transformer transformer = tFactory.newTransformer(xsltSource);
org.jdom.output.DOMOutputter outputterDom = new org.jdom.output.DOMOutputter();
Document doc = rmi().getMasDetStat(mstr);
org.w3c.dom.Document domDocument = outputterDom.output(doc);
javax.xml.transform.Source xmlSource = new javax.xml.transform.dom.DOMSource(domDocument);
transformer.transform(xmlSource, xmlResult);
}
public static int[] masAbID;
private PrintWriter out;
String[] mstr;
}