Java EE baza servlety klasy DAO

Odpowiedz Nowy wątek
2017-07-23 13:33
0

Witam mam pytanie czy taki mechanizm jest poprawny ? a mianowicie chodzi mi o klasy dao ktore przekazywane sa w taki sposob jak ponizej do servletów i żądań.

package Dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import encje.Temat;
import encje.Uzytkownik;

    public class TematyDAO {
        private EntityManager em;

        public TematyDAO(EntityManager em){
            this.em = em;
        }
        public List<Temat> pobierzTematy(){
            List<Temat> tematy = this.em.createQuery("SELECT t from Temat t").getResultList();
            return tematy;
        }
        public List pobierzIloscTematowWKategori(String id){
            List tematy = this.em.createQuery("SELECT count(t) from Temat t where t.kategoria ="+id).getResultList();
            return tematy;
        }
        public List<Temat> pobierzPoKategori(String id){
            List<Temat> tematy = this.em.createQuery("SELECT t from Temat t where t.kategoria ="+id).getResultList();
            return tematy;
        }
        public Temat pobierzTemat(int id){
            this.em.clear();
            return this.em.find(Temat.class, id);
        }

        public boolean dodajTemat(Temat t){
            EntityTransaction et = em.getTransaction();
            try{
                et.begin();
                em.persist(t);
                et.commit();
                return true;
            }catch(Exception e){
                e.printStackTrace();
                et.rollback();
                return false;
            }
        }

    }
----------------------------------------------------------------------
package DB;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class DBConfig implements ServletContextListener {
    private static EntityManagerFactory emf;

    @Override
    public void contextDestroyed(ServletContextEvent arg0){
        if(emf != null && emf.isOpen()){
            emf.close();
        }

    }

    @Override
    public void contextInitialized(ServletContextEvent arg0){
        emf = Persistence.createEntityManagerFactory("mojabaza");
    }

    public static EntityManager createEntityManager(){
        if(emf != null)
            return emf.createEntityManager();
        else
            return null;
    }
}
---------------------------------------------------------------------------------------
package DB;

import javax.persistence.EntityManager;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

import Dao.KategoriaDAO;
import Dao.TematyDAO;
import Dao.UzytkownicyDAO;
import Dao.WpisyDAO;

/**
 * Application Lifecycle Listener implementation class InicjatorDB
 *
 */
@WebListener
public class InicjatorDB implements ServletRequestListener {

    public void requestDestroyed(ServletRequestEvent arg0)  { 
         // TODO Auto-generated method stub
    }

    public void requestInitialized(ServletRequestEvent arg0)  { 
         EntityManager em = DBConfig.createEntityManager();
         UzytkownicyDAO uzytkownicyDAO = new UzytkownicyDAO(em);
         TematyDAO tematyDAO = new TematyDAO(em);
         WpisyDAO wpisyDAO = new WpisyDAO(em);
         KategoriaDAO kategoriaDAO = new KategoriaDAO(em);
         ServletRequest req = arg0.getServletRequest();
         req.setAttribute("wpisyDAO", wpisyDAO);
         req.setAttribute("tematyDAO", tematyDAO);
         req.setAttribute("uzytkownicyDAO", uzytkownicyDAO);
         req.setAttribute("kategoriaDAO", kategoriaDAO);
    }

}
------------------------------------------------------------------------------------------------------------------------------------
package servlety;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Dao.KategoriaDAO;
import Dao.TematyDAO;
import encje.Kategoria;
import encje.Temat;

@WebServlet("/index")
public class IndexSerwlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        TematyDAO dao = (TematyDAO) request.getAttribute("tematyDAO");
        List<Temat> tematy = dao.pobierzTematy();
        request.setAttribute("tematy", tematy);
        KategoriaDAO dao1 = (KategoriaDAO) request.getAttribute("kategoriaDAO");
        List<Kategoria> kategorie = dao1.pobierzKategorie();
        request.setAttribute("kategorie", kategorie);

        String id = "1";
        List t = dao.pobierzIloscTematowWKategori(id);
        System.out.print(id);
        System.out.print(t);

        request.getRequestDispatcher("/WEB-INF/widok/index.jsp").forward(request, response);

        }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);
    }

}

pokazuje akurat jeden z serwletów bo reszta jest na tej samej zasadzie

Pozostało 580 znaków

2017-07-23 16:48
0

Nie widzę nic złego w przekazaniu dao jako atrybut requesta. Natomiast sposób w jaki uzyskujesz EntityManagera i transakcje to nie jest Java EE. To jest Java SE. W Javie EE musiałbyś pobierać EM przez @PersistenceContext i włączać transakcję przez EJB. Albo w Java EE 7 użyć adnotacji @Transactional. To jest już identycznie jak w springu. Odpada kod zarządzający transakcjami i EMF.

Chodzi więc o to, pod jaki system piszesz aplikację. Czy pod EE 7, EE 6, czy pod Tomcata albo Jetty. Jeżeli pod te ostatnie, które nie są EE, to ok. Ale w temacie wątku napisałeś EE. Ten kod zadziała również na EE, choć nie jest zgodny z zaleceniami dla tej platformy. A tu masz wątek o DAO i EJB: Architektura aplikacji Java EE.

Korzyści z używania Springa są takie, że piszesz sobie kod nie myśląc o tym, na jakim serwerze to ma działać. Spring zajmie się dostosowaniem do środowiska serwerowego, poprzez odpowiednią konfigurację.


Przeważnie ignoruję niezarejestrowanych użytkowników.

Pozostało 580 znaków

2017-07-23 17:02
0

bo równiez chce zrobic to w springu i wyglada to tak

package pl.forum.encje;

import java.sql.Timestamp;
import java.util.Date;
import java.util.Set;

import javax.persistence.*;

@Entity
@Table(name="temat")

public class Temat {
    @Id
    @GeneratedValue
    private int id;
    private Date data;
    @ManyToOne
    @JoinColumn(name="kategoria")
    private Kategoria kategoria;

    private String tytul;
    @Lob
    private String tresc;

    @ManyToOne
    @JoinColumn(name="uzytkownik")
    private Uzytkownik uzytkownik;
    @OneToMany(mappedBy="temat", fetch=FetchType.EAGER)
    @OrderBy("data ASC")
    private Set<Wpis> wpisy;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public Date getData() {
        return data;
    }
    public void setData(Date data) {
        this.data = data;
    }
    public String getTytul() {
        return tytul;
    }
    public void setTytul(String tytul) {
        this.tytul = tytul;
    }
    public String getTresc() {
        return tresc;
    }
    public void setTresc(String tresc) {
        this.tresc = tresc;
    }
    public Uzytkownik getUzytkownik() {
        return uzytkownik;
    }
    public void setUzytkownik(Uzytkownik uzytkownik) {
        this.uzytkownik = uzytkownik;
    }
    public Set<Wpis> getWpisy() {
        return wpisy;
    }
    public void setWpisy(Set<Wpis> wpisy) {
        this.wpisy = wpisy;
    }
    public Kategoria getKategoria() {
        return kategoria;
    }
    public void setKategoria(Kategoria kategoria) {
        this.kategoria = kategoria;
    }

}
--------------------------------------------------------
package pl.forum.dao;

import java.util.List;

import pl.forum.encje.Temat;

public interface ITemat {

    public List<Temat> pobierzTematy();

}
--------------------------------------------------------------
package pl.forum.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pl.forum.encje.Kategoria;
import pl.forum.encje.Temat;

@Repository
@Transactional
public class ITematImpl implements ITemat {
    @Autowired
    SessionFactory sessionFactory;

    @Override
    public List<Temat> pobierzTematy() {
        Session session = sessionFactory.getCurrentSession();
        Query query = session.createQuery("from Temat");
        List<Temat> tematlist = query.list();
        session.flush();
        return tematlist;
    }

}
---------------------------------------------------------------------------------------------
package pl.forum.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import pl.forum.dao.IKategoria;
import pl.forum.dao.ITemat;
import pl.forum.encje.Kategoria;
import pl.forum.encje.Temat;

@Controller
public class indexController {

    @Autowired
    ITemat iTemat;
    @Autowired
    IKategoria iKategoria;

    @RequestMapping("/index")
    public String home(Model model) {
        List<Temat> tematy = iTemat.pobierzTematy();
        model.addAttribute("tematy", tematy);
        List<Kategoria> kategorie = iKategoria.pobierzKategorie();
        model.addAttribute("kategorie", kategorie);
        return "index";
    }
    @RequestMapping("/wyloguj")
    public String wyloguj(Model model) {
        return "login";
    }
    @RequestMapping("/rejestruj")
    public String rejestracja(Model model) {
        return "rejestracja";
    }
    @RequestMapping("/login")
    public String login(Model model) {
        return "login";
    }
}

oczywiscie to tez tylko opcja tematów ale chodzi mi o sam schemat czy lepiej zrobic calosc w springu i czy moj schemat powyzej springa jest poprawny z góry dzieki :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0