Java EE baza servlety klasy DAO

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

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ę.

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 :)

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