1. Internacionalização
Prepare arquivos de recursos O formato de nomenclatura dos arquivos de recursos é o seguinte:
baseName_idioma_país.properties
nomebase_idioma.properties
nomebase.properties
Entre eles, baseName é o nome base do arquivo de recurso. Podemos personalizá-lo, mas idioma e país devem ser o idioma e o país suportados pelo java. como:
China Continental: baseName_zh_CN.properties
Estados Unidos: baseName_en_US.properties
Agora adicione dois arquivos de recursos ao aplicativo:
O primeiro armazena chinês: csdn_zh_CN.properties
O conteúdo é: bem-vindo=Bem-vindo ao Chuanzhi Podcast O segundo depósito é inglês (Estados Unidos): csdn_en_US.properties
O conteúdo é: bem-vindo = bem-vindo ao csdn
Para arquivos de propriedades chineses, depois de escrevê-los, devemos usar o comando native2ascii fornecido pelo jdk para converter os arquivos em arquivos codificados em Unicode. O comando é usado da seguinte forma:
arquivo de origem Native2ascii.properties arquivo de destino.properties
2. Configure recursos globais e produza informações internacionais
Depois de preparar o arquivo de recursos, podemos defini-lo como um arquivo de recursos global por meio da constante struts.custom.i18n.resources em struts.xml, como segue:
<constant name="struts.custom.i18n.resources" value="csdn" />
csdn é o nome base do arquivo de recurso.
Posteriormente podemos acessar as informações de internacionalização na página ou na ação:
Use a tag <s:text name=""/> na página JSP para gerar informações de internacionalização:
<s:text name="user"/>, name é a chave no arquivo de recurso
Na classe Action, você pode herdar ActionSupport e usar o método getText() para obter informações de internacionalização. O primeiro parâmetro deste método é usado para especificar a chave no arquivo de recursos.
Na tag do formulário, especifique a chave no arquivo de recurso por meio do atributo key, como:
<s:textfield name="nome real" key="usuário"/>
3. Internacionalização - Gere informações de internacionalização com espaços reservados
O conteúdo do arquivo de recurso é o seguinte:
bem-vindo= {0}, bem-vindo ao Podcast Chuanzhi {1}
Gere informações de internacionalização com espaços reservados na página jsp
<s:text name="bem-vindo">
<s:param><s:property value="nomereal"/></s:param>
<s:param>Aprendizado</s:param>
</s:texto>
Para obter informações de internacionalização com espaços reservados na classe Action, você pode usar o método getText(String key, String[] args) ou getText(String aTextName, List args).
4. Internacionalização – arquivos de recursos de escopo
Em um aplicativo grande, todo o aplicativo possui uma grande quantidade de conteúdo que precisa ser internacionalizado. Se colocarmos todo o conteúdo internacionalizado no arquivo de atributos de recursos globais, isso obviamente fará com que o arquivo de recursos se torne muito grande, inchado e inconveniente. para manter. Às vezes podemos usar o escopo do pacote para organizar arquivos de internacionalização para diferentes módulos.
Veja como:
Coloque o arquivo de recurso package_language_country.properties no pacote java. O pacote é um método de gravação fixo neste pacote e os subpacotes podem acessar este recurso. Ao procurar mensagens com uma chave especificada, o sistema primeiro pesquisará no arquivo de recursos do pacote. Quando a chave correspondente não puder ser encontrada, ele pesquisará no arquivo de recursos especificado pela constante struts.custom.i18n.resources.
5. Arquivo de recursos de escopo de ação de internacionalização
Também podemos especificar um arquivo de recursos separadamente para uma ação da seguinte forma:
No caminho onde a classe Action está localizada, coloque o arquivo de recurso ActionClassName_language_country.properties ActionClassName é o nome simples da classe de ação.
Ao procurar mensagens com uma chave especificada, o sistema primeiro pesquisará no arquivo de recurso ActionClassName_language_country.properties. Se a chave correspondente não for encontrada, ele pesquisará o arquivo de recurso com o pacote de nome básico junto com o pacote atual até encontrá-lo. o pacote de nível superior. Se a chave correspondente não for encontrada, ela será finalmente pesquisada no arquivo de recursos especificado pela constante struts.custom.i18n.resources.
6. Internacionalização – acesso direto a um arquivo de recursos em JSP
Struts2 nos fornece a tag <s:i18n> Usando a tag <s:i18n> podemos obter dados internacionalizados diretamente de um arquivo de recurso no classpath sem qualquer configuração:
<s:i18n nome="csdn">
<s:text name="bem-vindo"/>
</s:i18n>
csdn é o nome base do arquivo de recurso no caminho de classe.
Se o arquivo de recursos que você deseja acessar estiver em um determinado pacote no classpath, você poderá acessá-lo assim:
<s:i18n name="cn/csdn/action/package">
<s:text name="bem-vindo">
<s:param>Xiao Zhang</s:param>
</s:texto>
</s:i18n>
O acima acessa o arquivo de recursos basicamente denominado pacote no pacote cn.csdn.action.
7. Linguagem de Expressão OGNL
OGNL é a abreviatura de Object Graphic Navigation Language, que é um projeto de código aberto. A estrutura Struts 2 usa OGNL como linguagem de expressão padrão.
Comparado com expressões EL, ele fornece algumas funções que normalmente precisamos, como:
Suporta chamadas de método de objeto, como xxx.sayHello();
Suporta chamada de método estático de classe e acesso a valor. O formato da expressão é @[nome completo da classe (incluindo caminho do pacote)]@[nome do método | nome do valor], por exemplo: @java.lang.String@format('foo %s'). , 'barra') ou @cn.csdn.Constant@APP_NAME;
Manipule objetos de coleção.
Ognl tem um conceito de contexto. Para ser franco, contexto é uma estrutura MAP, que implementa a interface java.utils.Map. No Struts2, a implementação do contexto é ActionContext.
Para acessar objetos no contexto, você precisa usar o símbolo # para marcar o namespace, como #application, #session
Além disso, OGNL definirá um objeto raiz (objeto raiz). No Struts2, o objeto raiz é ValueStack (pilha de valores). Se quiser acessar as propriedades do objeto no objeto raiz (ou seja, ValueStack), você pode omitir o namespace # e acessar diretamente as propriedades do objeto.
No struts2, a classe de implementação do objeto raiz ValueStack é OgnlValueStack. Este objeto não armazena apenas um único valor como imaginamos, mas armazena um grupo de objetos. Existe uma variável raiz do tipo List na classe OgnlValueStack, que é usada para armazenar um grupo de objetos.
|--solicitação
|--aplicação
contexto ------|--variável raiz OgnlValueStack [ação, OgnlUtil, ...]
|--sessão
|--atributo
|--parâmetros
O primeiro objeto na variável raiz é chamado de objeto no topo da pilha. Normalmente podemos acessar as propriedades do objeto na variável raiz escrevendo diretamente o nome da propriedade na expressão OGNL. A sequência de pesquisa começa no objeto no topo da pilha. no topo da pilha, ele será pesquisado a partir do segundo objeto, caso não seja encontrado, pesquise a partir do terceiro objeto e acesse-o em sequência até ser encontrado.
Atenção: No Struts2, as expressões OGNL precisam ser utilizadas com tags do Struts. Por exemplo: <s:valor da propriedade="nome"/>
Como ValueStack é o objeto raiz do OGNL no Struts 2, se o usuário precisar acessar os objetos na pilha de valores, a página JSP pode acessar diretamente as propriedades dos objetos no ValueStack por meio da seguinte expressão EL:
${foo} //Obtém o atributo foo de um objeto na pilha de valores
Caso você acesse objetos em outros Contextos, por não serem objetos raiz, será necessário adicionar o prefixo # ao acessar.
objeto aplicação: utilizado para acessar o ServletContext, como #application.userName ou #application['userName'], que equivale a chamar getAttribute("username") do ServletContext.
objeto de sessão: usado para acessar HttpSession, como #session.userName ou #session['userName'], que equivale a chamar session.getAttribute("userName").
objeto request: Mapa usado para acessar atributos HttpServletRequest, como #request.userName ou #request['userName'], que equivale a chamar request.getAttribute("userName").
objeto de parâmetros: usado para acessar parâmetros de solicitação HTTP, como #parameters.userName ou #parameters['userName'], que equivale a chamar request.getParameter("username").
Objeto attr: usado para acessar seus atributos na ordem página->solicitação->sessão->aplicativo.
8. Por que você pode usar expressões EL para acessar as propriedades de objetos em valueStack?
A razão é que o Struts2 encapsula ainda mais o HttpServletRequest. O código simplificado é o seguinte:
classe pública StrutsRequestWrapper estende HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
objeto público getAttribute(Strings) {
...
ActionContext ctx = ActionContext.getContext();
Atributo de objeto = super.getAttribute(s); //Primeiro obtém o valor do atributo do escopo da solicitação
if (ctx! = nulo) {
if (attribute == null) {//Se o valor do atributo não for encontrado no intervalo de solicitação, encontre o valor do atributo do objeto no ValueStack
...
Pilha ValueStack = ctx.getValueStack();
atributo = stack.findValue(s);
...
}
}
atributo de retorno;
}
}
9. Crie objetos de coleção Lista/Mapa usando expressões OGNL
Se você precisar de um elemento de coleção (como um objeto List ou um objeto Map), poderá usar as expressões relacionadas à coleção no OGNL.
Use o código a seguir para gerar diretamente um objeto List:
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:valor da propriedade="n"/><br>
</s:iterador>
Gere um objeto Mapa:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:property value="key"/>=<s:property value="value"/><br>
</s:iterador>
A tag Set é usada para colocar um valor em um intervalo especificado.
Escopo: Especifica o escopo em que a variável é colocada. Este atributo pode aceitar aplicação, sessão, solicitação, página ou ação. Se este atributo não for definido, ele será colocado no Contexto OGNL por padrão.
valor: o valor atribuído à variável. Se este atributo não for definido, o valor no topo da pilha ValueStack será atribuído à variável.