Dynamic Web Project a chybějící knihovna javax.servlet

Pokud si vytvoříte Dynamic Web Project v Eclipse, přidáte Tomcat a pokusíte se vytvořit vlastní servlet, může se vám stát, že knihovnu javax.servlet nelze importovat. Řešením je přidat Apache Tomcat runtime: pravým na projekt -> Properties -> v pravo záložka Runtimes -> zakliknout Apache Tomcat -> potvrdit.

Zdroj: stackoverflow.com/…/the-superclass-javax-servlet-http-httpservlet-was-not-found-on-the-java-build/30161602

Responsivní tlačítka v Vaadinu

V tomto příspěvku ukážu, jak vytvořit ve Vaadin 8 tlačítka, která se přizpůsobí velikosti prohlížeče. Pokud bude mít prohlížeč šířku větší než 500px, rozbrazí se tlačítko včetně popisku. Pokud bude šířka menší než 500px, zobrazí se pouze ikona.

VerticalLayout layout = new VerticalLayout();
layout.addStyleName("flexible-layout");
Responsive.makeResponsive(layout);

Button btnAir = new Button("Airplane", VaadinIcons.AIRPLANE);
btnAir.addStyleName("flexible-button");
Button btnBoat = new Button("Boat", VaadinIcons.BOAT);
btnBoat.addStyleName("flexible-button");
Button btnEye = new Button("Eye", VaadinIcons.EYE);
btnEye.addStyleName("flexible-button");
Button btnUser = new Button("User", VaadinIcons.USER);
btnUser.addStyleName("flexible-button");
layout.addComponents(btnAir, btnBoat, btnEye, btnUser);

Tlačítku přidávám styl flexible-button a layoutu flexible-layout. Aby to fungovalo, je ještě potřeba udělat layout responsivní pomocí statické metody Responsive.makeResponsive().

Ostylování pomocí css. Zde třídě flexible-layout přidávám range a určuji, jak má v daném rozsahu vypadat styl třídy flexible-button.

@import "../valo/valo.scss";

@mixin mytheme {
    @include valo;

    // Insert your own theme rules here
  
	.flexible-layout {
	    background: black;
	    color: white;
	
	.flexible-layout[width-range~="0-499px"] {
	    .flexible-button .v-button-caption {
	    	display: none;
	    }
	}
	
	.flexible-layout[width-range~="500px-"] {
	    .flexible-button .v-button-caption {}
	    
	}
}

A takto to vypadá

Zobrazení effective pom v Idea IDE

V Idea IDE lze efektivní pom zobrazit následovně: Kliknout pravým tlačítkem na pom.xml v projektu -> Maven -> Show Effective POM.

Vysvětlení pojmů

Super pom
Všechny maven projekty dědí z super pomu, který obsahuje defaultní hodnoty. Super pom je rodič všech pom souborů.

Simple pom
Pom, který je ve vašem projektu. V případě jednoduchého projektu není třeba definovat téměr vůbec nic, vše potřebné se vezme ze super pomu.

Effective pom
Spojení super a simple (projektového) pomu.


Zdroje:

Problémy při vytváření webového projektu v Javě

Pokud si necháme vygenerovat projekt pomocí mavenu: File -> New -> Maven project -> maven-archetype-webapp (verze 1.0) -> … a pokud tento projekt nasadíme na Tomcat, zobrazí se očekávaný výstup – jednoduchá stránka s textem „Hello World!“. Problém nastane v okamžiku, kdy začneme používat jsp.
Když původní jednoduchou stránku

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

nahradíme například tímto:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ prefix="c" taglib uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
	<c:set var="message" value="Hello World"/>
	<c:set var="otherMessage" value="This is other message."/>
	<c:set var="display" value="${true}"/>
	<c:if test="${display}">
		<c:out value="${message}"></c:out>
	</c:if>
	<c:out value="${otherMessage}"></c:out>
</body>
</html>

dostaneme tuto chybu:

Číst dál

Proudy v Java 8

Proudové (stream) zpracovávání je novinka Javy 8. Cílem je zjednodušit operace nad posloupnostmi prvků. Umožňují zřetězení operací. Operace se dělí do dvou hlavních skupin:

  • terminální (terminal) – touto operací je proud uzavřen
  • neterminální (intermediate) – vytváří nový proud

Jak je vidět z popisu, neterminální operace lze za sebou řetězit, dokud se nezavolá operace terminální.

Nejpoužívanější operace jsou

forEach terminální všechny prvky proudu postupně odešle konzumentovi
findFirst terminální vrátí první prvek pokud existuje
collect terminální sesbírá elementy a vytvoří z nich návratovou strukturu
map neterminální převede prvky na jiné
filter neterminální filtruje podle zadaného predikátu (podmínky)
sorted neterminální seřadí prvky

Příklady použití.

Číst dál

Testování private static final proměnné

Při testování se můžeme setkat s tím, že potřebujeme otestovat funkcionalitu, která není přes vystavené API přístupná. Jako příklad zde uvedu třídu Extractor. Jedná se o třídu, která čte soubor z přesně zadaného umístění. Z toho důvodu je soubor zadán jako private static final. Jak otestovat metodu getContent(), když nemáme přístup k souboru C:\input.txt (nemůžeme tento soubor modifikovat a dokonce tento soubor ani nemusí v době testů existovat)? Řešením je použít reflexi.

Extractor.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Extractor {
	private static final File INPUT = new File("C:\\input.txt");
	
	public Extractor() {}
	
	public String getContent() {
		String result = "";
		try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(INPUT), "UTF-8"))) {
			String line;
			while ((line = br.readLine()) != null) {
				result = result + line;
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
		return result;
	}
}

Testovací soubor testinput.txt umístěný v src/test/resources.

Číst dál

Ignorování JUnit testů

V případě, že potřebujete, aby se některé JUnit testy nespouštěly, nabízí JUnit anotaci @Ignore (javadoc).

import org.junit.Ignore;
import org.junit.Test;

public class JUnitIgnoreTest {

	@Ignore
	@Test
	public void test1() {
		assertEquals(11, 22);
	}

	@Test
	public void test2() {
		assertEquals(2, 2);
	}
}

junit-ignore-annotace

Je vidět, test byl ignorován. Pokud bychom anotaci @Ignore v tomto případě zakomentovali, test by spadl. Anotaci je možné použít na celou třídu. V tom případě se neprovede žádný test z této třídy.

Rozhraní a defaultní metody v Javě

Defaultní metody v rozhraní nám umožňují přidávat do rozhraní nové metody bez toho, abychom rozbili původní kód. Zde je jednoduchý příklad.

rozhraní MyIntf.java

public interface MyIntf {
	void print(String text);
}

implementace MyIntfImpl.java

public class MyIntfImpl implements MyIntf {

	@Override
	public void print(String text) {
		System.out.println("Printing: " + text);
	}
}

Číst dál

Nepoužívání hvězdičkového importu v Idea IDE

V případě, že máte několik importů ze stejného balíčku, Idea IDE nahradí jednotlivé importy hvězdičkou (ve výchozím nastavení od pěti importů):

import java.util.*

Pokud vám toto chování nevyhovuje, nastavení lze změnit v Settings -> Editor -> Code Style -> Java -> záložka Imports. Zde nastavte nějaké vysoké číslo.

idea-zakazani-hvezdickovych-importu

import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Map;