Struts a checkbox
HTML checkboxy mají tu nepříjemnou vlastnost, že pokud nejsou zašktnuté, browser je vůbec neodesílá. V běžných případech to nevadí, když nedojde, je to false, když ano, je to true. Problém se ale objeví v následujícím příkladu.
Formulář pro úpravu více záznamů současně
Představme si aplikaci, ve které chceme uživateli nabídnout k editaci více záznamů najednou — například chceme administrátorovi systému umožnit nastavit ostatním uživatelům nějaký příznak. A protože se jedná o častou operaci, chceme, aby měl nástroj co nejjednodušší. Nabídneme mu tedy následující formulář:
<p> Franta: <input type="hidden" name="userId" value="123"/> <input type="text" name="password" value=""/> <input type="checkbox" name="disabled" value="true"/> </p> <p> Pepa: <input type="hidden" name="userId" value="456"/> <input type="text" name="password" value=""/> <input type="checkbox" name="disabled" value="true"/> </p> ... a dalších 30 řádků.
Na něm může administrátor nastavovat potřebné příznaky a měnit hromadně další nastavení účtů.
Struts nám ve zpracování takového formuláře vycházejí vstříc, stačí do příslušné form bean vložit:
private Integer[] userId; private String[] password; private boolean[] disabled;
a doplnit odpovídající gettery a settery. Pole, která po odeslání formuláře obdržíme, projdeme for-cyklem a navaříme si z nich potřebné Data Transfer Objecty, které pak Struts Action nějak zpracuje (to už není pro náš příklad podstatné). Pozorný čtenář již tuší zádrhel. Zatímco u textů, hidden inputů a selectů mají výsledná pole stejnou délku a položky se stejným indexem patří ke stejnému záznamu, při použití checkboxů se nám celá struktura rozsype. Dostanou se k nám jen checkboxy zaškrtnuté a při vytváření DTO skončíme s největší pravděpodobností s ArrayIndexOutOfBoundsException — právě nad polem boolean hodnot. Nehledě na to, že do výsledných DTO nacpeme nesmysly.
Ať to řeší klient
Pokud víme, že máme k dispozici JavaScript, pomůžeme se malým trikem:
function switch(checkbox, hiddenId) {
var hiddenItem = document.getElementById(hiddenId);
if (checkbox.checked) {
hiddenItem.value="true";
} else {
hiddenItem.value="false";
}
}
<p>
Pepa:
<input type="hidden" name="userId" value="456"/>
<input type="text" name="password" value=""/>
1<input type="checkbox" name="dummy" value="true" onchange="switch(this, disabled 456);"/>
<input type="hidden" name="disabled" value="true" id="disabled 456"/>
</p>
Místo checkboxu použijeme hidden input, a podle toho jak náš administrátor zaškrtává a odškrtává checkboxy, měníme zastupujícím hiddenům hodnoty. Jednoduché, účinné a ve Strutsech pak nemusíme nic řešit.
Ať to řeší server
Předchozí metoda není zcela čistá a nelze ji nasadit všude. Druhou variantou je posílat si jako hodnotu checkboxu nějakou jednoznačnou identifikaci, v našem případě například userId.
<p> Franta: <input type="hidden" name="userId" value="123"/> <input type="text" name="password" value=""/> <input type="checkbox" name="disabled" value="123"/> </p>
Tím získáme pole userId všech uživatelů, které chce náš administrátor označit jako "disabled". Zůstává tedy vyřešit, jak elegantně pro každého uživatele určit jestli je nebo není disabled.
Upravíme setter pole "disabled"
public void setDisabled(Integer[] disabled) {
this.disabled = disabled;
Arrays.sort(this.disabled);
}
A v okamžiku vytváření DTO rozhodneme o boolean hodnotě pomocí Arrays.binarySearch(...):
for (int a=0; a< userId.lenght; a++) {
Integer currentUser = userId[a];
boolean isDisabled = (Arrays.binarySearch(disabled, currentUser) >= 0);
...
}
Pořadí prvků ve formuláři
Opravdu je někde zaručeno, že browser pošle data z formuláře v tom pořadí, v jakém jsou uvedeny na stránce? Našel jsem pouze něco málo na w3.org, pokud někdo víte víc, dejte mi prosím vědět.
Open-source Java se opravdu nechystá
Poslední dobou se vedlo hodně diskusí na téma, zda by Java neměla přejít na open-source. Stručné shrnutí najdete na Dagblogu; začal to otevřeným dopisem Eric Raymond, a myšlenky se hned chopila IBM a začala Sun pošťuchovat.
Tento týden to Scott McNealy rozsekl veřejným prohlášením, že Java v blízké době opravdu open-source nebude. A na adresu IBM vzkazuje: "Go open source with DB2 and then you can tell me what to do with my assets,".
Zdroj: GCN.com
Složený primární klíč EJB Entity
Když už se dostanete do situace, kdy si musíte napsat třídu pro složený primární klíč ručně, místo toho, abyste zapřáhli xDoclet nebo vaše oblíbené IDE, pamatujte, že příslušné vlastnosti (česky fieldy) primárního klíče musí být public.
JBoss 3.2.1, na kterém jsem měl čest tuto chybu spáchat, lišácky zareagoval vytvářením dotazů "SELECT FROM tabulka ... ". Prostě nenapsal, "co" chce vlastně selectovat. SQLException už pak není překvapením.
Takové chyby se hledají špatně 