Strust2 的OGNL和s标签的用法

版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/84941794

在之前的学习中,我们在页面上访问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名称

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/84941794
今日推荐