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("@cn.itheima.a_ognl.HahaUtils@echo('hello 强勇!')", oc, oc.getRoot());
- //Double pi = (Double) Ognl.getValue("@java.lang.Math@PI", 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>
-
- <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>
-
- <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中
JAVAEE学习——struts2_03:OGNL表达式、OGNL与Struts2的结合和练习:客户列表的更多相关文章
- JSTL标签,EL表达式,OGNL表达式,struts2标签 汇总
一下纯属个人总结摘抄,总结一起方便查看,解决疑问,有遗漏或错误,还请指出. 1,JSTL标签总结: a).JSTL标签有什么用? JSTL是由JCP(Java Commu ...
- OGNL表达式struts2标签“%,#,$”
一.什么是OGNL,有什么特点? OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一种可以方便地操作对象属性的开源表达式语言.OGN ...
- struts2中使用ognl表达式时各种符号的使用规则$,#,%
OGNL表达式struts2标签“%,#,$” 一.什么是OGNL,有什么特点? OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一 ...
- struts2:OGNL表达式之#、%、$符号运用
1. OGNL表达达符号"#" 1.1 #用于访问OGNL上下文和Action上下文,#相当于ActionContext.getContext() 注意:当系统创建了Action实 ...
- Struts2 OGNL表达式、ValueStack
OGNL简介 OGNL,即Object-Graph Navigation Language,对象视图导航语言,是一种数据访问语言,比EL表达式更加强大: EL只能从11个内置对象中取值,且只能获取属性 ...
- java之struts2之OGNL表达式
struts2推荐使用ognl表达式 ognl: object graph navigation language 对象导航图语言 如:school.teacher.address="北京& ...
- struts2-OGNL表达式-OGNL与Struts2的结合
1 OGNL表达式 OGNL:对象视图导航语言. ${user.addr.name} 这种写法就叫对象视图导航.OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能. 1.1 使用OGNL 导包 ...
- 2018.11.24 struts2中的OGNL表达式及两者的结合
OGNL表达式 OGNL:对象视图导航语言. ${user.addr.name} 这种写法就叫对象视图导航. OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能. 理解图示 使用OGNL准备工 ...
- Ognl表达式基本原理和使用方法
Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...
随机推荐
- 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 ...
- 如何设置文本不换行省略号显示等CSS常用文本属性
如何让多余的文本省略号显示首先要说几个属性的作用: whitespace:nowrap 中文行末不断行显示 overflow: 控制超出文本的显示方式:hidden 超出范围文本隐藏:scroll 始 ...
- Linux下安装单机版zookeeper(和dubbo配合验证)和redis(用图形化界面连接验证)
上次写了篇zookeeper的集齐,并且用dubbo admin验证了集群结果.最近又特地装了个虚拟机,专门装各种单机版的,免得跟集群的机器混合了.安装的虚拟机IP为192.168.1.108 1.单 ...
- cin 字符串输入
cin 字符串输入 在学习c的时候,关于字符串的输入,记得有 scanf("%s",s); gets(s); 还有...o.o 好想没了... scanf("%s&quo ...
- 【转】10 条提升 Android 性能的建议
每个人都知道一个 App 的成功,与这个 App 的性能体验有着很密切的关系.但是如何让你的 App 拥有极致性能体验呢?在 DroidCon NYC 2015 的这个分享里,Boris Farber ...
- 关于Java FTP SFTP的相关实际问题
第一个: java ftp使用的是Apache common-net,但是FTP服务侧提供的FTP服务器只支持SFTP,结果报 java.net.ConnectException: Connectio ...
- XSHELL工具上传文件到Linux以及下载文件到本地(Windows)
Xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz.首先你的Linux上需要安装安装lrzsz工具包,(如果没有安装请执行以下命令,安装 ...
- 远程登录aws
AWS的EC2服务器是用密钥来认证的,在创建instance时,会提示,创建一个key pair,同时会提示下载一个xxx.pem的密钥文件到本地硬盘.下面是通过SecureCRT连接到EC2的操作步 ...
- Swift学习笔记(4):字符串
目录: 初始化 常用方法或属性 字符串索引 初始化 创建一个空字符串作为初始值: var emptyString = "" // 空字符串字面量 var anotherEmptyS ...
- Natas Wargame Level 12 Writeup(文件上传漏洞)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAAChCAYAAADA86lDAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF