在之前的学习中,我们在页面上访问Action对象的时候,都是用EL表达式来实现的如${productName}
为什么我们通过EL表达式就可以取到对象呢?
我一直以为是从request、session、application域中获取的;
我们知道struts2就是相当于servlet,但是在servlet对象中,需要用到request.setAttribute("name",name);来设置属性的话,在页面上就可以通过EL表达式取值;
而Action对象里,没有用到request,session.application的情况下仍然可以通过EL表达式取到值
demo如下
<form action="for.action">
用户名:<input type="text" name="name"/><br>
密码: <input type="password" name="password"/><br>
<input type="submit" value="submit">
</form>
<action name="for" class="cn.com.action.Info" method="save">
<result>/one.jsp</result>
</action>
package cn.com.action;
public class Info {
private String name;
private String password;
//这个是Action类,能够处理struts2请求的类;
//action:struts2的一个请求就是一个action
/*1、Action类必须有无参构造函数
*2、 而且属性名必须与前端的表单的属性名一致
*3、一个Action类可以有多个方法
*4、一个Action类至少有多个可以供请求的方法
*5、每一次请求都创建一个实例,线程安全的
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String save(){
return "success";
}
}
<body>
用户名:${name }<br>
密码:${password }
</body>
结果页面如下:
这是为什么呢?
其实所有的都是从valuestrack中取得的;
vlaueStrack主要有map栈和list栈
ognlcontext:map栈,主要是属性的映射关系
root:list栈,主要是存储对象,这个才是真正的值栈;
第一部分:
怎么从list栈也就是对象栈中取值
1、在jsp页面上引入s标签
<%@ taglib uri="/struts-tags" prefix="s" %>
2、语法格式
<s:property value="Object.propertyName"/>
如:
<s:property value="[0].name"/>
[0]是位置,堆栈都是先进后出的,0代表是堆栈的第一个属性
demo2
test类
package cn.com.action;
public class Test {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
info类
package cn.com.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
public class Info {
private String name;
private String password;
//这个是Action类,能够处理struts2请求的类;
//action:struts2的一个请求就是一个action
/*1、Action类必须有无参构造函数
*2、 而且属性名必须与前端的表单的属性名一致
*3、一个Action类可以有多个方法
*4、一个Action类至少有多个可以供请求的方法
*5、每一次请求都创建一个实例,线程安全的
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String save(){
//1.获取堆栈
ValueStack vs=ActionContext.getContext().getValueStack();
//2.获取test对象
Test test=new Test();
test.setName("hahah");
//3.把test对象放入堆栈中
vs.push(test);
return "success";
}
}
表单:
<form action="for.action">
用户名:<input type="text" name="name"/><br>
密码: <input type="password" name="password"/><br>
<input type="submit" value="submit">
</form>
显示页面
<body>
<s:debug></s:debug>
用户名:${name }<br>
<s:property value="[0].name"/>
密码:${password }
<s:property value="[0].password"/>
</body>
页面 效果图
在表单页面我输入ttt,111,但是显示页面却是hahah 111
原因如下:
由于之前test中有一个name的属性,和info中的name属性同名,我在info类中堆栈加入了test对象,先进后出,第一个取到的自然是test的name属性
第二部分:
怎么从map栈中取值
一模一样的,就是格式不一样
<s:property value="#request/application/session.对象.属性名"/>
如:
<s:property value="#request.Info.name"/>
demo如下:
package cn.com.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public class RequestTest {
/*
* author:命运的信徒 date:2018/12/11 arm:ognl+s标签获取map栈
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute() {
ActionContext context = ActionContext.getContext();
Map<String, Object> sessionmap = context.getSession();
RequestTest rt=new RequestTest();
rt.setName("yecunwanzhai");
sessionmap.put("RequestTest", rt);
return "success";
}
}
struts.xml
<action name="map" class="cn.com.action.RequestTest" >
<result>/one.jsp</result>
</action>
连接页面
<a href="map.action">map栈</a>
显示页面
<s:property value="#session.RequestTest.name"/>
各位有没有懂呢?
我是没有懂。
关于#session.RequestTest.name
1.格式是不是#session.对象.属性?
2.session.属性行么?
3.对象是Action类名么?
解答:
1、我把sessionmap.put("RequestTest", rt);改成了sessionmap.put("rt", rt);
在jsp页面 <s:property value="#session.rt.name"/>,结果显示正常
证实了,#session.key名称.属性
2、session.属性是可以的;
当sessionmap.put("RequestTest", rt);中的rt是属性的时候就是#session.属性对应的key名称;
当sessionmap.put("RequestTest", rt);中的rt是对象的时候,#session.对象对应的key名称.属性名称
3.对象不是Action类名,是key名称