java EE JSF

0

Witam serdecznie,
jestem na etapie studiowania książki - Java EE 6. Programowanie aplikacji WWW i w tej książce jest przykład, który przepisałem kropla w kroplę (niby) i mi nie działa :/ sprawdzałem parę razy i nic. Korzystam z Eclispse oraz TomCat.

package notowaniagieldowe.entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Spolka{
	private String nazwa;
	private String symbol;
	private String sektor;
	private List<Notowanie> notowania;
	private Notowanie ostatnie;
	
	public Spolka() {
	}
	public Spolka(String nazwa, String 	symbol,String sektor){
		this.nazwa = nazwa;
		this.symbol = symbol;
		this.sektor = sektor;
	}
	public Spolka(String nazwa, String 	symbol,String sektor,double cena,double zmiana,Date dzien){
		this(nazwa,symbol,sektor);
		this.notowania = new ArrayList<Notowanie>();
		this.notowania.add(new Notowanie(cena,dzien, zmiana, this));
	}
	/**
	 * @return the nazwa
	 */
	public String getNazwa() {
		return nazwa;
	}
	/**
	 * @param nazwa the nazwa to set
	 */
	public void setNazwa(String nazwa) {
		this.nazwa = nazwa;
	}
	/**
	 * @return the symbol
	 */
	public String getSymbol() {
		return symbol;
	}
	/**
	 * @param symbol the symbol to set
	 */
	public void setSymbol(String symbol) {
		this.symbol = symbol;
	}
	/**
	 * @return the sektor
	 */
	public String getSektor() {
		return sektor;
	}
	/**
	 * @param sektor the sektor to set
	 */
	public void setSektor(String sektor) {
		this.sektor = sektor;
	}
	/**
	 * @return the notowania
	 */
	public List<Notowanie> getNotowania() {
		return notowania;
	}
	/**
	 * @param notowania the notowania to set
	 */
	public void setNotowania(List<Notowanie> notowania) {
		this.notowania = notowania;
	}
	/**
	 * @return the ostatnie
	 */
	public Notowanie getOstatnie() {
		if (ostatnie == null)
			if(getNotowania() != null && !getNotowania().isEmpty())
				this.ostatnie = getNotowania().get(getNotowania().size()-1);
		return ostatnie;
	}
	/**
	 * @param ostatnie the ostatnie to set
	 */
	public void setOstatnie(Notowanie ostatnie) {
		this.ostatnie = ostatnie;
	}
}

package notowaniagieldowe.entity;

import java.util.Date;

public class Notowanie {
	private Date dzien;
	private double cena;
	private double zmiana;
	private Spolka spolka;
	
	public Notowanie() {
	}
	public Notowanie(double cena, Date dzien, double zmiana, Spolka spolka){
		this.cena = cena;
		this.dzien =dzien;
		this.zmiana= zmiana;
		this.spolka = spolka;
	}
	/**
	 * @return the dzien
	 */
	public Date getDzien() {
		return dzien;
	}
	/**
	 * @param dzien the dzien to set
	 */
	public void setDzien(Date dzien) {
		this.dzien = dzien;
	}
	/**
	 * @return the cena
	 */
	public double getCena() {
		return cena;
	}
	/**
	 * @param cena the cena to set
	 */
	public void setCena(double cena) {
		this.cena = cena;
	}
	/**
	 * @return the zmiana
	 */
	public double getZmiana() {
		return zmiana;
	}
	/**
	 * @param zmiana the zmiana to set
	 */
	public void setZmiana(double zmiana) {
		this.zmiana = zmiana;
	}
	/**
	 * @return the spolka
	 */
	public Spolka getSpolka() {
		return spolka;
	}
	/**
	 * @param spolka the spolka to set
	 */
	public void setSpolka(Spolka spolka) {
		this.spolka = spolka;
	}
	
	
}


package notowaniagieldowe.entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Menedzer {
	private List<Spolka> spolki;

	public Menedzer(){
		spolki = new ArrayList<Spolka>(3);
		Date data = new Date();
		
		spolki.add(new Spolka("Kocia spółka węgla", "KSW", "energetyczny", 20, 11.1, data));
		spolki.add(new Spolka("KitKompDontCom", "KKDC", "inforatyczny", 90, 3.4, data));
		spolki.add(new Spolka("Kocie Dane Studio", "KDS", "rozrywkowy", 15, -11.7, data));
	}
	/**
	 * @return the spolki
	 */
	public List<Spolka> getSpolki() {
		return spolki;
	}

	/**
	 * @param spolki the spolki to set
	 */
	public void setSpolki(List<Spolka> spolki) {
		this.spolki = spolki;
	}
}

I teraz chyba najważniejsze:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	  xmlns:h="http://java.sun.com/jsf/html"
	  xmlns:ui="http://java.sun.com/jsf/facelets">
	<h:head>
		<title>Facelet Title</title>
	</h:head>
	<h:body>
		<h1>Notowanie giełdowe</h1>
		<table>
			<tr>
			    <th>Nazwa</th>
			    <th>Symbol</th>
			    <th>Cena</th>
			    <th>Zmiana (%)</th>
			</tr>
			<ui:repeat value="#{menedzer.spolki}" var="spolka">
			  <tr>
				<td>#{spolka.nazwa}</td>
				<td>#{spolka.symbol</td>
				<td>#{spolka.ostatnie.cena}</td>
				<td>#{spolka.ostatnie.zmiana}</td>
			   </tr>
			</ui:repeat>
		</table>
	</h:body>
</html>
<?xml version="1.0" encoding="UTF-8"?>

<faces-config 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
    
    <managed-bean>
    	<managed-bean-name>menedzer</managed-bean-name>
    	<managed-bean-class>notowaniagieldowe.entity.Menedzer</managed-bean-class>
    	<managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>

A tu jak wygląda rezultat:
b80b0b3c5c.png

0

.html ????

2

Nie polecam, abyś dalej czytał tą książkę: przynajmniej w kontekście JSF (inne tematy jak EJB, JPA2 pewnie są lepiej opisane). Musiała być pisane w czasie przejściowym międy JEE 5, a 6. Na załączonym przez Ciebie listingu widać konfigurację JSF za pomocą XML. Można to robić i trzeba tak robić w JSF 1.2. Jednak teraz dominuje JSF 2.1, 2.2, a w drodze jest 2.3. Używanie XML ma jednak większy sens w przypadku starszego projektu pisanego na JSF 1.2, który należy podnieść: migracja. Nie ma potrzeby pisać w ten sposób w nowym projekcie. Lepiej od razu nabrać dobrych nawyków.

Sugeruje od razu podłączyć bibliotekę np. PrimeFaces i spróbować użyć CDI Managed Beans zamiast tych z JSF. Najlepiej idź od razu w Java EE 7, weź np. serwer Payara (ulepszony GlassFish).

Demo primefaces:
http://www.primefaces.org/showcase/
Payara:
http://www.payara.co.uk/about
Jako IDE NetBeans.

0

Pewnie masz złe mapowanie w web.xml, w sumie rozszerzenie nie ma znaczenia byle mapowanie było dobre, ale...
w web.xml powinno być tak:

<servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

a rozszerzenia plików zmień właśnie na *.xhtml

0

Plik XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Gielda</display-name>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <welcome-file-list>
  	<welcome-file>/faces/index.xhtml</welcome-file>
  </welcome-file-list>
  
  
   <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>
</web-app>

I teraz wygląda tak:
d7f8136b08.png

0

Udało mi się odnaleźć co jest nie tak.

Brakowało mi konfiguracji w faces-config.
Szkoda, że w książce w listing-u nie było tego.

 <?xml version="1.0" encoding="UTF-8"?>

<faces-config 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
    
    <managed-bean>
    	<managed-bean-name>menedzer</managed-bean-name>
    	<managed-bean-class>notowaniagieldowe.entity.Menedzer</managed-bean-class>
    	<managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    
    <managed-bean>
    	<managed-bean-name>spolka</managed-bean-name>
    	<managed-bean-class>notowaniagieldowe.entity.Spolka</managed-bean-class>
    	<managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    
    <managed-bean>
    	<managed-bean-name>notowanie</managed-bean-name>
    	<managed-bean-class>notowaniagieldowe.entity.Notowanie</managed-bean-class>
    	<managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    
</faces-config>

0

Gdyby zamiast XML'a skorzystać z adnotacji, to zamiast faces-config miałbyś tylko jedną adnotację dla każdej klasy (Menedzer, Spolka i Notowanie): @Model
;)

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