1. 程式人生 > >Strust2 的OGNL和s標籤的用法

Strust2 的OGNL和s標籤的用法

在之前的學習中,我們在頁面上訪問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名稱