JTraining Blog

A short description about your blog
svanhugten
svanhugten

When working with JSF 1.x you will eventually find out about some of its annoying features. Such as that it is all about HTTP POST and nothing but HTTP POST. So when working with forms with inputTextArea components you will notice that refreshing or navigating away and then back will leave them blank again. Some of customers I worked for had a problem understand this limitation, because dropdown boxes just worked fine and demanded that the text areas work the same.

I found a small piece of code that will remedy this shortcoming.   

 


Tagged in: Java EE 6 , Java EE , Ajax4JSF , Ajax
svanhugten
svanhugten

It's something that it very hard to find once some of your RichFaces pages are suddenly acting very weird, like sortable columns only sorting once and then ignoring all other requests. It turns out that the following configuration changes the way events and life cycle are handled, breaking AJAX.

<context-param> 

<param-name>facelets.BUILD_BEFORE_RESTORE</param-name> 


Tagged in: RichFaces , Java EE 6 , Facelets , Ajax4JSF
svanhugten
svanhugten

... Java is dead! But that's a good thing if you believe the writer of the following article:

http://muckandbrass.com/web/display/~cemerick/2009/10/01/Java+is+dead,+but+you'll+learn+to+love+it

In short he elaborates  on the fact that Java has now become a settled language like C and that any major changes would break more things than that it would change for the better. The world of tomorrow is for languages such as Scala and Groovy. To discuss the subject here, I would like to refer you all to the group discussion.


Tagged in: Java EE 6 , Java EE
svanhugten
svanhugten

A classic from lifehacker, that introduces you to 10 applications on the web that can make your life much easier, even for free. A must read, found at:  

http://lifehacker.com/5361979/top-10-underhyped-webapps-2009-edition

I  really like the TinyChat and the Aviary Suite.


Tagged in: tools , ExternalNews
svanhugten
svanhugten

In my daily job I use Hibernate as my favourite ORM-framework. It's very convenient not having to think about all those low-level database stuff, but sometimes you can encounter some problems with the non- or badly documented features that can cause a lot of agitation and loss of time.

A few of these quirks are already documented at this link, but I would like to also add a few of my tips below.

 


Tagged in: ORM , Java EE 6 , Hibernate
svanhugten
svanhugten

As of the 1st of juli the specification of JSR-314, also known as JSF 2.0, has become final. This means it's high time to look at all the changes, hopefully all improvements, that this new version brings us.

Throughout the years of the existence of JSF it has been flooded with critique. Combine that with the rise of new alternatives like RIA (e.g. Adobe Flex) and you understand that SUN must come up with something very good to make any meaningful impact. Fortunately the JSF team, led by Ed Burns and Roger Kitain, listened to all the critics and at the same time tried to unify the wild growth of implementations. A leading rule is; less configuration, more convention.

A number of features to look out for:


Tagged in: JSF , Java EE 6 , Ajax
svanhugten
svanhugten

De annotaties zijn al een tijdje ingeburgerd in Java en iedereen die ooit met Java 1.5 of hoger heeft gewerkt, zal het vertrouwde @-tje herkennen, maar hoe vaak heb je er nu een zelf gemaakt? Waarschijnlijk nooit, want dat is toch het domein van de Springs, Hibernates en andere frameworks in deze wereld. Hoe gaat het überhaupt in zijn werk? Het is namelijk geen onderdeel van een of ander certificaat.
Op internet zijn wel wat dingen te vinden over hoe annotaties te maken, maar daarbij valt me op dat er nooit wordt ingegaan op zogenaamde runtime annotaties, annotaties die je ook tijdens het runnen van jouw programma kunt gebruiken.

Annotaties zijn in feite niet meer dan interfaces:

public
@interface Ranked {
      String column() default "";
}

Er vallen wel een aantal dingen op; voor het keyword interface staat een @-tje en de property declaratie ziet er heel verschillend uit. Ook ben je wat beperkt in je typekeuze voor een property. Alleen primitieve types, String, Class, annotaties en enums mogen of een 1-dimensionale array hiervan. Geen objecten dus. In de praktijk is dit echter niet echt een belemmering.
Het keyword default geeft, geheel verwacht, een standaard waarde aan de property. Als je dit keyword weglaat, is deze property verplicht om in te vullen.
De overige configuratie kun je op de interface annoteren en zal ik even de vier nuttigste opties doornemen:

@Retention:
Dit geeft aan wanneer een annotatie beschikbaar is op de class. Dit kan zijn alleen tijdens build-time, tijdens compile-time of tijdens runtime. Zie de enum RetentionPolicy.

@Target
Dit geeft aan waar de annotatie geldig is, bv. op types, fields of methods. Zie de enum ElementType.

@Documented
Dit geeft aan of de annotatie ook wordt meegenomen met de Javadoc.

@Inherited
Dit geeft aan of de annotatie ook wordt doorgegeven via inheritance.

Onze annotatie zie er na configuratie er als volgt uit:

@Retention(value=RetentionPolicy.RUNTIME)
@Target(value={ElementType.TYPE})
@Documented
public @interface Ranked {

}

Dus kunnen we deze annotatie tijdens runtime nog steeds gebruiken en mag deze alleen op classes worden gebruikt. De @Documented spreekt vanzelf.
Nu is de annotatie klaar voor gebruik op de bekend manier:

/*
* Deze class is geranked.
*/
@Ranked
public class Product {

}
 
Nu moeten we ook nog wat met deze property gaan doen, want ook al lijkt Spring soms magisch, het werkt niet vanzelf. Onze magie zit bijvoorbeeld in de DAO, waar we entiteiten met @Ranked automatisch sorteren. (Ja, ik weet dat dit ook kan met @Sort kan)

if (persistentClass.isAnnotationPresent(Ranked.class)) {
            return findByCriteriaOrdered(Order.desc(RANK));
}

Waar het hier om gaat is de method isAnnotationPresent van de class Class. Deze kijkt of een annotatie tijdens runtime (vandaar de RetentionPolicy) in de class aanwezig is. Als dat zo is, kun je daarmee iets doen, zoals hier gebeurd.


Tagged in: Reflection , Java SE , Java EE 6 , Java EE
svanhugten
svanhugten

 

Het uploaden van bestanden is vaak een niet-triviale taak. Eerst moet je het bestand worden gevalideerd op type en grootte, naar een tijdelijke bestemming worden gestreamed en daarna gekopieerd, wat nu al simpeler klinkt dan het is als je het zelf moet doen.
Met RichFaces wordt het echter een stuk simpeler, een oplossing die ik jullie niet wilde onthouden.

De component:

Met de <rich:fileUpload> tag plaats je de component. In mijn geval ziet het er als volgt uit:

<rich:fileUpload maxFilesQuantity="1"
            immediateUpload="true"  onsizerejected=
"alert('Uw bestand mag niet groter dan 1000KB zijn');"
            ontyperejected=
"alert('Alleen *.jpg, *.gif, *.png en *.bmp bestanden zijn toegestaan als plaatje');"
            acceptedTypes=
"jpg, gif, png, bmp"
            fileUploadListener="#{bean.upload}">
</rich:fileUpload>


Dit creëert een upload-component dat één plaatje accepteert en het meteen upload na het selecteren. Als het groter is dan 1000KB (te configureren als maxRequestSize init-param bij het rich-faces filter in web.xml) of als niet voldoet aan de bestandtype-eis, dan geeft dit component netjes een melding. De listener verwijst naar een specifiek event in de achterliggende bean.

public void upload(UploadEvent event) throws IOException {
        UploadItem item = event.getUploadItem();
        String filePath = //path waar het bestand naar toe moet

        File file = new File(filePath);
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        // In de web.xml is ook weer configureren of er  tijdelijke bestanden worden
        // gemaakt of dat alleen het geheugen wordt gebruikt. Standaard wordt er
        // gebruik gemaakt van tijdelijke bestanden.
        //<init-param>
        //   <param-name>createTempFiles</param-name>
        //   <param-value>true</param-value>
        //</init-param>   
        if (item.isTempFile()) {
            FileInputStream fis = new FileInputStream(item.getFile());
            IOUtils.write(IOUtils.toByteArray(fis), fos);
            fis.close();
        } else {
            IOUtils.write(item.getData(), fos);
        }
        fos.close();
}


Merk op dat ik bij deze code ook de IOUtils uit Apache Commons gebruik om de bestandsafhandeling aanzienlijk te vereenvoudigen.
Hiermee is het bestand geupload, inclusief nette afhandeling van eventuele fouten. Bedankt RichFaces!











































Tagged in: RichFaces , Java SE , Java EE , Ajax4JSF
svanhugten
svanhugten In deze blog wil ik aandacht schenken aan een framework dat dag in, dag uit mijn leven als Java programmeur makkelijker maakt. Nou ja, een framework... het is meer een verzameling van uitermate handige utility classes die samen Apache Commons vormen. Ik heb er al diverse keren stukjes van gebruikt in blogs, maar in een recent gesprek met collega's kwam ik er achter dat de mogelijkheden van deze classes nog steeds niet bij iedereen bekend zijn. Vandaar dat ik hiermee de aandacht wil vestigen op een aantal, door mij veelgebruikte, classes. Onder het kopje Jar vind je het artifact waarin je de class kunt vinden.

StringUtils:

Hoe vaak ik wel niet ‘if (foo != null && !foo.equals.("") && !foo.equals(" "))' heb getikt... Te vaak naar mijn mening. StringUtils maakt hier een einde aan met methods zoals isEmpty, isBlank en de tegenhangers isNotEmpty en isNotBlank. Met een korte functie doen ze wat je zelf ook al heel vaak deed: het checken van een lege string (met Blank mag een spatie wel, met Empty niet), NullPointer-safe. Naast nog tientallen nuttige String methods, vormt dit een van de meest gebruikte classes.

Jar
: commons-lang

Validation:

In dezelfde package zit nog een goede vriend. Met Validate kun je eenvoudig een expressie valideren, van een simpele lege string tot aan een Collection check. Als de validatie faalt, wordt er vanzelf een IllegalStateException gegooit.

Jar
: commons-lang

SerializationUtils:

Iedereen die wel eens een object heeft geserializeert, weet dat dit een aardig aantal regels code vergt. SerializationUtils doet dit allemaal binnen één regel, zo simpel als het maar kan. Serialize(Serializable) geeft een byte array terug en Deserialize(byte[]) geeft het object weer netjes terug.

Jar
: commons-lang

IOUtils:

Nog zo een voorbeeld van veel regels code, het openen en bewerken van bestanden. Het openen, lezen en schrijven van bestanden gaat met een minimale hoeveelheid regels. Andere handige classes, die ik echter niet veel gebruik, zijn FileUtils, FileSystemUtils en CopyUtils.

Jar: 
commons-io

BeanUtils, PropertyUtils:

Deze classes zijn vooral handig voor het kopiëren van data tussen objecten, die hetzelfde zijn, maar uit een ander model komen of voor het vullen van Transfer Objects. De twee classes hebben allebei de methode copyProperties(source, target). Deze kopieert alle properties die accessible zijn, dat wil zeggen een public getter hebben bij de source en een public setter bij de target. Voor een enkele property is er ook een get en setSimpleProperty methode.
Nadeel hiervan is dat het dus ook alleen maar bij simpele Java Beans werkt. Het verschil tussen de twee classes is dat BeanUtils nog een aantal standaard converters heeft die voor de meest voorkomende conversies een converter heeft, zoals een Integer to String. Dit systeem is uitbreidbaar, maar het jammere is dat als de conversie niet lekker loopt, het hele proces meteen faalt, bijvoorbeeld bij een gewone BigDecimal of Calendar. Als je net zoals ik geen zin hebt om een berg extra converters te schrijven, gebruik je PropertyUtils die dit niet doet. Als nuttige extra heeft PropertyUtils ook nog een describe(Object) method, die van het object een lijst met PropertyDescriptors terug geeft, die nét wat meer informatie hebben als een dan een gewone Field.

Jar: 
commons-beanutils

CollectionUtils:

Als laatste wil ik de CollectionUtils bekijken, een class die alles kan met Collections. Deze class kan alles doen met jouw collection wat je maar met verzamelingenleer kunt bedenken. Unions, intersections, filters, disjunctions, predicaten en de rest, het zit er allemaal in. Tevens kun je hier een enorme hoeveelheid specialistische collections vinden, zoals de Bag, FastHashMap en de ArrayStack. Voor de mensen die niet kunnen wachten op Java 7, is er zelfs een Closure class.

Jar: 
commons-collections

Daarnaast zijn er nog een hele hoop andere classes, die ik heel weinig of niet heb gebruikt, maar die zeker nuttig zijn, zoals de ComparatorUtils, DateFormatUtils, DateUtils, LocaleUtils, SystemUtils, EqualsBuilder, HashCodeBuilder, ReflectionToStringBuilder, FactoryUtils, StrBuilder en de StrTokenizer. Ik kan iedereen aanraden om er eens naar te kijken, want gemak dient de programmeur!

Tagged in: Untagged 
svanhugten
svanhugten Ik moet toegeven, de mensen hebben toch wel een beetje gelijk met de opmerkingen over Spring configuratie met annotaties. Zijn annotaties uiteindelijk niet net zo erg of erger dan XML configuratie? In mijn huidige project kwam dit probleem niet zozeer voor aan de webkant, zoals in mijn blog over de Spring Component Scan, maar in het domeinmodel. De combinatie Hibernate plus Hibernate Search levert een ietwat opmerkelijke class op:

@Entity
@Indexed
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = HTMLStripStandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = SynonymFilterFactory.class, params = {
@Parameter(name = "synonyms", value = "syns.txt"),
@Parameter(name = "ignoreCase", value = "true")
})
})
public class Product {

@Embedded
private ProductID productID;
@Field
@Boost(value=2.0f)
@Analyzer(definition="customanalyzer")
private String naam;
@Field
@Analyzer(definition="customanalyzer")
private Long rank;
@Field
@Boost(value=1.5f)
@Analyzer(definition="customanalyzer")
@Lob
private String omschrijving;

etc.
}


































Tagged in: Untagged 
« StartPrev123NextEnd »

Tags:

Sponsers