Prefácio
Por que digitar conversor em struts2?
: O STRUTS2 só pode fornecer conversão automática para 8 tipos originais em Java e tipos comuns, como string e data.
Mas isso definitivamente não pode atender às nossas necessidades se queremos integrar os dados da página em um Javabean. Quando você vai à ação, o que a ação recebe é um objeto; portanto, esse requisito exige que usemos um conversor de tipo.
Na maioria das vezes, o uso do conversor de tipo interno e do conversor de tipo OGNL fornecido pela estrutura do STRUTS2 pode atender à maioria das necessidades de conversão de tipos; No entanto, existem alguns casos especiais em que uma sequência de um formato especificado pode precisar ser convertida em um objeto composto e um conversor de tipo personalizado é necessário. Por exemplo, se o cliente enviar uma string como "Jelly | 123456" para o servidor, precisamos converter essa string em uma instância do tipo de usuário, com "geléia" como nome do usuário e "123456" como senha do usuário.
Classe de conversão de tipo personalizado
Há uma página da recepção como esta:
<form action = "login" method = "post"> user: <input type = "text" name = "userInfo"> <br> <input type = "submit" value = "convert"> </morm>
O código de ação correspondente é:
usuário privado usuário; // Esta é uma dica de string privada do tipo composto; public void Setusers (usuário do usuário) {this.User = user;} public user getUser () {return user;}Esperamos que o usuário digite uma string na página de primeiro plano com o formato "Nome de usuário | Senha" e converte a string no formato de "Nome de usuário | senha" no tipo de usuário através de um conversor de tipo personalizado. Vamos falar sobre como implementar um conversor de tipo personalizado.
O conversor do tipo STRUTS2 ainda é baseado na estrutura OGNL. Existe uma interface TypeConverter no projeto OGNL, que é a interface que deve ser implementada por um conversor de tipo personalizado. O código de definição dessa interface é o seguinte:
// Ognl fornece interface pública TypeConverter {public Object ConvertValue (contexto do mapa, destino do objeto, membro do membro, String PropertyName, Valor do Objeto, classe Totype);}Para implementar um conversor de tipos, você deve implementar o TypeConverter acima, mas os métodos na interface acima são muito complexos; portanto, o projeto OGNL também fornece uma classe de implementação para esta interface: DefultTypeconverter, que geralmente usa estendido esta classe para implementar conversores de tipos personalizados. A implementação de um conversor de tipo personalizado requer substituição do método ConvertValue da classe DefaultTypeconverter.
A seguir, a classe de conversão convertida em uma instância da classe de usuário:
classe pública UserConverter estende o DefaultTyPeconverter {public Object ConvertValue (contexto do mapa, valor do objeto, class. // Crie um usuário do usuário do usuário Usuário = new User (); // Processa apenas o primeiro elemento da matriz da matriz de parâmetros de solicitação e divida a string em duas cordas com o '|' símbolo string [] uservalues = params [0] .split ("// |"); // atribui um valor ao usuário do usuário user.setName (userValues [0]); user.setPassword (uservalues [1]); devolver usuário; } else if (TOTYPE == String.class) {// Quando for necessário converter o tipo de usuário em um usuário do usuário da String = (Usuário); retornar "<" + user.getName () + "|" + user.getpassword () + ">"; } retornar nulo; }}A função do método ConvertValue é muito simples. Este método é responsável por concluir a conversão do tipo, mas essa conversão é bidirecional. O tipo de destino é julgado com base no parâmetro TOTYPE e, em seguida, podemos implementar a lógica de conversão em duas direções.
Registre um conversor de tipo
Ter um conversor de tipo não é suficiente, porque a estrutura STRUTS2 não sabe quando usar esses conversores de tipo, portanto, o conversor de tipos deve ser registrado no aplicativo da Web; portanto, a estrutura do Struts2 pode usar esse conversor de tipo normalmente.
O STRUTS2 suporta principalmente as duas maneiras seguintes de registrar conversores de tipo:
Vamos falar sobre os dois métodos acima de registrar conversores de tipo.
Conversor de tipo local
O STRUTS2 permite que os desenvolvedores especifiquem informações de configuração para conversão de tipo através de arquivos de conversão de tipos locais. Um arquivo de conversão de tipo é um arquivo de propriedades ordinárias (*.Properties). O nome do arquivo do arquivo de conversão do tipo local deve estar no formulário ActionName Conversão.properties, onde o nome da ação é o nome de ação que precisa ser convertido para o arquivo com esse tipo e a sequência subsequente -Conversion.Properties é uma parte fixa. O arquivo de conversão de tipo deve ser colocado no mesmo local que o arquivo da classe de ação.
Depois de falar sobre o arquivo de conversão do tipo local, vamos continuar falando sobre o conversor de tipo local registrado. Para registrar um conversor de tipo local, você só precisa adicionar a seguinte linha de configuração ao arquivo de conversor de tipos locais:
<PropName> = <ConverterClass>
Substitua o <propName> acima pela propriedade que precisa ser convertida em tipo e substitua <ConverterClass> pela classe de implementação do conversor de tipo. Para a classe UserConverter implementada acima, é necessário configurá -lo no arquivo de conversão do tipo local da seguinte maneira:
# Para especificar o atributo do usuário, você precisa usar a classe UserConverter para concluir o usuário de conversão do tipo = com.jellythink.practise.userConverter
Conversor de tipo global
As limitações dos conversores do tipo local são óbvias demais e só podem trabalhar em ações especificadas e propriedades especificadas. No entanto, se várias ações no aplicativo contêm atributos do tipo de usuário ou uma ação contiver atributos de vários tipos de usuário, seria mais apropriado usar um conversor de tipo global.
O conversor do tipo global não funciona nas propriedades especificadas da ação especificada, mas no tipo especificado. Por exemplo, ele funciona para todas as propriedades do tipo com.jellythink.practicise.User.
O registro de um conversor de tipo global deve fornecer um arquivo xwork-conversion.properties, que é o arquivo de conversor do tipo global. Você precisa colocar diretamente o arquivo no caminho da Web-Inf/Classes do aplicativo da Web.
O conteúdo do arquivo de conversão do tipo global consiste em múltiplos itens <proptype> = <Convertclass>. Substitua o APTYPE pelo tipo que precisa ser o tipo convertido e substitua o ConvertClass pela classe de implementação do conversor de tipo. Para a classe UserConverter implementada acima, é necessário configurá -lo no arquivo de conversão do tipo global da seguinte forma:
com.jellythink.practicise.User = com.jellythink.practicise.userConverter
"Local" vs "Global"
A conversão do tipo local pode converter apenas o atributo especificado da ação especificada. Independentemente de o atributo da ação ser uma matriz ou um tipo de coleção, o método de conversão do conversor apenas converte o atributo uma vez. Se uma ação tiver uma lista <suários> Usuário da propriedade, o conversor de tipos local chamará o método convertValue () apenas uma vez, que converte o parâmetro de solicitação de usuários em um objeto de coleta de uma lista <suser> ao mesmo tempo.
O conversor do tipo global converterá todos os tipos específicos de ação. Se o atributo de uma ação for um tipo de matriz ou coleção, e o elemento de matriz ou coleta for o método que requer o conversor para converter, o conversor do tipo global não converterá o atributo set inteiro, mas converterá cada elemento do atributo set. Ou seja, quando o atributo é uma matriz ou coleção, a matriz ou coleção contém vários elementos do tipo, o método convertValue () será chamado várias vezes.
Depois de me familiarizar com a diferença entre os dois, prestarei mais atenção no meu trabalho futuro; Especialmente a diferença entre a matriz e o conjunto de elementos ao convertê -los.
Conversor de tipo personalizado com base em struts2
O acima introduz a direção de conversão herdando a classe DefaultTypeconverter, em um método ConvertValue, a direção de conversão é julgada pelo julgamento do parâmetro Totype e, em seguida, a lógica de conversão para diferentes direções de conversão é implementada separadamente. Na estrutura do STRUTS2, para simplificar a implementação de conversores de tipo, é fornecida uma classe abstrata StrutStyConverter, que é uma subclasse da classe DefaultTypeconverter. Ele implementou o método ConvertValue da classe DefaultTypeconverter; Ao implementar esse método, ele transforma a conversão em duas direções diferentes, julgando o parâmetro Totype no método ConvertValue para chamar os dois métodos diferentes:
O que precisamos fazer é herdar a classe abstrata StrutStyConverter e implementar os dois métodos abstratos: convertidos e convertidos.
O código modificado é o seguinte:
classe pública UserConverter estende StrutStyPeConverter {public Object ConvertFromString (contexto do mapa, valores de string [], classe TOCLASS) {Usuário do usuário = new User (); String [] uservalues = valores [0] .split ("// |"); user.setName (uservalues [0]); user.setPassword (uservalues [1]); devolver usuário; } public string converttoString (contexto do mapa, objeto o) {// Quando é necessário converter o tipo de usuário em um usuário de string usuário = (usuário) o; retornar "<" + user.getName () + "|" + user.getpassword () + ">"; }}Resumir
Este artigo resume o conversor de tipo personalizado no Struts2 em detalhes, e a idéia geral é a seguinte:
Apenas algumas etapas para fazer o conversor de tipo personalizado.
Ok, o acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.