Vytváříme multijazyčnou aplikaci pomocí resource souborů, probereme jsp stránky a uživatelské značky Struts, aplikaci zkompilujeme a provedeme první deploy
4.3.2005 06:00 | Miroslav Holubec | přečteno 15826×
Internacionalizace Struts spočívá především v souborech lokalizovaných zpráv, jakýkoliv text nebo obrázek má svůj vlastní klíč. V závislosti na nastavení Locales uživatele aplikace (konkrétně nastavení preference jazyků jeho prohlížeče), se načte správný soubor obsahující klíče a jím odpovídající položky. Načítání a zároveň ukládání souborů zpráv do vyrovnávací paměti se provádí při vyžádání první lokalizované hodnoty. Soubory v našem příkladu umístíme do balíku cz.linuxsoft.web.struts.shop.resources
, konkrétně zde vytvoříme soubor MessageResources_cs_CZ.properties
pro českou verzi, MessageResources_en_US.properties
pro americkou angličtinu, apod. Pokud se nenalezne soubor s požadovaným jazykem, použije se standartní soubor zpráv MessageResources.properties
. V některém z příštích dílů si ukážeme, jak místo souborů použít data z databáze. Následuje ukázka ze souboru s českou lokalizací, jelikož je celý soubor v čistém ASCII, musí se ostatní znaky převést na opis unikódu utilitou native2ascii
.
# -- other errors --- errors.invalidlogin=Neplatn\u00e9 \u00fadaje # -- login -- login.title=P\u0159ihla\u0161ovac\u00ed str\u00e1nka login.username=U\u017eivatel login.password=Heslo login.submit=Ode\u0161li login.invalid=Neplatn\u00e9 p\u0159ihl\u00e1\u0161en\u00ed #-- welcome -- welcome.title=V\u00edtej welcome.back=V\u00edtej zp\u011bt #-- global -- global.user=U\u017eivatel
Nastavení lokalizace je umístěno ve struts-config.xml
v části message-resources
. Atribut parameter
udává cestu k souborům zpráv a výchozí jméno souboru, atribut null
říká, že pokud se nenalezne hodnota s daným klíčem, místo chyby serveru se zobrazí tento klíč.
<message-resources parameter="cz.linuxsoft.web.struts.shop.resources.MessageResources" null="true"/>
Struts v této části modelu MVC především nabízejí uživatelské značky nezávislé na implementaci stránek. Úzce však spolupracují s technologií Java Server Pages, jenž je součástí J2EE. Uživatelské značky lze rozdělit do těchto hlavních oblastí:
První JSP stránkou, kterou vytvoříme, je index.jsp
.
Pokud chceme začít používat uživatelské značky Struts, je potřeba je do stránky vložit direktivou taglib. Samotný výklad technologie JSP přesahuje rámec článku, zájemce odkazuji na seriál.
<%@ page pageEncoding="UTF-8" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <%-- přesměrování na standartní akci --%> <logic:redirect forward="default"/>
Tato stránka pouze přesměruje tok aplikace na standartní akci, která je nadefinována v části global-forwards
a action-mappings
. Atribut forward
specifikuje jméno přesměrování, path
říká kam přesměrovat, a redirect
určuje, zda budeme přesměrovávat vnitřně v rámci serveru, nebo klientovi (což vede i ke změně URL). Standartní hodnotou je false, tedy vnitřní předání toku na serveru. Akce pak jen předá řízení toku stránce login.jsp
v adresáři pages
.
<global-forwards> <forward name="default" path="/do/default" redirect="false"/> </global-forwards> <action-mappings> <action path="/default" forward="/pages/login.jsp" unknown="true"/> <!-- další akce --> <action-mappings>
Další stránkou je login.jsp
. Důkladněji si projdeme jen uživatelské značky, zbylé HTML je jasné.
Značka | Popis |
---|---|
<html:xhtml /> | určuje, že typ dokumentu bude XHTML |
<html:html> | vloží začátek html stránky (tag html) |
<bean:message key="login.title" /> | zobrazí text s klíčem login.title (viz část o i18n) |
<html:errors /> | zobrazí chyby předávané jsp stránce akcí |
<html:form action="/login" method="post"> | říká jakou akcí budou zpracována data z formuláře |
<html:rewrite page="/theme/style.css" /> | přepíše relativní cestu z kořenového adresáře aplikace na absolutní |
<html:link action="/logout">Logout</html:link> | vytvoří odkaz na akci logout |
<bean:write name="user" property="realName" /> | vypíše člena realName beany user |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <%@ page contentType="text/html" %> <%@ page pageEncoding="UTF-8" %> <%-- definice knihoven Struts --%> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <html:xhtml /> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title><bean:message key="login.title" /></title> <link rel="stylesheet" type="text/css" href="<html:rewrite page="/theme/style.css" />"> </head> <body> <h1><bean:message key="login.title" /></h1> <div class="errors"> <html:errors /> <br /><br /> </div> <html:form action="/login" method="post"> <table> <tr><td><bean:message key="login.username" /></td><td>:</td> <td><html:text property="username" value="" /></td></tr> <tr><td><bean:message key="login.password" /></td> <td>:</td><td><html:password property="password" value="" /></td></tr> </table> <p><html:submit><bean:message key="login.submit" /></html:submit></p> </html:form> </body> </html:html>
Poslední stránkou je welcome.jsp
. Jejím jediným úkolem je zobrazení uživatelského menu a uvítací zprávy.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <%@ page contentType="text/html" %> <%@ page pageEncoding="UTF-8" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <html:xhtml /> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title><bean:message key="welcome.title" /></title> <link rel="stylesheet" type="text/css" href="<html:rewrite page="/theme/style.css" />"> </head> <body> <div class="errors"> <html:errors /> </div> <div class="menu"> <table> <td><html:link action="/logout">Logout</html:link></td> <td class="username"><bean:message key="global.user" />: <bean:write name="user" property="realName" /></td> </table> </div> <div class="body"> <bean:message key="welcome.back" /> </div> </body> </html:html>
Apache Ant je software, jenž nám usnadňuje práci s kompilací java projektů. Zájemce o bližší popis odkazuji na seriál Nebojte se mravence. Pokud jste dosud postupovali podle tohoto návodu, tj. upravovali aplikaci struts-blank, tak v adresáři WEB-INF/src
naleznete soubor build.xml
. V něm je potřeba především upravit cestu ke knihovně servletu aplikačního serveru a poté doplnit proměnou ${servlet.jar}
do seznamu CLASSPATH projektu. Po úpravě tedy build.xml
vypadá následovně.
<project name="shop" basedir="../" default="all"> <!-- Local system paths --> <property name="servlet.jar" value="/usr/local/share/jboss-4.0.1/server/default/lib/javax.servlet.jar"/> <property name="distpath.project" value="../../deploy"/> <!-- Project settings --> <property name="project.title" value="LinuxSoft Shop"/> <property name="project.distname" value="shop"/> <property name="project.version" value="1.0"/> <!-- Path settings --> <property name="doc.path" value="./doc/api"/> <property name="doc.src" value="./src/java"/> <!-- classpath for Struts 1.1 --> <path id="compile.classpath"> <pathelement path ="lib/commons-beanutils.jar"/> <pathelement path ="lib/commons-digester.jar"/> <pathelement path ="lib/struts.jar"/> <pathelement path ="classes"/> <pathelement path ="${servlet.jar}"/> <pathelement path ="${classpath}"/> </path> <!-- Check timestamp on files --> <target name="prepare"> <tstamp/> </target> <!-- Copy any resource or configuration files --> <target name="resources"> <copy todir="classes" includeEmptyDirs="no"> <fileset dir="src/java"> <patternset> <include name="**/*.conf"/> <include name="**/*.properties"/> <include name="**/*.xml"/> </patternset> </fileset> </copy> </target> <!-- Normal build of application --> <target name="compile" depends="prepare,resources"> <javac srcdir="src" destdir="classes"> <classpath refid="compile.classpath"/> </javac> </target> <!-- Remove classes directory for clean build --> <target name="clean" description="Prepare for clean build"> <delete dir="classes"/> <mkdir dir="classes"/> </target> <!-- Build entire project --> <target name="project" depends="clean,prepare,compile,javadoc"/> <!-- Create binary distribution --> <target name="dist" description="Create binary distribution"> <mkdir dir="${distpath.project}"/> <jar jarfile="${distpath.project}/${project.distname}.jar" basedir="./classes"/> <copy file="${distpath.project}/${project.distname}.jar" todir="${distpath.project}"/> <war basedir="../" warfile="${distpath.project}/${project.distname}.war" webxml="web.xml"> <exclude name="${distpath.project}/${project.distname}.war"/> </war> </target> <!-- Build project and create distribution--> <target name="all" depends="project,dist"/> </project>
Poté již jen stačí spustit příkazem ant compile dist
samotnou kompilaci a vytvoření archivu WAR.
WAR soubor (z adresáře deploy) nakopírujte do adresáře /usr/local/share/jboss-4.0.1/server/default/
, server se o zbytek postará sám. Po spuštění serveru otestujte funkčnost aplikace na adrese http://localhost:8080/shop
Podrobněji probereme formuláře, ActionForm, DynaActionForm, jejich validaci metodou a vestavěným validátorem.