Aprendi SSH recentemente e não entendi a diferença entre $,%,%e#. Fiz alguns pequenos exercícios e gradualmente entendi um pouco. Vou gravar o que aprendi.
A seguinte entidade existe:
public class Pessoa {private int id; nome de string privado; public int getId () {return id; } Pessoa pública (int id, nome da string) {super (); this.id = id; Nome = nome; } public Person () {super (); } public void setId (int id) {this.id = id; } public string getName () {return name; } public void setName (nome da string) {name = name; }} Na ação do STRUTS2, o seguinte código é escrito:
@Override public String Execute () lança exceção {// Pessoa do aplicativo P = nova pessoa (1, "Zhangsan"); ActionContext.getContext (). GetApplication (). Put ("pessoa", p); // Pessoa de sessão P1 = nova pessoa (3, "Wangwu"); ActionContext.getContext (). GetSession (). Put ("pessoa", p1); // Pessoa de solicitação P2 = nova pessoa (2, "lisi"); ActionContext.getContext (). Put ("Pessoa", P2); // servletContext pessoa p3 = nova pessoa (5, "xiaoming"); ActionContext.getContext (). GetContextMap (). Put ("Pessoa", P3); Pessoa P4 = nova pessoa (3, "Wangwu"); ActionContext.getContext (). GetValuestack (). Push (p4); retornar "sucesso"; } Armazene um objeto de pessoa em aplicação, sessão, solicitação, servletContext, valuestack, respectivamente. Então, no JSP, podemos obtê -lo da seguinte maneira:
Pessoa: <input type = "text" name = "name" value = "$ {pessoa}" /> <r /> id: <input type = "text" name = "name" value = "$ {pessoa.id}" /> <br /> name: <input type = "text" = "name" value = "$ {pessoa.name}" /> As informações da pessoa obtidas pelo código acima são xiaoming, ou seja, as informações armazenadas no actionContext.getContext (). GetContextMap (). Ao consultar o uso de $, verifica -se que existe uma maneira de obter o objeto de $, isto é,
ActionContext.getContext (). GetContextMap ()> actionContext.getContext ()> actionContext.getContext (). GetSession ()> actionContext.getContext (). Para objetos com o mesmo nome, existem em diferentes escopos (escopos), o método de pesquisa de $ será realizado de acordo com as etapas acima. Se for encontrado, será emitido. Se não for encontrado, continuará pesquisando no nível anterior. Quando o topo não existir, ele será produzido nulo.
Então o uso de $ é: $ {scope.object.attribute}
O valor do atributo do escopo é solicitação, sessão, aplicação. Quando não está escrito por padrão, você pesquisará de acordo com o esquema acima. Se você o encontrar, produzirá o valor do atributo relevante.
Na tag struts, salve A:
<S: Property Value = "#Application.Person"/>
Pode -se observar que o número # foi usado neste momento. Pessoalmente, acho que o uso de # e $ é realmente o mesmo. Desde que você carregue o objeto que você precisa em um mapa (ServletContext, solicitação, sessão e aplicação) em um intervalo diferente, ao exibi -lo na visualização, usando <s: property value = "#scope.object.attribute"> é exatamente o mesmo que $ compreensivo. Mas quando você usa tags de struts, por exemplo:
<s: textfield name = "Person.name"> </s: textfield>
Pode ser entendido completamente como
<input type = "text" name = "persom.name" id = "pessoa.name" value = "<s: propriedade value ="#pessoa.name " />" />
Ou seja, a tag struts foi encapsulada para nós no texto html <s: property value = "#target.name"/>, que pode me economizar muito código.
Da mesma forma, o uso de # é: <S: Property Value = " # scope.object.attribute" />
Obviamente, você pode usar as tags definidas pelo Struts2 para salvar o incômodo de escrever muitos códigos duplicados. De fato, # tem outros usos, como a construção de objetos como mapas, mas eu pessoalmente acho que a era de escrever muito código na visualização passou, e esse uso não tem significado. Além disso, desta vez eu apenas escrevi o processo de exibi -lo na vista, então não vou falar sobre isso em outro lugar.
Por fim, vamos falar sobre o uso de %. Para simplificar, %{} é uma expressão de cálculo da string. Por exemplo, existe um certo link na visão, que geralmente possui funções básicas como Crud. Para as funções de adição e atualização, ele pode ser concluído na mesma página. A diferença é que o endereço que enviamos é diferente. Por exemplo, pode ser assim: para o método Add, o endereço é user_add.action e, para o método do udpate, o endereço é user_update.action; portanto, no formulário, % pode ser usado para julgamento:
<s: formulário action = "user _%{id == 0? 'Adicionar': 'update'}"> </morm> Haha, então as duas páginas anteriores agora podem ser resolvidas em uma página.
Da mesma forma, % é usado com mais frequência com os rótulos do julgamento, como se e ifelse em suportes. Afinal, é uma comparação? . . .
<s: se test = "%{false}"> <div> não será executado </div> </s: if> <s: elseif test = "%{true}"> <div> será executado </div> </s: elseif> <s: else> <div> não será executado </div> </s: Por fim, vamos falar sobre a abordagem útil desse %, assumindo que haja uma lista mostrando todas as notas de aprovação dos alunos (ou seja, as notas com falha não serão exibidas acima), se o % usado será muito simples. Não, basta colocar o código primeiro:
classe pública implementa o java.io.Serializable {private estático final serialversionuid = -691038814755396419l; private int id; nome de string privado; Pontuação privada int; Assunto de String Private; public int getId () {return id; } public void setId (int id) {this.id = id; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public int getScore () {Return Score; } public void SetScore (Int Score) {this.score = score; } public string getSBject () {retornar sujeito; } public void Setsubject (String sujeito) {this.subject = sujeito; } / ** * Aqui julgamos se a pontuação passa no exame * @param socre * @return * / public boolean ispast (int socre) {return getScore ()> 60; }} Então, agora procure as notas dos alunos no banco de dados e os coloque na lista para armazenamento temporário. Na página JSP, podemos usar o seguinte código para controlar se a saída do sistema de grau passa:
<s: iterator value = "#AllUser"> <!- Determine se passar a linha, se você passar na linha, ela será emitida, caso contrário, você desistirá! -> <s: if test = "#session.user.istsast (score)"> nome: <s: textfield name = "name"> </s: textfield> pontuação: <s: textfield name = "score"> </s: textfield>/sujeito: <s: textfield name = "sujeito"> </s: textfield> </s: se> </s: iTer.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!