Advertisement
Guest User

Untitled

a guest
Jan 8th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 45.71 KB | None | 0 0
  1. Cursul 6. Dezvoltarea unei aplicaţii web cu ajutorul platformei Hibernate
  2.  
  3. Framework-ul Hibernate reprezintă un serviciu de mapare obiect-relaţional pentru limbajul de programare Java. Prin intermediu acestei platforme se asigură persistenţa datelor pentru aplicatiile web - pentru înţelegerea noţiunilor fundamentale de Hibernate vă recomand sursele de documentaţie disponibile pe pagina oficială - http://hibernate.org/orm/what-is-an-orm/. Pe scurt, Hibernate ORM permite utilizatorilor să dezvolte aplicaţii ale căror date vor fi disponibile şi după ce aplicaţia este oprită. Hibernate ORM se ocupă cu persistenţa datelor stocate în sisteme de gestiune a bazelor de date relaţionale. ORM(Object-Relational Mapping) reprezintă o tehnică de programare de conversie a datelor stocate în sisteme de gestiune a bazelor de date relaţionale şi limbaje de programare obiect-orientate precum Java.
  4. În acest curs vom dezvolta o aplicatie web cu ajutorul tehnologiei Java Server Pages (JSP) şi a framework-ului Hibernate care va permite efectuarea operaţiilor de bază CRUD(Create, Read, Update, Delete) pe toate tabelele bazei de date. Aplicaţia va fi construită în NetBeans iar baza de date va fi dezvoltată în SGBD-ul MySql.
  5. Diagrama logică a bazei de date “spital” este următoarea(aceeaşi bază de date construită la cursul 5):
  6.  
  7. Tabele sunt următoarele:
  8. * medici(idmedic, Nume, Prenume);
  9. * pacienti(idpacient, Nume, Prenume, Adresa);
  10. * consultatie(idconsultatie, idpacient, idmedic, DataConsultatie, Diagnostic, Medicament).
  11. Între tabelele medici şi pacienţi se realizează asocierea M:N prin intermediul tabelei de legatură consultatie. Astfel, în această tabelă vom avea 2 chei străine(FK): idpacient şi idmedic.
  12. Pentru a evita problemele de funcţionalitate ale aplicaţiei trebuie respectate următoarele reguli simple:
  13. * toate id-urile în baza de date vor avea acelaşi tip de date(INT);
  14. * câmpurile idpacient(din tabela pacienti), idconsultatie(din tabela consultatie) şi idmedic(din tabela medici) vor fi chei primare(PK, NN) şi vor fi setate astfel încât valorile să se autogenereze(AI - AUTO_INCREMENT).
  15. * în tabela consultaţie veţi avea 2 chei străine la care se va seta opţiunea de CASCADE la ştergere(se poate pune şi la modificare).
  16. Atenţie: respectaţi denumirea bazei de date, a tabelelor şi a câmpurilor din diagrama bazei de date pentru o funcţionare corectă a aplicaţiei.
  17.  
  18. Dezvoltarea aplicaţiei web în NetBeans
  19.  
  20. 1. Din meniul File se alege opţiunea New Project.
  21. 2. În fereastra apărută se alege opţiunea Web Application din cadrul categoriei de aplicaţii Java Web.
  22.  
  23. 3. Se tastează numele noului proiect:
  24.  
  25. 4. Se alege serverul pe care va rula aplicaţia web. În cazul nostru se va alege serverul GlasFish Server 4.1.1. Se poate alege şi serverul Apache.
  26.  
  27. 5. Din lista prezentată mai jos se alege framework-ul de dezvoltare a aplicaţiei Hibernate. Mai jos se va seta şi conexiunea cu baza de date spital. În cazul în care nu aveţi conexiunea disponibilă va trebui să o realizaţi voi - va trebui să intraţi în meniul Services(de lângă Projects şi Files). Aici veţi crea conexiunea cu baza de date(intraţi pe SGBD-ul “MySql Server at localhost” după care daţi click dreapta şi connect pe baza de date spital) după care veţi reintra să creaţi aplicaţia web(punctul 1).
  28.  
  29.  
  30.  
  31. 6. În cadrul acestui pas trebuie configurat proiectul astfel încât să se permită conectarea la o bază de date implementată în SGBD-ul MySql. Se va da click dreapta pe proiect şi se va accesa opţiunea Properties.
  32.  
  33. 7. Se aleg librăriile următoare: MySQL JDBC Driver(driverul de conectare la baza de date) şi JSTL 1.2.1( pentru mai multe detalii puteţi consulta următorul link http://docs.oracle.com/javaee/5/tutorial/doc/bnakc.html). Se apasă Add Library şi OK la final.
  34.  
  35. 8. Se va deschide automat fişierul de configurare hibernate.cfg.xml. Înlocuiţi codul generat în acest fişier cu codul de mai jos(aveţi grijă să setaţi parola corect în codul de mai jos). Pentru mai multe detalii legate de opţiunile şi valorile hibernate.hbm2ddl.auto puteţi accesa următorul link: http://www.onlinetutorialspoint.com/hibernate/hbm2ddl-auto-example-hibernate-xml-config.html.
  36. <?xml version="1.0" encoding="UTF-8"?>
  37. <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  38. <hibernate-configuration>
  39. <session-factory>
  40. <property name="hibernate.hbm2ddl.auto">update</property>
  41. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  42. <property name="hibernate.show_sql">true</property>
  43. <property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property>
  44. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/spital</property>
  45. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  46. <property name="hibernate.connection.username">root</property>
  47. <property name="hibernate.connection.password">parola</property>
  48. </session-factory>
  49. </hibernate-configuration>
  50.  
  51. 9. Structura finală proiectului va fi următoarea(am afişat structura finală doar pentru a vedea exact ce pachete şi fişiere veţi crea):
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58. 10. La început creaţi în cadrul proiectului pachetele următoare: pojo, DAO, DAOImpl şi Controller. Pentru aceasta daţi click dreapta pe proiectul nou creat, intraţi la New iar aici alegeţi opţiunea Java Package:
  59.  
  60. Veţi proceda similar pentru toate pachetele cerute mai sus.
  61.  
  62. 11. Daţi click dreapta pe Source Packages şi accesaţi opţiunea New->Other. Alegeţi serviciul Hibernate după care alegeţi opţiunea “Hibernate Reverse Engineering Wizard”:
  63.  
  64.  
  65.  
  66.  
  67. 12. În cadrul următoarei ferestre se lasă numele default al fişierului “hibernate.reveng” şi se apasă pe butonul Next
  68.  
  69. 14. În fereastra următoare se aleg cele 3 tabele din baza de date spital după care se apasă butonul Add(sau apasaţi Add All pentru rapiditate):
  70.  
  71. După ce tabelele sunt trecute in fereastra din dreapta se apasă Finish. În final fişierul creat trebuie să conţină următorul cod:
  72.  
  73. <?xml version="1.0" encoding="UTF-8"?>
  74. <!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
  75. <hibernate-reverse-engineering>
  76. <schema-selection match-catalog="spital"/>
  77. <table-filter match-name="consultatie"/>
  78. <table-filter match-name="pacienti"/>
  79. <table-filter match-name="medici"/>
  80. </hibernate-reverse-engineering>
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92. 15. Daţi click dreapta pe pachetul nou creat denumit “pojo” şi accesaţi opţiunea New->Other. Alegeţi serviciul Hibernate după care alegeţi opţiunea “Hibernate Mapping Files and POJOs from Database” (POJO - Plain Old Java Object).
  93.  
  94. 16. Se bifează opţiunea JDK 5 Language Features după care se apasă butonul Finish.
  95.  
  96.  
  97. Se poate observa că au fost generate fişierele de mapare şi clasele java corespunzătoare tabelelor din baza de date spital.
  98.  
  99. 17. În pachetul DAO se fac următoarele trei interfeţe java: PacientiDao, MediciDao şi ConsultatieDao. Codul pentru cele trei fişiere este următorul:
  100. package DAO;
  101. // Fisierul PacientiDao
  102. import java.util.List;
  103. import pojo.Pacienti;
  104.  
  105. public interface PacientiDao {
  106. public void adaugaPacient (Pacienti pacient);
  107. public List<Pacienti> afiseazaPacienti();
  108. public void modificaPacient (int idpacient, String nume, String prenume, String adresa);
  109. public void stergePacient (Pacienti pacient);
  110. }
  111.  
  112. // Fisierul MediciDao
  113. package DAO;
  114.  
  115. import java.util.List;
  116. import pojo.Medici;
  117.  
  118. public interface MediciDao {
  119. public void adaugaMedic (Medici medic);
  120. public List<Medici> afiseazaMedici();
  121. public void modificaMedic (int idmedic, String nume, String prenume, String sectie);
  122. public void stergeMedic (Medici medic);
  123. }
  124.  
  125. // Fisierul ConsultatieDao
  126. package DAO;
  127.  
  128. import java.util.List;
  129. import pojo.Consultatie;
  130. import java.util.Date;
  131. import pojo.Medici;
  132. import pojo.Pacienti;
  133.  
  134. public interface ConsultatieDao {
  135. public void adaugaConsultatie (Consultatie consultatie);
  136. public List<Consultatie> afiseazaConsultatie();
  137. public void modificaConsultatie (Integer idconsultatie, Pacienti pacient, Medici medic, Date dataConsultatie, String diagnostic, String medicament);
  138. public void stergeConsultatie (Consultatie consultatie);
  139. }
  140.  
  141. 18. Se crează fişierul HibernateUtil.java în pachetul DAOImpl- scopul acestuia este acela de a accesa SessionFactory astfel încât să se obţină un obiect de tip sesiune(Session). Această clasă va apela funcţia de configurare configure() şi va încărca fişierul hibernate.cfg.xml, va construi SessionFactory după care obţine obiectul de tip Session.
  142.  
  143.  
  144. 19. Numiţi fişierul HibernateUtil după care apăsaţi Finish.
  145.  
  146.  
  147. 20. În pachetul DAOImpl creaţi clasele java următoare: PacientiDaoImpl, MediciDaoImpl şi ConsultatieDaoImpl. Codul pentru cele trei fişiere este următorul:
  148. // Fisierul PacientiDaoImpl
  149. package DAOImpl;
  150.  
  151. import java.util.ArrayList;
  152. import java.util.List;
  153. import javax.persistence.Query;
  154. import org.hibernate.Session;
  155. import org.hibernate.Transaction;
  156. import pojo.Pacienti;
  157. import DAO.PacientiDao;
  158.  
  159. public class PacientiDaoImpl {
  160.  
  161. public void adaugaPacienti(Pacienti pacient) {
  162. Session session = HibernateUtil.getSessionFactory().openSession();
  163. Transaction transaction = session.beginTransaction();
  164. session.save(pacient);
  165. transaction.commit();
  166. session.close();
  167. }
  168.  
  169. public List<Pacienti> afiseazaPacienti() {
  170. List<Pacienti> listaPacienti = new ArrayList();
  171. Session session = HibernateUtil.getSessionFactory().openSession();
  172. org.hibernate.Query query = session.createQuery("From Pacienti");
  173. listaPacienti = query.list();
  174. return listaPacienti;
  175. }
  176.  
  177. public void modificaPacienti(int idpacient, String nume, String prenume, String adresa) {
  178. Session session = HibernateUtil.getSessionFactory().openSession();
  179. Transaction transaction = session.beginTransaction();
  180. Pacienti detaliipacienti = (Pacienti) session.load(Pacienti.class, idpacient);
  181. detaliipacienti.setNume(nume);
  182. detaliipacienti.setPrenume(prenume);
  183. detaliipacienti.setAdresa(adresa);
  184. session.update(detaliipacienti);
  185. transaction.commit();
  186. session.close();
  187. }
  188.  
  189. public void stergePacient(Pacienti pacient) {
  190. Session session = HibernateUtil.getSessionFactory().openSession();
  191. Transaction transaction = session.beginTransaction();
  192. session.delete(pacient);
  193. transaction.commit();
  194. session.close();
  195. }
  196. }
  197.  
  198.  
  199. // Fisierul MediciDaoImpl
  200. package DAOImpl;
  201.  
  202. import java.util.ArrayList;
  203. import java.util.List;
  204. import javax.persistence.Query;
  205. import org.hibernate.Session;
  206. import org.hibernate.Transaction;
  207. import pojo.Medici;
  208. import DAO.MediciDao;
  209.  
  210. public class MediciDaoImpl {
  211.  
  212. public void adaugaMedici(Medici medic) {
  213. Session session = HibernateUtil.getSessionFactory().openSession();
  214. Transaction transaction = session.beginTransaction();
  215. session.save(medic);
  216. transaction.commit();
  217. session.close();
  218. }
  219.  
  220. public List<Medici> afiseazaMedici() {
  221. List<Medici> listaMedici = new ArrayList();
  222. Session session = HibernateUtil.getSessionFactory().openSession();
  223. org.hibernate.Query query = session.createQuery("From Medici");
  224. listaMedici = query.list();
  225. return listaMedici;
  226. }
  227.  
  228. public void modificaMedici(int idmedic, String nume, String prenume, String sectie) {
  229. Session session = HibernateUtil.getSessionFactory().openSession();
  230. Transaction transaction = session.beginTransaction();
  231. Medici detaliimedici = (Medici) session.load(Medici.class, idmedic);
  232. detaliimedici.setNume(nume);
  233. detaliimedici.setPrenume(prenume);
  234. detaliimedici.setSectie(sectie);
  235. session.update(detaliimedici);
  236. transaction.commit();
  237. session.close();
  238. }
  239.  
  240. public void stergeMedic(Medici medic) {
  241. Session session = HibernateUtil.getSessionFactory().openSession();
  242. Transaction transaction = session.beginTransaction();
  243. session.delete(medic);
  244. transaction.commit();
  245. session.close();
  246. }
  247. }
  248.  
  249.  
  250. // Fisierul ConsultatieDaoImpl
  251. package DAOImpl;
  252.  
  253. import java.util.ArrayList;
  254. import java.util.List;
  255. import javax.persistence.Query;
  256. import org.hibernate.Session;
  257. import org.hibernate.Transaction;
  258. import pojo.Consultatie;
  259. import DAO.ConsultatieDao;
  260. import java.util.Date;
  261. import pojo.Medici;
  262. import pojo.Pacienti;
  263.  
  264. public class ConsultatieDaoImpl {
  265.  
  266. public void adaugaConsultatie(Consultatie consultatie) {
  267. Session session = HibernateUtil.getSessionFactory().openSession();
  268. Transaction transaction = session.beginTransaction();
  269. session.save(consultatie);
  270. transaction.commit();
  271. session.close();
  272. }
  273.  
  274. public List<Consultatie> afiseazaConsultatie() {
  275. List<Consultatie> listaConsultatie = new ArrayList();
  276. Session session = HibernateUtil.getSessionFactory().openSession();
  277. org.hibernate.Query query = session.createQuery("From Consultatie");
  278. listaConsultatie = query.list();
  279. return listaConsultatie;
  280. }
  281. public void modificaConsultatie(Integer idconsultatie, Pacienti pacient, Medici medic, Date dataConsultatie, String diagnostic, String medicament) {
  282. Session session = HibernateUtil.getSessionFactory().openSession();
  283. Transaction transaction = session.beginTransaction();
  284. Consultatie detaliiconsultatiei;
  285. detaliiconsultatiei = (Consultatie) session.load(Consultatie.class, idconsultatie);
  286. detaliiconsultatiei.setPacienti(pacient);
  287. detaliiconsultatiei.setMedici(medic);
  288. detaliiconsultatiei.setDataConsultatie(dataConsultatie);
  289. detaliiconsultatiei.setDiagnostic(diagnostic);
  290. detaliiconsultatiei.setMedicament(medicament);
  291. session.update(detaliiconsultatiei);
  292. transaction.commit();
  293. session.close();
  294. }
  295.  
  296. public void stergeConsultatie(Consultatie consultatie) {
  297. Session session = HibernateUtil.getSessionFactory().openSession();
  298. Transaction transaction = session.beginTransaction();
  299. session.delete(consultatie);
  300. transaction.commit();
  301. session.close();
  302. }
  303. }
  304. 21. În continuare se vor implementa controllere-le aplicaţiei web - acestea vor fi clase de tip servlets.
  305.  
  306. Observaţie - toate aceste fişiere se vor contrui în mod asemănător astfel încât prezint crearea şi configurarea unui singur servlet(codul va fi însă complet pentru toate cele trei fişiere). Controllere-le vor avea următoarele denumiri: PacientiController, MediciController şi ConsultatieController.
  307.  
  308. 22. În fereastra următoare se bifează opţiunea “Add information to deployment descriptor (web.xml)” după care se apasă Finish.
  309.  
  310.  
  311. 23. Codul pentru cele trei servlet-uri este următorul:
  312. // Fisierul PacientiController
  313. package Controller;
  314.  
  315. import java.io.IOException;
  316. import java.util.ArrayList;
  317. import java.util.List;
  318. import javax.servlet.RequestDispatcher;
  319. import javax.servlet.ServletException;
  320. import javax.servlet.http.HttpServlet;
  321. import javax.servlet.http.HttpServletRequest;
  322. import javax.servlet.http.HttpServletResponse;
  323. import pojo.Pacienti;
  324. import DAOImpl.PacientiDaoImpl;
  325.  
  326. /**
  327. *
  328. * @author vali
  329. */
  330. public class PacientiController extends HttpServlet {
  331.  
  332. Pacienti pacient = new Pacienti();
  333. PacientiDaoImpl pacientDaoImpl = new PacientiDaoImpl();
  334.  
  335. @Override
  336. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  337. throws ServletException, IOException {
  338. if (request.getParameter("adaugaPacient") != null) {
  339. String nume = request.getParameter("nume");
  340. String prenume = request.getParameter("prenume");
  341. String adresa = request.getParameter("adresa");
  342. pacient.setNume(nume);
  343. pacient.setPrenume(prenume);
  344. pacient.setAdresa(adresa);
  345. pacientDaoImpl.adaugaPacienti(pacient);
  346. RequestDispatcher rd = request.getRequestDispatcher("adauga_Pacient.jsp");
  347. rd.forward(request, response);
  348. }
  349. }
  350.  
  351. @Override
  352. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  353. throws ServletException, IOException {
  354. if (request.getParameter("afiseazaPacienti") != null) {
  355. List<Pacienti> listaPacienti = new ArrayList();
  356. listaPacienti = pacientDaoImpl.afiseazaPacienti();
  357. request.setAttribute("listaPacienti", listaPacienti);
  358. RequestDispatcher rd = request.getRequestDispatcher("tabela_Pacienti.jsp");
  359. rd.forward(request, response);
  360. }
  361.  
  362. if (request.getParameter("modificaPacient") != null) {
  363. int id1 = Integer.parseInt(request.getParameter("idpacient"));
  364. String nume = request.getParameter("nume");
  365. String prenume = request.getParameter("prenume");
  366. String adresa = request.getParameter("adresa");
  367. pacientDaoImpl.modificaPacienti(id1, nume, prenume, adresa);
  368. RequestDispatcher rd = request.getRequestDispatcher("adauga_Pacient.jsp");
  369. rd.forward(request, response);
  370.  
  371. }
  372.  
  373. if (request.getParameter("stergePacient") != null) {
  374. int id2 = Integer.parseInt(request.getParameter("idpacient"));
  375. pacient.setIdpacient(id2);
  376. pacientDaoImpl.stergePacient(pacient);
  377. RequestDispatcher rd = request.getRequestDispatcher("adauga_Pacient.jsp");
  378. rd.forward(request, response);
  379. }
  380. }
  381.  
  382. /**
  383. * Returns a short description of the servlet.
  384. *
  385. * @return a String containing servlet description
  386. */
  387. @Override
  388. public String getServletInfo() {
  389. return "Short description";
  390. }// </editor-fold>
  391.  
  392. }
  393.  
  394. // Fisierul MediciController
  395. package Controller;
  396.  
  397. import DAO.MediciDao;
  398. import java.io.IOException;
  399. import java.util.ArrayList;
  400. import java.util.List;
  401. import javax.servlet.RequestDispatcher;
  402. import javax.servlet.ServletException;
  403. import javax.servlet.http.HttpServlet;
  404. import javax.servlet.http.HttpServletRequest;
  405. import javax.servlet.http.HttpServletResponse;
  406. import pojo.Medici;
  407. import DAOImpl.MediciDaoImpl;
  408.  
  409. /**
  410. *
  411. * @author vali
  412. */
  413. public class MediciController extends HttpServlet {
  414.  
  415. Medici medic = new Medici();
  416. MediciDaoImpl medicDaoImpl = new MediciDaoImpl();
  417.  
  418. @Override
  419. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  420. throws ServletException, IOException {
  421. if (request.getParameter("adaugaMedic") != null) {
  422. String nume = request.getParameter("nume");
  423. String prenume = request.getParameter("prenume");
  424. String sectie = request.getParameter("sectie");
  425. medic.setNume(nume);
  426. medic.setPrenume(prenume);
  427. medic.setSectie(sectie);
  428. medicDaoImpl.adaugaMedici(medic);
  429. RequestDispatcher rd = request.getRequestDispatcher("adauga_Medic.jsp");
  430. rd.forward(request, response);
  431. }
  432. }
  433.  
  434. @Override
  435. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  436. throws ServletException, IOException {
  437. if (request.getParameter("afiseazaMedici") != null) {
  438. List<Medici> listaMedici = new ArrayList();
  439. listaMedici = medicDaoImpl.afiseazaMedici();
  440. request.setAttribute("listaMedici", listaMedici);
  441. RequestDispatcher rd = request.getRequestDispatcher("tabela_Medici.jsp");
  442. rd.forward(request, response);
  443. }
  444.  
  445. if (request.getParameter("modificaMedic") != null) {
  446. int id1 = Integer.parseInt(request.getParameter("idmedic"));
  447. String nume = request.getParameter("nume");
  448. String prenume = request.getParameter("prenume");
  449. String sectie = request.getParameter("sectie");
  450. medicDaoImpl.modificaMedici(id1, nume, prenume, sectie);
  451. RequestDispatcher rd = request.getRequestDispatcher("adauga_Medic.jsp");
  452. rd.forward(request, response);
  453.  
  454. }
  455.  
  456. if (request.getParameter("stergeMedic") != null) {
  457. int id2 = Integer.parseInt(request.getParameter("idmedic"));
  458. medic.setIdmedic(id2);
  459. medicDaoImpl.stergeMedic(medic);
  460. RequestDispatcher rd = request.getRequestDispatcher("adauga_Medic.jsp");
  461. rd.forward(request, response);
  462. }
  463. }
  464.  
  465. /**
  466. * Returns a short description of the servlet.
  467. *
  468. * @return a String containing servlet description
  469. */
  470. @Override
  471. public String getServletInfo() {
  472. return "Short description";
  473. }// </editor-fold>
  474.  
  475. }
  476.  
  477. // Fisierul ConsultatieController
  478. package Controller;
  479.  
  480. import java.io.IOException;
  481. import java.util.ArrayList;
  482. import java.util.List;
  483. import javax.servlet.RequestDispatcher;
  484. import javax.servlet.ServletException;
  485. import javax.servlet.http.HttpServlet;
  486. import javax.servlet.http.HttpServletRequest;
  487. import javax.servlet.http.HttpServletResponse;
  488. import pojo.Pacienti;
  489. import pojo.Medici;
  490. import pojo.Consultatie;
  491. import DAOImpl.ConsultatieDaoImpl;
  492. import DAOImpl.HibernateUtil;
  493. import java.text.DateFormat;
  494. import java.text.ParseException;
  495. import java.text.SimpleDateFormat;
  496. import java.util.Date;
  497. import org.hibernate.Session;
  498.  
  499. /**
  500. *
  501. * @author vali
  502. */
  503. public class ConsultatieController extends HttpServlet {
  504.  
  505. Consultatie consultatie = new Consultatie();
  506. ConsultatieDaoImpl consultatieDaoImpl = new ConsultatieDaoImpl();
  507.  
  508. @Override
  509. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  510. throws ServletException, IOException {
  511. if (request.getParameter("adaugaConsultatie") != null) {
  512. // preluarea parametrilor de interes
  513. Integer idpacient = java.lang.Integer.parseInt(request.getParameter("idpacient"));
  514. Integer idmedic = java.lang.Integer.parseInt(request.getParameter("idmedic"));
  515. Session session = HibernateUtil.getSessionFactory().openSession();
  516. Pacienti pacient = (Pacienti) session.get(Pacienti.class, idpacient);
  517. Medici medic = (Medici) session.get(Medici.class, idmedic);
  518.  
  519. DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  520. Date dataConsultatie = null;
  521. try {
  522. dataConsultatie = df.parse(request.getParameter("dataConsultatie"));
  523. } catch (ParseException e) {
  524. e.printStackTrace();
  525. }
  526. String diagnostic = request.getParameter("diagnostic");
  527. String medicament = request.getParameter("medicament");
  528.  
  529. consultatie.setPacienti(pacient);
  530. consultatie.setMedici(medic);
  531. consultatie.setDataConsultatie(dataConsultatie);
  532. consultatie.setDiagnostic(diagnostic);
  533. consultatie.setMedicament(medicament);
  534.  
  535. consultatieDaoImpl.adaugaConsultatie(consultatie);
  536. RequestDispatcher rd = request.getRequestDispatcher("adauga_Consultatie.jsp");
  537. rd.forward(request, response);
  538. }
  539. }
  540.  
  541. @Override
  542. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  543. throws ServletException, IOException {
  544. if (request.getParameter("afiseazaConsultatie") != null) {
  545. List<Consultatie> listaConsultatie = new ArrayList();
  546. listaConsultatie = consultatieDaoImpl.afiseazaConsultatie();
  547. request.setAttribute("listaConsultatie", listaConsultatie);
  548. RequestDispatcher rd = request.getRequestDispatcher("tabela_Consultatie.jsp");
  549. rd.forward(request, response);
  550. }
  551.  
  552. if (request.getParameter("modificaConsultatie") != null) {
  553. Integer id1 = Integer.parseInt(request.getParameter("idconsultatie"));
  554. // preluarea parametrilor de interes
  555. Integer idpacient = java.lang.Integer.parseInt(request.getParameter("idpacient"));
  556. Integer idmedic = java.lang.Integer.parseInt(request.getParameter("idmedic"));
  557. Session session = HibernateUtil.getSessionFactory().openSession();
  558. Pacienti pacient = (Pacienti) session.get(Pacienti.class, idpacient);
  559. Medici medic = (Medici) session.get(Medici.class, idmedic);
  560.  
  561. DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  562. Date dataConsultatie = null;
  563. try {
  564. dataConsultatie = df.parse(request.getParameter("dataConsultatie"));
  565. } catch (ParseException e) {
  566. e.printStackTrace();
  567. }
  568. String diagnostic = request.getParameter("diagnostic");
  569. String medicament = request.getParameter("medicament");
  570.  
  571. consultatieDaoImpl.modificaConsultatie(id1, pacient, medic, dataConsultatie, diagnostic, medicament);
  572. RequestDispatcher rd = request.getRequestDispatcher("adauga_Consultatie.jsp");
  573. rd.forward(request, response);
  574.  
  575. }
  576.  
  577. if (request.getParameter("stergeConsultatie") != null) {
  578. Integer id2 = Integer.parseInt(request.getParameter("idconsultatie"));
  579. consultatie.setIdconsultatie(id2);
  580. consultatieDaoImpl.stergeConsultatie(consultatie);
  581. RequestDispatcher rd = request.getRequestDispatcher("adauga_Consultatie.jsp");
  582. rd.forward(request, response);
  583. }
  584. }
  585.  
  586. /**
  587. * Returns a short description of the servlet.
  588. *
  589. * @return a String containing servlet description
  590. */
  591. @Override
  592. public String getServletInfo() {
  593. return "Short description";
  594. }// </editor-fold>
  595.  
  596. }
  597.  
  598. 24. În continuare se vor implementa paginile JSP ale aplicaţiei web. Primele pagini vor fi cele de adăugare a datelor în cele trei tabele: adauga_Pacient.jsp, adauga_Medic.jsp şi adauga_Consultatie.jsp
  599. // Fisierul adauga_Pacient.jsp
  600. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  601. <!DOCTYPE html>
  602. <html>
  603. <head>
  604. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  605. <title>Pacienti</title>
  606. </head>
  607. <body>
  608.  
  609. <div id="add">
  610. <h1> Adauga pacient </h1>
  611. <form action="PacientiController" method="GET">
  612. <table>
  613. <tr>
  614. <td> Nume Pacient: </td>
  615. <td><input type="text" name="nume"></td>
  616. </tr>
  617. <tr>
  618. <td> Prenume Pacient: </td>
  619. <td><input type="text" name="prenume"></td>
  620. </tr>
  621. <tr>
  622. <td> Adresa Pacient: </td>
  623. <td><input type="text" name="adresa"></td>
  624. </tr>
  625. <tr>
  626. <td><input type="submit" name="adaugaPacient" value="Adauga"></td>
  627.  
  628. </tr>
  629. </table>
  630. </form>
  631. </div>
  632.  
  633. <form action="PacientiController" method="POST">
  634. <input type="submit" name="afiseazaPacienti" value="Afiseaza"> &nbsp; &nbsp;<br>
  635. </form>
  636. <br>
  637. <a href="index.html"><b>Home</b></a>
  638. </body>
  639. </html>
  640.  
  641. // Fisierul adauga_Medic.jsp
  642. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  643. <!DOCTYPE html>
  644. <html>
  645. <head>
  646. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  647. <title>Medici</title>
  648. </head>
  649. <body>
  650.  
  651. <div id="add">
  652. <h1> Adauga medic </h1>
  653. <form action="MediciController" method="GET">
  654. <table>
  655. <tr>
  656. <td> Nume Medic: </td>
  657. <td><input type="text" name="nume"></td>
  658. </tr>
  659. <tr>
  660. <td> Prenume Medic: </td>
  661. <td><input type="text" name="prenume"></td>
  662. </tr>
  663. <tr>
  664. <td> Sectie Medic: </td>
  665. <td><input type="text" name="sectie"></td>
  666. </tr>
  667. <tr>
  668. <td><input type="submit" name="adaugaMedic" value="Adauga"></td>
  669.  
  670. </tr>
  671. </table>
  672. </form>
  673. </div>
  674.  
  675. <form action="MediciController" method="POST">
  676. <input type="submit" name="afiseazaMedici" value="Afiseaza"> &nbsp; &nbsp;<br>
  677. </form>
  678. <br>
  679. <a href="index.html"><b>Home</b></a>
  680. </body>
  681. </html>
  682.  
  683.  
  684. // Fisierul adauga_Consultatie.jsp
  685. <%@page import="DAOImpl.MediciDaoImpl"%>
  686. <%@page import="DAOImpl.PacientiDaoImpl"%>
  687. <%@page import="pojo.Medici"%>
  688. <%@page import="java.util.ArrayList"%>
  689. <%@page import="pojo.Pacienti"%>
  690. <%@page import="java.util.List"%>
  691. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  692. <!DOCTYPE html>
  693. <html>
  694. <head>
  695. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  696. <title>Consultatie</title>
  697. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  698. </head>
  699. <body>
  700. <%
  701. PacientiDaoImpl pacientDaoImpl = new PacientiDaoImpl();
  702. MediciDaoImpl medicDaoImpl = new MediciDaoImpl();
  703. List<Pacienti> listaPacienti = new ArrayList();
  704. listaPacienti = pacientDaoImpl.afiseazaPacienti();
  705. List<Medici> listaMedici = new ArrayList();
  706. listaMedici = medicDaoImpl.afiseazaMedici();
  707. request.setAttribute("listaPacienti", listaPacienti);
  708. request.setAttribute("listaMedici", listaMedici);
  709. %>
  710. <div id="add">
  711. <h1> Adauga o noua consultatie </h1>
  712. <form action="ConsultatieController" method="GET">
  713. <table>
  714. <tr>
  715. <td> Pacient: </td>
  716. <td>
  717. <select name="idpacient">
  718. <c:forEach items="${listaPacienti}" var="pacienti">
  719. <option value="${pacienti.idpacient}">${pacienti.idpacient}, ${pacienti.nume}, ${pacienti.prenume}, ${pacienti.adresa}</option>
  720. </c:forEach>
  721. </select>
  722. </td>
  723. </tr>
  724. <tr>
  725. <td> Medic: </td>
  726. <td>
  727. <select name="idmedic">
  728. <c:forEach items="${listaMedici}" var="medici">
  729. <option value="${medici.idmedic}">${medici.idmedic}, ${medici.nume}, ${medici.prenume}, ${medici.sectie}</option>
  730. </c:forEach>
  731. </select>
  732. </td>
  733. </tr>
  734. <tr>
  735. <td> Data Consultatie: </td>
  736. <td><input type="text" name="dataConsultatie"></td>
  737. </tr>
  738. <tr>
  739. <td> Diagnostic: </td>
  740. <td><input type="text" name="diagnostic"></td>
  741. </tr>
  742. <tr>
  743. <td> Medicament: </td>
  744. <td><input type="text" name="medicament"></td>
  745. </tr>
  746. <tr>
  747. <td><input type="submit" name="adaugaConsultatie" value="Adauga"></td>
  748.  
  749. </tr>
  750. </table>
  751. </form>
  752. </div>
  753.  
  754. <form action="ConsultatieController" method="POST">
  755. <input type="submit" name="afiseazaConsultatie" value="Afiseaza"> &nbsp; &nbsp;<br>
  756. </form>
  757. <br>
  758. <a href="index.html"><b>Home</b></a>
  759. </body>
  760. </html>
  761.  
  762. // Fisierul tabela_Pacienti.jsp
  763. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  764. <!DOCTYPE html>
  765. <html>
  766. <head>
  767. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  768. <title>Pacienti</title>
  769. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  770. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  771. <script>
  772. $(document).ready(function () {
  773. $("#stergePacient").hide();
  774. $("#modificaPacient").hide();
  775.  
  776. $("#update").click(function () {
  777. $("#modificaPacient").show();
  778. $("#stergePacient").hide();
  779. });
  780. $("#delete").click(function () {
  781. $("#stergePacient").show();
  782. $("#modificaPacient").hide();
  783. });
  784. });
  785. </script>
  786.  
  787. </head>
  788. <body>
  789. <h1 align="center"> Tabela Pacienti:</h1>
  790. <table border="1" align="center">
  791. <tr>
  792. <td><b>IdPacient:</b></td>
  793. <td><b>Nume:</b></td>
  794. <td><b>Prenume:</b></td>
  795. <td><b>Adresa:</b></td>
  796. </tr>
  797. <c:forEach var="pacienti" items="${listaPacienti}">
  798. <tr>
  799. <td>${pacienti.idpacient}</td>
  800. <td>${pacienti.nume}</td>
  801. <td>${pacienti.prenume}</td>
  802. <td>${pacienti.adresa}</td>
  803.  
  804. </tr>
  805. </c:forEach>
  806. </table>
  807. <form action="PacientiController" method="POST">
  808. <p align="center">
  809. Modifica: <input type="checkbox" id="update"> Sterge: <input type="checkbox" id="delete" onclick="document.getElementById('nume').disabled = this.checked;
  810. document.getElementById('prenume').disabled = this.checked;
  811. document.getElementById('adresa').disabled = this.checked;"><br><br>
  812. <select name="idpacient">
  813. <c:forEach items="${listaPacienti}" var="pacienti">
  814. <option value="${pacienti.idpacient}">${pacienti.idpacient}</option>
  815. </c:forEach>
  816. </select>
  817. <br><br>
  818. Modifica Nume: <input id="nume" type="text" name="nume"><br><br>
  819. Modifica Prenume: <input id="prenume" type="text" name="prenume"> <br><br>
  820. Modifica Adresa: <input id="adresa" type="text" name="adresa"> <br><br>
  821. <button type="submit" id="modificaPacient" name="modificaPacient"> Modifica</button> <br> <br>
  822. <button type="submit" id="stergePacient" name="stergePacient"> Sterge </button>
  823. </p>
  824. </form>
  825. <p align="center">
  826. <a href="index.html"><b>Home</b></a>
  827. </p>
  828. </body>
  829. </html>
  830.  
  831. // Fisierul tabela_Medici.jsp
  832. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  833. <!DOCTYPE html>
  834. <html>
  835. <head>
  836. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  837. <title>Medici</title>
  838. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  839. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  840. <script>
  841. $(document).ready(function () {
  842. $("#stergeMedic").hide();
  843. $("#modificaMedic").hide();
  844.  
  845. $("#update").click(function () {
  846. $("#modificaMedic").show();
  847. $("#stergeMedic").hide();
  848. });
  849. $("#delete").click(function () {
  850. $("#stergeMedic").show();
  851. $("#modificaMedic").hide();
  852. });
  853. });
  854. </script>
  855.  
  856. </head>
  857. <body>
  858. <h1 align="center"> Tabela Medici:</h1>
  859. <table border="1" align="center">
  860. <tr>
  861. <td><b>IdMedic:</b></td>
  862. <td><b>Nume:</b></td>
  863. <td><b>Prenume:</b></td>
  864. <td><b>Sectie:</b></td>
  865. </tr>
  866. <c:forEach var="medici" items="${listaMedici}">
  867. <tr>
  868. <td>${medici.idmedic}</td>
  869. <td>${medici.nume}</td>
  870. <td>${medici.prenume}</td>
  871. <td>${medici.sectie}</td>
  872.  
  873. </tr>
  874. </c:forEach>
  875. </table>
  876. <form action="MediciController" method="POST">
  877. <p align="center">
  878. Modifica: <input type="checkbox" id="update"> Sterge: <input type="checkbox" id="delete" onclick="document.getElementById('nume').disabled = this.checked;
  879. document.getElementById('prenume').disabled = this.checked;
  880. document.getElementById('adreasa').disabled = this.checked;"><br><br>
  881. <select name="idmedic">
  882. <c:forEach items="${listaMedici}" var="medici">
  883. <option value="${medici.idmedic}">${medici.idmedic}</option>
  884. </c:forEach>
  885. </select>
  886. <br><br>
  887. Modifica Nume: <input id="nume" type="text" name="nume"><br><br>
  888. Modifica Prenume: <input id="prenume" type="text" name="prenume"> <br><br>
  889. Modifica Sectie: <input id="sectie" type="text" name="sectie"> <br><br>
  890. <button type="submit" id="modificaMedic" name="modificaMedic"> Modifica</button> <br> <br>
  891. <button type="submit" id="stergeMedic" name="stergeMedic"> Sterge </button>
  892. </p>
  893. </form>
  894. <p align="center">
  895. <a href="index.html"><b>Home</b></a>
  896. </p>
  897. </body>
  898. </html>
  899.  
  900. // Fisierul tabela_Consultatie.jsp
  901. <%@page import="DAOImpl.MediciDaoImpl"%>
  902. <%@page import="DAOImpl.PacientiDaoImpl"%>
  903. <%@page import="pojo.Medici"%>
  904. <%@page import="java.util.ArrayList"%>
  905. <%@page import="pojo.Pacienti"%>
  906. <%@page import="java.util.List"%>
  907. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  908. <!DOCTYPE html>
  909. <html>
  910. <head>
  911. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  912. <title>Consultatie</title>
  913. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  914. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  915. <script>
  916. $(document).ready(function () {
  917. $("#stergeConsultatie").hide();
  918. $("#modificaConsultatie").hide();
  919.  
  920. $("#update").click(function () {
  921. $("#modificaConsultatie").show();
  922. $("#stergeConsultatie").hide();
  923. });
  924. $("#delete").click(function () {
  925. $("#stergeConsultatie").show();
  926. $("#modificaConsultatie").hide();
  927. });
  928. });
  929. </script>
  930.  
  931. </head>
  932. <body>
  933. <%
  934. PacientiDaoImpl pacientDaoImpl = new PacientiDaoImpl();
  935. MediciDaoImpl medicDaoImpl = new MediciDaoImpl();
  936. List<Pacienti> listaPacienti = new ArrayList();
  937. listaPacienti = pacientDaoImpl.afiseazaPacienti();
  938. List<Medici> listaMedici = new ArrayList();
  939. listaMedici = medicDaoImpl.afiseazaMedici();
  940. request.setAttribute("listaPacienti", listaPacienti);
  941. request.setAttribute("listaMedici", listaMedici);
  942. %>
  943. <h1 align="center"> Tabela Consultatie:</h1>
  944. <table border="1" align="center">
  945. <tr>
  946. <td><b>IdConsultatie:</b></td>
  947. <td><b>IdPacient:</b></td>
  948. <td><b>Nume:</b></td>
  949. <td><b>Prenume:</b></td>
  950. <td><b>Adresa:</b></td>
  951. <td><b>IdMedic:</b></td>
  952. <td><b>Nume:</b></td>
  953. <td><b>Prenume:</b></td>
  954. <td><b>Sectie:</b></td>
  955. <td><b>DataConsultatie:</b></td>
  956. <td><b>Diagnostic:</b></td>
  957. <td><b>Medicament:</b></td>
  958. </tr>
  959. <c:forEach var="consultatie" items="${listaConsultatie}">
  960. <tr>
  961. <td>${consultatie.idconsultatie}</td>
  962. <td>${consultatie.pacienti.idpacient}</td>
  963. <td>${consultatie.pacienti.nume}</td>
  964. <td>${consultatie.pacienti.prenume}</td>
  965. <td>${consultatie.pacienti.adresa}</td>
  966. <td>${consultatie.medici.idmedic}</td>
  967. <td>${consultatie.medici.nume}</td>
  968. <td>${consultatie.medici.prenume}</td>
  969. <td>${consultatie.medici.sectie}</td>
  970. <td>${consultatie.dataConsultatie}</td>
  971. <td>${consultatie.diagnostic}</td>
  972. <td>${consultatie.medicament}</td>
  973. </tr>
  974. </c:forEach>
  975. </table>
  976. <form action="ConsultatieController" method="POST">
  977. <p align="center">
  978. Modifica: <input type="checkbox" id="update"> Sterge: <input type="checkbox" id="delete" onclick="document.getElementById('idpacient').disabled = this.checked;
  979. document.getElementById('idmedic').disabled = this.checked;
  980. document.getElementById('dataConsultatie').disabled = this.checked;
  981. document.getElementById('diagnostic').disabled = this.checked;
  982. document.getElementById('medicament').disabled = this.checked;"><br><br>
  983. idconsultatie:
  984. <select name="idconsultatie">
  985. <c:forEach items="${listaConsultatie}" var="consultatie">
  986. <option value="${consultatie.idconsultatie}">${consultatie.idconsultatie}</option>
  987. </c:forEach>
  988. </select>
  989. <br><br>
  990. idpacient:
  991. <select name="idpacient">
  992. <c:forEach items="${listaPacienti}" var="pacienti">
  993. <option value="${pacienti.idpacient}">${pacienti.idpacient}, ${pacienti.nume}, ${pacienti.prenume}</option>
  994. </c:forEach>
  995. </select>
  996. <br><br>
  997. idmedic:
  998. <select name="idmedic">
  999. <c:forEach items="${listaMedici}" var="medici">
  1000. <option value="${medici.idmedic}">${medici.idmedic}, ${medici.nume}, ${medici.prenume}</option>
  1001. </c:forEach>
  1002. </select>
  1003. <br><br>
  1004. Modifica data consultatiei: <input id="nume" type="text" name="dataConsultatie"><br><br>
  1005. Modifica diagnosticul: <input id="prenume" type="text" name="diagnostic"> <br><br>
  1006. Modifica medicametul: <input id="sectie" type="text" name="medicament"> <br><br>
  1007. <button type="submit" id="modificaConsultatie" name="modificaConsultatie"> Modifica</button> <br> <br>
  1008. <button type="submit" id="stergeConsultatie" name="stergeConsultatie"> Sterge </button>
  1009. </p>
  1010. </form>
  1011. <br>
  1012. <p align="center">
  1013. <a href="index.html"><b>Home</b></a>
  1014. </p>
  1015. </body>
  1016. </html>
  1017.  
  1018. // Fisierul index.html
  1019. <!DOCTYPE html>
  1020. <!--
  1021. To change this license header, choose License Headers in Project Properties.
  1022. To change this template file, choose Tools | Templates
  1023. and open the template in the editor.
  1024. -->
  1025. <html>
  1026. <head>
  1027. <title>index</title>
  1028. <meta charset="UTF-8">
  1029. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  1030. </head>
  1031. <body>
  1032. <hr>
  1033. <hr>
  1034. <ul>
  1035. <li><a href="adauga_Pacient.jsp"><b><strong>Adauga Pacienti</strong></b></a></li>
  1036. </ul>
  1037. <ul>
  1038. <li><a href="adauga_Medic.jsp"><b><strong>Adauga Medici</strong></b></a></li>
  1039. </ul>
  1040. <ul>
  1041. <li><a href="adauga_Consultatie.jsp"><b><strong>Adauga Consultatie</strong></b></a></li>
  1042. </ul>
  1043. <hr>
  1044. <hr>
  1045. <br/>
  1046. </body>
  1047. </html>
  1048.  
  1049. 25. Pentru a rula proiectul intraţi în pagina index.html şi daţi SHIFT+F6.
  1050.  
  1051. Cerinţe pentru îmbunătăţirea proiectului:
  1052. 1. Modificaţi funcţionalitatea aplicaţiei astfel încât să se permită efectuarea modificărilor/ştergerilor în urma apăsării a două butoane dedicate acestui scop chiar în cadrul tabelei în care se face vizualizarea datelor(funcţionalitate clasică) - pentru aceasta va trebui să modificaţi structura tabelelor de vizualizare astfel încât la finalul fiecărei linii veţi avea câte două butoane(Modificare şi Stergere).
  1053. 2. Îmbunătăţiţi aspectul aplicaţiei. Dezvoltaţi partea de front-end astfel încât aplicaţia să fie adaptivă - să nu fie probleme de afişare pe dispozitive diferite(telefon, tabletă, desktop).
  1054. 3. Modificaţi codul furnizat astfel încât clasele din pachetul DaoImpl sa implementeze efectiv interfeţele din pachetul DAO.
  1055. Recomandare: pentru punctul 2 folosiţi bootstrap. Astfel, pagina va avea un aspect mai plăcut:
  1056. În loc de o pagină care arată astfel:
  1057.  
  1058.  
  1059.  
  1060. Trebuie să aveţi pagini care arată mai îngrijit construite:
  1061.  
  1062.  
  1063. Vă recomand utilizarea a două tool-uri pentru bootstrap:
  1064. 1. http://www.layoutit.com/ (funcţioneaza online)
  1065.  
  1066.  
  1067. 2. http://pingendo.com/ (acesta trebuie descărcat)
  1068.  
  1069.  
  1070. Ambele soluţii vă oferă multe componente şi opţiuni de implementare pentru interfeţele aplicaţiilor web.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement