1. Vários valores padrão na configuração da ação
<nome do pacote="csdn" namespace="/test" extends="struts-default">
<action name="helloworld" método="executar" >
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</pacote>
1>Se nenhuma classe for especificada para ação, o padrão é ActionSupport.
2>Se nenhum método for especificado para a ação, o método execute() na ação será executado por padrão.
3> Se o atributo nome do resultado não for especificado, o valor padrão será sucesso.
2. Vários tipos de encaminhamento de resultado em Ação
<nome da ação="helloworld">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
A configuração do resultado é semelhante ao encaminhamento no struts1, mas o struts2 fornece vários tipos de resultados comumente usados: dispatcher (valor padrão), redirecionamento, redirecionamento, plainText.
A seguir está um exemplo do tipo de resultado redirectAction, se a ação redirecionada estiver no mesmo pacote:
<result type="redirectAction">olámundo</result>
Se a ação redirecionada estiver em outro namespace:
<result type="redirectAction">
<param name="actionName">olámundo</param>
<param name="namespace">/teste</param>
</resultado>
texto simples: exibe o conteúdo original do arquivo. Por exemplo, quando precisamos exibir o código-fonte do arquivo jsp como está, podemos usar este tipo.
<nome do resultado = "fonte" type = "texto simples">
<param name="local">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- Especifique a codificação para leitura de arquivos -->
</resultado>
No resultado, você também pode usar a expressão ${attribute name} para acessar os atributos na ação. Os nomes dos atributos na expressão correspondem aos atributos na ação. do seguinte modo:
<result type="redirect">view.jsp?id=${id}</result>
3. Múltiplas ações compartilham uma visão - configuração de resultado global
Quando a mesma visão é usada em múltiplas ações, devemos definir o resultado como uma visão global. O encaminhamento global é fornecido em struts1, e funções semelhantes também são fornecidas em struts2:
<pacote....>
<resultados globais>
<result name="message">/message.jsp</result>
</resultados globais>
</pacote>
4. Injete valores nas propriedades da ação
Struts2 fornece função de injeção de dependência para as propriedades em Action. No arquivo de configuração do struts2, podemos facilmente injetar valores nas propriedades em Action. Nota: As propriedades devem fornecer métodos setter.
classe pública HelloWorldAction{
string privada savePath;
string pública getSavePath() {
retornar savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
...
}
<nome do pacote="csdn" namespace="/test" extends="struts-default">
<nome da ação="olámundo" >
<param name="savePath">/imagens</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</pacote>
O acima injeta "/images" no atributo savePath da ação por meio do nó <param>.
5. Especifique o sufixo de solicitação que precisa ser processado pelo Struts 2
Anteriormente usávamos o sufixo .action por padrão para acessar Action. Na verdade, o sufixo padrão pode ser modificado através da constante "struts.action.extension". Por exemplo, podemos configurar o Struts 2 para processar apenas caminhos de solicitação com .do como sufixo:
<?xml versão="1.0" codificação="UTF-8"?>
<!DOCTYPE suporta PUBLIC
"-//Apache Software Foundation//Configuração do DTD Struts 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<suportes>
<constant name="struts.action.extension" value="do"/>
</struts>
Se o usuário precisar especificar vários sufixos de solicitação, separe os vários sufixos com vírgulas (,). como:
<constant name="struts.action.extension" value="do,go"/>
6. Descreva detalhadamente a definição de constantes
As constantes podem ser configuradas em struts.xml ou struts.properties. É recomendado configurá-las em struts.xml. Os dois métodos de configuração são os seguintes:
Configure constantes no arquivo struts.xml
<suportes>
<constant name="struts.action.extension" value="do"/>
</struts>
Configure constantes em struts.properties
struts.action.extension=do
Como as constantes podem ser definidas em vários arquivos de configuração abaixo, precisamos entender a ordem de pesquisa na qual o struts2 carrega as constantes:
struts-default.xml
struts-plugin.xml
suportes.xml
suportes.properties
web.xml
Se a mesma constante for configurada em vários arquivos, o valor da constante configurada no último arquivo substituirá o valor da constante configurada no arquivo anterior.
7. Introdução às constantes comumente usadas
<!-- Especifique o conjunto de codificação padrão, que atua no método setCharacterEncoding de HttpServletRequest e na saída de freemarker e speed -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- Este atributo especifica o sufixo da solicitação que precisa ser processado pelo Struts 2. O valor padrão deste atributo é action, ou seja, todas as solicitações correspondentes a *.action são processadas pelo Struts2.
Se o usuário precisar especificar vários sufixos de solicitação, separe os vários sufixos com vírgulas (,). -->
<constant name="struts.action.extension" value="do"/>
<!-- Defina se o navegador armazena conteúdo estático em cache. O valor padrão é verdadeiro (usado no ambiente de produção. É melhor desligá-lo durante o estágio de desenvolvimento).
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- Quando o arquivo de configuração do struts é modificado, se o sistema recarregará automaticamente o arquivo, o valor padrão é falso (usado no ambiente de produção), é melhor ativá-lo durante o estágio de desenvolvimento -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- Usado no modo de desenvolvimento, para que mensagens de erro mais detalhadas possam ser impressas -->
<constant name="struts.devMode" value="true" />
<!--Tema de visualização padrão-->
<constant name="struts.ui.theme" value="simple" />
<! Ao integrar com spring, especifique que spring é responsável pela criação do objeto de ação -->
<constant name="struts.objectFactory" value="spring" />
<!Esta propriedade define se o Struts 2 suporta chamada de método dinâmico. O valor padrão desta propriedade é verdadeiro. Se precisar desativar a chamada de método dinâmico, você pode definir esta propriedade como falsa. -->
<constant name="struts.enable.DynamicMethodInvocation" valor="false"/>
<!--Limite de tamanho para arquivos enviados-->
<constante nome="struts.multipart.maxSize" valor="10701096"/>
8. Especifique vários arquivos de configuração do struts para o aplicativo
Na maioria dos aplicativos, à medida que a escala do aplicativo aumenta, o número de ações no sistema também aumentará significativamente, fazendo com que o arquivo de configuração struts.xml fique muito inchado. Para evitar que o arquivo struts.xml seja muito grande e inchado e melhorar a legibilidade do arquivo struts.xml, podemos decompor um arquivo de configuração struts.xml em vários arquivos de configuração e, em seguida, incluir outros arquivos de configuração no struts.xml arquivo. O seguinte struts.xml especifica vários arquivos de configuração por meio do elemento <include>:
<?xml versão="1.0" codificação="UTF-8"?>
<!DOCTYPE suporta PUBLIC
"-//Apache Software Foundation//Configuração do DTD Struts 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<suportes>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</struts>
Desta forma, podemos adicionar o Struts 2 Action a vários arquivos de configuração por módulo.
9. Chamada de método dinâmico
Se houver vários métodos na ação, podemos usar !+nome do método para chamar o método especificado. do seguinte modo:
classe pública HelloWorldAction{
mensagem de string privada;
....
public String execute() lança exceção{
this.message = "Minha primeira aplicação struts2";
retornar "sucesso";
}
public String other() lança exceção{
this.message = "Segundo método";
retornar "sucesso";
}
}
Suponha que o caminho da URL para acessar a ação acima seja: /struts/test/helloworld.action
Para acessar o método other() da ação, podemos chamá-lo assim:
/struts/test/helloworld!other.action
Se não quisermos usar a invocação de método dinâmico, podemos desativar a invocação de método dinâmico por meio da constante struts.enable.DynamicMethodInvocation.
<constant name="struts.enable.DynamicMethodInvocation" valor="false"/>
10. Use curingas para definir ações
<nome do pacote="csdn" namespace="/test" extends="struts-default">
<action name="helloworld_*" método="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</pacote>
classe pública HelloWorldAction{
mensagem de string privada;
....
public String execute() lança exceção{
this.message = "Minha primeira aplicação struts2";
retornar "sucesso";
}
public String other() lança exceção{
this.message = "Segundo método";
retornar "sucesso";
}
}
Para acessar o método other(), você pode acessá-lo através de uma URL como esta: /test/helloworld_other.action
11. Receba parâmetros de solicitação
Use tipos básicos para receber parâmetros de solicitação (get/post)
Defina um atributo com o mesmo nome do parâmetro de solicitação na classe Action, e o struts2 poderá receber automaticamente o parâmetro de solicitação e atribuí-lo ao atributo com o mesmo nome.
Caminho da solicitação: http://localhost:8080/test/view.action?id=78
classe pública AçãoProduto {
ID inteiro privado;
public void setId(Integer id) {//struts2 usa tecnologia de reflexão para chamar o método setter da propriedade com o mesmo nome do parâmetro de solicitação para obter o valor do parâmetro de solicitação
isto.id = id;
}
público inteiro getId() {id de retorno;}
}
Use o tipo composto para receber o caminho da solicitação dos parâmetros da solicitação: http://localhost:8080/test/view.action?product.id=78
classe pública AçãoProduto {
produto privado;
public void setProduct(Produto produto) { this.product = produto };
produto público getProduto() {retornar produto;}
}
Struts2 primeiro cria o objeto de produto chamando o construtor padrão de Produto por meio da tecnologia de reflexão e, em seguida, chama o método setter da propriedade com o mesmo nome do parâmetro de solicitação no produto por meio da tecnologia de reflexão para obter o valor do parâmetro de solicitação.
12. O significado da conversão de tipo
Para uma estrutura MVC inteligente, é inevitável implementar a conversão de tipo. Como os parâmetros de solicitação dos aplicativos da estrutura B/S (navegador/servidor) são enviados ao servidor por meio do navegador, esses parâmetros não podem ter tipos de dados ricos, portanto, tipo de dados. a conversão deve ser concluída no lado do servidor
A estrutura MVC é uma solução de camada de apresentação e deve fornecer suporte à conversão de tipo. O Struts2 fornece suporte à conversão de tipo muito poderoso.
13. Processamento de dados da camada de apresentação
Para aplicações web, a camada de apresentação é usada principalmente para interagir com os usuários, incluindo a coleta de dados de entrada do usuário e a apresentação do status do servidor aos usuários. Portanto, o fluxo de dados na camada de apresentação tem principalmente duas direções: dados de entrada e dados de saída.
Para dados de entrada: você precisa concluir a conversão de dados de string em vários tipos de dados. O programa geralmente não pode ser concluído automaticamente e precisa ser convertido manualmente no código.
Para dados de saída: Java e jsp suportam saída direta de vários tipos de dados.
Outro processamento de dados na camada de apresentação é: verificação de dados, que é dividida em verificação do cliente e verificação do lado do servidor. Isso será explicado em detalhes posteriormente.
14. Conversão de tipo
Os parâmetros HTTP são todos tipos de string. Os dados salvos podem ser string, número, booleano, data e hora, etc. ou tipo JavaBean. Conversão manual de tipo, como converter uma string em uma data, por meio de: obtenção da string através do método request.getParameter verificando se ela está vazia em um objeto Date através do método DateFormat.parse;
15. Conversão do tipo Struts2
Conversão de tipo integrada do Struts2
String e booleano completam a conversão entre valores string e booleanos
Conversão de strings e caracteres entre strings e caracteres comuns
String, int e Integer completam a conversão entre strings e inteiros.
String e Long completam a conversão entre string e valores inteiros longos
String, double e Double completam a conversão de strings e valores de ponto flutuante de precisão dupla.
String e Float completam a conversão entre strings e ponto flutuante de precisão simples
String e Data completam a conversão entre os tipos string e data. O formato de data usa o formato SHORT do Local onde o usuário solicita o formato.
String e array No caso padrão, o elemento array é uma string. Se o usuário definir um conversor de tipo, também podem ser outros tipos de dados compostos.
String e mapa e lista
16. API de conversão de tipo Struts
O conversor de tipo do Struts2 é realmente implementado com base no OGNL. Existe uma interface ognl.TypeConverter no projeto OGNL. Esta interface é a interface que deve ser implementada para implementar o conversor de tipo. A interface é definida da seguinte forma:
interface pública TypeConverter {
objeto público convertValue (Mapa arg0, Objeto arg1, Membro arg2, String arg3,
Objeto arg4, Classe arg5) {
retornar nulo;
}
Para implementar um conversor de tipo, você deve implementar o TypeConverter acima. No entanto, os métodos na interface acima são muito complicados, então o projeto OGNL também fornece uma classe de implementação desta interface: ognl.DefaultTypeConverter Você pode implementar seu próprio conversor de tipo. herdando esta classe. A classe é definida da seguinte forma:
classe pública DefaultTypeConverter estende Object implementa TypeConverter{
public Object convertValue(Map<String,Object> contexto, valor do objeto, classe toType) {
}
……//Outros métodos
}
A função do método ConvertValue é concluir a conversão de tipo, mas essa conversão de tipo é bidirecional. Quando uma string precisa ser convertida em uma instância de objeto, esse método também é usado. usado. Esta conversão é feita através do tipo de parâmetro toType que é o tipo de destino que precisa ser convertido. Portanto, a direção da conversão pode ser determinada com base no parâmetro toType.
Parâmetros do método ConvertValue e significado de retorno O primeiro parâmetro: context é o contexto do ambiente de conversão de tipo. O segundo parâmetro: value é o parâmetro que precisa ser convertido.
O terceiro parâmetro: toType é o tipo de destino convertido. O valor de retorno deste método é o valor após a conversão do tipo. O tipo do valor também muda com a direção da conversão. Pode-se observar que o método convertValue convertido aceita o valor que precisa ser convertido, o tipo de destino que precisa ser convertido é um parâmetro e, em seguida, retorna o valor alvo convertido.
Por que Value é uma matriz de strings?
Para o conversor DefaultTypeConverter, ele deve levar em consideração a situação mais comum, por isso trata todos os parâmetros da solicitação como arrays de strings em vez de strings. Equivalente aos valores dos parâmetros obtidos por getParameterValues()