Document:Handleiding WOSI

From WOSI
Jump to: navigation, search

In deze handleiding wordt uitgelegd hoe verschillende technieken worden toegepast binnen WOSI en wordt er uitgelegd welke technieken zijn gebruikt en hoe je deze in de grote lijn kunt gebruiken.


Contents

Inleiding techniek WOSI

Het project is volgens het MVC model opgebouwd.

Services

De modellen staan in de .java bestanden in het services project.

Views

De views zijn de .jsp pagina's die te vinden zijn in <project>\src\main\webapp\WEB-INF\jsp\...

Controllers

De controllers zijn de .java bestanden die te vinden zijn in <project>\src\main\java\org\wosi\controller\...

Samenwerking

Als voorbeeld staat hier ...\vhe\list.jsp

<%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
<t:basePage title="VHE overzicht">
 
 <h2><spring:message code="vhe.titleOverview" /></h2>
 
 <form>
 <t:tableData>
 <display:table name="${vhe}" sort="external" defaultsort="2" pagesize="${pageSize}"
 id="vhe" partialList="true" size="${size}" requestURI="">
 <display:column property="id" sortable="true" sortName="id" titleKey="vhe.id"/>
 
 <display:column property="vheCreationDate" sortable="true" 
 sortName="vheCreationDate" titleKey="vhe.creationDate" decorator="org.wosi.tags.decorator.DateDecorator"/>
 <display:column property="composedAddress.street.name" sortable="false" titleKey="vhe.street" />
 <display:column property="composedAddress.number" sortable="false" titleKey="vhe.houseNumber" />
 <display:column property="composedAddress.numberAddition" sortable="false" titleKey="vhe.additive" />
 <display:column property="composedAddress.street.zipCode" sortable="false" titleKey="vhe.postalCode" />
 <display:column property="composedAddress.street.city.name" sortable="false" titleKey="vhe.city" />
 <display:column titleKey="form.actions">
 <t:action_icon icon="BRICK_EDIT" title="edit" href="edit.wosi?vhe_id=${vhe.id}"/>
 <t:action_icon icon="CHART_BAR" title="procedures" href="edit.wosi?vhe_id=${vhe.id}"/>
 <t:action_icon icon="MAP_GO" title="show map" href="location.wosi?vhe_id=${vhe.id}"/>
 <t:action_icon icon="DELETE" title="delete" href="delete.wosi?vhe_id=${vhe.id}" onClick="return confirm('delete?')" />
 
 <t:action_icon icon="BRICK_EDIT" title="taxaties bekijken" href="appraisal/list.wosi?vhe_id=${vhe.id}"/>
 <t:action_icon icon="BRICK_EDIT" title="reparaties bekijken" href="repair/list.wosi?vhe_id=${vhe.id}"/>
 <!--<spring:message code="vhe.vheDeleteQuestion" />
<spring:message code="vhe.vheDelete" />-->
 </display:column>
 </display:table>
 </t:tableData>
 </form>
 <br>
 <b><spring:message code="form.actions" /></b><br>
 <a href="<c:url value="create.wosi"/>"><spring:message code="vhe.vheCreate" /></a>
</t:basePage>
 

De knop om een nieuwe VHE aan te maken, verstuurt gegevens naar "create.wosi" met <spring:message code="vhe.vheCreate" />. In de onderstaande controller wordt door,

@RequestMapping(value= "create.wosi", method=RequestMethod.GET)

gezorgd dat de create(Model model) methode wordt aangeroepen

package org.wosi.controller;
 
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.wosi.model.Vhe;
import org.wosi.model.VheType;
import org.wosi.service.VheService;
import org.wosi.service.VheTypeService;
import org.wosi.service.propertyeditor.IdToWOSIEntityEditor;
import org.wosi.tags.DisplayTagHelper;
 
@Controller
@RequestMapping("/vhe/*")
@SessionAttributes("vhe")
public class VheController {
 
 @Autowired VheService vheService;
 @Autowired VheTypeService vheTypeService;
 //@Autowired Menu menu;
 
 //@PostConstruct
 //private void setUp() {
 // MenuNode vhe_root_node = new MenuNode("vhe", null);
 // vhe_root_node.addChild(new MenuNode("list", "/vhe/list.wosi"));
 // vhe_root_node.addChild(new MenuNode("edit", "/vhe/edit.wosi"));
 // menu.root.addChild(vhe_root_node);
 //}
 
 @RequestMapping(value= "create.wosi", method=RequestMethod.GET)
 public String create(Model model) {
 Vhe vhe = new Vhe();
 model.addAttribute("vhe", vhe);
 model.addAttribute("vheTypes", vheTypeService.getAll());
 return "/vhe/edit";
 }
 ...
 ...
}

Vanuit die methode wordt een nieuw leeg VHE object aan het model toegevoegd en wordt genavigeerd naar /vhe/edit wat correspondeerd met ...\vhe\edit.jsp

<%@ include file="/WEB-INF/jsp/includes/taglibs.jsp" %>
 
<c:choose>
 <c:when test="${param['ID'] == null}">
 <spring:message code="vhe.titleRegister" var="pageTitle" />
 </c:when>
 <c:otherwise>
 <spring:message code="vhe.titleEdit" var="pageTitle" />
 </c:otherwise>
</c:choose>
 
<t:basePage title="${pageTitle}">
 
 <h2>${pageTitle}</h2>
 
 <t:form width="40em">
 <form:form commandName="vhe">
 <fieldset>
 <legend><spring:message code="vhe.vheData" /></legend>
 <table>
 <tr>
 <td><spring:message code="vhe.street" />:</td>
 <td><form:input path="composedAddress.street.name" cssClass="field" /></td>
 </tr>
 <tr>
 <td><spring:message code="vhe.houseNumber" />:</td>
 <td>
 <form:input path="composedAddress.number" cssClass="field" />
 <div class="m-warningText"></div>
 </td>
 </tr>
 <tr>
 <td><spring:message code="vhe.additive" />:</td>
 <td><form:input path="composedAddress.numberAddition" cssClass="field" />
 <div class="m-warningText"></div>
 </td>
 </tr>
 <tr>
 <td><spring:message code="vhe.postalCode" />:</td>
 <td>
 <form:input path="composedAddress.street.zipCode" cssClass="field" />
 <div class="m-warningText"></div>
 </td>
 </tr>
 <tr>
 <td><spring:message code="vhe.city" />:</td>
 <td><form:input path="composedAddress.street.city.name" cssClass="field" /></td>
 </tr>
 <tr>
 <td><spring:message code="vhe.description" />:</td>
 <td><form:textarea path="vheDescription" cssClass="field" /></td>
 </tr>
 <tr>
 <td><spring:message code="vhe.type" />:</td>
 <td><form:select itemLabel="name" itemValue="id" items="${vheTypes}" path="type" />
 </td>
 </tr>
 <tr>
 <td>location:</td>
 <td>
 <table>
 <tr>
 <td>latitude:</td>
 <td><form:input path="composedAddress.location.latitude" cssClass="field"/></td>
 </tr>
 <tr>
 <td>longitude:</td>
 <td><form:input path="composedAddress.location.longitude" cssClass="field"/></td>
 </tr>
 <tr>
 <td>height:</td>
 <td><form:input path="composedAddress.location.height" cssClass="field"/></td>
 </tr>
 </table>
 </td>
 </tr>
 </table>
 
 </fieldset>
 <t:formButtons>
 <input type="submit" value="<spring:message code="form.save" />" class="default">
 <input type="button" value="<spring:message code="form.cancel" />" onclick="document.location='<c:url value="list.wosi"/>'">
 </t:formButtons>
 </form:form>
 </t:form>
 
</t:basePage>

Op deze manier wordt binnen project WOSI van jsp naar servlet naar jsp genavigeerd.

Hibernate binnen WOSI

Tijdens WOSI ga je het Java ORM framework Hibernate gebruiken om een entiteit (domein class) te persisteren naar een database. Persisteren betekent dat de gegevens zodanig worden opgeslagen dat ze op een later tijdstip weer opgehaald kunnen worden, ook als bijvoorbeeld de stroom uitvalt.

Het persisteren van een entiteit gebeurt via een DAO(Data Access Object). Echter is de DAO nu al geïmplementeerd in Hibernate. Een DAO is een object welke er voor zorgt dat de POJO’s (Plain Old Java Object) / Beans gekoppelt worden aan een database en de transacties via Hibernate persisteren.

Inleiding Hibernate

Voordat we verder gaan, eerst een kleine introductie tot Hibernate en wat de rol van het Hibernate framework binnen WOSI is.

Hibernate is een Object/Relational (ORM) oplossing voor onder andere Java. Het is een gratis, open source framework dat beschikbaar is onder de LGPL licentie. Hibernate werd door een internationaal team van Java ontwikkelaars gemaakt, en is ondertussen geport naar .NET. Het is een relatief eenvoudig te gebruiken framework voor het koppelen van een object georiënteerd domeinmodel (POJO’s) aan een traditionele relationele database.

Tevens zorgt Hibernate voor de transactiefuncties waardoor het ontwikkeltraject aanmerkelijk kan worden verkort. De ontwikkelaar hoeft zich door gebruik te maken van dit framework niet meer bezig te houden met SQL en JDBC verbindingen. Naast Hibernate kun je gewoon gebruik blijven maken van SQL en JDBC maar dit raden wij jullie af, omdat dit het principe voor het gebruik van Hibernate verpest.

Hibernate maakt gebruikt van een zelf gemaakte querytaal HQL (Hibernate Query Language), met deze querytaal kun je op een simpele manier queries formulieren, en indien nodig complexe queries via criteria uitvoeren.

Het voordeel voor het gebruik van Hibernate binnen je applicaties is dat je een snellere ontwikkeltijd, efficiënter gebruik van SQL maar vooral de transacties zijn een groot voordeel.

In de onderstaande afbeelding wordt het Hibernate framework geillustreerd.

Hibernate Framework Illustratie

Annotations

Vanaf Java versie 1.5 is het mogelijk om annotaties (annotations) te gebruiken binnen je Java projecten.

Dit kopje geeft je een korte inleiding in annotations en het gebruik daarvan.

Wat is een Annotation

Een annotation ziet er als volgt uit:

@<NaamVanAnnotatie>


Door gebruik te maken van annotaties wordt het mogelijk meta-informatie toe te voegen aan je source code. De annotatie voegt dus bruikbare informatie toe maar maakt zelf geen deel uit van de code.


Voorbeelden van Annotations

Voorbeelden van annotaties welke standaard in Java zitten:

Annotatie: @Override

Deze annotatie geeft aan dat de ontwikkelaar een methode overschrijft welke gedefinieerd is in een superclass. Bij het compilen van de code zal de compiler deze ‘hint’ (de annotatie) verfieeren. Indien de methode niet bestaat in een superclass, en dus niet ‘override’, dan zal de code niet compileren.

Toepassingsvoorbeeld:

public class Superclass {
    public void doSomething() {
        System.out.println("Do something nice");
    }
}
 
public class Subclass extends Superclass {
   @Override
    public void doSomething(){
        System.out.println("Do something really nice");
    }
}


Annotatie: @Deprecated

Deze annotatie geeft bijvoorbeeld aan dat een methode of class “deprecated” is.
Wanneer een methode of class deprecated is wil dat zeggen het het gebruik van zo’n methode of class voorkomen dient te worden, dit omdat de methode of class bijvoorbeeld in een volgende versie verwijderd wordt.


Toepassingsvoorbeeld:

@Deprecated
public void veryOldMethod() {
}


Annotations gebruikt met een voorbeeld

Hibernate ondersteunt het gebruik van annotaties om de relatie uit te drukken tussen domein objecten en database tabellen.

Binnen het voorbeeld wordt gebruik gemaakt van annotaties om het domein object Customer te koppelen aan de tabel “CUSTOMER”. Verder worden de attributen van het object Customer gekoppeld aan kolommen in de tabel.

Java domein Object Tabel in database

Image:Hibernate_annotations.jpg


Uitleg annotaties:

@Entity
Door de class Customer te annoteren als entiteit wordt het mogelijk de class Customer te persisteren via Hibernate.


@Table
De entiteit (class) Customer wordt gekoppeld aan de tabel met naam “CUSTOMER”.
Syntax:
@Table(name = "<naamVanDeTabel>")


@Id / @GeneratedValue
Deze twee annotaties worden gezamenlijk gebruikt om de primaire sleutel aan te geven en hoe de id’s gegenereerd dienen te worden.


@Column
Dit is de meest gebruikte annotatie omdat hiermee variabelen uit een class gekoppeld worden aan een kolom in de tabel.

In het voorbeeld wordt de annotatie gebruikt om koppeling te leggen tussen de variabele id uit de class aan de primaire sleutel (kolom) id in de tabel. Tevens het koppelen van de variabele name aan de kolom name.
Syntax:
@Column(name="<naamVandeKolom>")

Spring binnen WOSI

Spring maakt het mogelijk voor applicaties om geprogrammeerd te worden vannuit de POJO's.


@Controller
Het basisdoel van de @Controller annotatie is als stereotype voor de geannoteerde klasse te handelen die op zijn rol wijst. De @Controller annotation wijst erop dat een bepaalde klasse dient als de rol van een controller. De dispatcher zal dergelijke geannoteerde klassen voor in kaart gebrachte methodes aftasten, op zoek gaand naar @RequestMapping annotaties (zie de volgende sectie).
De @RequestMapping annotation wordt gebruikt om URL's zoals list.wosi door te verwijzen


@RequestParam
De @RequestParam annotation wordt gebruikt om verzoekparameters aan een methodeparameter in uw controlemechanisme te binden.


@ModelAttribute
@ModelAttribute heeft 2 scenario's in controllers. Wanneer het geplaatst wordt op een methode parameter, @ModelAttribute wordt dan gebruikt om een model attribuut te koppelen aan een specifieke, annotated methode parameter. Dit is hoe de controller een referentie naar het object welke de data beva ingevoerd in de form krijgt.
@ModelAttribute wordt ook gebruikt op methode niveau om referentie data voor het model te voorzien.


@SessionAttributes
De type-level @SessionAttributes annotation declareert sessie attributen welke worden gebruikt door een specifieke handler. Dit zal normaal een lijst van de namen van model attributen maken welke transparant opgeslagen horen te worden in de sessie.


@InitBinder
Controller methoden annoteren met @InitBinder laat jouw toe om web data te configureren direct in je controller klasse.

Personal tools