Pergunta

Alguém pode recomendar um quadro de templating / formatação de mensagens em um aplicativo independente ao longo das linhas da JSP EL (Expression Language)?

Eu esperaria para ser capaz de instanciar um objeto de algum tipo, dar-lhe um modelo ao longo das linhas

Dear ${customer.firstName}. You order will be dispatched on ${order.estimatedDispatchDate}

fornecê-lo com um contexto que incluiria um dicionário valor dos objetos de parâmetros (neste caso, um objeto do tipo cliente com um nome de 'cliente', digamos, e um objeto do tipo ordem com um nome de 'ordem').

Eu sei que há muitas estruturas de modelo lá fora - muitos dos quais trabalho fora do contexto de aplicação web, mas eu não vejo isso como uma estrutura de modelagem pesos pesados ??grande. Apenas uma versão melhor da funcionalidade básica Message Format Java já fornece

Por exemplo, eu posso realizar o acima com java.text.MessageFormat usando um modelo (ou um 'padrão', como eles chamam) como

Dear {0}. You order will be dispatched on {1,date,EEE dd MMM yyyy}

e eu posso passar uma matriz de objectos, em meu chamado programa Java

new Object[] { customer.getFirstName(), order.getEstimatedDispatchDate() };

No entanto, neste uso, o código eo padrão estão intimamente ligados. Enquanto eu poderia colocar o padrão em um arquivo de propriedades de recurso, o código ea necessidade de padrões para saber detalhes íntimos sobre o outro. Com um semelhante EL sistema, o contrato entre o código eo padrão estaria em um nível muito mais elevado (por exemplo, cliente e da ordem, em vez de customer.firstName e order.estimatedDispatchDate), tornando mais fácil para mudar a estrutura, ordem e conteúdo da mensagem sem alterar qualquer código.

Foi útil?

Solução

Você pode simplesmente usar o Expression Universal própria linguagem. Você precisa de uma implementação (mas há alguns a escolher). Depois disso, você precisa implementar três classes:. ELResolver, FunctionMapper e VariableMapper

Este blog descreve como fazê-lo: Java :. usando EL fora J2EE

Outras dicas

StringTemplate é uma alternativa mais leve para Velocity e Freemarker.

Eu recomendaria para Apache Velocity . É muito simples e leve.

No momento, estamos a usá-lo para os nossos modelos de e-mail, e ele funciona muito bem.

Você pode usar Casper muito semelhante ao JSP e fácil de usar: Casper

eu iria para a linguagem de expressão Primavera:

http: //docs.spring. io / primavera / docs / current / spring-framework-referência / html / expressions.html

Alguns exemplos que demonstram a potência (os dois primeiros são a partir da documentação):

int year = (Integer) parser.parseExpression("Birthdate.Year + 1900").getValue(context);

String city = (String) parser.parseExpression("placeOfBirth.City").getValue(context);

// weekday is a String, e.g. "Mon", time is an int, e.g. 1400 or 900
{"Thu", "Fri"}.contains(weekday) and time matches '\d{4}'

Expressões também pode usar as propriedades do objeto:

public class Data {
    private String name; // getter and setter omitted
}

Data data = new Data();
data.setName("John Doe");

ExpressionParser p = new SpelExpressionParser();
Expression e = p.parseExpression("name == 'John Doe'");
Boolean r = (Boolean) e.getValue(data); // will return true

e = p.parseExpression("Hello " + name + ", how are you ?");
String text = e.getValue(data, String.class); // text will be "Hello John Doe, how are you ?"

Você pode querer olhar em OGNL qual é o tipo de biblioteca que são depois. OGNL possa ser razoavelmente poderoso, e é a linguagem de expressão usado na WebWork framework web .

Re: Jasper e Juel sendo construído para 1,5: E então eu descobri RetroTranslator ( http: //retrotranslator.sourceforge. / net). Uma vez retrotranslated, EL e Jasper funciona como um encanto

A idéia de usar EL-se fora de Java EE era defendida por Ed Burns, e discutido na Servidor Side . implementação Tomcats navios em um frasco separado, mas eu não sei se ele pode ser usado fora do servidor.

Freemarker faria exatamente o que você precisa. Este é um modelo de motor com uma sintaxe muito semelhante ao JSP:

http://freemarker.org/

AAh. Considerando que, com MessageFormat, eu posso fazer

Dear {0}. Your order will be dispatched on {1,date,EEE dd MMM yyyy}

onde parâmetro # 1 é um objeto Data e fica formatado de acordo com o padrão, não há equivalente em EL.

Em JSP, eu teria usado, talvez, um tag de formato. Neste exemplo autônomo, eu vou ter que formatar a data como uma String no meu código antes de avaliar a expressão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top