1.向值栈中放数据
1. 向值栈放数据的多种方式
第一种:获取值栈对象,调用值栈对象里面的set方法
public class ValueStackDemo1Action extends ActionSupport {
@Override
public String execute() throws Exception {
//1.获取值栈对象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2.调用set方法
stack.set("username", "zzu");
return "success";
}
}
第二种:获取值栈对象,调用值栈对象里面的push方法
public class ValueStackDemo1Action extends ActionSupport {
@Override
public String execute() throws Exception {
//1.获取值栈对象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//3.调用push方法
stack.push("abcd");
return "success";
}
}
第三种:在action定义变量,生成变量的get方法(数据直接在action种存储,减少内存的开辟)
public class ValueStackDemo1Action extends ActionSupport {
//1.定义一个变量
private String name;
//2.生成一个get方法
public String getName() {
return name;
}
@Override
public String execute() throws Exception {
//3.在具体的方法里面给属性设置值
name="abcd";
return "success";
}
}
2.向值栈种放对象
步骤:
(1)定义一个成员对象
(2)生成对象的get方法
(3)在具体执行的方法里面向对象中设置值
public class ObjectDemoAction extends ActionSupport {
//1.定义一个对象
private User user=new User();
//2.get方法
public User getUser() {
return user;
}
@Override
public String execute() throws Exception {
//放具体的数据
user.setUsername("lucy");
user.setPassword("12300");
user.setAddress("china");
return "success";
}
}
3.向值栈中放list集合
步骤:
(1)定义一个成员集合变量
(2)生成集合的get方法
(3)在具体的方法里面向list集合中放置值
public class ListDemoAction extends ActionSupport {
//1.定义一个list
private List<User> list=new ArrayList<>();
//2.生成get方法
public List<User> getList() {
return list;
}
@Override
public String execute() throws Exception {
//3.放具体的数据
User user1=new User();
user1.setUsername("小米");
user1.setPassword("123");
user1.setAddress("日本");
User user2=new User();
user1.setUsername("小马");
user1.setPassword("133");
user1.setAddress("美国");
list.add(user1);
list.add(user2);
return "success";
}
}
2.从值栈中获取数据
使用struts2标签和OGNL表达式来获取数据
1.获取字符串
public class ValueStackAction extends ActionSupport {
private String username;
public String getUsername() {
return username;
}
@Override
public String execute() throws Exception {
username="zzu";
return "success";
}
}
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<!-- 先获取字符串的值 -->
<s:property value="username"/>
</body>
</html>
2.获取对象
<!-- 获取值栈对象的值 -->
<s:property value="user.username"/>
<s:property value="user.password"/>
<s:property value="user.address"/>
private User user=new User();
public User getUser() {
return user;
}
@Override
public String execute() throws Exception {
//username="zzu";
user.setUsername("xx");
user.setPassword("1230");
user.setAddress("china");
return "success";
}
}
3.获取list集合中的数据
<!-- 获取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"/>
<!-- 第二种 使用struts2标签类似于jstl的foreach标签
s:iterator遍历值栈的list集合
-->
<s:iterator value="list">
<s:property value="username"/>
<s:property value="password"/>
<s:property value="address"/>
</s:iterator>
<!-- 第三种 -->
<s:iterator value="list" var="user">
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<s:property value="#user.address"/>
</s:iterator>
4.其他的操作
1.使用set方法向值栈中放数据的值获取
<!-- 获取set方法获取值 ,根据名称获取值
value的值是set放置的key
-->
<s:property value="username"/>
2.使用push方法放置的值获取的方法
(1)使用push方法设置的值,没有名称,只有设置的值
(2)向值栈放数据,把向值栈放数据存到数组里面,数组名称为top
<!-- 获取push方法获取值 -->
<s:property value="[0].top"/>
3.EL表达式获取值栈数据(why)
1.EL表达式获取域对象值
2。向域对象设置值使用setAttribute方法,获取使用getAttribute
3.底层增强request对象里面的方法getAttribute方法
(1)首先从request域里面获取值,如果获取到,直接返回
(2)如果从request域对象娶不到之,到值栈里面把值取出来放到域对象里面
4.OGNL的#和%的使用
#的使用
1.使用#获取context里面的数据
(1)向request域放值
(2)在页面使用ognl获取
<body>
<s:property value="#request.req"/>
</body>
public class ContextAction extends ActionSupport {
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("req", "reqvalue");
return "success";
}
}
%的使用
1.在struts2标签中表单标签
(1)在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有使用%之后才会识别
<!-- 普通输入项 -->
<s:textfield name="username" value="%{#request.req}"></s:textfield>