Java klassen

Leerdoelen

Na het bestuderen van dit hoofdstuk wordt van je verwacht dat je weet:

  • hoe je java klassen in je web app kunt maken en gebruiken

Opdracht 14

Maak dezelfde pagina als in opdracht 12, maar maak nu gebruik van een klasse die de berekeningen uitvoert in plaats van dat de berekeningen in JSP worden uitgevoerd. Maak naast JSP gebruik van HTML en CSS bij het uitvoeren van deze opdracht.

In Eclipse maak je in je projectstructuur een java klasse. Klassen bevinden zich in zogenaamde "packages" in de map "src" (source).

Java klasse in Eclipse project

De java klasse

We maken een java klasse met een constructor en twee methoden om van Celsius naar Fahrenheit en vice versa te rekenen. We geven aan de methoden een String mee als parameter. Deze String moet naar een int worden geconverteerd met de methode Integer.parseInt(). Zoals we hebben gezien werpt deze methode een NumberFormatException op als de conversie niet lukt. Door achter de methode "throws NumberFormatException" te zetten geven we aan dat deze exception moet worden opgegooid als de methodes worden aangeroepen met een onjuiste parameter(geen int). Later in de jsp gebruiken we deze exception om een foutmelding te maken.

package graden;

public class Graden {

	private int uitkomst;
	
	public Graden() {
		
	}
	//Exception opwerpen voor foute invoer
	public int naarCels(String sFahr) throws NumberFormatException {
		int fahr = Integer.parseInt(sFahr);
		uitkomst = Math.round((fahr -32)/1.8f);
		return uitkomst;
	}
	
	public int naarFahr(String sCels) throws NumberFormatException {
		int cels = Integer.parseInt(sCels);
		uitkomst = Math.round(cels * 1.8f + 32);
		return uitkomst;
	}
}

De JSP pagina

In de JSP pagina willen we de klasse die we net hebben gemaakt gebruiken om de berekening uit te voeren. Hiertoe moeten we de klasse importeren.

<%@page import="graden.Graden" %>

Nu kunnen we een instantie van Graden aanmaken en daarop de twee methoden aanroepen. Als parameters geven we de String mee die de methode request.getParameter(String s) teruggeeft.

<%
Graden g = new Graden();
String celsValue = "";
String fahrValue = "";
String warning = "";
//check of er op knop is geklikt
if (request.getParameter("knop") != null) {
  try {
    //er mag maar één input veld zijn ingevuld
    if (!request.getParameter("cels").equals("") 
     && !request.getParameter("fahr").equals("")) {
       warning = "Voer slechts &eacute;&eacute;n waarde in!";
    }
    //gebruiker heeft Celsius ingevoerd
    else if (!request.getParameter("cels").equals("")) {
      int fahr = g.naarFahr(request.getParameter("cels"));
      fahrValue += fahr;
    }
    //gebruiker heeft Fahrenheit ingevoerd
    else if (!request.getParameter("fahr").equals("")) {
      int cels = g.naarCels(request.getParameter("fahr"));
      celsValue += cels;
    }
  }
  //foute of geen invoer werpt Exception op
  catch(NumberFormatException e) {
    warning = "Voer een geheel getal in";
  }
}
%>
        
<h1>Fahrenheit en Celsius omrekenen</h1>
<form action="index.jsp" method="get">
  <table id="graden">
    <tr>
      <th>Celsius</th>
      <th>Fahrenheit</th>
    </tr>
    <tr>
      <td><input type="text" name="cels" value="<%=celsValue%>"></td>
      <td><input type="text" name="fahr" value="<%=fahrValue%>"></td>
      <td><input type="submit" name="knop" value="Omrekenen"></td>
    </tr>
    
    <% if (request.getParameter("knop") != null) { %>
      <tr>
        <td colspan="2" class="fout"><%= warning %></td>
      </tr>
    <% } %>
  </table>

</form>


Opdracht 15

Maak dezelfde pagina met de rekenmachine als in opdracht 13, maar maak nu gebruik van een klasse die de berekeningen uitvoert in plaats van dat de berekeningen in JSP worden uitgevoerd. Maak naast JSP gebruik van HTML en CSS bij het uitvoeren van deze opdracht.

Rekenmachine

Eerste getal

Tweede getal

In onderstaande code zijn iets andere keuzes gemaakt dan in de vorige opgave. Zoek de verschillen!

Java

package rekenmachine;

/**
 *Geeft double als uitkomst terug voor rekenmachine
 *@author AO ROC Flevoland pdv
 *
 */
public class Rekenmachine {
  double uitkomst = 0;
	
 /**
  *Geeft uitkomst berekening afhankelijk van functie
  *@param double arg0
  *@param double arg1
  *@param String functie bepaalt type berekening
  *@return double uitkomst berekening
  */
  public double bereken(double arg0, double arg1, String functie) {
    switch (functie) {
      case "+": uitkomst = arg0 + arg1;
                break;

      case "-": uitkomst = arg0 - arg1;
                break;

      case "x": uitkomst = arg0 * arg1;
                break;

      case "/": uitkomst = arg0 / arg1;
                break;
    }
    return uitkomst;
  }
}


JSP

<%
Rekenmachine rm = new Rekenmachine();
String uitkomst = "";
String foutboodschap = "";


if (request.getParameter("functie") != null) {
  if (request.getParameter("arg1").equals("") || 
    request.getParameter("arg2").equals("")) {
      foutboodschap = "Voer <em>twee</em> getallen in";
  }
  else {
    try {
      double getal1 = Double.parseDouble(request.getParameter("arg1"));
      double getal2 = Double.parseDouble(request.getParameter("arg2"));
      String functie = request.getParameter("functie");
      uitkomst += rm.bereken(getal1, getal2, functie);
    }
    catch(NumberFormatException e) {
      foutboodschap = "Je mag alleen (decimale) getallen invoeren";
    }
  }
}
%>

    <form action="index.jsp" method="get">
      
      <table id="rekenmachine">
        
        <thead>
          
          <tr id="kop">
            <th colspan="4">Rekenmachine</th>
          </tr>
          
        </thead>
        
        <tbody>
          
          <tr>
            <td class="getallabels" colspan="2">Eerste getal</td>
            <td class="getallabels" colspan="2">Tweede getal</td>
          </tr>

          <tr id="invoer">
            <td colspan="2">
              <input type="text" name="arg1" value="<%= uitkomst %>"
            </td>
            <td colspan="2">
              <input type="text" name="arg2" value="">
            </td>
          </tr>

          <tr id="knoppen" >
            <td>
              <div class="knopcontainer">
                <input type="submit" name="functie" value="+">
              </div>
           </td>
            <td>
              <div class="knopcontainer">
                <input type="submit" name="functie" value="-">
              </div>
            </td>
            <td>
              <div class="knopcontainer">
                <input type="submit" name="functie" value="x">
              </div>
            </td>
            <td>
              <div class="knopcontainer">
                <input type="submit" name="functie" value="/">
              </div>
            </td>
          </tr>
          
          <tr>
            <td colspan="4" class="fout"><%= foutboodschap %></td>
          </tr>

      </table>
      
    </form>
  
  </body>
</html>


Merk op dat er bij het programmeren vaak meerdere oplossingen mogelijk zijn. Iedere programmeur ontwikkelt in zekere zin zijn eigen stijl. Let er wel op dat je probeert zo "zuinig" mogelijk te programmeren en je code overzichtelijk te houden. Sommige bedrijven hanteren strenge stijlregels om hun code uniform te houden.

Toets

Maak een webpagina volgens onderstaand voorbeeld waarin auto's of andere produkten worden vertoond en waarbij de gebruiker kan selecteren op merk of minimum- en/of maximumprijs.



FordFiesta

Ford Fiesta

€ 23.999,--

FordFocus

Ford Focus

€ 18.995,--

OpelAstra

Opel Astra

€ 14.895,--

OpelInsignia

Opel Insignia

€ 65.450,--

SubaruForester

Subaru Forester

€ 34.750,--

SubaruImpreza

Subaru Impreza

€ 28.345,--

MercedesE 63

Mercedes E 63

€ 110.995,--

MercedesCLA 45

Mercedes CLA 45

€ 190.780,--

MercedesE 230

Mercedes E 230

€ 1.000,--

MercedesC 250

Mercedes C 250

€ 599,--

Ferrari612 GTO

Ferrari 612 GTO

€ 350.500,--

FerrariCalifornia

Ferrari California

€ 210.780,--

Ferrari458

Ferrari 458

€ 280.775,--

LotusElise CR

Lotus Elise CR

€ 48.591,--

LotusElise S CR

Lotus Elise S CR

€ 60.079,--

Citroen2CV

Citroen 2CV

€ 459,--

VolvoV40

Volvo V40

€ 1.250,--

MiniCooper

Mini Cooper

€ 34.495,--

Om je op weg te helpen kun je gebruik maken van de twee onderstaande Java klassen.

package jspcursus;

import java.text.DecimalFormat;

public class Auto {
    private final String merk;
    private final String type;
    private final int prijs;
    private final String fotourl;
    
    
    public Auto(String merk, String type, int prijs, String fotourl) {
        this.merk = merk;
        this.type = type;
        this.prijs = prijs;
        this.fotourl = fotourl;
    }
    
    public String getMerk() {
        return merk;
    }
    
    public String getType() {
        return type;
    }
    
    public int getPrijs() {
    	
        return prijs;
    }
    
    public String getFoto() {
        return fotourl;
    }
    
    
    /**
      *
      * @return geeft prijs als geformatteerde String
      */
    public String getPrijsFormat() {
    	DecimalFormat df = new DecimalFormat("#,##0.--");
    	double prijs = (double) this.getPrijs();
    	String sPrijs = df.format(prijs);
    	return sPrijs;
    }

package jspcursus;

import java.util.ArrayList;

/**
 * Klasse met een lijst van auto's
 * @author piet
 */
public class AutoLijst {
    private ArrayList<Auto> autolijst;
    
    /**
     * Constructor die de lijst aanmaakt en auto's toevoegt
     */
    public AutoLijst() {
        autolijst = new ArrayList<Auto>();
        Auto ford1 = new Auto("Ford", "Fiesta", 23999, 
          "images/autos/fordfiesta.jpg");
        autolijst.add(ford1);
        Auto ford2 = new Auto("Ford", "Focus", 18995, 
          "images/autos/fordfocus.jpg");
        autolijst.add(ford2);
        Auto opel1 = new Auto("Opel", "Astra", 14895, 
          "images/autos/opelastra.jpg");
        autolijst.add(opel1);
        Auto opel2 = new Auto("Opel", "Insignia", 65450, 
          "images/autos/opelinsignia.jpg");
        autolijst.add(opel2);
        Auto subaru1 = new Auto("Subaru", "Forester", 34750, 
          "images/autos/subaruforester.jpg");
        autolijst.add(subaru1);
        Auto subaru2 = new Auto("Subaru", "Impreza", 28345, 
          "images/autos/subaruimpreza.jpg");
        autolijst.add(subaru2);
        Auto mercedes1 = new Auto("Mercedes", "E 63", 110995, 
          "images/autos/mercedede63.png");
        autolijst.add(mercedes1);
        Auto mercedes2 = new Auto("Mercedes", "CLA 45", 190780, 
          "images/autos/mercedescla45.jpg");
        autolijst.add(mercedes2);
        Auto ferrari1 = new Auto("Ferrari", "612 GTO", 350500, 
          "images/autos/ferrari612.jpg");
        autolijst.add(ferrari1);
        Auto citroen1 = new Auto("Citroen", "2CV", 459, 
          "images/autos/citroen2cv.jpg");
        autolijst.add(citroen1);
        Auto mini1 = new Auto("Mini", "Cooper", 34495, 
          "images/autos/minicooper.jpg");
        autolijst.add(mini1);
     }
    
    /**
     * 
     * @return geeft de lijst met auto's
     */
    public ArrayList<Auto> getLijst() {
        return autolijst;
    }
    
    
    
    /**
     * Ten behoeve van het select merk input veld
     * @return een lijst met alle unieke merken
     */
    public ArrayList<String> getMerken() {
        ArrayList<String> merken = new ArrayList<String>();
        for (Auto auto: autolijst) {
            String merk = auto.getMerk();
            if (!merken.contains(merk)) {
                merken.add(merk);
            }
        }
        return merken;
    }
}

Uitwerking studenten

Criteria voor de Ninja-levels

De definitieve criteria zijn nog onderwerp van gesprek, er kunnen derhalve geen rechten aan deze pagina worden ontleend

greenbelt
  • Het onderdeel "programmeren" van de proeve van bekwaamheid jaar 1 is als voldoende beoordeeld
blackbelt
  • de pagina is ingebed in je online portfolio. Je hebt een eigen(zinnige) stijl gemaakt
  • de HTML van het selectieveld "Merk" wordt automatisch gevuld met unieke merken. Default is "alle merken"
  • bij de inputvelden "prijs" hoeft maar één van beide velden door gebruiker te worden ingevuld (twee mag uiteraard ook)
  • de auto's verschijnen netjes naast en onder elkaar, de pagina elementen schalen afhankelijk van de schermgrootte
  • de prijzen van de produkten zijn geformatteerd volgens de Nederlandse standaard (1.000.000,-)
  • er kan een combinatie van Merk(en) en prijzen worden geselecteerd
  • de pagina heeft een overzichtelijke lay-out en een wervende vormgeving
  • de pagina staat online in een produktieomgeving (zoals Google App Engine)
  • de broncode van de web-app is "Open Source" en is te vinden op GitHub inclusief een readme bestand met een Engelstalige gebruiksaanwijzing
master
  • alle vereisten zwarte band
  • de inputvelden prijs zijn vervangen door een "slider" waarmee zowel minimum- als maximumprijs kan worden aangepast (voorbeeld)
  • er kunnen nu ook meerdere merken worden geselecteerd
  • de pagina is gekoppeld aan een database en er is functionaliteit toegevoegd zodat de eigenaar van de website zijn voorraad op gemakkelijke wijze kan beheren.
  • De auto-divs worden met JQuery / AJAX ververst zonder dat de pagina hoeft te worden herladen

Publiceer je portfolio

Je kunt je portfolio hier publiceren.