Java EE zapytanie DAO o ilosc tematów w danej kategori i przekazanie wartosci do JSP

0

WItam mam problem z wychwyceniem zapytania o ilosc wpisow w danej kategorii wyglada to tak:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<h1>Forum</h1>
	<table>
		<tr>
			<th>Temat</th>
			<th>Datat</th>
			<th>Autor</th>
		</tr>
		<c:forEach var="temat" items="${tematy}">
			<tr>
				<td>
					<c:url var="url" scope="page" value="/temat">
						<c:param name="id" value="${temat.id}"/>
					</c:url>
					<a href="${url}">${temat.tytul}</a>
				</td>
				<td><fmt:formatDate value="${temat.data}" dateStyle="short" timeStyle="short"/>
				<td>${temat.uzytkownik.login}</td>
			</tr>
		</c:forEach>	
	</table>
	<c:url value="/nowyTemat" var="urlNowyTemat" scope="page"/>
	<form action="${urlNowyTemat}">
		<input type="submit" value="Nowy temat"/>
	</form>
	<br/>
	<a href="wyloguj">Wyloguj</a><br/><br/>
	<c:forEach var="kategoria" items="${kategorie}">
			<tr>
				<td>

					<input type="hidden" name="id" value="${kategoria.id}"/>
				
					<c:url var="url" scope="page" value="/tematKategoria">
						<c:param name="idd" value="${kategoria.id}"/>
					</c:url>
					<a href="${url}">${kategoria.nazwa}</a>--------------${tematyy}<br/><br/>	
				</td>
			</tr>
	</c:forEach>
</body>
</html>

jak widzicie zliczanie mialo by nastapic tutaj ${tematyy}

public List pobierzIloscTematowWKategori(String id){
			List tematy = this.em.createQuery("SELECT count(t) from Temat t where t.kategoria ="+id).getResultList();
			return tematy;
		}

tak wyglada zapytanie o ilosc tematow wiem wyglada kiepsko ale nie o to tu chodzi bo pobiera dane i zlicza prawidlowo ;

@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 = request.getParameter("id");
		List tematyy = dao.pobierzIloscTematowWKategori(id);
		System.out.print(id);
		System.out.print(tematyy);
		request.setAttribute("tematyy", tematyy);
		
		request.getRequestDispatcher("/WEB-INF/widok/index.jsp").forward(request, response);
		
		}

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

}

powyzej jest servlet i jego zadaniem ma byc zliczenie czyli moje myslenie jest takie pobieram z ukrytego inputa co widzicie na JSP id kategori w postaci liczby ktora zostaje pobrana przes servlet skierowana do zapytania i pozniej otrzymuje wynik "request.setAttribute("tematyy", tematyy)" tylko jest problem z inputu nie pobiore wartosci poniewaz musial bym go wyslac za pomoca formularza a chce zeby robilo sie to dynamicznie przy otwarciu JSP i dynamicznie dla kazdej kategorii zliczanie tematow . Macie jakies pomysly ? Z góry dzieki

0

przez* wkradla sie dosc intrygujaca literówka sory

0
TematyDAO dao = (TematyDAO) request.getAttribute("tematyDAO")

WTF?

Co to jest?

0

Moja klasa DAO

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 Temat pobierzIloscTematowWKategori(String id){
			Temat t = (Temat)em.createQuery("SELECT count(t) from Temat t where t.kategoria = "+id).getSingleResult();
			return t;
		}
		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;
			}
		}

	}
0

Ale chcesz powiedzieć że ty próbujesz przekazać DAO przez requesty?

0

no a jak mam to zrobic inaczej ?

0

Przez wstrzyknięcie zależności.

0

no ale jesli sparametryzuje zapytania to tez bedzie to bezpieczne tak mi sie wydaje .

0

Nie no, to jakaś tragedia okrutna taka architektura. To musi być pole klasy, requestami to można przekazać dane z formatek a nie takie obiekty jak DAO...
Z serwletami jest o tyle ciężko że nie ma konstruktorów z parametrami (tzn. są ale nie są wykorzystywane przy uruchamianiu aplikacji), więc po prostu trzeba zrobić DAO dao = new DAO() i ew. zrobić 2 konstruktor do testowania

0

wiec lepiej sie robi na JSF ?

0

Lepiej się robi w Springu.

0

a za czasów servletów z JSP nie robilo sie wlasnie w taki sposob jak zrobilem to ja ?

0

w Springa jeszcze nie wszedlem i moze dlatego zrobilem to w ten sposob .

0

No z tym TematyDAO to dowaliłeś. A co do tych dynamicznie zmieniających się elementów, to już Tobie pisałem na innym forum, żebyś użył Ajax. Lepszy tutek

0

sprobuje to zrobic za pomoca wstrzykniecia zaleznosci i wtedy podesle do oceny chociaz na ta chwile nie mam pojecia jak nto zrobic i czy w ogole ten projekt da sie przerobic w ten sposob

0

a chcialem ominac Springa bo javy ucze sie od 2 miechów ale widze ze w tej chwili Spring ma najlepsze i najnowsze rozwiazania i konfiguracje .

0

Może masz wszystko dobrze, ale pokaż jeszcze kod, w którym uzyskujesz EntityManagera i tworzysz tematyDao. Masz tam jakiś filtr?

Bez Springa też można mieć Dependency Injection, wystarczy użyć @Named i @Inject, zgodnie z jsr. Jest to część standardu EE, nazywa się CDI.

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