ognl概述
- 1: 之前
web
阶段,学习过EL
表达式,EL
表达式在jsp
中获取域对象里面的值 - 2:
OGNL
是—种表达式,这个表达式功能更加强大,- (1): 在
struts2
里面操作值栈数据 - (2): 一般把
ognl
在struts2
操作:和struts2
标签一起使用操作值栈
- (1): 在
- 3:
OGNL
不是struts2
的一部分,单独的项目,经常和struts2一起使用- (1): 使用
ognl
时候首先导入jar
包,struts2
提供jar
包
- (1): 使用
ognl入门案例
- 1:
- (1): 支持对象方法调用。例如:
objName.methodName()
。 - (2): 在
java
代码中,调用字符串.length()
;
- (1): 支持对象方法调用。例如:
- 2: 使用
struts2
标签- (1): 使用
jstl
时候,导入jar
包之外,在jsp
页面中引入标签库 - 使用
struts2
标签时候,在jsp
中引入标签库<%@ taglib uri="/struts-tags" prefix="s"%>
:粘贴在第三行
- (2): 使用struts2标签实现操作
- (1): 使用
<!-- 使用`ognl+struts2`标签实现计算字符串长度·
value属性值:ognl表达式
-->
<s:property value="'haha'.length()" />
什么是值栈
概念:
- 之前在
web
阶段,在servlet
里面进行操作,把数据放到域对象里面,在页面中使用el
表达式获取到,域对象在一定范围内,存值和取值 - 在
struts2
里面提供本身一种存储机制,类似于域对象,是值栈,可以存值和取值。- 在
action
里面把数据放到值栈里面,在页面中获取到值栈数据
- 在
servlet和action区别
Servlet
:默认在第一次访间时候创建,创建一次,单实例对象Action
:访问的时候创建,每次访问aciton
的时候,都会创建action
对象,创建对象,多实例对象
public class UserAction extends ActionSupport {
public UserAction() {
System.out.println("action创建了、、、、、、、、、、");
}
@Override
public String execute() throws Exception {
return NONE;
}
}
<package name="demo1" extends="struts-default" namespace="/">
<action name="userAction" class="com.day2.action.UserAction"></action>
</package>
值栈存储位置
- 每次访问
aciton
的时候,都会创建action
对象 - 在每个
aciton
对象里面都会有一个值栈对象(只有一个)
如何获取值栈对象
- 1: 获取值栈对象有多种方式
- 常用方式: 使用
ActionContext
类里面的方法得到值栈对象ActionContext context = ActionContext.getContext();
:获取ActionContext
类的对象ValueStack stack1 = context.getValueStack();
:调用方法得到值栈对象
- 常用方式: 使用
- 2: 每个
Action
对象中只有一个值栈对象
向值栈放数据
值栈的内部结构
- 1: 第一部分
root
,结构是list
集合- 一般操作都是
root
里面数据 extends ArrayList
- 一般操作都是
- 2: 第二部分
context
。结构map
集合。extends object implements Map
request
:request对象引用session
:HttpSession对象引用application
:ServletContext对象引用parameters
:传递相关的参数attr
:一个品对象,向三个域对象放值,名称都相同setAttribute(name",value)
;- 使用
attr
操作,获取域对象
- 使用
s:debug 标签
概念: 使用这个标签可以查看值栈结构和存储值
struts2
里面标签<s:debug></s:debug>
,使用这个标签可以查看值栈结构和存储值- (1): 访间
action
,执行action
的方法有返回值,配置返回值到jsp
页面中,在jsp
页面中使用这个标签 - (2): 在
action
没有做任何操作,栈顶元素是com.yap.action.ValuestackDemoAction
- action 对象里面有值栈对象
- 值栈对象里面有action引用
- (1): 访间
public class ValuestackDemoAction extends ActionSupport {
@Override
public String execute() throws Exception {
return "success";
}
}
<package name="demo1" extends="struts-default" namespace="/">
<action name="valueStackDemo1" class="com.day2.action.ValuestackDemoAction">
<result name="success">/valueStack.jsp</result>
</action>
</package>
<!-- 使用struts2标签杳看值栈结构 -->
<s:debug></s:debug>
向值栈放数据多种方式
- 1: 获取值栈对象,调用值栈对象里面的
set
方法ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
:获取值栈对象valueStack.set("username", "yap");
:调用set方法
- 2: 获取值栈对象,调用值栈对象里面的
push
方法。ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
:获取值栈对象stack.push("abcd");
:调用push
方法
- 3: 在
action
定义变量,生成变量的get
方法
向值栈放对象
- 1: 实现步骤
- 第一步 实现对象变量
- 第二步 生成变量
get
方法 - 第三步 在执行的方法里面向对象中设置值
public class ListDemoAction extends ActionSupport {
// 1 定义list变量
private List<User> list = new ArrayList<User>();
// 2 get方法
public List<User> getList() {
return list;
}
@Override
public String execute() throws Exception {
// 3向list中设置值
User user1 = new User();
user1.setUsername("小奥");
user1.setPassword("123");
user1.setAddress("美国");
User user2 = new User();
user2.setUsername("小王");
user2.setPassword("250");
user2.setAddress("越南");
list.add(user1);
list.add(user2);
return "success";
}
}
<action name="ListDemo" class="com.day2.action.ListDemoAction">
<result name="success">/valueStack.jsp</result>
</action>
<!-- 使用struts2标签杳看值栈结构 -->
<s:debug></s:debug>
向值栈放list对象
- 1: 实现步骤
- 第一步 定义
list
集合变量 - 第二步 生成变量
get
方法 - 第三步 在执行的方法里面向
list
集合设置值
- 第一步 定义
public class ObjectDemoAction extends ActionSupport {
// 1定义对象变量
private User user = new User();
// 2生成get方法
public User getUser() {
return user;
}
@Override
public String execute() throws Exception {
// 向值栈的uesr里面放数据
user.setUsername("aaa");
user.setPassword("123");
user.setAddress("adada");
return "success";
}
}
<action name="ObjectDemo" class="com.day2.action.ObjectDemoAction">
<result name="success">/valueStack.jsp</result>
</action>
<!-- 使用struts2标签杳看值栈结构 -->
<s:debug></s:debug>
从值核获取数据
从值栈获取字符串。
- 1: 使用
struts2
的标签+ognl
表达式获取值栈数据- (1):
<s:property value=”ognl表达式”>
- (1):
- 向值栈放字符串
public class ValueStackAction extends ActionSupport {
private String username;
public String getUsername() {
return username;
}
@Override
public String execute() throws Exception {
username = "itcast";
return "success";
}
}
<action name="valueDemo" class="com.day2.valuestack.ValueStackAction">
<result name="success">/valueStack.jsp</result>
</action>
<!-- 获取字符串值 -->
<s:property value="username"/>
从值栈获取对象
public class ValueStackAction extends ActionSupport {
private User user = new User();
public User getUser() {
return user;
}
@Override
public String execute() throws Exception {
// 向值栈的uesr里面放数据
user.setUsername("aaa");
user.setPassword("123");
user.setAddress("adada");
return "success";
}
}
<action name="valueDemo" class="com.day2.valuestack.ValueStackAction">
<result name="success">/valueStack.jsp</result>
</action>
<!-- 2获取值栈对象的值 -->
<br /> 获取对象的值:
<br />
<s:property value="user.username" />
<s:property value="user.password" />
<s:property value="user.address" />
从值栈获取list集合
测试代码
public class ValueStackAction extends ActionSupport {
private List<User> list = new ArrayList<User>();
public List<User> getList() {
return list;
}
@Override
public String execute() throws Exception {
// 3向list中设置值
User user1 = new User();
user1.setUsername("小奥");
user1.setPassword("123");
user1.setAddress("美国");
User user2 = new User();
user2.setUsername("小王");
user2.setPassword("250");
user2.setAddress("越南");
list.add(user1);
list.add(user2);
return "success";
}
}
<action name="valueDemo" class="com.day2.valuestack.ValueStackAction">
<result name="success">/valueStack.jsp</result>
</action>
第一种方式
<!-- 获取值栈list集合数据-->
<!--第一种方式实现 -->
<s:property value="list[0].username" />
<s:property value="List[0].password" />
<s:property value="list[0].address" />
<br />
<s:property value="list[1].username" />
<s:property value="List[1].password" />
<s:property value="list[1].address" />
第二种方式 通过<s:iterator>
循环获取数据
<!-- 使用struts2标签类似jstl的foreach标签
s:iterator:遍历值栈的list集合
<c:foreach items="" var="user">
${user.username}
</foreach>
-->
<s:iterator value="list">
<!--遍历list得到list里面每个user对象-->
<s:property value="username" />
<s:property value="password" />
<s:property value="address" />
</s:iterator>
第三种方式
<s:iterator value="list" var="user">
<!--
遍历值栈list集合,得到每个user对象
机制: 把每次遍历出来的user对象放到context里面
获取context里面数据,特点:写ognl表达式,
使用特殊符号 #
-->
<s:property value="#user.username" />
<s:property value="#user.password" />
<s:property value="#user.address" />
<br />
</s:iterator>
使用set/push方法向值栈放/取
// 第一种方式使用值栈对象里面的set方法
// 1获取值栈对象
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
// 调用set方法
valueStack.set("username", "yap");
// 调用push方法
valueStack.push("yap");
<!-- 获取字符串值 set中的key -->
<s:property value="username" />
<!-- 使用push方法设置值,没有名称,只有设置的值 -->
<!-- 向值栈放数据,把向值柱放数据存到数组里面,数组名称 top,根据数组获取值 -->
<s:property value="[0].top" />
foreach方法获取
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
:如果使用foreach
需要在jsp
添加这串代码
<!--使用foreach标签+el表达式获取值栈list集合数据-->
<c:forEach items="${list}" var="user">
${user.username }
${user.password }
${user.address }
<br />
</c:forEach>
EL表达式获取值栈数据(为什么)
- 1: EL表达式获取域对象值。
- 2: 向域对象里面放值使用
setAttribute
方法,获取值使用getAttribute
方法。 - 3: 底层增强
request
对象里面的方法getAttribute
方法。- (1:) 首先从
request
域获取值,如果获取到,直接返回 - (2:) 如果从
request
域获取不到值,到值栈中把值获取出来,把值放到域对象里面
- (1:) 首先从
ognl表达式
#使用
- 第一种方式
<s:iterator value="list" var="user">
<!--
遍历值栈list集合,得到每个user对象
机制: 把每次遍历出来的user对象放到context里面
获取context里面数据,特点:写ognl表达式,
使用特殊符号 #
-->
<s:property value="#user.username" />
<s:property value="#user.password" />
<s:property value="#user.address" />
<br />
</s:iterator>
- 第二种方式
- (1:) 向
request
域放值。 - (2:) 在页面中使用
ognl
获取
- (1:) 向
public class ContextAction extends ActionSupport {
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("req", "reqValue");
return "success";
}
}
<action name="contextAction" class="com.day2.action.ContextAction">
<result name="success">/context.jsp</result>
</action>
<!-- 获取context里面数据,写ognl时候,首先添加符号
#context的key名称.域对象名称
-->
<s:property value="#request.req" />
%使用
- 1: 在
struts2
标签中表单标签- (1:) 在
struts2
标签里面使用ognl
表达式,如果直接在struts2
表单标签里面使用ognl
表达式不识别,只有%
之后才会识别。
- (1:) 在
public class ContextAction extends ActionSupport {
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("req", "reqValue");
return "success";
}
}
<action name="contextAction" class="com.day2.action.ContextAction">
<result name="success">/context.jsp</result>
</action>
<!-- <input type="text" name="name" value="123" value="${req }" />-->
<s:textfield name="username" value="%{#request.req}"></s:textfield>