Struts2 $,#,%详解及实例代码

 更新时间:2016年12月12日 11:23:36   投稿:lqh  
这篇文章主要介绍了Struts2 $,#,%详解及实例代码的相关资料,需要的朋友可以参考下

最近在学ssh,一直搞不懂$,%,#的区别,做了点小练习,慢慢也懂了一点,将自己所学的也记录下来吧。

   存在一下一个实体entity:

public class Person { 
 
  private int id ; 
  private String Name ; 
   
  public int getId() { 
    return id; 
  } 
   
  public Person(int id, String name) { 
    super(); 
    this.id = id; 
    Name = name; 
  } 
 
  public Person() { 
    super(); 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return Name; 
  } 
  public void setName(String name) { 
    Name = name; 
  } 
 
} 

在struts2的Action中,写了如下代码:

@Override 
  public String execute() throws Exception { 
     
    //application  
    Person p = new Person(1,"zhangsan") ; 
    ActionContext.getContext().getApplication().put("person", p); 
     
    //session 
    Person p1 = new Person(3,"wangwu"); 
    ActionContext.getContext().getSession().put("person", p1); 
     
    //request 
    Person p2 = new Person(2,"lisi"); 
    ActionContext.getContext().put("person", p2) ; 
     
    //servletContext 
    Person p3 = new Person(5,"xiaoming"); 
    ActionContext.getContext().getContextMap().put("person", p3); 
     
    Person p4 = new Person(3,"wangwu"); 
    ActionContext.getContext().getValueStack().push(p4); 
     
    return "success"; 
  } 

分别在application,session,request,servletContext,valueStack中存入一个person对象,那么在JSP中我们可以按照一下方式获取:

person: <input type="text" name="name" value="${person }" /><br />  
id: <input type="text" name="name" value="${person.id }" /><br />  
name: <input type="text" name="name" value="${person.name }" /><br /> 
<hr> 

         以上代码所得出的person信息时xiaoming的,即ActionContext.getContext().getContextMap()中存放的信息,通过查询$的用法,发现$获取对象的方式是有方式的,即

ActionContext.getContext().getContextMap() > ActionContext.getContext() >ActionContext.getContext().getSession() >ActionContext.getContext().getApplication(),对于不同的scope(范围)中存在同名对象时,$的查找方式将会按照以上步骤进行,找到即输出,没有找到继续上一级查找,到顶不存在时将输出null。

   那么$的用法为:${scope.object.attribute}

   scope的属性值为request,session,application,默认不写时将按照上述所说的方案查找,找到即输出相关属性值。

  在struts标签中,存一个这样的:

<s:property value="#application.person"/>

   可以看出,此时用到了#号,个人认为,其实#和$的用法完全是一样的,只要你将需要输出的对象装进不同范围的map(servletContext,request,session和application),在view中展示时,使用<s:property value="#scope.object.attribute">跟$理解完全是一样的。但是你在使用struts的标签时,比如:

<s:textfield name="person.name"></s:textfield> 

完全可以理解为

<input type="text" name="persom.name" id="person.name" value="<s:property value="#person.name"/>" /> 

即struts的标签已经在HTML的text中给我们封装了<s:property value="#target.name"/>,可以给我省去很多代码的。
同理,那么#的用法为:<s:property value="#scope.object.attribute" />

当然完全可以使用struts2给我们定义的标签,这样完全可以省去写过多重复代码的麻烦。其实#还有其他的用法,比如用来构造map等对象,但是个人觉得在view中写过多代码的时代已经过去,这种用法已经没有太多的意义,况且这次我只写出在view展示的过程,因此其它地方不扯了。

最后,扯一点%的用法,简单的看,%{}就是字符串计算表达式,举个例子,view中存在某个环节,一般都存在CRUD等基本功能,对于add和uppdate功能,完全可以在同一个页面完成,不同的是我们提交的地址是不同的,比如可能只这样的:对于add方法,地址为user_add.action,对于udpate方法,地址为user_update.action,那么在form中,可以使用%进行判断:

<s:form action="user_%{ id == 0 ? 'add' : 'update' }"></form> 

呵呵,这样以前的两个页面现在完全一个页面可以解决掉。

同理,%与struts中的if,ifelse等判断标签联合起来用得比较多,毕竟是比较的吗。。。。

<s:if test="%{false}"> 
  <div>Will Not Be Executed</div> 
</s:if> 
<s:elseif test="%{true}"> 
  <div>Will Be Executed</div> 
</s:elseif> 
<s:else> 
  <div>Will Not Be Executed</div> 
</s:else> 

最后,说说这个%很有用的做法,假设存在一个列表展示student全部及格的成绩(即不及格的成绩将不会展示在上面),如果使用的%将是非常简单的。不扯,先上代码:

public class Stduent implements java.io.Serializable{ 
   
  private static final long serialVersionUID = -691038814755396419L; 
  private int id ; 
  private String name ; 
  private int score ; 
  private String subject ; 
   
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
  public int getScore() { 
    return score; 
  } 
  public void setScore(int score) { 
    this.score = score; 
  } 
  public String getSubject() { 
    return subject; 
  } 
  public void setSubject(String subject) { 
    this.subject = subject; 
  } 
   
  /** 
   * 此处判断成绩是否及格 
   * @param socre 
   * @return 
   */ 
  public boolean isPast(int socre){ 
    return getScore() > 60 ; 
  } 
   
} 

那么,现在数据库中查找学生成绩,放到list中暂时存放起来,在JSP页面,我们可以使用以下代码来控成绩制输出是否及格:

<s:iterator value="#allUser"> 
  <!-- 判断是否过线,过线即输出,否则舍去! --> 
    <s:if test="#session.user.isPast(score)"> 
        name: <s:textfield name="name"></s:textfield> 
        score: <s:textfield name="score"></s:textfield>\ 
        subject:<s:textfield name="subject"></s:textfield> 
    </s:if> 
</s:iterator> 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 详解Java的Hibernate框架中的注解与缓存

    详解Java的Hibernate框架中的注解与缓存

    这篇文章主要介绍了详解Java的Hibernate框架中的注解与缓存,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • JAVA对象clone方法代码实例解析

    JAVA对象clone方法代码实例解析

    这篇文章主要介绍了JAVA对象clone方法代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • springboot中通过lua脚本来获取序列号的方法

    springboot中通过lua脚本来获取序列号的方法

    这篇文章主要介绍了springboot中通过lua脚本来获取序列号的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 基于Java的Socket编写的C/S聊天程序实现

    基于Java的Socket编写的C/S聊天程序实现

    这篇文章主要介绍了基于Java的Socket编写的C/S聊天程序实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java中的Cglib动态代理详细解读

    Java中的Cglib动态代理详细解读

    这篇文章主要介绍了Java中的Cglib动态代理详细解读,CGLib是一个强大的、高性能、高质量的 Code 生成类库,它可以在运行期扩展 Java 类与实现 Java 接口,需要的朋友可以参考下
    2023-11-11
  • emoji表情与unicode编码互转的实现(JS,JAVA,C#)

    emoji表情与unicode编码互转的实现(JS,JAVA,C#)

    这篇文章主要介绍了emoji表情与unicode编码互转的实现(JS,JAVA,C#),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java求字符串长度的方法举例

    Java求字符串长度的方法举例

    这篇文章主要给大家介绍了关于Java求字符串长度的相关资料,Java中的字符串是一种常见的数据类型,用于表示文本数据,文中给出了详细的代码实例,需要的朋友可以参考下
    2023-10-10
  • 详细分析Java内存模型

    详细分析Java内存模型

    Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的,以及在必须时如何同步的访问共享变量
    2021-06-06
  • Java连接MongoDB的常用方法详解

    Java连接MongoDB的常用方法详解

    这篇文章主要为大家详细介绍一下Java语言连接MongoDB的常用方法以及实现增删改查功能的示例代码,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-07-07
  • JDK输入命令Javac报错的解决方法

    JDK输入命令Javac报错的解决方法

    相信很多人都经历过配置环境变量失败的经历,尤其是很多时候明明按照老师教的步骤或者教程上的方法循规守矩配置却还是出错,下面我们来解决一个非常蹊跷的问题---输入Java和Java -version都没问题,但是输入Javac报错,感兴趣的朋友一起看看吧
    2023-11-11

最新评论