JAVAEE学习——struts2_03:OGNL表达式、OGNL与Struts2的结合和练习:客户列表

一、OGNL表达式

  1.简介

  OGNL:对象视图导航语言.  ${user.addr.name} 这种写法就叫对象视图导航。
  OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能。

  2.使用OGNL准备工作

   2.1导包

  struts2 的包中已经包含了.所以不需要导入额外的jar包

   2.2代码准备

  

    @Test
    //准备工作
    public void fun1() throws Exception{
        //准备OGNLContext
            //准备Root
            User rootUser = new User("tom",18);
            //准备Context
            Map<String,User> context = new HashMap<String,User>();
            context.put("user1", new User("jack",18));
            context.put("user2", new User("rose",22));
        OgnlContext oc = new OgnlContext();
        //将rootUser作为root部分
        oc.setRoot(rootUser);
        //将context这个Map作为Context部分
        oc.setValues(context);
        //书写OGNL
        Ognl.getValue("", oc, oc.getRoot());
    }

准备工作

  3.基本语法演示

        //取出root中user对象的name属性
        String name = (String) Ognl.getValue("name", oc, oc.getRoot());
        Integer age = (Integer) Ognl.getValue("age", oc, oc.getRoot());
        System.out.println(name);
        System.out.println(age);

取出root中的属性值

        //取出context中键为user1对象的name属性
        String name = (String) Ognl.getValue("#user1.name", oc, oc.getRoot());
        String name2 = (String) Ognl.getValue("#user2.name", oc, oc.getRoot());
        Integer age = (Integer) Ognl.getValue("#user2.age", oc, oc.getRoot());
        System.out.println(name);
        System.out.println(name2);
        System.out.println(age);

取出context中的属性值

        //将root中的user对象的name属性赋值
        Ognl.getValue("name=‘jerry‘", oc, oc.getRoot());
        String name = (String) Ognl.getValue("name", oc, oc.getRoot());

        String name2 = (String) Ognl.getValue("#user1.name=‘郝强勇‘,#user1.name", oc, oc.getRoot());
        System.out.println(name);
        System.out.println(name2);

为属性赋值

        //调用root中user对象的setName方法
        Ognl.getValue("setName(‘lilei‘)", oc, oc.getRoot());
        String name = (String) Ognl.getValue("getName()", oc, oc.getRoot());
        String name2 = (String) Ognl.getValue("#user1.setName(‘lucy‘),#user1.getName()", oc, oc.getRoot());

        System.out.println(name);
        System.out.println(name2);

调用方法

        String name = (String) Ognl.getValue("@[email protected](‘hello 强勇!‘)", oc, oc.getRoot());
        //Double pi = (Double) Ognl.getValue("@[email protected]", oc, oc.getRoot());
        Double pi = (Double) Ognl.getValue("@@PI", oc, oc.getRoot());
        System.out.println(name);
        System.out.println(pi);

调用静态方法

        //创建list对象
        Integer size = (Integer) Ognl.getValue("{‘tom‘,‘jerry‘,‘jack‘,‘rose‘}.size()", oc, oc.getRoot());
        String name = (String) Ognl.getValue("{‘tom‘,‘jerry‘,‘jack‘,‘rose‘}[0]", oc, oc.getRoot());
        String name2 = (String) Ognl.getValue("{‘tom‘,‘jerry‘,‘jack‘,‘rose‘}.get(1)", oc, oc.getRoot());

        /*System.out.println(size);
        System.out.println(name);
        System.out.println(name2);*/
        //创建Map对象
        Integer size2 = (Integer) Ognl.getValue("#{‘name‘:‘tom‘,‘age‘:18}.size()", oc, oc.getRoot());
        String name3  = (String) Ognl.getValue("#{‘name‘:‘tom‘,‘age‘:18}[‘name‘]", oc, oc.getRoot());
        Integer age  = (Integer) Ognl.getValue("#{‘name‘:‘tom‘,‘age‘:18}.get(‘age‘)", oc, oc.getRoot());
        System.out.println(size2);
        System.out.println(name3);
        System.out.println(age);

ognl创建对象-list|map

二、OGNL与Struts2的结合

  1.结合原理

  

  ValueStack中的两部分

  

  2.栈原理

  

  栈是由ArrayList模拟的

  

  栈中的两个方法的实现

  

  访问栈中属性的特点.由上到下

  

  3.查看值栈中两部分内容(使用DEBUG标签)

   3.1Root

  默认情况下,栈中放置当前访问的Action对象

  

  3.2Context

  

  

  Context部分就是ActionContext数据中心

  4.struts2与ognl结合体现

    4.1参数接收

 

    如何获得值栈对象,值栈对象与ActionContext对象是互相引用的

        //压入栈顶
        //1获得值栈
        ValueStack vs = ActionContext.getContext().getValueStack();
        //2将u压入栈顶
        vs.push(u);

    4.2配置文件中

<action name="Demo3Action" class="cn.itheima.d_config.Demo3Action" method="execute" >
            <result name="success" type="redirectAction" >
                <param name="actionName">Demo1Action</param>
                <param name="namespace">/</param>
                <!-- 如果添加的参数struts"看不懂".就会作为参数附加重定向的路径之后.
                     如果参数是动态的.可以使用${}包裹ognl表达式.动态取值
                 -->
                <param name="name">${name}</param>
            </result>
        </action>

语法:${ognl表达式}

  5.扩展:request对象的getAttribute方法

   查找顺序:

  

三、练习:客户列表

    public String list() throws Exception {
        //1 接受参数
        String cust_name = ServletActionContext.getRequest().getParameter("cust_name");
        //2 创建离线查询对象
        DetachedCriteria dc =DetachedCriteria.forClass(Customer.class);
        //3 判断参数拼装条件
        if(StringUtils.isNotBlank(cust_name)){
            dc.add(Restrictions.like("cust_name", "%"+cust_name+"%"));
        }
        //4 调用Service将离线对象传递
        List<Customer> list = cs.getAll(dc);
        //5 将返回的list放入request域.转发到list.jsp显示

        //ServletActionContext.getRequest().setAttribute("list", list);
        // 放到ActionContext
        ActionContext.getContext().put("list", list);

        return "list";
    }

Action代码(新增ActionContext存放数据)

<s:iterator value="#list" var="cust" >
    <TR
        style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
        <TD>
            <s:property value="#cust.cust_name" />
        </TD>
        <TD>
        <s:property value="#cust.cust_level" />
        </TD>
        <TD>
        <s:property value="#cust.cust_source" />
        </TD>
        <TD>
        <s:property value="#cust.cust_linkman" />
        </TD>
        <TD>
        <s:property value="#cust.cust_phone" />
        </TD>
        <TD>
        <s:property value="#cust.cust_mobile" />
        </TD>
        <TD>
        <a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
        &nbsp;&nbsp;
        <a href="${pageContext.request.contextPath }/customerServlet?method=delete&custId=${customer.cust_id}">删除</a>
        </TD>
    </TR>
    </s:iterator>
    <%-- <s:iterator value="#list"  >
    <TR
        style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
        <TD>
            <s:property value="cust_name" />
        </TD>
        <TD>
        <s:property value="cust_level" />
        </TD>
        <TD>
        <s:property value="cust_source" />
        </TD>
        <TD>
        <s:property value="cust_linkman" />
        </TD>
        <TD>
        <s:property value="cust_phone" />
        </TD>
        <TD>
        <s:property value="cust_mobile" />
        </TD>
        <TD>
        <a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
        &nbsp;&nbsp;
        <a href="${pageContext.request.contextPath }/customerServlet?method=delete&custId=${customer.cust_id}">删除</a>
        </TD>
    </TR>
    </s:iterator> --%>

JSP显示数据的代码(注释的是另一种方法)

注意:<s:iterator value="#list" var="cust" > 每次都会把cust存在ActionContext中

时间: 2024-12-24 03:26:13

JAVAEE学习——struts2_03:OGNL表达式、OGNL与Struts2的结合和练习:客户列表的相关文章

Struts2中OGNL表达式的用法

OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,能通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能. 一.为什么要使用OGNL 视图层的表达式语言通常是用来简化数据的访问操作,取代Java脚本代码,提供更清晰的视图层实现.比如,要获取user对象的age属性,利用OGNL表达式可以写成: <s:property value="user.age&

OGNL表达式struts2标签“%,#,$”

一.什么是OGNL,有什么特点? OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一种可以方便地操作对象属性的开源表达式语言.OGNL有如下特点: 1.支持对象方法调用,形式如:objName.methodName(): 2.支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 |  值名],例如: @java.lang.String@format('foo %s', 'bar')或@tutorial.

Struts2标签库汇总和OGNL表达式语言

Struts2标签分类 UI标签:主要用于生成HTML元素的标签 非UI标签:主要用于数据访问.逻辑控制的标签 Ajax标签:用于支持Ajax的标签 表单标签(属于UI标签):用于生成HTML页面的form标签及普通表单元素的标签 非表单标签(属于UI标签):用于生产页面上的树.Tab页等标签 流程控制标签(属于非UI标签):主要包含用于实现分支.循环等流程控制的标签 数据访问标签(属于非UI标签):主要包含用于操作值栈和完成国际化功能的标签. OGNL表达式语言 (Object-Graph N

Struts——OGNL表达式与Struts2结合

一.OGNL表达式 OGNL:对象视图导航语言. ${user.addr.name} 这种写法就叫对象视图导航. OGNL不仅仅可以视图导航而且还支持比EL表达式更加丰富的功能. 语法: public void func() throws OgnlException { // 1.准备Root User rootUser = new User("jiaxin",23); // 2.准备Context Map<String,User> context = new HashMa

Ognl表达式基本原理和使用方法

1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个开源项目.Struts框架使用OGNL作为默认的表达式语言. OGNL优势 支持对象方法调用,如:×××.doSomeSpecial(); 支持类静态的方法调用和值访问,表达式的格式 @[类全名(包括包路径)]@[方法名 |  值名],例如: @[email protected]('foo %s', 'bar') 或@[email 

struts标签、OGNL表达式、JSTL标签、EL表达式

Struts标签.Ognl表达式.el表达式.jstl标签库这四者之间的关系和各自作用 我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用    Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的代码复用.Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求. Struts2的标签库有一个巨大的改进之

Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用

<转载> 我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用   Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的代码复用.Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求.Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于任何表现层技术,也就是说strtus2提供

EL和OGNL表达式的区分

OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="#xx" /> struts页面中不能单独使用,el可以单独使用 ${sessionScope.username} 页面取值区别: 名称 servlet ognl                                                                           el parameters request.getParameter(&q

EL,OGNL表达式 $ % #

1.OGNL表达式依赖于struts2标签,必须结合struts2标签使用, %”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值. <s:a href="getThemeMsg.action?tea_id= %{#session.loginUser.teacher.tea_id}" cssClass="icoZwsc">作文上传</s:a> 访问session 包含loginUser的属性 <s:property val