Разработване на подсистеми "Национален адресен регистър" и "Заявки за списъци, таблици и файлове" от есграон



страница3/3
Дата18.06.2018
Размер1.15 Mb.
#74124
1   2   3


Сподели с приятели:

III.4.3. Клас app.util.classes.BugTrack.java”. Класът има само един метод: public static String BugTracking(Exception _e, HttpServletRequest _request, String SName). В този метод се обработва настъпването на грешка в системата и когато това се случи, към буферна променлива buf от тип “StringBuffer” се добавя типът на грешката и параметрите от рекуеста, при които е настъпила грешката. Целият клас представлява буфер, който се използва при логирането на грешките настъпили в системата.

III.4.4. Класовете app.util.classes.Lib_Isnd.java”, “app.util.classes. Lib_Isnd2.java” и “app.util.classes.Lib_Isnd2VH.java” служат като помощни класове съдържащи методи за генериране на роднинските връзки и детайлите за дадено ЕГН/лице. Те не се използват в системите които се разглеждат от магистърската теза, така че няма да се спирам на обяснението им.

III.4.5. Класовете от пакета Log”. Първите два класа “Log.NBDLog.java” и “Log.NBDLogChange.java” представляват също буфери, в които се добава информация свързана с логирането на системата.

Първият клас отговаря за информацията при правене на заявки към системата. Всяко извеждане на данни се добавя в него, като към записа има и идентификатор на потребителя, дата и час и друга информация, която се изисква от закона за защита на личните данни.

Вторият клас също капсулира подобна информация, но това се извършва само в случаите в които има Online актуализиране на данни от базата.

Следващите три класа “Log.NBD_LogBugtrack_Thread.java”, “Log. NBD_LogChange_Thread.java” и “Log.NBD_Log_Thread.java” представляват нишките управляващи записването на редовете от будерите в лог-файловете. Те управляват записът съответно на: грешките възникнали в системата, Online актуализацията на записи от базата и всички заявки извеждащи данни от базата.

Проследяването на логовете с възникналите грешки служи на програмистите по-лесно да наблюдават дали системата е стабилна и по-лесно да откриват при какви обстоятелства е възникнала грешката.

Логовете с направените промени се образуват с определен макет, така че при необходимост от възстановяване на базата да може лесно да се възстановят и промените направени след като е направен последният архив на базата.

Логовете на всички заявки към базата, служат при необходимост да се установи кой потребител е разглеждал данните за даден човек. Те са направени с цел системата да отговаря на последните изисквания на Закона за Защита на Лични Данни /ЗЗЛД/.

III.4.6. Класовете от пакета app.util”.

Първият клас (JAVA Bean)app.util.Message.java” съхранява информация за настъпила грешка в системата(съобщението за грешка) и идентификатора на потребителя. В някои случаи се използва за проверка дали даден потребител е влезнал в системата или директно се опитва да достъпи някой от сървлетите които извеждат данни, и ако не се е логнал в обект от този клас се записва съобщението за грешка, което след това се извежда на потребителя.

Вторият клас “app.util.OrderedHashtable.java” разширява стандартният JAVA клас “java.util.Hashtable.java”, като добавя методи служещи за сортирането на стандартната хеш-таблица, която е несортируема.

Третият клас (JAVA Bean)app.util.Rajoni.java” капсулира информация за административните райони в страната. Например код на област, код на район, име на район и т.н.



Четвъртият клас (JAVA Bean)app.util.UserInfo.java” капсулира детайлна информация необходима да се идентифицира потребителят влезнал в системата и правата които има. Съхраняват се идентификатора, паролата, ЕГН на потребителя имена и т.н.

III.4.7. Класовете от пакета ExServlets”. Двата класа от този пакет: “ExServlets.ExServlet.java” (Код. VII.3.7.) и “ExServlets.ExServletS.java” служат за едни и същи цели. Различията между тях са малки така че ще опиша първия от двата и ще обясня единствената съществена разлика между тях. И двата сървлета наследяват стандартния клас “javax.servlet.http.HttpServlet.java”. Всеки друг сървлет от системата наследява някой от двата сървлета, тъй като в тях се управлява създаването или използването на вече създадена връзка от пулинга с връзки към базата. Има две важни променливи които се инициализират от конструкторите на двата класа: 1. Пътят на резултатната JSP-страница към която сървлета да пренасочи системата след неговото изпълнение – ResURL, 2. има ли право потребителят да извика сървлета с метод “GET” – flag. Ако има право на метод “GET”, съответно в метода public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException управлението се пренасочва каскадно към методът public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException, който служи за обработка на заявките към сървлетите подадени с метод “POST”. В този метод се проверява дали сесията на потребителя е изтекла или не. Ако сесията не е изтекла отново каскадно се извиква методът private void redirectPage(boolean connect,HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException, в който се проверява дали има активна връзка към базата, и ако няма такава се взима от пулинга – “conn =dbc.getConnection();”. След това се проверява дали обекта msg от тип “app.util.Message.java” е празен и ако не е това значи че има идентифициран потребител, който е влязъл в системата. Ако има потребител управлението се пренасочва към метода: public abstract boolean kernel_core(Connection conn, HttpServletRequest request, HttpServletResponse response, Message msg) throws SQLException,IOException,ServletException,ParseException, който е абстрактен метод и в сървлета е дадена само неговата дефиниция. Тук идва и разликата в двата сървлета. При сървлета “ExServlets.ExServlet.java” методът връща стойности от тип “boolean”. Когато изискванията към връщаните стойности са по сложни се използва сървлета “ExServlets.ExServletS.java”, в който същият метод връща стойности от тип “String”. Операциите които методът “kernel_core” ще извършва се описват в метода със същото име в сървлета който текущо е наследил някой от двата сървлета. Наследявайки някой от двата сървлета спестяваме повторното писане на еднакъв код и след това редактирането му на много места при откриване на грешка в него.
IV. Подсистема – 3. Национален адресен регистър. В тази подсистема от информационната система се правят справки в различните класификатори за място – класификатор на населените места, класификатор на адресите и на пътните артерии.
IV.1. Модул - 3.1. Списък на областите.

Модулът трябва да извежда резултатния списък в таблица със следните колони: код, код латиница, код кирилица, наименование и код латиница - НСИ.

При избиране на менюто, управлението на браузъра трябва да се пренасочва към сървлета “isnk.isnk_obl.java”, който да прави заявка към базата и да извлича таблица с 28-те области на Бългаия. Тук не е необходимо да има “JSP” страница за входящите данни, тъй като няма такива. След изпълнението на сървлета, управлението трябва да се пренасочи към “JSP” страница за изход “Web Content\isnk\list_obl1.jsp” (Фигура 1.1). В тази страница трябва да се показва таблицата с областите. Схема на модула - Схема 3.1.
IV.2. Модул - 3.2. Списък на общините.

Модулът трябва да извежда в табличен вид списъкът на общините за дадена област, след като е избрана в страницата за входящи данни. В таблицата трябва да има следните колони: код, код латиница, код кирилица и наименование.

Избирайки това меню, браузърът трябва да бъде пренасочен към страницата за входящи данни “Web Content\isnk\index1.jsp”(Фиг. 2.1). В тази страница трябва да има HTML Select – поле (комбобокс), от което потребителят да избира областта, за която иска да види списък с общините и. Бутонът “Край” трябва да пренасочва към главното меню – страница “Web Content\M_Menu.jsp”. Бутонът “Търси”, трябва да пренасочва браузъра към сървлета “isnk.isnk_pob1.java”. След изпълнението на сървлета, управлението трябва да се пренасочва към страница “Web Content\isnk\pob_list.jsp” (Фигура 2.2), в която да се отпечатва таблица с общините на избраната област. Интересен е случаят, в който се избира например област “Варна”. В този случай, тъй като във Варна има и райони, в полето “Наименование” трябва да се отпечатва и подтаблица с районите към общината, на която принадлежат. Схема на модула - Схема 3.2.
IV.3. Модул - 3.3. Справка в класификатора на населените места.

По избрани Област, Община и Име или код на населено място модълът трябва да извежда спъсък на населените места в табличен вид, като таблицата трябва да има следните колони: код, наименование, вид, п. код, променено от НСИ(дата), състояние, област, община, бр. улици, бр. адреси. Избирайки това меню, браузърът трябва да бъде пренасочен към страницата за входящи данни “Web Content\isnk\isnnm2\index1.jsp” (Фигура 3.1). От тази страница трябва да може да се направят два вида справки:



а). Получаване на населените места за една община. Необходимо е да се избере "Област", от HTML Select полето и "Община" и да се натисне бутон "Търси". Общината трябва да се избере, като срещу полетата за код и име на Общината има бутон “Избор”. След натискането му трябва да се появява нов прозорец, в който браузърът да зареди сървлета “m3.isnnm2_chnm.java”, като чрез метод “GET” да се подава кодът на избраната област. След изпълнението на сървлета той трябва да пренасочва към страницата “Web Content\isnk\isnnm2\chnm.jsp” (Фиг. 3.2), в която потребителят трябва да избере от списъчно поле общината, която желае и да натисне бутона “Избери”, като чрез JavaScript полетата на главният прозорец на модула, отговарящи за община, трябва да са запълнени с избраните данни и допълнителният прозорец да бъде затворен.

б). Получаване на населени места от цялата страна по име или код. Трябва да се въведе част от името или част от кода на населено място и да се натисне бутон “Търси”.

Бутонът “Изчисти” трябва да изчиства полетата на страницата (да задава стойностите, така както са при първоначално зареждане на страницата). Бутонът “Помощ” трябва да показва в нов прозорец помощния екран за модула “Web Content\isnk\isnnm2\helpn.jsp”.

С натискането на бутон “Търси” управлението трябва да се пренасочва към сървлета “isnk.Isnnm.java”, който да прави SQL заявките към базата. След изпълнението на сървлета, ако не са настъпили грешки, браузърът трябва да се пренасочи към страницата, в която се показват резултатите - “Web Content\isnk\isnnm2\list.jsp” (Фигура 3.3).
Данните от класификатора на населените места трябва да се получават на екрана във вид на таблица, и колоните трябва да са следните:

- Код - код на населено място;

- Наименование - име на населеното място;

- Вид - видът може да бъде: “Село”, “Град”, “Манастир”, “Р-н, кварт.”, “Махала”, “Колиба”;

- П. код - пощенски код на централната пощенска станция;

- Променено от НСИ - дата на последна промяна в НСИ;

- Състояние - “Съществува” или “Закрито”;

- Бр. улици - Брой на съществуващи и закрити пътни артерии;

- Бр. адреси - Брой на адресите за населеното място.

Схема на модула - Схема 3.3.


IV.4. Модул - 3.4. Справка в класификатора на пътните артерии.

Тук пренасочването трябва да се осъществи към страницата “Web Content\isnk\isnpa2\index1.jsp” (Фигура 4.1). В този екран се търсят пътни артерии. В него трябва да могат да се избират или въвеждат следните параметри: “Област”, “Община”, “Населено място”, “Име или код на пътна артерия” и “Начин на подреждане.



Заявките трябва да се изпълняват по следния начин:

- Ако е зададена само област трябва да се отпечатват пътните артерии от областта;

- Ако е зададена област и община трябва да се отпечатват пътните артерии от общината;

- Ако е зададено населено място трябва да се отпечатват пътните артерии от от него без да се има в предвид избраната област или община.

При изпълнението на всички заявки трябва да се включва и избор по име или код на пътна артерия, ако такъв е зададен.

При отпечатване на заявка по код на област или община трябва да се отпечатва и населеното място. Населеното място трябва да може да бъде избрано, при което трябва да се получава списък на пътните артерии в съответното населено място.



Съдържанието на отпечатаните пътни артерии трябва да се определя от избора на “Подреждане по”:

- подреждане по “Име на пътна артерия” - трябва да се отпечатат данни за съществуващите и закритите пътни артерии, подредени по вид и наименование;

- подреждане по “Код на пътна артерия” - трябва да се отпечатат данни за съществуващите, закритите и преименуваните пътни артерии в едно населено място (да са включени техните стари имена). Трябва да са подредени по код на пътна артерия, състояние и дата на актуализация.

Област трябва да се избира пак от падащо меню(комбобокс). Общината трябва да се избира, както в модулът 3.3, като управлението да получава сървлетът “m3.isnpa2_chnm.java” и той да пренасочва към страница “Web Content\isnk\isnpa2\chnm.jsp” (Фигура 4.2). Подобно да е и избирането на населено място, но сървлетът да е “m3.isnpa2_chpa.java”, а страницата, в която той извежда списъка с населените места - “Web Content\isnk\isnpa2\ chpa.jsp” (Фигура 4.3). Другата разлика е, че подаваният чрез метод “GET” параметър този път трябва да е код на избраната община. Името на пътната артерия, част от него или кода трябва да може да се въвежда ръчно в едноименното текстово поле. Бутоните “Изчисти”, “Помощ” и “Край” трябва да са еднакви както в другите. Бутонът “Търси” трябва да пренасочва към сървлета “isnk.isnpa.java”.

След като сървлетът приключи своята работа, управлението трябва да се пренасочва към страницата за показване на резултатите “Web Content\ isnk\isnpa2\list.jsp” (Фигура 4.4).

Данните от класификатора на пътните артерии трябва да се получават на екрана във вид на таблица. Колоните трябва да са следните:

- Код - код на пътна артерия;

- Наименование - име на пътна артерия;

- Състояние - състоянието на пътната артерия може да бъде: “Съществува”, “Закрита”, “Ново име”, “Старо име”;

- Актуализирана - дата на последна промяна на пътната артерия в НБД;

- Бр. адреси - Брой на адресите на пътната артерия.

Схема на модула - Схема 3.4.
IV.5. Модул - 3.5. Справка в класификатора на адресите.

Този модул от Националния Адресен Регистър ще разгледаме по-подробно. С избирането на менюто браузърът трябва да зарежда:



IV.5.1. JSP страницата за входящите данни - “Web Content\isnk\ isnad2\index1.jsp” - (код VII.3.1.). От този екран трябва да може да се направят два вида справки:

а). Получаване на адресите на една пътна артерия. Необходимо е да се избере “Област”, “Община”, “Населено място”, “Пътна артерия”, подреждане на данните и да се натисне бутон “Търси”.

б). Получаване на адресите на една секция. Необходимо е да се избере “Област”, “Община”, “Населено място”, “Район/Секция”, подреждане на данните и да се натисне бутон “Търси”.
Данните от класификатора на адресите трябва да се получават на екрана във вид на таблица. Таблицата трябва да съдържа:

- Номер - номер и подномер на сграда (дворно място);

- Вход - вход на сграда;

- Район - район, в който се намира сградата;

- Секция - секция, в която се намира сградата;

- С пост. адрес - брой на живите лица с постоянен адрес;

- С наст. адрес - брой на живите лица с настоящ адрес;

- Вид на адреса - видът на адреса може да бъде: “Жилище", "Административна", "Жил. и админ., "В строеж", "Разрушена", "Празно дв. място", "Дом 'Майка и дете'", "Дом 'Стари хора'";

- Актуализиран - дата на последна промяна на този адрес в НБД;
Полетата в страницата (Фигура 5.1):

а). HTML Select поле с работно име “tz” - “Област”, от което трябва да се избира една от 28-те области на България.

б). Две полета за “Община”. И двете полета трябва да са текстови. Първото да е с работно име “obs”, като видимата дължина да е “2”, максималната дължина да е “2” и трябва да не може да се въвежда ръчно. В него трябва да се зарежда кодът на общината. Второто поле с име “obsname”, размерът му (видимата дължина) да е “30” и максималният размер на въвеждания символен низ да е “25”. В това поле също не трябва да може да се въвежда ръчно. В него трябва да се зарежда името на общината. (Фиг. 5.2 (а)).

Срещу двете полета, които са едно до друго трябва да има бутон “Избор”, чрез който да се избира дадена община, принадлежаща на избраната по-рано област и данните за избраната община да се зареждат в описаните полета. При натискането на този бутон да се извиква JavaScript функцията “open_rj('../../isnad2_chnm')” - (код VII.3.1.), която да стартира нов прозорец на браузъра и в него да се зарежда сървлетът “m3.Isnad2_chnm.java” - (код VII.3.2.), като с метод “GET” да му се подава кодът на избраната област. При стартирането на сървлета управлението трябва да се предава на метода “public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException”, който да предава управлението на метода “public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException”. Тeзи два метода са наследени от някой от сървлетите “ExServlet.java” и “ExServletS.java”. и са еднакви за всички сървлети.



Интерес представлява методът “boolean kernel_core(Connection conn, HttpServletRequest request, HttpServletResponse response, Message msg) throws SQLException, IOException, ServletException”, защото той изпълнява извеждането на общините, принадлежащи на избраната област. Ще обърна внимание само на основните редове от кода, с цел изложението да е кратко и съдържателно. В него се създава обект “session ” от тип “HttpSession ”, в който се взима сесията “request.getSession(true)”, след това се създава обект “ResultI” от тип “ArrayList” – “ArrayList ResultI = new ArrayList();”, като в него се въвеждат резултатите от изпълнението на сървлета, представляващи изходни данни, обработени чрез HTML-тагове с цел удачното им възпроизвеждане пред потребителя. Следваща важна стъпка е дефинирането на обект с име “pstm” от тип “PreparedStatement” и обект “SQL_S1” от тип “String”, които са важни при изпълняването на SQL-заявките към базата. Важно е и създаването на обекта “kobl” от тип “String”, в който се взима от рекуеста подаденият код на областта “String kobl = request.getParameter("kobl");” и след това подава първите два символа от него на обекта “tz” от тип “String”. Следват някои основни проверки за коректни входни данни и ако всичко е наред, се преминава на основната част от сървлета, а именно заявките към базата. Използва се таблицата “t_ob” от базата (Таблица 1). След задаването на SQL-заявката “SQL_S1 = "SELECT * FROM t_ob WHERE ob_kobl=?";”, която взима всички полета на всички записи от таблицата с код за област = на подаваната стойност със знака “?”. След това в обекта “pstm” подаденият като параметър на метода обект “conn” от тип “Connection” подготвя изпълнението на заявката - “pstm = conn.prepareStatement (SQL_S1);”. Сега вече се подава променливата, като обектът “pstm” чрез неговия метод “setString” замества в “SQL” стринга “?” с кода на избраната област – “pstm.setString(1, tz);”. Следва създаването на обект “chnmcur” от тип “ResultSet”, в който се въвеждат данните от направената заявка - “ResultSet chnmcur = pstm.executeQuery();”. След това с цикъл докато съществува следващ запис в този обект, в обекта “ResultI” се въвеждат изходните данни, оформени с HTML-тагове, защото се извеждат в HTML Select (списъчно) поле. Въвеждането става чрез кода “ResultI.add(new String("”. След цикъла следва затварянето на резълтсета “chnmcur.close();” и в обекта “request” от тип “HttpServletRequest”, който е подаден като входен параметър на метода, се изпраща и обектът “ResultI”, в който се намират крайните резултати “request.setAttribute("ResultI",ResultI);”. И накрая, ако всичко е наред, методът връща “return true;”, при което управлението се връща на метода “doPost()”, който пренасочва браузъра към страницата за изходни данни “Web Content\isnk\isnad2\chnm.jsp”(Фигура 5.2 (а)). В тази страница трябва да има списъчно поле (HTML Select) с работно име “nmchoose” и размер на видимото поле “7”, в което да е списъкът на общините, принадлежащи на областта. След като е избрана община, трябва да се натиска бутон “Избери”, който да извиква “JavaScript” функцията “transfer(this)”, която предава данните на главния прозорец, от който е извикан изборът (Код VII.3.3.). Функцията взима индекса на избрания от списъка елемент “ind = document.nmform.nmchoose.options.selectedIndex;” и ако не е избрано нищо, т.е. индексът е равен на “-1” - “if(ind == -1) {alert("Не сте избрали нищо!");return false;}”, извежда съобщение за грешка. Ако е избрана община, на полето “obs” в главния прозорец трябва да се подава кодът на общината, който представлява първите два символа от избрания от списъка елемент за община “opener.document.isnpa.obs.value = tmp.substring(0,2);” На полето “obsname” трябва да се задава името на общината (останалите символи от низа) “opener.document.isnpa.obsname.value = tmp.substring(3, len);”. Крайната стъпка е затварянето на прозореца “window.close();”.

в). Две текстови полета за “Населено място”. И в двете трябва да не може да се въвежда ръчно. Първото поле “nm” да е с видима област “5” и максимална дължина “5”. В него трябва да се избира кодът на населеното място. Второто поле “nmname” да е с видима област “30” и максимален брой символи “25”. В него трябва да е името на населеното място.

Следва отново бутон “Избор”, чрез който трябва да се избира дадено населено място, принадлежащо на избраната по-рано община и данните за избраното населено място да се зареждат в описаните полета. При натискането на този бутон се извиква JavaScript функцията “open_rj2('../../isnad2_chpa');”, която да стартира нов прозорец на браузъра и в него да се зарежда сървлетът “m3.Isnad2_chpa.java”, като с метод “GET” да му се подава кодът на избраната община. Изпълнението на сървлета е подобно на “m3.Isnad2_chnm.java” и няма да се спирам на неговият код. Само ще спомена, че той трябва да препраща към изходната страница “Web Content\isnk\isnad2\ chpa.jsp” (Фигура 5.2 (б)), действията на която също трябва да следват аналогична техника. Използва се таблица “t_knm” (Таблица 5).



г). Две текстови полета за “Пътна Артерия”. И в двете трябва да не може да се въвежда ръчно. Първото поле “pa” да е с видима област “5” и максимална дължина “5”. В него да се избира кодът на пътната артерия. Второто поле “paname” да е с видима област “30” и максимален брой символи “30”. В него трябва да е името на пътната артерия. Когато въвеждащият курсор(фокусът) е върху това поле, да се извиква функцията “onBlur= "decodeie(this);”, която служи за вдигане на малките букви в главни.

Бутонът “Избор” отново активира JavaScript функция “open_rj3 ('../../isnad2_chpa2');”, която в нов прозорец на браузъра трябва да зарежда сървлета “m3.Isnad2_chpa2.java”, като с метод “GET” да му се подава кодът на избраното населено място. След изпълнението на сървлета, който е подобен на “m3.Isnad2_chpa.java”, той трябва да препраща към изходната страница “Web Content\isnk\isnad2\chpa2.jsp” (Фигура 5.2 (в)). Използваната от базата таблица е “t_kpa” (Таблица 3).



д). Две текстови полета. И в двете трябва да не може да се въвежда ръчно, и също да се вдигат малките букви в главни. Първото поле “rn” да е за район, с видима област “2” и максимална дължина “5”. Второто поле “sek” да е за секция, с видима област “30” и максимален брой символи “30”.

Бутонът “Избор” отново активира JavaScript функция “open_rj4 ('../../isnad2_chpa3');”. Разликата е, че сървлетът този път трябва да е “m3.Isnad2_chpa3.java”, като с метод “GET” да му се подава кодът на избраната пътна артерия. След изпълнението на сървлета, той трябва да препраща към изходната страница “Web Content\isnk\isnad2\chpa3.jsp” (Фигура 5.2 (г)). Тук трябва да се прави заявка към таблицата “t_kad” (Табл. 4).



е). HTML Select поле с работно име “sort” - “Данните да са подредени по”, от което трябва да се избира или “Улици и номера на сгради”, или “По секции (и райони)”.

ж). Бутон “Изчисти”.Трябва да е от тип “Reset” и да възстановява полетата такива, каквито са били при зареждането на страницата.

з). Бутон “Помощ”. Този бутон трябва да извиква в нов прозорец помощната страница “Web Content\isnk\isnad2\help1.jsp”.

и). Бутон “Край”. Този бутон трябва да пренасочва браузъра към главното меню на информационната система “Web Content\M_Menu.jsp”.

й). Бутон “Търси”. Той трябва да е от тип “Submit” - “<INPUT TYPE="submit" VALUE="Търси">” и да пренасочва браузъра към главния сървлет с логиката на модула “isnk.Isnad.java” (Код VII.3.4.). Пренасочването става по следния начин: Първо при натискане на бутона се отива на реда от HTML кода, в който се дефинира формата – “
”. Вижда се, че при действие “submit” се стартира JavaScript функцията “return chp(this);”, която проверява дали са въведени данни, за да може заявката да бъде изпълнена коректно, и в случай, че няма грешка, се извършва препращането към сървлета.
IV.5.2. Сървлет -isnk.Isnad.java” (Код VII.3.4.).

В началото на сървлета се задава в кой пакет е “package isnk;”. След това се импортират класовете, необходими на сървлета да намери методите,

използвани в кода му:

import app.util.Message;

import app.util.UserInfo;

import java.sql.Connection;

import java.sql.*;

import java.sql.PreparedStatement;

import java.util.ArrayList;

import javax.naming.InitialContext;

import javax.servlet.*;

import javax.naming.*;

import javax.servlet.http.*;

import java.io.PrintWriter;

import java.io.IOException;

import javax.sql.DataSource;

import java.text.SimpleDateFormat;

import java.util.Date;

import app.util.classes.Connection_M1;

import app.util.classes.lib; import ExServlets.ExServlet;

import bufer.Isnad2_bufer;


За всички сървлети използваните класове са почти еднакви, заради сходството в използвания навсякъде инструментариум от методи и за това ги посочвам само в този сървлет.

В сървлета, методът “GET” е забранен и при опит да се подадат данни на сървлета чрез този метод, браузърът се препраща към страницата за грешки “Web Content\error_page\error_page.jsp” със съобщение “Подаването на данни с метод [GET] е забранено.”. При натискането на бутона “Търси” управлението се предава на метод “public void doPost(HttpServletRequest request, HttpServletResponse response)” наследен от някой от сървлетите “ExServlet.java” и “ExServletS.java”. Тъй като съм описал действието на метода в описанието на сървлета “ExServlets.ExServlet.java” ще се спра на описанието на методът “if (kernel_core(conn, request, response, msg))”, който извършва обработката и търсенето по подадените параметри и подходящото оформяне на резултатните данни и е различен за всеки сървлет. Този метод се вика в проверка “if”. Ако методът се е изпълнил успешно, той връща резултат “True” и условието “if (kernel_core(conn, request, response, msg))” е вярно, при което ако резултатното URL, което е подадено в променливата /“ResURL” от тип “String”/ не е равно на “pob_list” възникват 2 случая:

1. ако е равно на “login.jsp”, браузъра се пренасочва към логин-страницата на системата – “response.sendRedirect("login.jsp");”;

2. ако не е равно на “login.jsp” се изпълняват двата реда код “dispacher = request.getRequestDispatcher(ResURL);” и “dispacher.forward (request, response);”, които пренасочват към страницата за изходни данни “Web Content\isnk\isnad2\list.jsp”. На извеждането на изходните данни ще обърнем внимание, след като разгледаме сървлета.



На основния метод “boolean kernel_core(Connection conn, HttpServletRequest request, HttpServletResponse response, Message msg) throws SQLException, IOException, ServletException, ParseException”. му се подават като параметри обектите за връзката с базата “conn”, рекуестът и респонсът на браузъра “request” и “response” и обектът “msg”. Методът е от тип “boolean” и предава следните типове грешки, които се обработват в метода “doPost”: “SQLException”, “IOException” и “ServletException”. На първия ред “ArrayList ResultI = new ArrayList();” от тялото на метода се дефинира обект “ResultI” от тип “ArrayList”, в който се зареждат изходните данни, форматирани с подходящите HTML тагове. Отново в обект “session” от тип “HttpSession” се взима сесията от рекуеста “HttpSession session = request.getSession(true);”. За да може дадена дата да се форматира, се създава обект “dateFormatter” от тип “SimpleDateFormat” и му се задава формат “dateFormatter = new SimpleDateFormat("dd.MM.yyyy");”. След това дефинираме обекти “SQL_S1” и “sel” от тип “String” и ги инициализираме с празен стринг. Създаваме обект “pstm” от тип “PreparedStatement”, като му задаваме първоначална стойност “null” – “PreparedStatement pstm = null;”. Дефинираме и инициализираме обекти от тип “ResultSet”, които са ни необходими, за да изпълним SQL заявките и в които се зареждат резултатите - “ResultSet cursg = null, chnmcur = null, chnmcur2 = null,chnmcura = null, cur = null;”. Кодът, който извършва логиката на модула е заграден от оператор “if”, който проверава дали потребителят е минал през формата за вход и се е записал в системата – “if (msg.getAppData()!=null)”. Тази проверка не е най-удачната, и в момента се променя технологията с цел още по-добра защита на системата. Следва дефиниране и инициализиране на брояча на адресите “int count = 0;”. Следващият ред -“Connection_M1.SetDate();” извиква от класа “Connection_M1” статичния метод “SetDate();”. Този метод въвежда датата и времето, през което е направена заявката във формат “dd.MM.yyyy HH:mm” в статичния обект “mStartDate” от тип “String”. В обекта “CurDate”се взима зададената дата “String CurDate = Connection_M1.mStartDate;”. За да може датата и часът да бъдат показани в изходния сървлет “list.jsp”, този обект се добавя в рекуеста - “request.setAttribute("CurDate",CurDate);”. Времето се показва в горния десен ъгъл от страницата (Фигура 5.3). Дефинираме обекти “k1”, “ad_vh”, “ad_rn”, “ad_f”, “tmp”, “tmp2” и “tmp3” от тип “String”. След това обекти “ad_data”, “ad_data2” и “ad_data3” от тип “Date”. В обектите “tz”, “obs”, “nm”, “pa”, “sek”, “rn” и “sort” от тип “String” зареждаме от рекуеста входните данни, които сме избрали в страницата за входни данни “Web Content\isnk\isnad2\index1.jsp”. Зареждат се съответно код на област, код на община, код на населено място, код на пътна артерия, секция, район и код на начина на подреждане (1 или 2). Това става аналогично за всички “String tz = request.getParameter("tz");”.

Сега следва SQL заявка, която ще опиша по-подробно, а следващите заявки ще описвам накратко. Заявката започва като в обекта “SQL_S1” от тип “String” се зарежда SQL-стрингът “SQL_S1 = "SELECT * FROM t_obl WHERE obl_kobl=?";”. Той задава на базата следните действия. Да се вземат всички колони от таблица “t_obl” (Таблица 2), където полето “obl_kobl” (код на област) е равно на “?”. Знакът “?” означава, че на този стринг, на това място ще се подава променлива, по която ще се извърши заявката. Следва подготвяне на SQL заявката - “pstm=conn.prepareStatement (SQL_S1);”. Сега на мястото на първия в “SQL_S1” знак “?”, който за случая е единствен, се въвежда стойността на обекта “tz”, като автоматично се слагат и единичните кавички около стойността – “pstm.setString(1,tz);”. Сега в обекта “cursg” от тип “ResultSet”, се зареждат взетите от базата – данни “cursg = pstm.executeQuery();”. С кода “cursg.next();”, се поставя поинтера (индекса) на първия запис от “cursg”, който за така направената заявка и данните от базата винаги е и единствен ред. Интересна и важна част представлява запълването на обекта “ResultI”, в който се зарежда HTML кода на динамичната част от резултатната страница (извежданите данни). Използва се метода “add” от обекта - “ResultI.add(new String ("Област: " + cursg.getString ("obl_kobl") + " " + cursg.getString("obl_ime")));”. За да е сигурно, че компилаторът ще възприеме въвежданите данни като обект, те се заграждат от “new String ()”. Вътре се взимат текущите за обекта “cursg”, код на областта и името и. Това представлява част от подзаглавието на резултатната страница и показва коя област е избрана. Затваряме (изчистваме) обекта “cursg” - “cursg.close();”. С това заявката е изпълнена.

След това правим “SQL” заявка, с която добавяме общината към заглавието:

SQL_S1 = "SELECT * FROM t_ob WHERE ob_kobl=? and ob_kob=?";

pstm = conn.prepareStatement(SQL_S1);

pstm.setString(1,tz);

pstm.setString(2,obs);

cursg = pstm.executeQuery();

cursg.next();

ResultI.add(new String (" Община: " + cursg.getString("ob_kob") + " " + cursg.getString("ob_ime")));

cursg.close();

Аналогично в заглавието добавяме кода и името на населеното място.



Следва проверка дали в кода на пътната артерия - “pa” има данни или е празен (if (pa != null && !pa.equalsIgnoreCase(""))).

а). Ако има данни, се изпълнява отново SQL заявка, която по избраните код на населено мястоpa_knm” и код на пътна артерияpa_kpa” взима всички полета от таблицата “t_kpa”(Таблица 3). Данните се въвеждат аналогично в обекта “ResultI” - “ResultI.add(new String (" Пътна артерия: " + cursg.getString("pa_kpa") + " " + cursg.getString("pa_ime") + "
"));
”. На обекта “k1” от тип “String” се задава стойност “1”. От таблици “t_kad”(Таблица 4) и “t_kpa” се избират колоните “pa_kpa”, “pa_ime”, “ad_ns”, “ad_rn”, “ad_sek”, “ad_ks”, “ad_vh”, “ad_brna”, “ad_brpa”, “ad_f”, “ad_data”, “ad_data2” и “ad_data3”, като кодът на пътната артерия от таблица “t_kad трябва да е равен на кода на избраната пътна артерияpa”. Кодовете на пътните артерии и кодовете на населените места и в двете таблици да са равни. Кодът на населеното място в таблица “t_kad да е равен на кода на избраното населено място “nm” - “SQL_S1 = "SELECT pa_kpa, pa_ime, ad_ns, ad_rn, ad_sek, ad_ks, ad_vh, ad_brna, ad_brpa, ad_f, ad_data, ad_data2, ad_data3 FROM t_kad, t_kpa WHERE ad_kpa=? and ad_kpa=pa_kpa and pa_knm=ad_knm AND ad_knm =?";” - (Заявка 1). Тук идва ролята на обекта “sort”. Ако е равен на “1”, към заявката се добавя сортиране по колони “pa_kpa”, “ad_ns” и “ad_vh” - “SQL_S1 = SQL_S1 + " ORDER BY pa_kpa, ad_ns, ad_vh";”, ако е равен на друга стойност – сортиране по колони “ad_rn”, “ad_sek”, “pa_kpa”, “ad_ns” и “ad_vh”. Тази заявка изисква от базата резултатната таблицата. (Целият блок на “if” оператора извежда адресите на избрана пътна артерия).

б). В случай, че няма данни (целият блок на “else” оператора извежда адресите на избрана секция). Проверява се дали има въведен код на район в обекта “rn”. Ако има, към подзаглавието се добавят кодоветв на района и на секциятаResultI.add(new String (" Район: " + rn + " Секция: " + sek + "
"));
”. Ако не е въведен, се добавя само кодът на секциятаResultI.add(new String (" Секция: " + sek + "
"));
”. Към таблицата на пътните артерии “t_kpa” (Таблица 3) се подава заявка в променлива “br” да се въведе броят на записите с код на пътна артерия, отговарящ на кода в обекта “nm”.

sel = "SELECT count(*) br FROM t_kpa WHERE pa_knm=?";

pstm = conn.prepareStatement(sel);

pstm.setString(1,nm);

chnmcur2 = pstm.executeQuery();

chnmcur2.next();

След това, ако “br” е различно от “0” - “if (chnmcur2.getInt("br") != 0)”, това означава, че населеното място има улици. В този случай се изпълнява следната SQL заявка “sel = "SELECT pa_kpa, pa_ime, pa_vid, ad_ns, ad_rn, ad_sek, ad_ks, ad_vh, ad_brna, ad_brpa, ad_f, ad_data, ad_data2, ad_data3 FROM t_kad, t_kpa WHERE ad_rn=? AND ad_sek =? and ad_kpa=pa_kpa and pa_knm=ad_knm AND ad_knm=?";”. Аналогично на (Заявка 1), описана малко по-нагоре според избраното сортиране се задава един от двата вида сорт “sel = sel + " ORDER BY pa_vid,pa_ime,ad_ns,ad_vh";” или “sel = sel + " ORDER BY ad_rn,ad_sek,pa_kpa,ad_ns,ad_vh";”. В този случай кодът на района от таблица “t_kad трябва да е равен на кода на избраната пътна артерияrn”. Секцията от същата таблица трябва да е равна на секцията в обекта “sek”. Кодовете на пътните артерии и кодовете на населените места и в двете таблици трябва да са равни и кодът на населеното място в таблица “t_kad да е равен на кода на избраното населено място “nm”.

Ако “br” е равно на “0” (населеното място няма улици), се задава следната заявка : “sel = "SELECT ad_ns, ad_rn, ad_sek, ad_ks, ad_vh, ad_brna, ad_brpa, ad_f, ad_data, ad_data2, ad_data3 FROM t_kad WHERE ad_rn=? AND ad_sek =? AND ad_knm=?";”, като отново (според сортирането) се задават сортиращите полета. На обекта “k1” се задава стойност “2”.

Излиза се от “if” оператора за проверка дали има въведена улица в “pa” и се стартира образуваната SQL заявка – (chnmcur = pstm. executeQuery();). Влиза се в цикъла “while (chnmcur.next() )”, който обработва данните, изведени от базата по подходящ за потребителя интуитивен и удобен вид на таблица, използвайки подходящите за това HTML тагове. На първо място в цикъла се проверява дали броят на адресите е равен на “0” (if (count == 0)). Ако той е равен на “0”, това означава, че още няма изведени от цикъла адреси и тогава в тялото на условния оператор се създава хедъра на таблицата, като данните се въвеждат чрез метода “add” в резултатния обект “ResultI” от тип “ArrayList”.



if (count == 0)

{

ResultI.add(new String (""));

ResultI.add(new String (""));

}

В такъв вид данните се показват на потребителя във формата на таблица. Следват таговете за нов ред и клетка (кл. 1) в таблицата “ResultI.add(new String ("

"));

ResultI.add(new String ("
"));

count++; //инкрементира се броячът на цикъла “while
Важно е да се спомене, че се проверява дали резултатната от сравненията дата, записана в променливата “tmp” е равна на “01.01.1800” (стойността по подразбиране в базата, която означава, че записът не е бил актуализиран) - “if (tmp.equalsIgnoreCase("01.01.1800"))”. Ако е равна на тази дата в клетката, се извежда символът “-”. Такава стойност по подразбиране съществува, защото полетата в базата са “NotNull”. Следва затварящата скоба на цикъла “} // Край на цикъла "while"”.

Цикълът се повтаря докато в таблицата не се извадят всички записи, получени от SQL заявката.

В резултатния обект “ResultI” се въвежда затварящият таг на таблицата “ResultI.add(new String ("

Пътна артерия"));

ResultI.add(new String ("
Номер"));

ResultI.add(new String ("
Вход"));

ResultI.add(new String ("
Район"));

ResultI.add(new String ("
Секция"));

ResultI.add(new String ("
С пост. адрес"));

ResultI.add(new String ("
С наст. адрес"));

ResultI.add(new String ("
Вид на адреса"));

ResultI.add(new String ("
Актуализиран"));

ResultI.add(new String ("
"));”. Когато населеното място има улици - в обекта “k1” сме въвели “1”, когато няма - сме въвели “2”. Проверяваме дали “k1” е равно на “1” - “if (k1.equalsIgnoreCase("1"))”. Ако е равно на “1”, това означава, че има улици и в първата колона на таблицата се въвежда кодът и името на улицата “ResultI.add(new String (chnmcur. getString("pa_kpa") + " " + chnmcur.getString("pa_ime")));”, взети от текущия елемент на обекта “chnmcur”. В противен случай в първата колона въвеждаме символа “-”, “ResultI.add(new String (" - "));”.

Достигаме до задаването на следващата колона на таблицата, като текстът и се центрира “ResultI.add(new String ("

"));”. Този ред се среща често и аз няма да го показвам всеки път, а само когато има друго подравняване на текста. Когато стане въпрос за следваща клетка или колона, това означава, че в кода има отново същия ред. От обекта “chnmcur” се взима номерът на пътната артерия и се въвежда в текущата клетка (текущия ред и 2-ра колона) – “ResultI.add(new String (chnmcur. getString ("ad_ns")));”. Последователно се взимат вход, район и полето “ad_f”, представляващо флаг, означаващ типа на адреса. Типът може да бъде:

0” – “Жилищeн Aдpec”, “1” – “Aдминистративна Cгpaдa”, “2” – “Жилищен Адрес И Aдминистративна Cгpaдa”, “3” – “Cгpaдa B Cтpoeж”, “4” – “Paзpушeнa Cгpaдa”, “5” – “Празно Дворно Място”, “6” – “Дом "Майка и Дете"”, “7” – “Дом "Стари Хора"”. Прововерява се дали вход/“ad_vh” е празно “if (ad_vh != null && !ad_vh. equalsIgnoreCase(" "))”. Ако не е, в новата колона (3-та), на текущия ред се извежда входътResultI.add(new String (ad_vh));”, в противен случай се извежда празно място “ResultI.add(new String (" "));”. След това аналогично се проверява дали район/“ad_rn” е празно “if (ad_rn != null && !ad_rn.equalsIgnoreCase(" "))”. И пак ако не е, в следващата клетка (к 4) се изежда районът “ResultI.add(new String (ad_rn));”, а иначе “ResultI.add(new String (" "));”. В следващата клетка (колона 5) се въвежда секцията “ResultI.add(new String (chnmcur.getString("ad_sek")));”. Тук показвам HTML таговете за следваща колона (6) на текущия ред, защото има дясно подравняване “ResultI.add(new String ("

"));”. В клетката се извежда броят на хората с постоянен адрес на тази улица “ResultI.add(new String (chnmcur.getString("ad_brpa")));”. Отново с дясно подравняване на текста в колона (7), в текущата клетка се извежда броят на хората с настоящ адрес на тази улица “ResultI.add(new String (chnmcur.getString("ad_brna")));”. В следващата клетка (кол. 8), текстът е центриран “ResultI.add(new String (""));”. В нея според флага “ad_f” се извежда типът на адреса чрез “if” проверки:


if (ad_f.equalsIgnoreCase("0")) { ResultI.add(new String ("Жилище")); } else

{

if (ad_f.equalsIgnoreCase("1")) { ResultI.add(new String ("Административна")); }



if (ad_f.equalsIgnoreCase("2")) { ResultI.add(new String ("Жил. и админ.")); }

if (ad_f.equalsIgnoreCase("3")) { ResultI.add(new String ("В строеж")); }

if (ad_f.equalsIgnoreCase("4")) { ResultI.add(new String ("Разрушена")); }

if (ad_f.equalsIgnoreCase("5")) { ResultI.add(new String ("Празно дв. място")); }

if (ad_f.equalsIgnoreCase("6")) { ResultI.add(new String ("Дом 'Майка и дете'")); }

if (ad_f.equalsIgnoreCase("7")) { ResultI.add(new String ("Дом 'Стари хора'")); }

}

В последната клетка (кол. 9) с центриран текст се показва датата във формат “dd.MM.yyyy”, на която последно е променян този запис. Това става като се сравняват три полета от тип “Date” от таблица “t_kad”, в които са отразени различни по вид промени за този запис. Избира се най-скорошната дата, защото тя сочи като цяло датата на последните промени на записа. Това става с кода:



ad_data = chnmcur.getDate("ad_data");

ad_data2 = chnmcur.getDate("ad_data2");

ad_data3 = chnmcur.getDate("ad_data3");

tmp = dateFormatter.format(chnmcur.getDate("ad_data"));

tmp2 = dateFormatter.format(chnmcur.getDate("ad_data2"));

mp3 = dateFormatter.format(chnmcur.getDate("ad_data3"));

if (ad_data.compareTo(ad_data2) < 0) { tmp = tmp2; }

if (ad_data2.compareTo(ad_data3) < 0) { tmp = tmp3; }

if (tmp.equalsIgnoreCase("01.01.1800")) { ResultI.add(new String ("-")); } else

{ ResultI.add(new String (tmp)); }



ResultI.add(new String ("
"));” и след това се въвежда броят на намерените адресиResultI.add(new String ("Намерени " + count + " адреса !"));”.
Следва много важна стъпка, а именно поставянето в сесията на резултатния обект “ResultI” – “request.setAttribute("ResultI",ResultI);”. С това основната логика на модула завършва. Методът връща резултата – “return true;” и скобата на проверката за влязъл потребител се затваря “} // tuk svyr6va IF ....”.

След като методът е върнал резултат “true” и условието на проверката “if (kernel_core(conn, request, response,msg))” е вярно, в тялото на “if” условието се взима рекуест-диспечера на резултатната страница “RequestDispatcher dispacher = request.getRequestDispatcher("/isnk/isnad2/list.jsp");” и след това управлението на браузъра се предава на нея “dispacher.forward(request, response);”.


IV.5.3. Резултатна (динамична) JSP страница “Web Content\isnk\ isnad2\list.jsp” (Код. VII.3.5.). Кодът на тази страница е кратък. Започва със задаване на “taglibraries“<%@ taglib uri="http://xmlns.oracle.com/uix/ui" prefix= "uix"%>”. Следва задаването на енкодинг на текста на страницата “<%@ page contentType= "text/html;charset=windows-1251"%>” и импортирането на класовете “<%@ page import="app.util.Message" %>”, “<%@ page import="java.util.*" %>” и “<%@ page import="app.util.classes.lib" %>”. Сега отваряме таговете “” и “”. Задаваме мета-таг ” - описание на енкодинга на текста. Определяме заглавието на страницата (това заглавие, което се показва в лентата на браузъра (TitleBar)) Класификатор на адресите (КАД)” и главата на страницата се затваря “”. След това задаваме тялото на страницата (показваната в работното поле на браузъра част) “ "#EEF3F5">”. Интерес представлява следващият ред, който създава обект “udata”, в който се зарежда от сесията обекта, в който се съдържа информация дали потребителят е минал през страницата за вход “”. Казано по-просто и кратко - използваме “JavaBean”-биин от тип “Message” който е в сесията. С таговете “<%” и “%>” ограждаме JAVA код, изпълняван в JSP страницата. Този код, който следва тук, е проверка дали клиентът е влязъл в системата “if (udata.getAppData() !=null)”.
а). Ако е влязъл в системата, се минава през следните редове код:

Отваряме таг за таблица с ширина “100%” от работната област и отваряме първия ред и първата клетка на таблицата, като тя е с ляво подравнен текст “
”. В горния ляв ъгъл с тагове за Хедър 3 се изписва “

### НБД "Население"

”. В средата на заглавието (2-та клетка от таблицата), оградено с таг за удебелен шрифт се изписва: “
Класификатор на адресите (КАД)”. Пак с Java код се изважда датата и часът, на които е направена заявката “<%String dateX;%>” и “<%dateX = (String)request. getAttribute("CurDate");%>”. В горния десен ъгъл (3-та клетка) се извежда потребителят и датата на заявката <%=udata.getAppData()%> <%=dateX%>”. Извеждането на стойност на променлива става пак с Java код, със синтаксис “<%=Променлива%>”. Затваряме таблицата “
”. Идва ред на създаването на формата, в която се показват резултатите “”.



Ограден от отварящ и затварящ таг за центриране “
”, следва Java кодът, който с цикъл извежда на страницата обработените и предадени от сървлета “isnk.Isnad.java” резултатни данни. Отваря се таг за код “<%”. С първия ред се създава обект “ResultI” от тип “ArrayList” - “ArrayList ResultI = new ArrayList();”. Дефинира се и инициализира броячът на цикъла “int j=0;”. След това в обект “ResultI” от рекуеста се зарежда обектът със същото име и тип, в който сървлетът е заредил изходните данни “ResultI = (ArrayList)request.getAttribute("ResultI");”. Следва условието на цикъла, който извежда данните, повтаря се докато има записи в обекта “ResultI” - “for(j = 0 ; j < ResultI.size(); j++)” и се отваря тялото на цъкъла “{”. Затваря се тагът за код “%>”. В тагове за извеждане на стойност на променлива се извежда текущият (j-ти) елемент (ред) от обекта “<%=(String)ResultI.get(j)%>”. След това в тагове за Java код се затваря цикълът “for” - “<%}%>”. След излизането от цикъла се затварят таговете “
”, “”, “
1   2   3




©obuch.info 2024
отнасят до администрацията

    Начална страница