一、OGNL表达式

  1.简介

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

  2.使用OGNL准备工作

   2.1导包

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

   2.2代码准备

  

  1. @Test
  2. //准备工作
  3. public void fun1() throws Exception{
  4. //准备OGNLContext
  5. //准备Root
  6. User rootUser = new User("tom",18);
  7. //准备Context
  8. Map<String,User> context = new HashMap<String,User>();
  9. context.put("user1", new User("jack",18));
  10. context.put("user2", new User("rose",22));
  11. OgnlContext oc = new OgnlContext();
  12. //将rootUser作为root部分
  13. oc.setRoot(rootUser);
  14. //将context这个Map作为Context部分
  15. oc.setValues(context);
  16. //书写OGNL
  17. Ognl.getValue("", oc, oc.getRoot());
  18. }

准备工作

  3.基本语法演示

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

取出root中的属性值

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

取出context中的属性值

  1. //将root中的user对象的name属性赋值
  2. Ognl.getValue("name='jerry'", oc, oc.getRoot());
  3. String name = (String) Ognl.getValue("name", oc, oc.getRoot());
  4.  
  5. String name2 = (String) Ognl.getValue("#user1.name='郝强勇',#user1.name", oc, oc.getRoot());
  6. System.out.println(name);
  7. System.out.println(name2);

为属性赋值

  1. //调用root中user对象的setName方法
  2. Ognl.getValue("setName('lilei')", oc, oc.getRoot());
  3. String name = (String) Ognl.getValue("getName()", oc, oc.getRoot());
  4. String name2 = (String) Ognl.getValue("#user1.setName('lucy'),#user1.getName()", oc, oc.getRoot());
  5.  
  6. System.out.println(name);
  7. System.out.println(name2);

调用方法

  1. String name = (String) Ognl.getValue("@cn.itheima.a_ognl.HahaUtils@echo('hello 强勇!')", oc, oc.getRoot());
  2. //Double pi = (Double) Ognl.getValue("@java.lang.Math@PI", oc, oc.getRoot());
  3. Double pi = (Double) Ognl.getValue("@@PI", oc, oc.getRoot());
  4. System.out.println(name);
  5. System.out.println(pi);

调用静态方法

  1. //创建list对象
  2. Integer size = (Integer) Ognl.getValue("{'tom','jerry','jack','rose'}.size()", oc, oc.getRoot());
  3. String name = (String) Ognl.getValue("{'tom','jerry','jack','rose'}[0]", oc, oc.getRoot());
  4. String name2 = (String) Ognl.getValue("{'tom','jerry','jack','rose'}.get(1)", oc, oc.getRoot());
  5.  
  6. /*System.out.println(size);
  7. System.out.println(name);
  8. System.out.println(name2);*/
  9. //创建Map对象
  10. Integer size2 = (Integer) Ognl.getValue("#{'name':'tom','age':18}.size()", oc, oc.getRoot());
  11. String name3 = (String) Ognl.getValue("#{'name':'tom','age':18}['name']", oc, oc.getRoot());
  12. Integer age = (Integer) Ognl.getValue("#{'name':'tom','age':18}.get('age')", oc, oc.getRoot());
  13. System.out.println(size2);
  14. System.out.println(name3);
  15. 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. //压入栈顶
  2. //1获得值栈
  3. ValueStack vs = ActionContext.getContext().getValueStack();
  4. //2将u压入栈顶
  5. vs.push(u);

    4.2配置文件中

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

语法:${ognl表达式}

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

   查找顺序:

  

三、练习:客户列表

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

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

  1. <s:iterator value="#list" var="cust" >
  2. <TR
  3. style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
  4. <TD>
  5. <s:property value="#cust.cust_name" />
  6. </TD>
  7. <TD>
  8. <s:property value="#cust.cust_level" />
  9. </TD>
  10. <TD>
  11. <s:property value="#cust.cust_source" />
  12. </TD>
  13. <TD>
  14. <s:property value="#cust.cust_linkman" />
  15. </TD>
  16. <TD>
  17. <s:property value="#cust.cust_phone" />
  18. </TD>
  19. <TD>
  20. <s:property value="#cust.cust_mobile" />
  21. </TD>
  22. <TD>
  23. <a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
  24. &nbsp;&nbsp;
  25. <a href="${pageContext.request.contextPath }/customerServlet?method=delete&custId=${customer.cust_id}">删除</a>
  26. </TD>
  27. </TR>
  28. </s:iterator>
  29. <%-- <s:iterator value="#list" >
  30. <TR
  31. style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
  32. <TD>
  33. <s:property value="cust_name" />
  34. </TD>
  35. <TD>
  36. <s:property value="cust_level" />
  37. </TD>
  38. <TD>
  39. <s:property value="cust_source" />
  40. </TD>
  41. <TD>
  42. <s:property value="cust_linkman" />
  43. </TD>
  44. <TD>
  45. <s:property value="cust_phone" />
  46. </TD>
  47. <TD>
  48. <s:property value="cust_mobile" />
  49. </TD>
  50. <TD>
  51. <a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
  52. &nbsp;&nbsp;
  53. <a href="${pageContext.request.contextPath }/customerServlet?method=delete&custId=${customer.cust_id}">删除</a>
  54. </TD>
  55. </TR>
  56. </s:iterator> --%>

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

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

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

  1. JSTL标签,EL表达式,OGNL表达式,struts2标签 汇总

    一下纯属个人总结摘抄,总结一起方便查看,解决疑问,有遗漏或错误,还请指出.       1,JSTL标签总结: a).JSTL标签有什么用?          JSTL是由JCP(Java Commu ...

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

    一.什么是OGNL,有什么特点? OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一种可以方便地操作对象属性的开源表达式语言.OGN ...

  3. struts2中使用ognl表达式时各种符号的使用规则$,#,%

    OGNL表达式struts2标签“%,#,$” 一.什么是OGNL,有什么特点? OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一 ...

  4. struts2:OGNL表达式之#、%、$符号运用

    1. OGNL表达达符号"#" 1.1 #用于访问OGNL上下文和Action上下文,#相当于ActionContext.getContext() 注意:当系统创建了Action实 ...

  5. Struts2 OGNL表达式、ValueStack

    OGNL简介 OGNL,即Object-Graph Navigation Language,对象视图导航语言,是一种数据访问语言,比EL表达式更加强大: EL只能从11个内置对象中取值,且只能获取属性 ...

  6. java之struts2之OGNL表达式

    struts2推荐使用ognl表达式 ognl: object graph navigation language 对象导航图语言 如:school.teacher.address="北京& ...

  7. struts2-OGNL表达式-OGNL与Struts2的结合

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

  8. 2018.11.24 struts2中的OGNL表达式及两者的结合

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

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

    Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...

随机推荐

  1. Hadoop - 操作练习之单机配置 - Hadoop2.8.0/Ubuntu16.04

    系统版本 anliven@Ubuntu1604:~$ uname -a Linux Ubuntu1604 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb ...

  2. 如何设置文本不换行省略号显示等CSS常用文本属性

    如何让多余的文本省略号显示首先要说几个属性的作用: whitespace:nowrap 中文行末不断行显示 overflow: 控制超出文本的显示方式:hidden 超出范围文本隐藏:scroll 始 ...

  3. Linux下安装单机版zookeeper(和dubbo配合验证)和redis(用图形化界面连接验证)

    上次写了篇zookeeper的集齐,并且用dubbo admin验证了集群结果.最近又特地装了个虚拟机,专门装各种单机版的,免得跟集群的机器混合了.安装的虚拟机IP为192.168.1.108 1.单 ...

  4. cin 字符串输入

    cin 字符串输入 在学习c的时候,关于字符串的输入,记得有 scanf("%s",s); gets(s); 还有...o.o 好想没了... scanf("%s&quo ...

  5. 【转】10 条提升 Android 性能的建议

    每个人都知道一个 App 的成功,与这个 App 的性能体验有着很密切的关系.但是如何让你的 App 拥有极致性能体验呢?在 DroidCon NYC 2015 的这个分享里,Boris Farber ...

  6. 关于Java FTP SFTP的相关实际问题

    第一个: java ftp使用的是Apache common-net,但是FTP服务侧提供的FTP服务器只支持SFTP,结果报 java.net.ConnectException: Connectio ...

  7. XSHELL工具上传文件到Linux以及下载文件到本地(Windows)

    Xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz.首先你的Linux上需要安装安装lrzsz工具包,(如果没有安装请执行以下命令,安装 ...

  8. 远程登录aws

    AWS的EC2服务器是用密钥来认证的,在创建instance时,会提示,创建一个key pair,同时会提示下载一个xxx.pem的密钥文件到本地硬盘.下面是通过SecureCRT连接到EC2的操作步 ...

  9. Swift学习笔记(4):字符串

    目录: 初始化 常用方法或属性 字符串索引 初始化 创建一个空字符串作为初始值: var emptyString = "" // 空字符串字面量 var anotherEmptyS ...

  10. Natas Wargame Level 12 Writeup(文件上传漏洞)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAAChCAYAAADA86lDAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF