(9)Tag:property、set、push、bean、if、iterate、date

public class UserAction extends ActionSupport implements SessionAware, RequestAware{

    private Map<String,Object> session;
    private User user=new User();
    private Map<String,Object> request;
    private List<User> userList=new ArrayList<User>();
    private Date dat;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Map<String, Object> getSession() {
        return session;
    }

    @Override
    public String execute() throws Exception {
        int length=15;
        request.put("len", length);
        request.put("request1", "request1的值");
        session.put("userSession",user);
        User u=new User();
        u.setUsername("aa");
        u.setPassword("11");

        User u2=new User();
        u2.setUsername("cc");
        u2.setPassword("33");

        User u1=new User();
        u1.setUsername("bb");
        u1.setPassword("22");
        userList.add(u1);
        userList.add(u);
        userList.add(u2);
        Timestamp t=Timestamp.valueOf("2017-09-22 00:00:00");
        dat=new Date(t.getTime());

       request.put("dat", dat);

        return super.execute();
    }

    public void setSession(Map<String, Object> arg0) {
        this.session=arg0;

    }

    public void setRequest(Map<String, Object> arg0) {
        this.request=arg0;

    }

    public Map<String, Object> getRequest() {
        return request;
    }

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

}

Tags.jsp

  <body>
      <!-- jsp:将HTML与Java代码混杂,而且在操作的时候,Java是一种强语言类型,要导入所有要使用的类,还要手动到request中去获取属性,非常麻烦 -->
      <!-- 下面根据struct2标签的分类来学习struct2的标签 -->
    <h3> 一、数据标签:关注如何从值栈上取值或者向值栈赋值<br/></h3>
      <b>1.property标签:用来输出ognl表达式的值.property标签的主要属性:value、default、escape、escapeJavaScript</b><br/>
      ①属性value、default<br/>
      value:用于获取值的ognl表达式,如果value属性值没有指定,那么将会被设为top,也就是返回位于值栈最顶端的对象<br>
      default:如果按照value属性指定的ognl求值后返回的是空值,但是仍然希望能够输出某些内容,那么就可以使用default属性来指定这些内容。<br/>

     输出value值:<s:property value="#request['request1']"/><br/>
    输出缺省值:<s:property value="#request['request2']" default="缺省值"/><br>
    输出栈顶的对象:<s:property /><br/>

  ②属性escape的使用:它指明了是否要把显示的值按照HTML的转义规则进行转义<br/>
  转义:就是把HTML中的一些特殊字符用已经定义好的实体进行替换的过程,默认是true,进行转义<br/>
 首先'<hr/>',这对单引号的意思是:单引号里面的东西不按照ognl表达式来解析,可以看成一个字符串<br/>
  <s:property value="'<hr/>'"/><br/><!-- 页面源码:&lt;hr/&gt;  <对应&lt; >对应&gt; -->
  <s:property value="'<hr/>'" escape="false"/><br/>

  <b>2.set标签:对设置的表达式进行求值,并将结果赋值给指定作用域中的某个变量。set标签类似于定义一个变量,并赋值</b>.<font color="red">set中var默认放在actionContext中</font><br/>
  set标签应用:比如一个对象在ognl上的访问层次比较深,就可以使用set标签给它定义一个变量,这样在多次引用它的时候更方便<br/>
  set标签的属性:var可以在ognl表达式中使用这个名称来引用存放到值栈的这个对象。<br/>
  scope:变量的生命周期,可以设置为application、session、request、page、action,默认action<br/>
  value:设置变量的值,可以是常量,也可以是ognl表达式<br/>
  访问session:<s:property value="#session['userSession'].username"/><br/><!-- 若此session要在此页面不断使用,它的长度太长,用set简化 -->
 <s:set var="tempUser" value="session.userSession"></s:set>
 访问set设置的用户名:<s:property value="#tempUser.username"/><br/>
  访问set设置的密码:<s:property value="#tempUser.password"/><br/>
 在ognl中也可以进行算数运算<br/>
 7+8=<s:property value="7+8"/><br/>
 <!-- 现在要在页面定义一个int型的变量,然后实现类似于i++的功能 -->
 <s:set var="i" value="1"></s:set>
 <s:set var="i" value="#i+1"></s:set>
 i++:<s:property value="#i"/>

 属性scope的使用:<br/>
 application:表示这个变量的生命周期是servlet中的application范围,也就是servletContext范围<br/>
 session:表示这个变量的生命周期是会话范围<br/>
 request:表示这个变量的生命周期是请求范围<br/>
 page:表示这个变量的生命周期是当前页面范围<br/>
 action:表示这个变量的生命周期是当前的actionContext范围<br/>
 <hr/>

 <b>3.push标签:</b><br/>
 功能:用来将对象的引用压入值栈.<br/>
 这也是很有用的,比如:如果一个对象访问层次过深的时候,可以用push标签来做访问的简化。其与set标签不同,<font color="red">push标签是把指定的对象放入值栈的栈顶</font>,这样在访问这个对象的时候,就可以直接访问到它了
而set是放入actionContext中<br/>
push标签的主要属性value:用于指定放入值栈栈顶的对象,主要体会操作带来的方便性。<br/>
在之前用session访问方式获取用户名:<s:property value="session.userSession.username"/><br/>
在之前用session访问方式获取密码:<s:property value="session.userSession.password"/><br/>
若user中有很多的属性,则访问中重复部分太多,可以考虑push<br/>

<s:push value="session.userSession">
  <s:property value="username"/>
  <s:property value="password"/>
</s:push>
对比set和push:两者常用与简化ognl操作,但是两者的区别是:
push标签的作用域是在自己的标签范围内,两个<s:property/> 都是它的子元素<br/>
set标签的作用域是在actionContext中,所以两个<s:property/> 只要在它后面即可。<br/>
push标签内的<s:property/> 直接引用这个对象的属性即可,而set标签后面的<s:property/> 还要加上set标签为对象取的变量名称<br/>
如何选择:当需要设置多个数据的时候,push标签更为简单
<hr/>
<b>4.bean与param标签<br/></b>
功能:bean用于创建Javabean实例,并将其压入值栈中,可以添加param标签<br/>
     param:用来给其他标签添加参数化设置的功能,比如为bean标签初始化Javabean的属性值,需要注意的是param标签主要用来配合其他的标签来指定参数,并不只与bean使用。<br/>
   bean主要属性:<br/>
   name:指定要创建Javabean的全类名,必须设置<br/>
   var:引用这个Javabean实例的名称,在bean标签创建Javabean实例之后,将这个实例压入值栈中,其key值就是这个var指定的值<br/>
   param标签的属性:name、value<br/>
   <s:bean name="com.action.User" var="user">
      <s:param name="xixi" value="100"></s:param>
   </s:bean>
   引用使用Javabean创建的user对象:<s:property value="#user.username"/>
 <hr/>
<h3>二、控制标签:关注程序的运行流程,if:循环;iterator:循环</h3>
<b>1.if、else、else标签</b><br/>
   <s:set var="length" value="request['len']"></s:set>
   <s:if test="#length>=20">
       length>=20
   </s:if>
   <s:elseif test="#length<=10">
      length<=10
   </s:elseif>
   <s:else>
    length在10~20之间
   </s:else>
 <b>2.iterator标签</b><br/> 
 功能:用于处理循环,可以遍历数组、set、list等集合对象,这个标签还支持在actionContext中保持一个遍历状态的对象,通过此变量来得到当前玄幻的各种信息。<br/>
 value指明循环的是谁,是个ognl表达式,用来访问ActionContext或者值栈中需要被循环的对象 <br/>
 使用标签,实现循环输出1-10<br/>
 <s:iterator var="i" begin="1" end="10" step="1">
    <s:property value="#i"/>
 </s:iterator>
 <br/>
  遍历复杂的对象,并且获取当前循环的索引值<br/>
 <s:iterator value="userList" status="state"><!-- -->
 索引:<s:property value="#state.index"/><br/>
    <s:property value="username"/>,<s:property value="password"/><br/>
 </s:iterator>
 实现斑马纹背景的表格:<br/>
 <table border="1" cellpadding="0" >
    <tr>
       <td colspan="4" align="center">用户列表</td>
    </tr>
    <tr>
      <td>索引</td>
       <td>用户名</td>
        <td>密码</td>
         <td>操作</td>
    </tr>
    <s:iterator value="userList" status="state">
       <tr>
          <s:if test="#state.even">bgcolor="#EF8FF"</s:if>
          <s:else>bgcolor="#B4CFF1"</s:else>
          <td><s:property value="#state.index"/></td>
          <td><s:property value="username"/></td>
           <td><s:property value="password"/></td>
          <td><a href="">修改</a></td>

       </tr>
    </s:iterator>
 </table>
 <b>3.date标签</b>
 主要属性:<br/>
 format:用于指定日期显示的格式,型如yyyy-MM-dd ,如果不指定,则会去找国际化信息中的key为structs.date.format的指定值<br/>
 name:被格式化的值,必须设置,它本身就是一个ognl表达式<br/>
 nice:是否显示当前时间与指定时间的差,如果为true,则不再显示指定时间,只显示当前时间与指定时间的差<br/>
  <s:date name="request['dat']" format="yyyy-MM-dd" /><br/>
   <s:date name="request['dat']" format="yyyy-MM-dd" nice="true"/><br/>
    <s:debug></s:debug>
  </body>
</html>
posted @ 2017-11-07 09:58  测试开发分享站  阅读(151)  评论(0编辑  收藏  举报