JSTL problem z pobraniem (wyswietleniem?) parametrów

0

Witam!
Problem polega na tym, ze stronka JSP przy uzyciu JSTL powinna mi wyswietlic wiersz po wierszu zawartosc listy, a wyswietla tylko ostatni wiersz, ale powtorzony tyle razy ile jest wierszy.
Lista zawiera dane z bazy PostgreSQLowej, ale nie bezposrednio z ResultSeta, lecz przepuszczone przez dodatkowa tablice.
Jako poczatkujacy domyslam sie, ze problem jest w miare banalny.
Zalezy mi na tym, zeby ten kod jak najszybciej zaczal dzialac. Wszelkich wygladzan bede dokonywal pozniej.
Istotne wg mnie fragmenty kodu:
z JSP:

<% String inv_id=request.getParameter("id"); %>
<% AccessDB accessDB=new AccessDB(); %>
<% List prods=accessDB.getProducts(inv_id); %>
<% request.setAttribute("prods", prods); %>

(...)

<c:forEach var="prod" items="${requestScope.prods}" >
                            <tr>
                                <td rowspan="2" style="vertical-align:top;"><%= lp %></td><td colspan="5">${prod.prodName}</td>
                            </tr>
                            <tr>
                                <td>${prod.prodPkwiu}</td><td>${prod.prodPrice}</td><td>${prod.prodQuantity} &nbsp; ${prod.prodUnit}</td><td>${prod.prodVat}</td><td>${prod.prodBrutto}</td>
                            </tr>
                            <c:set var="sumaBrutto" value="${sumaBrutto + prod.prodBrutto}" />
                            <c:set var="sumaNetto" value="${sumaNetto + prod.prodNetto}" />
                            <% lp=lp+1; %>
                        </c:forEach>

z AccessDB.java:

public List getProducts(String inv_id){
        Connection connection=null;
        InvoiceShow prod=null;
        List list=new ArrayList();
        
        try{
            DataSource dataSource=getJdbcConnectionPool2();
            connection=dataSource.getConnection();
            PreparedStatement stat=null;
            stat=connection.prepareStatement(sqlCountPart);
            stat.setString(1, inv_id);
            ResultSet rs_s=stat.executeQuery();
            rs_s.next();
            int rs_size = rs_s.getInt(1);
            stat=connection.prepareStatement(sqlSalePart);
            stat.setString(1, inv_id);
            ResultSet rs=stat.executeQuery();
            String[][] sumator = new String[rs_size][8];
            int count=0;
            while(rs.next()){

(...)

stat=connection.prepareStatement(sqlProducts);
                    stat.setString(1, id_part_v01s);
                    ResultSet rs2=stat.executeQuery();
                    rs2.next();
                    unit=rs2.getString("unit");

dalej podobnie
(...)

                if (discount == null){
                    if (price_spec == null){
                        price_final = price_base;
                    } else {
                        price_final = price_spec;
                    }
                }
                
                /////sumowanie produktów o różnych numerach a tym samym modelu
                int ile=-1;
                for (int i=0;i<sumator.length;i++){
                    if (sumator[i][0]==null){
                    }else {
                    }
                    if (stanimex_key.equals(sumator[i][0])){
                        if (sumator[i][1]==null){
                            ile = 0;
                        } else {
                            ile = Integer.parseInt(sumator[i][1]);
                        }
                        ile++;
                        sumator[i][1]=Integer.toString(ile);
                    } else {
                    }
                }
                if (ile == -1){
                    sumator[count][0]=stanimex_key;
                    sumator[count][1]=Integer.toString(1);
                    sumator[count][2]=""+price_final;
                    sumator[count][3]=prod_name+" ("+quantity+" "+unit+")";
                    sumator[count][4]=pkwiu;
                    sumator[count][5]=unit;
                    sumator[count][6]=Integer.toString(quantity);
                    sumator[count][7]=Integer.toString(vat_base);
                    count++;
                }
             //zamkniecie while(rs.next()):   
            }
            
            for (int j=0;j<sumator.length;j++){
                if (sumator[j][0]!=null){

                    prod.setProdPrice(BigDecimal.valueOf(Double.parseDouble(sumator[j][2])));
                    prod.setProdName(sumator[j][3]);
                    prod.setProdPkwiu(sumator[j][4]);
                    prod.setProdUnit(sumator[j][5]);
                    prod.setProdQuantity(Integer.parseInt(sumator[j][1]));
                    prod.setProdVat(Integer.parseInt(sumator[j][7]));
                    list.add(prod);
                }
            }
            
    
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        return list;
    }

Z InvoiceShow.java:

package org;

import java.math.BigDecimal;
import java.util.Date;
import java.lang.String;

public class InvoiceShow {
    
    public InvoiceShow() {
    }

    
    private String prodName;
    private String prodPkwiu;
    private BigDecimal prodPrice;
    private int prodVat;
    private int prodQuantity;
    private String prodUnit;
    private BigDecimal prodNetto;
    private int prodVatId;
    private int partId;
    private String partName;
    private String stanimexKey;
    private BigDecimal priceSell;

(...)

    //settery
    
    public void setProdName(String proN) {
        this.prodName=proN;
    }
    public void setProdPkwiu(String proPk) {
        this.prodPkwiu=proPk;
    }
    public void setProdPrice(BigDecimal proP) {
        this.prodPrice=proP;
    }
    public void setProdVat(int proV) {
        this.prodVat=proV;
    }
    public void setProdQuantity(int proQ) {
        this.prodQuantity=proQ;
    }
    public void setProdUnit(String proU) {
        this.prodUnit=proU;
    }
    public void setProdNetto(BigDecimal prodNetto) {
        this.prodNetto = prodNetto;
    }
    public void setProdVatId(int prodVatId) {
        this.prodVatId = prodVatId;
    }
     public void setPartId(int partId) {
        this.partId = partId;
    }
    public void setPartName(String partName) {
        this.partName = partName;
    }
    public void setStanimexKey(String stanimexKey) {
        this.stanimexKey = stanimexKey;
    }
    public void setPriceSell(BigDecimal priceSell) {
        this.priceSell = priceSell;
    }

(...)

//gettery
    
    
    public String getProdName() {
        return prodName;
    }
    public String getProdPkwiu() {
        return prodPkwiu;
    }
    public BigDecimal getProdPrice() {
        return prodPrice;
    }
    public int getProdVat() {
        return prodVat;
    }
    public int getProdQuantity() {
        return prodQuantity;
    }
    public String getProdUnit() {
        return prodUnit;
    }

    public BigDecimal getProdBrutto() {
        BigDecimal prodQuantityy = BigDecimal.valueOf(Double.parseDouble(Integer.toString(prodQuantity)));
        BigDecimal prodVatt = BigDecimal.valueOf(Double.parseDouble(Integer.toString(prodVat)));
        BigDecimal jeden = BigDecimal.valueOf(1);
        BigDecimal sto = BigDecimal.valueOf(100);
        BigDecimal prodBrutto = prodPrice.multiply(prodQuantityy.multiply(jeden.add(prodVatt.divide(sto))));
        return prodBrutto;
    }
    public BigDecimal getProdNetto() {
        BigDecimal prodQuantityy = BigDecimal.valueOf(Double.parseDouble(Integer.toString(prodQuantity)));
        prodNetto=prodPrice.multiply(prodQuantityy);
        return prodNetto;
    }
    
    public int getProdVatId() {
        return prodVatId;
    }

    public int getPartId() {
        return partId;
    }

    public String getPartName() {
        return partName;
    }

    public String getStanimexKey() {
        return stanimexKey;
    }
    public BigDecimal getPriceSell() {
        return priceSell;
    }
    

(...)

Dodam jeszcze, ze przed dodaniem tablicy, w ktorej odbywa sie sumowanie wszystko dzialalo, a sama tablice w ostatniej petli wyrzucam sobie do logow i widze, ze zawiera poprawne wartosci (System.outy powycinalem, coby skrocic post).
Mam nadzieje, ze ktos mi cos podpowie.
Pozdrawiam

0

dobra, ja bym zrobił to w ten sposób:

  1. nie wrzucaj kodu java na strony JSP, nie pytaj dlaczego, po prostu tak się robić nie powinno
    zamiast tego zrób sobie jakiś prosty Servlet i tam w metodzie goGet lub doPost pobieraj dane z bazy (lub jeszcze lepiej tylko wywołuj metody klasy odpowiedzialnej za dostęp do bazy)
  2. dodaj na początku strony JSP coś takiego:
    <%@page isELIgnored="false" %>
    co pozwoli Ci używać EL'a

podam teraz przykład, mam go akurat na książkach, ale to nie ma znaczenia:

JSP:

<%@page import="data.*"%>
<%@ page language="java" import="java.util.*" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
</head>


<h2>Lista Ksiazek</h2><br>
<table border="1">
<tr>
<td>Autor</td>
<td>Tytul</td>
<td>Usu?</td>
<td>Edycja</td>
</tr>
<c:forEach var="ksiazka" items="${ksiazki}">
<tr>
<td>${ksiazka.autor }</td>
<td>${ksiazka.tytul }</td>
<td><form method="post" action="usunKsiazke">
<input type="hidden" name="id" value="${ksiazka.id }">
<input type="submit"value="Usun"></form></td>
<td><form method="get" action="edytujKsiazke">
<input type="hidden" name="id2" value="${ksiazka.id }">
<input type="submit"value="Edytuj">
</form></td>
</tr>
</c:forEach>
</table>
...

i Servlet do tego:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import data.*;
import java.util.*;

public class listaKsiazek extends HttpServlet{
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
		this.doPost(request,response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
		Baza baza=new Baza();
		List lista=baza.wczytajKsiazki();//pobranie ksiazek z bazy i upakowanie ich w List
		request.setAttribute("ksiazki",lista);
		RequestDispatcher view=request.getRequestDispatcher("/jsp/listaKsiazek.jsp");
		view.forward(request,response);
		
	}
}

natomiast w web.xml musisz 'powiedzieć' żeby po wpisaniu danego adresu url przekierowało cie do danego servletu a nastepnie dopiero do JSP:

xmlns:xsi="http//www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/we-app_2_4.xsd">
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>listaKsiazek</servlet-name>
		<servlet-class>data.servlety.listaKsiazek</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>listaKsiazek</servlet-name>
		<url-pattern>/listaKsiazek</url-pattern>
	</servlet-mapping>
...
</wep-app>

i tyle

moge wyslac prosty gotowy projekt dzialajacy na JBOSS 4.2, ale rownie dobrze na Tomcacie

pzdr.

0

ok, dzieki serdeczne z odpowiedz.
Szczerze powiedziawszy, to wolalbym jednak jakis prostszy sposob, jesli istnieje (nawet nie do konca zgodny ze sztuka), niz przepisywanie wszystkiego od nowa. Po prostu przedstawiony tu kod jest tylko jedna z wielu w podobny sposob obsluzonych stronek, a mi zalezy na tym, zeby jak najszybciej zaczelo to dzialac. Jak juz zacznie, wtedy bede mogl na kopii poprawiac tak, zeby jak najbardziej ze sztuka zgodne bylo. Pogooglam jeszcze troche (heh, trzeci dzien googlania za tym) i jesli nic nie znajde albo ktos nie podpowie mi prostszej metody, to zrobie tak jak mowisz. Probowalem dobrac sie jakos do obiektow w liscie zwracanej przez getProducts przy pomocy javy z poziomu strony JSP, ale bezskutecznie. Zostalem rzucony na glebsze wody z lukami w podstawach i pewnie to jest tego efektem =).
No nic, jeszcze raz dziekuje i pozdrawiam.

PS.: Jakby ktos jeszcze mogl mi wytlumaczyc czemu to dzialalo poprawnie, kiedy z ResultSeta przepisywalem do listy za posrednictwem jednej zmiennej w stylu:

String costam = resultSet.getString("costam");
prod.setCostam(costam);
list.add(prod);

a w sposob taki jak w pierwszym poscie nie dziala, to bylbym juz calkiem szczesliwy =).
(zmiany wprowadzilem tylko w AccessDB.java)
Pozdrawiam

0

Dobra, tymczasowo poradzilem sobie inaczej, wiec juz mi sie nie pali. Przed wydrukiem i tak wyswiela calosc w PDFie przy pomocy PHPa, wiec tylko podlinkowalem tego PHPa. Ide dalej, ale jakby ktos mial wene odpowiedziec, to sie przyda na pozniej. Pozdrawiam

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