1. 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.
2. Processamento de dados da camada de apresentação
1. 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.
2. Para dados de entrada: é necessário 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.
3. Para dados de saída: Java e jsp suportam saída direta de vários tipos de dados.
4. 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.
3. Conversão de tipo
1. 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;
2. 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
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
3. Conversão de tipo integrada
4. 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>context, Objectvalue, ClasstoType) {
}
……//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 valor do parâmetro value também é diferente dependendo da direção da conversão.
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()
4. Implementação do conversor de tipo
1. Página de registro da primeira etapa
2. A segunda etapa: Implementar a classe de encapsulamento de usuário
3. A terceira etapa: Implementar a classe Action
5. Etapa 5: Registre o conversor de tipo Existem três métodos de registro:
1. Registre um conversor de tipo local: o conversor de tipo local funciona apenas nas propriedades de uma determinada ação
2. Registre um conversor de tipo global: O conversor de tipo global terá efeito em todos os atributos específicos da Ação.
3. Use anotações JDK1.5 para registrar o conversor de tipo: gere o conversor de tipo por meio de registro.
6. Formato do nome do arquivo de registro de registro do conversor de tipo parcial: ActionName-conversion.properties: ActionName é o nome da classe da Action que precisa do conversor para entrar em vigor, e a seguinte string -conversion.properties é um arquivo de propriedades típico ao corrigir parte ou mais do arquivo. Ele consiste em pares de valores-chave O conteúdo do arquivo é: propertyName = classe do conversor de tipo A seguir está o conteúdo do arquivo UserAction-conversion.properties.
#Especifique que o atributo do usuário em UserAction precisa usar a classe redarmy.user.UserConverter para concluir a conversão de tipo
usuário = redarmy.user.UserConverter
Nota: O arquivo de propriedades acima deve estar no mesmo pacote que UserAction. Ou seja, no caso acima, o método acima pode ser usado para obter a conversão de tipo local.
7. O formato do arquivo do nome de registro do conversor de tipo global: arquivo xwork-conversion.properties Este arquivo também é um arquivo de propriedades e seu conteúdo também é composto pelo item "tipo composto = classe do conversor de tipo correspondente".
A seguir está o conteúdo do arquivo xwork-conversion.properties:
#Especifique o conversor de tipo de todas as classes redarmy.user.User como redarmy.user.UserConverter
redarmy.user.User=redarmy.user.UserConverter
Nota: O arquivo xwork-conversion.properties deve ser criado na pasta class, ou seja, em src.
5. Conversão de tipo personalizado Struts2
A classe StrutsTypeConverter é fornecida no Struts2 para simplificar o design da conversão de tipo customizada. Esta classe possui dois métodos abstratos que precisam ser implementados:
(1) objeto público convertFromString (contexto do mapa, valores String [], classe toClass);
Parâmetros do método de processamento usados para converter dados do tipo String em tipos personalizados:
contexto --- informações contextuais relacionadas à ação
valores --- valores de parâmetros obtidos da solicitação
toClass --- o tipo de destino a ser convertido
(2) public String convertToString (contexto do mapa, objeto obj);
Usado para converter tipos personalizados em String
parâmetro:
contexto --- informações contextuais relacionadas à ação
obj --- objeto de tipo personalizado
Análise de exemplo: Design e configuração de uma conversão de tipo de data
(1) Projete MyDateTypeConverter, herde StrutsTypeConverter e cubra dois de seus métodos. O código de referência é o seguinte:
objeto público convertFromString (contexto do mapa, valores String [], classe toClass) {
SimpleDateFormat sdf = new SimpleDateFormat("aaaa-MM-dd");
tentar{
Data v = sdf.parse(valores[0]);
retornar v;
}catch(Exceção e){
e.printStackTrace();
retornar nova Data();
}
}
Continuação
public String convertToString(contexto do mapa, objeto obj) {
SimpleDateFormat sdf = new SimpleDateFormat("aaaa ano MM mês dd dia");
Data v = (Data)obj;
retornar sdf.formato(v);
}
Embora o Struts2 suporte a conversão de string e data por padrão, ele suporta apenas conversão de formato curto e formato de data localizado, o que pode não atender às suas necessidades. Precisamos implementar nossa própria conversão de tipo.
(2) Adicione um atributo de aniversário à classe UserInfo, cujo tipo é java.util.Date
classe pública UserInfo {
ID inteiro privado;
nome da string privada;
senha de string privada;
data privada aniversário;
...
}
(3) Configure o conversor de tipo para o componente UserInfo Primeiro, crie um arquivo de propriedades baseado no nome da classe do componente UserInfo. O formato de nomenclatura do arquivo é class name-conversion.properties.
Por exemplo UserInfo-conversion.properties
Este arquivo deve estar no mesmo pacote que o componente UserInfo.
O formato do conteúdo deste arquivo de recurso é o seguinte:
aniversário=demo.converter.MyDateTypeConverter
ilustrar:
aniversário é o nome do atributo do tipo java.util.Date no componente UserInfo
demo.converter.MyDateTypeConverter é uma classe de implementação de conversão personalizada
A estrutura Strus2 leva isso em consideração e fornece uma maneira simples de lidar com isso.
Para configurar o conversor de tipos em nível global, basta escrever um arquivo de propriedades denominado xwork-conversion.properties, que deve estar localizado no diretório /WEB-INF/classes, com o seguinte conteúdo:
java.util.Date=demo.converter.MyDateTypeConverter
6. Conversor de tipo personalizado
Propriedades do tipo java.util.Date podem receber valores de parâmetros de solicitação no formato 20/07/2009. Mas se precisarmos receber parâmetros de solicitação no formato 20091221, devemos definir um conversor de tipo, caso contrário, o struts2 não poderá concluir automaticamente a conversão de tipo.
importar java.util.Date;
classe pública HelloWorldAction {
data privada hora de criação;
data pública getCreatetime() {
retornar horário de criação;
}
public void setCreatetime(Data de criação) {
this.createtime = createtime;
}
}
classe pública DateConverter estende DefaultTypeConverter {
@Override public Object convertValue(Contexto do mapa, valor do objeto, classe toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("aaaaMMdd");
tentar {
if(toType == Date.class){//Quando a string é convertida para o tipo Date
String[] params = (String[]) valor;// Request.getParameterValues()
retornar dateFormat.parse(params[0]);
}else if(toType == String.class){//Quando a data é convertida em uma string
Data data = valor (Data);
retornar dateFormat.format(data);
}
} catch (ParseException e) {}
retornar nulo;
}
}
Registre o conversor de tipo acima como um conversor de tipo local:
Coloque o arquivo ActionClassName-conversion.properties no pacote onde a classe Action está localizada. ActionClassName é o nome da classe Action e o seguinte -conversion.properties é um método de escrita fixo. HelloWorldAction-conversion.properties. O conteúdo do arquivo de propriedades é:
Nome da propriedade = Nome completo da classe do conversor de tipo Para este exemplo, o conteúdo do arquivo HelloWorldAction-conversion.properties é:
createtime = cn.csdn.conversion.DateConverter
Registre o conversor de tipo acima como um conversor de tipo global:
Coloque o arquivo xwork-conversion.properties em WEB-INF/classes. O conteúdo do arquivo de propriedades é:
O tipo a ser convertido = o nome completo da classe do conversor de tipo. Para este exemplo, o conteúdo do arquivo xwork-conversion.properties é:
java.util.Date=cn.csdn.conversion.DateConverter
Propriedades do tipo java.util.Date podem receber valores de parâmetros de solicitação no formato 20/07/2009. Mas se precisarmos receber parâmetros de solicitação no formato 20091221, devemos definir um conversor de tipo, caso contrário, o struts2 não poderá concluir automaticamente a conversão de tipo.
importar java.util.Date;
classe pública HelloWorldAction {
data privada hora de criação;
data pública getCreatetime() {
retornar horário de criação;
}
public void setCreatetime(Data de criação) {
this.createtime = createtime;
}
}
classe pública DateConverter estende DefaultTypeConverter {
@Override public Object convertValue(Contexto do mapa, valor do objeto, classe toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("aaaaMMdd");
tentar {
if(toType == Date.class){//Quando a string é convertida para o tipo Date
String[] params = (String[]) valor;// Request.getParameterValues()
retornar dateFormat.parse(params[0]);
}else if(toType == String.class){//Quando a data é convertida em uma string
Data data = valor (Data);
retornar dateFormat.format(data);
}
} catch (ParseException e) {}
retornar nulo;
}
}
Registre o conversor de tipo acima como um conversor de tipo local:
Coloque o arquivo ActionClassName-conversion.properties no pacote onde a classe Action está localizada. ActionClassName é o nome da classe Action e o seguinte -conversion.properties é um método de escrita fixo. HelloWorldAction-conversion.properties. O conteúdo do arquivo de propriedades é:
Nome da propriedade = Nome completo da classe do conversor de tipo Para este exemplo, o conteúdo do arquivo HelloWorldAction-conversion.properties é:
createtime = cn.csdn.conversion.DateConverter
Registre o conversor de tipo acima como um conversor de tipo global:
Coloque o arquivo xwork-conversion.properties em WEB-INF/classes. O conteúdo do arquivo de propriedades é:
O tipo a ser convertido = o nome completo da classe do conversor de tipo. Para este exemplo, o conteúdo do arquivo xwork-conversion.properties é:
java.util.Date=cn.csdnconversion.DateConverter