Apache Struts (3) - i18n, jsp stránky, kompilace

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 15448×

Internacionalizace (i18n)

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"/>

Část View - JSP stránky

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í:

index.jsp

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>

login.jsp

Další stránkou je login.jsp. Důkladněji si projdeme jen uživatelské značky, zbylé HTML je jasné.

ZnačkaPopis
<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>

welcome.jsp

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>

Nastavení Ant, kompilace

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.

Nasazení aplikace na serveru

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

Příště

Podrobněji probereme formuláře, ActionForm, DynaActionForm, jejich validaci metodou a vestavěným validátorem.

Ke stažení

Současná podoba aplikace

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=733