zoukankan      html  css  js  c++  java
  • Struts2对Ognl的支持

                                                      Struts2对Ognl的支持

    一. 写作背景

       由于工作性质的变化,最近一直在研究struts2,从源码到各个技术点的分析,突然之间发现以前对struts2的ognl这一块的知识覆盖的还不是很全面。再加上笔者身处在深圳这个城市,这些天来一直高温不断,人显得特别的烦躁不安,唯有技术(当然个人爱好还是很广泛的,例如溜冰、篮球、气枪打气球等)能让笔者从燥热中平静下来,故花上几个小时整理了这篇博客,若有失误之处,希望各位读者能够及时的指正。阅读本篇博客之前请先阅读笔者的另外一篇博客《OGNL》。笔者写博客不太喜欢说太多与技术无关的文字,那么直接上代码吧。

    二. struts2之ognl

      struts2将ActionContext作为整个Ognl的上下文对象,然后将ValueStack(值栈)作为ActionContext的根对象,用户每次访问的Action放入到ValueStack的栈顶的位置, 故而我们可以直接访问Action中的属性。

      定义如下Action:

    public class OgnlAction extends ActionSupport{
        
        private List<Student> list;
    
        public List<Student> getList() {
            return list;
        }
    
        public void setList(List<Student> list) {
            this.list = list;
        }
        
        public Student student = new Student();
        
        public String execute(){
            list = new ArrayList<Student>();
            Student s1 = new Student();
            s1.setAge(10);
            s1.setName("zhangsan");
            s1.setBirthday(new Date());
            
            Student s2 = new Student();
            s2.setName("lisi");
            s2.setAge(20);
            s2.setBirthday(new Date());
            
            list.add(s1);
            list.add(s2);
    
            ActionContext ctx = ActionContext.getContext();
            ctx.getApplication().put("msg", "applicationMsg");
            ctx.getSession().put("msg", "sessionMsg");
            
            HttpServletRequest request = ServletActionContext.getRequest();
            request.setAttribute("msg", "requestMsg");
            
            return SUCCESS;
        }
    }

    在ognl.jsp中取值,如下代码:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h2>访问Ognl上下文和Action的上下文</h2>
        <p>request.msg: <s:property value="#request.msg"/>或者${request.msg }或者${requestScope.msg }</p>
        <p>parameters.msg: <s:property value="#parameters.msg"/> </p>
        <p>session.msg: <s:property value="#session.msg"/> </p>
        <p>application.msg: <s:property value="#application.msg"/></p>
        <p>attr.msg:<s:property value="#attr.msg"/>或者${attr.msg}</p>
        
        <h2>遍历list</h2>
        <table>
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>生日</th>
                </tr>
            </thead>
            <tbody>
                <s:if test="list.size > 0"> <!-- list取的是OgnlAction中的list成员变量, size是ognl的伪属性 -->
                    <!-- 在使用s:iterator的时候,遍历到每个对象的时候会临时的放到栈顶的位置,因此可以直接取其属性 -->
                    <s:iterator value="list">
                        <tr>
                            <td>${name }</td>
                            <td>${age }</td>
                            <td><s:date name="birthday" format="yyyy-MM-dd"/> </td>
                        </tr>
                    </s:iterator>                
                </s:if>
                <s:else>
                    <tr>
                        <td colspan="3">没有任何的数据</td>
                </s:else>
            </tbody>
        </table>
        
        <h2>Checkbox</h2>
        <!-- checkboxlist中的list表示从值栈中获取的list集合,
             name表示checkbox的name, 
             label是展示在checkbox前的信息, 
             listKey是checkbox的value信息,
             listValue是checkbox展示给用户看的信息 
             value中是集合,表示被选中的值
        -->
        <!-- list="list",取的是OgnlAction中的list这个成员变量,当访问OgnlAction的时候,会将该Action压入到ValueStack的栈顶的位置,
        而ValueStack又是ActionContext的根对象,因此可以直接获取,不用# -->
        <s:checkboxlist list="list" name="person" listKey="age" listValue="name" label="Student" value="{10}"></s:checkboxlist><br>
        <s:set name="map" value="#{'aa':'AA', 'bb':'BB', 'cc':'CC', 'cc':'DD'}"></s:set> <!-- 自定一个Map对象,对象名为map -->
        <!-- 访问上一行定义的map对象 -->
        <s:checkboxlist list="#map" label="TEST" listKey="key" listValue="value" name="test"></s:checkboxlist><br>
        <s:checkboxlist list="#{'xx':'XX', 'yy':'YY', 'zz':'ZZ'}" label="Test" name="test" listKey="value" listValue="key"></s:checkboxlist>
        
        <h2>以select的方式展示</h2>
        <!-- 
            s:select中,list表示从值栈中获取的值
            value表示被选中的值
            multiple="true" 表示多选
            listKey 表示option的value
            listValue表示展示给用户的信息
            Label要展示在select前的信息
            name是select的name
         -->
        <s:select list="list" value="{10}" multiple="true" listKey="age" listValue="name" label="Student" name="student"></s:select><br>
        <s:select list="#map" listKey="key" listValue="value" label="TEST" name="test" headerKey="-1" headerValue="请选择"></s:select><br>
        <s:select list="#{'xx':'XX', 'yy':'YY', 'zz':'ZZ'}" label="test" name="test" listKey="key" listValue="value" headerKey="-1" headerValue="请选择"></s:select>
        <br>
        <br>
        <hr/>
        
        <h2>过滤,投影与集合</h2>
      <!-- 遍历年龄大于或等于20岁的所有的人 -->
    <s:iterator value="list.{? age >= 20}"> ${name}---${age}--<s:date name="age" format="yyyy-MM-dd"/><br> </s:iterator> <br>
    <!-- 查找list中的名字为张三的第一个人的姓名 --> <p>查找姓名是zhangsan的人的name: <s:property value="list.{^ name='zhangsan'}[0].name"/> </p>
    <!-- 查找list中年龄大于20岁的最后一个人的年龄 --> <p> 查找年龄大于等于20岁的最后一个人的age: <s:property value="list.{$ age >= 20}[0].age"/> </p> <p> 查找年龄大于20岁的所有的人姓名(返回一个集合): <s:property value="list.{? age >= 20}.{name}"/> </p> <hr/> <h2>iterator的遍历</h2> <s:iterator begin="1" end="10" step="2" var="i" status="s"> ${i}-------${s.count}----${s.index}---${s.odd}--${s.even }---${s.last}---${s.first }<br> </s:iterator> <s:iterator value="#map" var="m"> <!-- 遍历的第一种方式 <s:property value="key"/>----<s:property value="value"/><br> --> <!-- 遍历的第二种方式 ${key}----${value }<br> --> <!-- 遍历的第三种方式 ${m.key }----${m.value }<br> --> <!--第四种方式 <s:property value="#m.key"/>----<s:property value="#m.value"/><br> --> <s:a href="hello?id=%{#m.key}">${m.value}</s:a><br> <!-- 使用%{}的目的是将括号中的内容强制作为ognl表达式来使用 --> </s:iterator> <hr/> <h2>取map的值</h1> <s:property value="#map['aa']"/> </body> </html>

     上一篇:ognl语言

  • 相关阅读:
    swift 关于闭包
    swift 多线程的使用
    线上故障解决流程解读
    coredata (转)
    归档
    NSSearchPathForDirectoriesInDomains
    【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例(转载)
    Objective-C Runtime (Runtime Library)转发
    Mac电脑系统降级(转载)
    UILabel
  • 原文地址:https://www.cnblogs.com/miller-zou/p/5598468.html
Copyright © 2011-2022 走看看